From 46384ce80dc006b2b74628fec092efd566d6e060 Mon Sep 17 00:00:00 2001 From: Xianny <8582774+xianny@users.noreply.github.com> Date: Fri, 26 Jul 2019 16:54:31 -0700 Subject: [PATCH] Allow generated wrappers to subscribe/unsubscribe to events (#1970) * Define SubscriptionManager and instantiate in generated wrappers * expose subscribe/unsubscribe in generated wrappers * update changelogs * use SubscriptionManager in `@0x/contract-wrappers` --- contracts/asset-proxy/test/erc1155_proxy.ts | 4 +- contracts/asset-proxy/test/proxies.ts | 3 +- contracts/exchange/test/core.ts | 3 +- .../test/utils/asset_proxy_owner_wrapper.ts | 11 +- .../multisig/test/utils/multi_sig_wrapper.ts | 9 +- .../abi-gen-templates/contract.handlebars | 86 +++++- packages/abi-gen-wrappers/CHANGELOG.json | 9 + .../generated-wrappers/asset_proxy_owner.ts | 83 +++++- .../coordinator_registry.ts | 83 +++++- .../generated-wrappers/dummy_erc20_token.ts | 83 +++++- .../generated-wrappers/dummy_erc721_token.ts | 83 +++++- .../src/generated-wrappers/erc20_proxy.ts | 83 +++++- .../src/generated-wrappers/erc20_token.ts | 83 +++++- .../src/generated-wrappers/erc721_proxy.ts | 83 +++++- .../src/generated-wrappers/erc721_token.ts | 83 +++++- .../src/generated-wrappers/exchange.ts | 83 +++++- .../generated-wrappers/multi_asset_proxy.ts | 83 +++++- .../src/generated-wrappers/weth9.ts | 83 +++++- .../src/generated-wrappers/zrx_token.ts | 83 +++++- packages/abi-gen/package.json | 1 + .../python/abi_gen_dummy/__init__.py | 48 +++- .../typescript/abi_gen_dummy.ts | 223 ++++++++++++++- .../fixtures/artifacts/AbiGenDummy.json | 47 +++- .../fixtures/contracts/AbiGenDummy.sol | 6 + .../test/abi_gen_dummy_test.ts | 33 ++- packages/base-contract/CHANGELOG.json | 9 + packages/base-contract/package.json | 6 +- packages/base-contract/src/index.ts | 4 + .../src/subscription_manager.ts} | 57 ++-- packages/base-contract/src/types.ts | 38 +++ .../base-contract/src/utils/filter_utils.ts | 87 ++++++ packages/contract-wrappers/CHANGELOG.json | 9 + packages/contract-wrappers/package.json | 1 + .../src/contract_wrappers.ts | 21 +- .../contract_wrappers/coordinator_wrapper.ts | 7 +- .../dutch_auction_wrapper.ts | 36 +-- .../contract_wrappers/erc20_proxy_wrapper.ts | 35 +-- .../contract_wrappers/erc20_token_wrapper.ts | 32 ++- .../contract_wrappers/erc721_proxy_wrapper.ts | 35 +-- .../contract_wrappers/erc721_token_wrapper.ts | 32 ++- .../contract_wrappers/ether_token_wrapper.ts | 32 ++- .../src/contract_wrappers/exchange_wrapper.ts | 256 +++++++++--------- .../contract_wrappers/forwarder_wrapper.ts | 38 +-- .../order_validator_wrapper.ts | 47 ++-- yarn.lock | 216 +-------------- 45 files changed, 1865 insertions(+), 612 deletions(-) rename packages/{contract-wrappers/src/contract_wrappers/contract_wrapper.ts => base-contract/src/subscription_manager.ts} (82%) create mode 100644 packages/base-contract/src/types.ts create mode 100644 packages/base-contract/src/utils/filter_utils.ts diff --git a/contracts/asset-proxy/test/erc1155_proxy.ts b/contracts/asset-proxy/test/erc1155_proxy.ts index fef6e7074f..5048af635c 100644 --- a/contracts/asset-proxy/test/erc1155_proxy.ts +++ b/contracts/asset-proxy/test/erc1155_proxy.ts @@ -23,7 +23,7 @@ import { LogWithDecodedArgs } from 'ethereum-types'; import * as ethUtil from 'ethereumjs-util'; import * as _ from 'lodash'; -import { ERC1155ProxyWrapper, ERC721ProxyContract } from '../src'; +import { ERC1155ProxyContract, ERC1155ProxyWrapper } from '../src'; chaiSetup.configure(); const expect = chai.expect; @@ -51,7 +51,7 @@ describe('ERC1155Proxy', () => { let receiver: string; let receiverContract: string; // contracts & wrappers - let erc1155Proxy: ERC721ProxyContract; + let erc1155Proxy: ERC1155ProxyContract; let erc1155Receiver: DummyERC1155ReceiverContract; let erc1155ProxyWrapper: ERC1155ProxyWrapper; let erc1155Contract: ERC1155MintableContract; diff --git a/contracts/asset-proxy/test/proxies.ts b/contracts/asset-proxy/test/proxies.ts index ffca38a77f..f6c21e7699 100644 --- a/contracts/asset-proxy/test/proxies.ts +++ b/contracts/asset-proxy/test/proxies.ts @@ -31,6 +31,7 @@ import * as _ from 'lodash'; import { artifacts, + ERC1155ProxyContract, ERC1155ProxyWrapper, ERC20ProxyContract, ERC20Wrapper, @@ -71,7 +72,7 @@ describe('Asset Transfer Proxies', () => { let erc721AFromTokenId: BigNumber; let erc721BFromTokenId: BigNumber; - let erc1155Proxy: ERC721ProxyContract; + let erc1155Proxy: ERC1155ProxyContract; let erc1155ProxyWrapper: ERC1155ProxyWrapper; let erc1155Contract: ERC1155MintableContract; let erc1155Contract2: ERC1155MintableContract; diff --git a/contracts/exchange/test/core.ts b/contracts/exchange/test/core.ts index 79b9d06185..ab77c8eb54 100644 --- a/contracts/exchange/test/core.ts +++ b/contracts/exchange/test/core.ts @@ -1,5 +1,6 @@ import { artifacts as proxyArtifacts, + ERC1155ProxyContract, ERC1155ProxyWrapper, ERC20ProxyContract, ERC20Wrapper, @@ -69,7 +70,7 @@ describe('Exchange core', () => { let exchange: ExchangeContract; let erc20Proxy: ERC20ProxyContract; let erc721Proxy: ERC721ProxyContract; - let erc1155Proxy: ERC721ProxyContract; + let erc1155Proxy: ERC1155ProxyContract; let multiAssetProxy: MultiAssetProxyContract; let staticCallProxy: StaticCallProxyContract; let staticCallTarget: TestStaticCallTargetContract; diff --git a/contracts/multisig/test/utils/asset_proxy_owner_wrapper.ts b/contracts/multisig/test/utils/asset_proxy_owner_wrapper.ts index afb6cb33ce..fdc3862450 100644 --- a/contracts/multisig/test/utils/asset_proxy_owner_wrapper.ts +++ b/contracts/multisig/test/utils/asset_proxy_owner_wrapper.ts @@ -4,14 +4,17 @@ import { BigNumber } from '@0x/utils'; import { Web3Wrapper } from '@0x/web3-wrapper'; import { TransactionReceiptWithDecodedLogs } from 'ethereum-types'; -import { AssetProxyOwnerContract } from '../../generated-wrappers/asset_proxy_owner'; +import { AssetProxyOwnerContract, TestAssetProxyOwnerContract } from '../../src'; import { artifacts } from '../../src/artifacts'; export class AssetProxyOwnerWrapper { - private readonly _assetProxyOwner: AssetProxyOwnerContract; + private readonly _assetProxyOwner: AssetProxyOwnerContract | TestAssetProxyOwnerContract; private readonly _web3Wrapper: Web3Wrapper; private readonly _logDecoder: LogDecoder; - constructor(assetproxyOwnerContract: AssetProxyOwnerContract, provider: Web3ProviderEngine) { + constructor( + assetproxyOwnerContract: AssetProxyOwnerContract | TestAssetProxyOwnerContract, + provider: Web3ProviderEngine, + ) { this._assetProxyOwner = assetproxyOwnerContract; this._web3Wrapper = new Web3Wrapper(provider); this._logDecoder = new LogDecoder(this._web3Wrapper, { ...artifacts, ...proxyArtifacts }); @@ -57,7 +60,7 @@ export class AssetProxyOwnerWrapper { ): Promise { // tslint:disable-next-line:no-unnecessary-type-assertion const txHash = await (this - ._assetProxyOwner as AssetProxyOwnerContract).executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync( + ._assetProxyOwner as TestAssetProxyOwnerContract).executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync( txId, { from, diff --git a/contracts/multisig/test/utils/multi_sig_wrapper.ts b/contracts/multisig/test/utils/multi_sig_wrapper.ts index 9a405d0671..11f2ce51eb 100644 --- a/contracts/multisig/test/utils/multi_sig_wrapper.ts +++ b/contracts/multisig/test/utils/multi_sig_wrapper.ts @@ -3,14 +3,17 @@ import { BigNumber } from '@0x/utils'; import { Web3Wrapper } from '@0x/web3-wrapper'; import { TransactionReceiptWithDecodedLogs } from 'ethereum-types'; -import { MultiSigWalletContract } from '../../generated-wrappers/multi_sig_wallet'; +import { MultiSigWalletContract, MultiSigWalletWithTimeLockContract } from '../../src'; import { artifacts } from '../../src/artifacts'; export class MultiSigWrapper { - private readonly _multiSig: MultiSigWalletContract; + private readonly _multiSig: MultiSigWalletContract | MultiSigWalletWithTimeLockContract; private readonly _web3Wrapper: Web3Wrapper; private readonly _logDecoder: LogDecoder; - constructor(multiSigContract: MultiSigWalletContract, provider: Web3ProviderEngine) { + constructor( + multiSigContract: MultiSigWalletContract | MultiSigWalletWithTimeLockContract, + provider: Web3ProviderEngine, + ) { this._multiSig = multiSigContract; this._web3Wrapper = new Web3Wrapper(provider); this._logDecoder = new LogDecoder(this._web3Wrapper, artifacts); diff --git a/packages/abi-gen-templates/contract.handlebars b/packages/abi-gen-templates/contract.handlebars index 67d1b6e198..78c5e47d89 100644 --- a/packages/abi-gen-templates/contract.handlebars +++ b/packages/abi-gen-templates/contract.handlebars @@ -1,7 +1,11 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { BaseContract{{#if events}}, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager{{/if}},PromiseWithTransactionHash } from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -9,7 +13,8 @@ import { CallData, ContractAbi, ContractArtifact, - DecodedLogArgs, + DecodedLogArgs,{{#if events}} + LogWithDecodedArgs,{{/if}} MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -53,7 +58,8 @@ export class {{contractName}}Contract extends BaseContract { {{> tx contractName=../contractName}} {{/this.constant}} {{/each}} - public static async deployFrom0xArtifactAsync( +{{#if events}}private readonly _subscriptionManager: SubscriptionManager<{{contractName}}EventArgs, {{contractName}}Events>; +{{/if}}public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, txDefaults: Partial, @@ -138,10 +144,82 @@ export class {{contractName}}Contract extends BaseContract { {{/each}} ] as ContractAbi; return abi; + }{{#if events}} + /** + * Subscribe to an event type emitted by the {{contractName}} contract. + * @param eventName The {{contractName}} 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( + eventName: {{contractName}}Events, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, {{contractName}}Events); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + {{contractName}}Contract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The {{contractName}} 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( + eventName: {{contractName}}Events, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, {{contractName}}Events); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + {{contractName}}Contract.ABI(), + ); + return logs; + }{{/if}} constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('{{contractName}}', {{contractName}}Contract.ABI(), address, supportedProvider, txDefaults); - classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']);{{#if events}} + this._subscriptionManager = new SubscriptionManager<{{contractName}}EventArgs, {{contractName}}Events>( + {{contractName}}Contract.ABI(), + this._web3Wrapper, + );{{/if}} } } diff --git a/packages/abi-gen-wrappers/CHANGELOG.json b/packages/abi-gen-wrappers/CHANGELOG.json index b58bfaf9dc..efe4f57227 100644 --- a/packages/abi-gen-wrappers/CHANGELOG.json +++ b/packages/abi-gen-wrappers/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "5.1.0", + "changes": [ + { + "note": "Add subscribe/unsubscribe methods for events", + "pr": 1970 + } + ] + }, { "timestamp": 1563957393, "version": "5.0.3", diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/asset_proxy_owner.ts b/packages/abi-gen-wrappers/src/generated-wrappers/asset_proxy_owner.ts index dd2689fa7b..45f96008b2 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/asset_proxy_owner.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/asset_proxy_owner.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -2083,6 +2091,7 @@ export class AssetProxyOwnerContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -2861,9 +2870,81 @@ export class AssetProxyOwnerContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the AssetProxyOwner contract. + * @param eventName The AssetProxyOwner 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( + eventName: AssetProxyOwnerEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, AssetProxyOwnerEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + AssetProxyOwnerContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The AssetProxyOwner 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( + eventName: AssetProxyOwnerEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, AssetProxyOwnerEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + AssetProxyOwnerContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('AssetProxyOwner', AssetProxyOwnerContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + AssetProxyOwnerContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/coordinator_registry.ts b/packages/abi-gen-wrappers/src/generated-wrappers/coordinator_registry.ts index 4502db105a..427ea64aed 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/coordinator_registry.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/coordinator_registry.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -192,6 +200,7 @@ export class CoordinatorRegistryContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -313,9 +322,81 @@ export class CoordinatorRegistryContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the CoordinatorRegistry contract. + * @param eventName The CoordinatorRegistry 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( + eventName: CoordinatorRegistryEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, CoordinatorRegistryEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + CoordinatorRegistryContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The CoordinatorRegistry 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( + eventName: CoordinatorRegistryEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, CoordinatorRegistryEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + CoordinatorRegistryContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('CoordinatorRegistry', CoordinatorRegistryContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + CoordinatorRegistryContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/dummy_erc20_token.ts b/packages/abi-gen-wrappers/src/generated-wrappers/dummy_erc20_token.ts index 58c465ea81..7d32562817 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/dummy_erc20_token.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/dummy_erc20_token.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -1102,6 +1110,7 @@ export class DummyERC20TokenContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -1497,9 +1506,81 @@ export class DummyERC20TokenContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the DummyERC20Token contract. + * @param eventName The DummyERC20Token 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( + eventName: DummyERC20TokenEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, DummyERC20TokenEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + DummyERC20TokenContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The DummyERC20Token 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( + eventName: DummyERC20TokenEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, DummyERC20TokenEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + DummyERC20TokenContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('DummyERC20Token', DummyERC20TokenContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + DummyERC20TokenContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/dummy_erc721_token.ts b/packages/abi-gen-wrappers/src/generated-wrappers/dummy_erc721_token.ts index 3852687fc9..ad2c8a15b5 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/dummy_erc721_token.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/dummy_erc721_token.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -1432,6 +1440,7 @@ export class DummyERC721TokenContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -1866,9 +1875,81 @@ export class DummyERC721TokenContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the DummyERC721Token contract. + * @param eventName The DummyERC721Token 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( + eventName: DummyERC721TokenEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, DummyERC721TokenEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + DummyERC721TokenContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The DummyERC721Token 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( + eventName: DummyERC721TokenEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, DummyERC721TokenEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + DummyERC721TokenContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('DummyERC721Token', DummyERC721TokenContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + DummyERC721TokenContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/erc20_proxy.ts b/packages/abi-gen-wrappers/src/generated-wrappers/erc20_proxy.ts index cf54c78d8b..e9dbd86a3a 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/erc20_proxy.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/erc20_proxy.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -691,6 +699,7 @@ export class ERC20ProxyContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -933,9 +942,81 @@ export class ERC20ProxyContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the ERC20Proxy contract. + * @param eventName The ERC20Proxy 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( + eventName: ERC20ProxyEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, ERC20ProxyEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + ERC20ProxyContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The ERC20Proxy 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( + eventName: ERC20ProxyEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, ERC20ProxyEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + ERC20ProxyContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('ERC20Proxy', ERC20ProxyContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + ERC20ProxyContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/erc20_token.ts b/packages/abi-gen-wrappers/src/generated-wrappers/erc20_token.ts index 8f0812c7f7..d8c303fef3 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/erc20_token.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/erc20_token.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -579,6 +587,7 @@ export class ERC20TokenContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -813,9 +822,81 @@ export class ERC20TokenContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the ERC20Token contract. + * @param eventName The ERC20Token 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( + eventName: ERC20TokenEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, ERC20TokenEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + ERC20TokenContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The ERC20Token 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( + eventName: ERC20TokenEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, ERC20TokenEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + ERC20TokenContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('ERC20Token', ERC20TokenContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + ERC20TokenContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/erc721_proxy.ts b/packages/abi-gen-wrappers/src/generated-wrappers/erc721_proxy.ts index c8664c3b1a..d9f18a654e 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/erc721_proxy.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/erc721_proxy.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -691,6 +699,7 @@ export class ERC721ProxyContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -933,9 +942,81 @@ export class ERC721ProxyContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the ERC721Proxy contract. + * @param eventName The ERC721Proxy 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( + eventName: ERC721ProxyEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, ERC721ProxyEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + ERC721ProxyContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The ERC721Proxy 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( + eventName: ERC721ProxyEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, ERC721ProxyEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + ERC721ProxyContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('ERC721Proxy', ERC721ProxyContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + ERC721ProxyContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/erc721_token.ts b/packages/abi-gen-wrappers/src/generated-wrappers/erc721_token.ts index 3a271860d5..00f849aca6 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/erc721_token.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/erc721_token.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -972,6 +980,7 @@ export class ERC721TokenContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -1286,9 +1295,81 @@ export class ERC721TokenContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the ERC721Token contract. + * @param eventName The ERC721Token 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( + eventName: ERC721TokenEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, ERC721TokenEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + ERC721TokenContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The ERC721Token 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( + eventName: ERC721TokenEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, ERC721TokenEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + ERC721TokenContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('ERC721Token', ERC721TokenContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + ERC721TokenContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/exchange.ts b/packages/abi-gen-wrappers/src/generated-wrappers/exchange.ts index 4f849c1873..0cdd34e277 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/exchange.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/exchange.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -4555,6 +4563,7 @@ export class ExchangeContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -6591,9 +6600,81 @@ export class ExchangeContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * 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( + eventName: ExchangeEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + ExchangeContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.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( + eventName: ExchangeEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + ExchangeContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('Exchange', ExchangeContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + ExchangeContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/multi_asset_proxy.ts b/packages/abi-gen-wrappers/src/generated-wrappers/multi_asset_proxy.ts index 119b1d76fb..23da203f8b 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/multi_asset_proxy.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/multi_asset_proxy.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -888,6 +896,7 @@ export class MultiAssetProxyContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -1200,9 +1209,81 @@ export class MultiAssetProxyContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the MultiAssetProxy contract. + * @param eventName The MultiAssetProxy 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( + eventName: MultiAssetProxyEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, MultiAssetProxyEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + MultiAssetProxyContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The MultiAssetProxy 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( + eventName: MultiAssetProxyEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, MultiAssetProxyEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + MultiAssetProxyContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('MultiAssetProxy', MultiAssetProxyContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + MultiAssetProxyContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/weth9.ts b/packages/abi-gen-wrappers/src/generated-wrappers/weth9.ts index 49ac1028aa..51de23f67f 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/weth9.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/weth9.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -884,6 +892,7 @@ export class WETH9Contract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -1226,9 +1235,81 @@ export class WETH9Contract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the WETH9 contract. + * @param eventName The WETH9 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( + eventName: WETH9Events, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, WETH9Events); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + WETH9Contract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The WETH9 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( + eventName: WETH9Events, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, WETH9Events); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + WETH9Contract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('WETH9', WETH9Contract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + WETH9Contract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/zrx_token.ts b/packages/abi-gen-wrappers/src/generated-wrappers/zrx_token.ts index 1072cdba29..b0d5ff3df7 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/zrx_token.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/zrx_token.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -693,6 +701,7 @@ export class ZRXTokenContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -966,9 +975,81 @@ export class ZRXTokenContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the ZRXToken contract. + * @param eventName The ZRXToken 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( + eventName: ZRXTokenEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, ZRXTokenEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + ZRXTokenContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The ZRXToken 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( + eventName: ZRXTokenEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, ZRXTokenEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + ZRXTokenContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('ZRXToken', ZRXTokenContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + ZRXTokenContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen/package.json b/packages/abi-gen/package.json index 688f87f718..6f73c07925 100644 --- a/packages/abi-gen/package.json +++ b/packages/abi-gen/package.json @@ -93,6 +93,7 @@ "mocha": "^6.2.0", "npm-run-all": "^4.1.2", "shx": "^0.2.2", + "sinon": "^4.0.0", "solhint": "^1.4.1", "tslint": "5.11.0", "typescript": "3.0.1" diff --git a/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py b/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py index 70ca086ae5..0b33e533be 100644 --- a/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py +++ b/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py @@ -197,6 +197,39 @@ class AbiGenDummy(BaseContractWrapper): view_only=True ) + def withdraw( + self, + wad: int, + tx_params: Optional[TxParams] = None, + view_only: bool = False, + ) -> Union[None, Union[HexBytes, bytes]]: + """Execute underlying, same-named contract method. + + :param tx_params: transaction parameters + :param view_only: whether to use transact() or call() + + :returns: if param `view_only`:code: is `True`:code:, then returns the + value returned from the underlying function; else returns the + transaction hash. + """ + self.validator.assert_valid( + method_name='withdraw', + parameter_name='wad', + argument_value=wad, + ) + # safeguard against fractional inputs + wad = int(wad) + func = self._get_contract_instance( + self.contract_address + ).functions.withdraw( + wad + ) + return self._invoke_function_call( + func=func, + tx_params=tx_params, + view_only=view_only + ) + def ecrecover_fn( self, _hash: bytes, @@ -595,6 +628,19 @@ class AbiGenDummy(BaseContractWrapper): tx_params=tx_params, view_only=True ) + def get_withdrawal_event( + self, tx_hash: Union[HexBytes, bytes] + ) -> Tuple[AttributeDict]: + """Get log entry for Withdrawal event. + + :param tx_hash: hash of transaction emitting Withdrawal event + """ + tx_receipt = self._web3_eth.getTransactionReceipt(tx_hash) + return ( + self._get_contract_instance(self.contract_address) + .events.Withdrawal() + .processReceipt(tx_receipt) + ) def get_an_event_event( self, tx_hash: Union[HexBytes, bytes] ) -> Tuple[AttributeDict]: @@ -613,7 +659,7 @@ class AbiGenDummy(BaseContractWrapper): def abi(): """Return the ABI to the underlying contract.""" return json.loads( - '[{"constant":true,"inputs":[],"name":"simpleRequire","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"bytes[]"}],"name":"acceptsAnArrayOfBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"ecrecoverFn","outputs":[{"name":"signerAddress","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"bytes"}],"name":"acceptsBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"revertWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"simpleRevert","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"nestedStructOutput","outputs":[{"components":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"innerStruct","type":"tuple"},{"name":"description","type":"string"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"requireWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"address"},{"name":"a","type":"uint256"},{"name":"b","type":"uint256"},{"name":"y","type":"address"},{"name":"c","type":"uint256"}],"name":"withAddressInput","outputs":[{"name":"z","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"s","type":"tuple"}],"name":"structInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"}],"name":"simplePureFunctionWithInput","outputs":[{"name":"sum","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethodThatReturnsNothing","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"simplePureFunction","outputs":[{"name":"result","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"innerStruct","type":"tuple"},{"name":"description","type":"string"}],"name":"n","type":"tuple"}],"name":"nestedStructInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"structOutput","outputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"s","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"pureFunctionWithConstant","outputs":[{"name":"someConstant","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"param","type":"uint8"}],"name":"AnEvent","type":"event"}]' # noqa: E501 (line-too-long) + '[{"constant":true,"inputs":[],"name":"simpleRequire","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"bytes[]"}],"name":"acceptsAnArrayOfBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"ecrecoverFn","outputs":[{"name":"signerAddress","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"bytes"}],"name":"acceptsBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"revertWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"simpleRevert","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"nestedStructOutput","outputs":[{"components":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"innerStruct","type":"tuple"},{"name":"description","type":"string"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"requireWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"address"},{"name":"a","type":"uint256"},{"name":"b","type":"uint256"},{"name":"y","type":"address"},{"name":"c","type":"uint256"}],"name":"withAddressInput","outputs":[{"name":"z","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"s","type":"tuple"}],"name":"structInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"}],"name":"simplePureFunctionWithInput","outputs":[{"name":"sum","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethodThatReturnsNothing","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"simplePureFunction","outputs":[{"name":"result","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"innerStruct","type":"tuple"},{"name":"description","type":"string"}],"name":"n","type":"tuple"}],"name":"nestedStructInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"structOutput","outputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"s","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"pureFunctionWithConstant","outputs":[{"name":"someConstant","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"param","type":"uint8"}],"name":"AnEvent","type":"event"}]' # noqa: E501 (line-too-long) ) # pylint: disable=too-many-lines diff --git a/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts b/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts index 67ca4b9534..cb741017c4 100644 --- a/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts +++ b/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts @@ -1,7 +1,14 @@ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable -import { BaseContract, PromiseWithTransactionHash } from '@0x/base-contract'; +import { + BaseContract, + BlockRange, + EventCallback, + IndexedFilterValues, + SubscriptionManager, + PromiseWithTransactionHash, +} from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, @@ -10,6 +17,7 @@ import { ContractAbi, ContractArtifact, DecodedLogArgs, + LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, @@ -23,12 +31,18 @@ import { assert } from '@0x/assert'; import * as ethers from 'ethers'; // tslint:enable:no-unused-variable -export type AbiGenDummyEventArgs = AbiGenDummyAnEventEventArgs; +export type AbiGenDummyEventArgs = AbiGenDummyWithdrawalEventArgs | AbiGenDummyAnEventEventArgs; export enum AbiGenDummyEvents { + Withdrawal = 'Withdrawal', AnEvent = 'AnEvent', } +export interface AbiGenDummyWithdrawalEventArgs extends DecodedLogArgs { + _owner: string; + _value: BigNumber; +} + export interface AbiGenDummyAnEventEventArgs extends DecodedLogArgs { param: number; } @@ -115,6 +129,106 @@ export class AbiGenDummyContract extends BaseContract { return abiEncodedTransactionData; }, }; + public withdraw = { + async sendTransactionAsync(wad: BigNumber, txData?: Partial | undefined): Promise { + assert.isBigNumber('wad', wad); + const self = (this as any) as AbiGenDummyContract; + const encodedData = self._strictEncodeArguments('withdraw(uint256)', [wad]); + const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...txData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + self.withdraw.estimateGasAsync.bind(self, wad), + ); + if (txDataWithDefaults.from !== undefined) { + txDataWithDefaults.from = txDataWithDefaults.from.toLowerCase(); + } + + const txHash = await self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); + return txHash; + }, + awaitTransactionSuccessAsync( + wad: BigNumber, + txData?: Partial, + pollingIntervalMs?: number, + timeoutMs?: number, + ): PromiseWithTransactionHash { + assert.isBigNumber('wad', wad); + const self = (this as any) as AbiGenDummyContract; + const txHashPromise = self.withdraw.sendTransactionAsync(wad, txData); + return new PromiseWithTransactionHash( + txHashPromise, + (async (): Promise => { + // When the transaction hash resolves, wait for it to be mined. + return self._web3Wrapper.awaitTransactionSuccessAsync( + await txHashPromise, + pollingIntervalMs, + timeoutMs, + ); + })(), + ); + }, + async estimateGasAsync(wad: BigNumber, txData?: Partial | undefined): Promise { + assert.isBigNumber('wad', wad); + const self = (this as any) as AbiGenDummyContract; + const encodedData = self._strictEncodeArguments('withdraw(uint256)', [wad]); + const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...txData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + if (txDataWithDefaults.from !== undefined) { + txDataWithDefaults.from = txDataWithDefaults.from.toLowerCase(); + } + + const gas = await self._web3Wrapper.estimateGasAsync(txDataWithDefaults); + return gas; + }, + async callAsync(wad: BigNumber, callData: Partial = {}, defaultBlock?: BlockParam): Promise { + assert.isBigNumber('wad', wad); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as AbiGenDummyContract; + const encodedData = self._strictEncodeArguments('withdraw(uint256)', [wad]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('withdraw(uint256)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + getABIEncodedTransactionData(wad: BigNumber): string { + assert.isBigNumber('wad', wad); + const self = (this as any) as AbiGenDummyContract; + const abiEncodedTransactionData = self._strictEncodeArguments('withdraw(uint256)', [wad]); + return abiEncodedTransactionData; + }, + }; public ecrecoverFn = { async callAsync( hash: string, @@ -903,6 +1017,7 @@ export class AbiGenDummyContract extends BaseContract { return abiEncodedTransactionData; }, }; + private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, @@ -982,6 +1097,20 @@ export class AbiGenDummyContract extends BaseContract { stateMutability: 'pure', type: 'function', }, + { + constant: false, + inputs: [ + { + name: 'wad', + type: 'uint256', + }, + ], + name: 'withdraw', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, { constant: true, inputs: [ @@ -1307,6 +1436,24 @@ export class AbiGenDummyContract extends BaseContract { stateMutability: 'pure', type: 'function', }, + { + anonymous: false, + inputs: [ + { + name: '_owner', + type: 'address', + indexed: true, + }, + { + name: '_value', + type: 'uint256', + indexed: false, + }, + ], + name: 'Withdrawal', + outputs: [], + type: 'event', + }, { anonymous: false, inputs: [ @@ -1323,9 +1470,81 @@ export class AbiGenDummyContract extends BaseContract { ] as ContractAbi; return abi; } + /** + * Subscribe to an event type emitted by the AbiGenDummy contract. + * @param eventName The AbiGenDummy 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( + eventName: AbiGenDummyEvents, + indexFilterValues: IndexedFilterValues, + callback: EventCallback, + isVerbose: boolean = false, + blockPollingIntervalMs?: number, + ): string { + assert.doesBelongToStringEnum('eventName', eventName, AbiGenDummyEvents); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + assert.isFunction('callback', callback); + const subscriptionToken = this._subscriptionManager.subscribe( + this.address, + eventName, + indexFilterValues, + AbiGenDummyContract.ABI(), + callback, + isVerbose, + blockPollingIntervalMs, + ); + return subscriptionToken; + } + /** + * Cancel a subscription + * @param subscriptionToken Subscription token returned by `subscribe()` + */ + public unsubscribe(subscriptionToken: string): void { + this._subscriptionManager.unsubscribe(subscriptionToken); + } + /** + * Cancels all existing subscriptions + */ + public unsubscribeAll(): void { + this._subscriptionManager.unsubscribeAll(); + } + /** + * Gets historical logs without creating a subscription + * @param eventName The AbiGenDummy 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( + eventName: AbiGenDummyEvents, + blockRange: BlockRange, + indexFilterValues: IndexedFilterValues, + ): Promise>> { + assert.doesBelongToStringEnum('eventName', eventName, AbiGenDummyEvents); + assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); + assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); + const logs = await this._subscriptionManager.getLogsAsync( + this.address, + eventName, + blockRange, + indexFilterValues, + AbiGenDummyContract.ABI(), + ); + return logs; + } constructor(address: string, supportedProvider: SupportedProvider, txDefaults?: Partial) { super('AbiGenDummy', AbiGenDummyContract.ABI(), address, supportedProvider, txDefaults); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + this._subscriptionManager = new SubscriptionManager( + AbiGenDummyContract.ABI(), + this._web3Wrapper, + ); } } diff --git a/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json b/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json index 0d6cf52860..6150aefefa 100644 --- a/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json +++ b/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json @@ -26,6 +26,20 @@ "stateMutability": "pure", "type": "function" }, + { + "constant": false, + "inputs": [ + { + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": true, "inputs": [ @@ -351,6 +365,23 @@ "stateMutability": "pure", "type": "function" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "_value", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -381,15 +412,15 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b50610b98806100206000396000f3fe608060405234801561001057600080fd5b506004361061011a5760003560e01c806363d69c88116100b25780639a3b618511610081578063ae2dae1711610066578063ae2dae17146101f9578063d6d7618c14610207578063d88be12f1461021c5761011a565b80639a3b6185146101e9578063a3c2f6b6146101f15761011a565b806363d69c88146101a0578063647341eb146101b357806376f15d5b146101c15780638ee52b4e146101d65761011a565b80634582eab2116100ee5780634582eab21461017357806345fdbdb71461017b57806359c28add146101835780635ba3c7c0146101985761011a565b806209e4371461011f5780630527c28f1461012957806336b323961461013c5780633e9ef66a14610165575b600080fd5b610127610224565b005b6101276101373660046106d7565b61025f565b61014f61014a366004610714565b610262565b60405161015c9190610999565b60405180910390f35b610127610137366004610757565b610127610344565b6101276103a9565b61018b6103db565b60405161015c9190610a60565b6101276103e6565b61014f6101ae366004610685565b61044b565b61012761013736600461081c565b6101c9610454565b60405161015c9190610ad3565b6101c96101e4366004610851565b610462565b610127610468565b6101c9610473565b61012761013736600461078c565b61020f610478565b60405161015c9190610ac0565b6101c9610480565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025690610a29565b60405180910390fd5b50565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081876040516020016102b3929190610977565b604051602081830303815290604052805190602001209050600181878787604051600081526020016040526040516102ee94939291906109ba565b6020604051602081039080840390855afa158015610310573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a000000000000000000000000000000000000000000000000000000000815261025691906004016109d8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610256906109f2565b6103e3610486565b90565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a000000000000000000000000000000000000000000000000000000000815261025691906004016109d8565b50929392505050565b600080546001019081905590565b60010190565b600080546001019055565b600190565b6103e36104a6565b6104d290565b6040518060a001604052806104996104a6565b8152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b600082601f8301126104e4578081fd5b813567ffffffffffffffff8111156104fa578182fd5b60206105098182840201610adc565b828152925080830184820160005b848110156105405761052e888584358a010161054b565b83529183019190830190600101610517565b505050505092915050565b600082601f83011261055b578081fd5b813567ffffffffffffffff811115610571578182fd5b6105a260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610adc565b91508082528360208285010111156105b957600080fd5b8060208401602084013760009082016020015292915050565b6000608082840312156105e3578081fd5b6105ed6080610adc565b90506000823567ffffffffffffffff80821115610608578283fd5b6106148683870161054b565b84526020850135915063ffffffff8216821461062e578283fd5b8160208501526040850135915080821115610647578283fd5b610653868387016104d4565b6040850152606085013591508082111561066b578283fd5b506106788582860161054b565b6060840152505092915050565b600080600080600060a0868803121561069d57600080fd5b85356106a881610b33565b9450602086013593506040860135925060608601356106c681610b33565b949793965091946080013592915050565b6000602082840312156106e957600080fd5b813567ffffffffffffffff81111561070057600080fd5b61070c848285016104d4565b949350505050565b6000806000806080858703121561072a57600080fd5b84359350602085013560ff8116811461074257600080fd5b93969395505050506040820135916060013590565b60006020828403121561076957600080fd5b813567ffffffffffffffff81111561078057600080fd5b61070c8482850161054b565b60006020828403121561079d578081fd5b813567ffffffffffffffff808211156107b4578283fd5b818401604081870312156107c6578384fd5b6107d06040610adc565b92508035828111156107e0578485fd5b6107ec878284016105d2565b845250602081013582811115610800578485fd5b61080c8782840161054b565b6020850152509195945050505050565b60006020828403121561082e57600080fd5b813567ffffffffffffffff81111561084557600080fd5b61070c848285016105d2565b60006020828403121561086357600080fd5b5035919050565b60008151808452610882816020860160208601610b03565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151608084526108c9608085018261086a565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b82851015610950577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086830301845261093c82825161086a565b600195909501949387019391508601610902565b506060880151955088810360608a015261096a818761086a565b9998505050505050505050565b60008351610989818460208801610b03565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526109eb602083018461086a565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160406020840152610a7c60608401826108b4565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848203016040850152610ab7818361086a565b95945050505050565b6000602082526109eb60208301846108b4565b90815260200190565b60405181810167ffffffffffffffff81118282101715610afb57600080fd5b604052919050565b60005b83811015610b1e578181015183820152602001610b06565b83811115610b2d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461025f57600080fdfea365627a7a72305820888f51db8be2b65eeba07b18b43cdc6dad5d8e6807eb4aa7f11e06f111742aef6c6578706572696d656e74616cf564736f6c634300050a0040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB98 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x11A JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63D69C88 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x9A3B6185 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xAE2DAE17 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x1F9 JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x207 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x21C JUMPI PUSH2 0x11A JUMP JUMPDEST DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x1E9 JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x1F1 JUMPI PUSH2 0x11A JUMP JUMPDEST DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0x647341EB EQ PUSH2 0x1B3 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x1C1 JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x1D6 JUMPI PUSH2 0x11A JUMP JUMPDEST DUP1 PUSH4 0x4582EAB2 GT PUSH2 0xEE JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x173 JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x17B JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x183 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x198 JUMPI PUSH2 0x11A JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x129 JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x165 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x127 PUSH2 0x224 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x127 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x25F JUMP JUMPDEST PUSH2 0x14F PUSH2 0x14A CALLDATASIZE PUSH1 0x4 PUSH2 0x714 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15C SWAP2 SWAP1 PUSH2 0x999 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x127 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x757 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x344 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x3A9 JUMP JUMPDEST PUSH2 0x18B PUSH2 0x3DB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15C SWAP2 SWAP1 PUSH2 0xA60 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x3E6 JUMP JUMPDEST PUSH2 0x14F PUSH2 0x1AE CALLDATASIZE PUSH1 0x4 PUSH2 0x685 JUMP JUMPDEST PUSH2 0x44B JUMP JUMPDEST PUSH2 0x127 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x81C JUMP JUMPDEST PUSH2 0x1C9 PUSH2 0x454 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15C SWAP2 SWAP1 PUSH2 0xAD3 JUMP JUMPDEST PUSH2 0x1C9 PUSH2 0x1E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x851 JUMP JUMPDEST PUSH2 0x462 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x468 JUMP JUMPDEST PUSH2 0x1C9 PUSH2 0x473 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x78C JUMP JUMPDEST PUSH2 0x20F PUSH2 0x478 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15C SWAP2 SWAP1 PUSH2 0xAC0 JUMP JUMPDEST PUSH2 0x1C9 PUSH2 0x480 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x256 SWAP1 PUSH2 0xA29 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2B3 SWAP3 SWAP2 SWAP1 PUSH2 0x977 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x2EE SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x9BA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x310 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x256 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x9D8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x256 SWAP1 PUSH2 0x9F2 JUMP JUMPDEST PUSH2 0x3E3 PUSH2 0x486 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x256 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x9D8 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x3E3 PUSH2 0x4A6 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x499 PUSH2 0x4A6 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4E4 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4FA JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0x509 DUP2 DUP3 DUP5 MUL ADD PUSH2 0xADC JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x540 JUMPI PUSH2 0x52E DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0x54B JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x517 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x55B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x571 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x5A2 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0xADC JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5E3 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x5ED PUSH1 0x80 PUSH2 0xADC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x608 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x614 DUP7 DUP4 DUP8 ADD PUSH2 0x54B JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0x62E JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x647 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x653 DUP7 DUP4 DUP8 ADD PUSH2 0x4D4 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x66B JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x678 DUP6 DUP3 DUP7 ADD PUSH2 0x54B JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x69D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x6A8 DUP2 PUSH2 0xB33 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0x6C6 DUP2 PUSH2 0xB33 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x6E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x700 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x70C DUP5 DUP3 DUP6 ADD PUSH2 0x4D4 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x72A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x742 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x769 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x780 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x70C DUP5 DUP3 DUP6 ADD PUSH2 0x54B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x79D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x7B4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x7C6 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x7D0 PUSH1 0x40 PUSH2 0xADC JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x7E0 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x7EC DUP8 DUP3 DUP5 ADD PUSH2 0x5D2 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x800 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x80C DUP8 DUP3 DUP5 ADD PUSH2 0x54B JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x82E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x845 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x70C DUP5 DUP3 DUP6 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x863 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x882 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xB03 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0x8C9 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x86A JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x950 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0x93C DUP3 DUP3 MLOAD PUSH2 0x86A JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0x902 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0x96A DUP2 DUP8 PUSH2 0x86A JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x989 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0xB03 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x9EB PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x86A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xA7C PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x8B4 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0xAB7 DUP2 DUP4 PUSH2 0x86A JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x9EB PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x8B4 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xAFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB1E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB06 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xB2D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723058 KECCAK256 DUP9 DUP16 MLOAD 0xdb DUP12 0xe2 0xb6 0x5e 0xeb LOG0 PUSH28 0x18B43CDC6DAD5D8E6807EB4AA7F11E06F111742AEF6C657870657269 PUSH14 0x656E74616CF564736F6C63430005 EXP STOP BLOCKHASH ", - "sourceMap": "641:2757:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:2757:0;;;;;;;" + "object": "0x608060405234801561001057600080fd5b50610c17806100206000396000f3fe608060405234801561001057600080fd5b50600436106101355760003560e01c806363d69c88116100b25780639a3b618511610081578063ae2dae1711610066578063ae2dae1714610227578063d6d7618c14610235578063d88be12f1461024a57610135565b80639a3b618514610217578063a3c2f6b61461021f57610135565b806363d69c88146101ce578063647341eb146101e157806376f15d5b146101ef5780638ee52b4e1461020457610135565b80633e9ef66a1161010957806345fdbdb7116100ee57806345fdbdb7146101a957806359c28add146101b15780635ba3c7c0146101c657610135565b80633e9ef66a146101935780634582eab2146101a157610135565b806209e4371461013a5780630527c28f146101445780632e1a7d4d1461015757806336b323961461016a575b600080fd5b610142610252565b005b610142610152366004610756565b61028d565b6101426101653660046108d0565b610290565b61017d610178366004610793565b6102e1565b60405161018a9190610a18565b60405180910390f35b6101426101523660046107d6565b6101426103c3565b610142610428565b6101b961045a565b60405161018a9190610adf565b610142610465565b61017d6101dc366004610704565b6104ca565b61014261015236600461089b565b6101f76104d3565b60405161018a9190610b52565b6101f76102123660046108d0565b6104e1565b6101426104e7565b6101f76104f2565b61014261015236600461080b565b61023d6104f7565b60405161018a9190610b3f565b6101f76104ff565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028490610aa8565b60405180910390fd5b50565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040516102d69190610b52565b60405180910390a250565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081876040516020016103329291906109f6565b6040516020818303038152906040528051906020012090506001818787876040516000815260200160405260405161036d9493929190610a39565b6020604051602081039080840390855afa15801561038f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526102849190600401610a57565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028490610a71565b610462610505565b90565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526102849190600401610a57565b50929392505050565b600080546001019081905590565b60010190565b600080546001019055565b600190565b610462610525565b6104d290565b6040518060a00160405280610518610525565b8152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b600082601f830112610563578081fd5b813567ffffffffffffffff811115610579578182fd5b60206105888182840201610b5b565b828152925080830184820160005b848110156105bf576105ad888584358a01016105ca565b83529183019190830190600101610596565b505050505092915050565b600082601f8301126105da578081fd5b813567ffffffffffffffff8111156105f0578182fd5b61062160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610b5b565b915080825283602082850101111561063857600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610662578081fd5b61066c6080610b5b565b90506000823567ffffffffffffffff80821115610687578283fd5b610693868387016105ca565b84526020850135915063ffffffff821682146106ad578283fd5b81602085015260408501359150808211156106c6578283fd5b6106d286838701610553565b604085015260608501359150808211156106ea578283fd5b506106f7858286016105ca565b6060840152505092915050565b600080600080600060a0868803121561071c57600080fd5b853561072781610bb2565b94506020860135935060408601359250606086013561074581610bb2565b949793965091946080013592915050565b60006020828403121561076857600080fd5b813567ffffffffffffffff81111561077f57600080fd5b61078b84828501610553565b949350505050565b600080600080608085870312156107a957600080fd5b84359350602085013560ff811681146107c157600080fd5b93969395505050506040820135916060013590565b6000602082840312156107e857600080fd5b813567ffffffffffffffff8111156107ff57600080fd5b61078b848285016105ca565b60006020828403121561081c578081fd5b813567ffffffffffffffff80821115610833578283fd5b81840160408187031215610845578384fd5b61084f6040610b5b565b925080358281111561085f578485fd5b61086b87828401610651565b84525060208101358281111561087f578485fd5b61088b878284016105ca565b6020850152509195945050505050565b6000602082840312156108ad57600080fd5b813567ffffffffffffffff8111156108c457600080fd5b61078b84828501610651565b6000602082840312156108e257600080fd5b5035919050565b60008151808452610901816020860160208601610b82565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516080845261094860808501826108e9565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b828510156109cf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08683030184526109bb8282516108e9565b600195909501949387019391508601610981565b506060880151955088810360608a01526109e981876108e9565b9998505050505050505050565b60008351610a08818460208801610b82565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610a6a60208301846108e9565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160406020840152610afb6060840182610933565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848203016040850152610b3681836108e9565b95945050505050565b600060208252610a6a6020830184610933565b90815260200190565b60405181810167ffffffffffffffff81118282101715610b7a57600080fd5b604052919050565b60005b83811015610b9d578181015183820152602001610b85565b83811115610bac576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461028d57600080fdfea365627a7a723058201a16b3cd19a115b5cfe3a42e5ddcd7a41b75f4a376a121a647cd429cbbf546266c6578706572696d656e74616cf564736f6c634300050a0040", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC17 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x135 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63D69C88 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x9A3B6185 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xAE2DAE17 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x24A JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x217 JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x21F JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x1CE JUMPI DUP1 PUSH4 0x647341EB EQ PUSH2 0x1E1 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x1EF JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x204 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A GT PUSH2 0x109 JUMPI DUP1 PUSH4 0x45FDBDB7 GT PUSH2 0xEE JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x1A9 JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x1B1 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x1C6 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x193 JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x1A1 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x13A JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x144 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x157 JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x16A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x142 PUSH2 0x252 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x756 JUMP JUMPDEST PUSH2 0x28D JUMP JUMPDEST PUSH2 0x142 PUSH2 0x165 CALLDATASIZE PUSH1 0x4 PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x290 JUMP JUMPDEST PUSH2 0x17D PUSH2 0x178 CALLDATASIZE PUSH1 0x4 PUSH2 0x793 JUMP JUMPDEST PUSH2 0x2E1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x7D6 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x3C3 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x428 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x45A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xADF JUMP JUMPDEST PUSH2 0x142 PUSH2 0x465 JUMP JUMPDEST PUSH2 0x17D PUSH2 0x1DC CALLDATASIZE PUSH1 0x4 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x4CA JUMP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x89B JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4D3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xB52 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x212 CALLDATASIZE PUSH1 0x4 PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x4E1 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x4E7 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4F2 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x80B JUMP JUMPDEST PUSH2 0x23D PUSH2 0x4F7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xB3F JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4FF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x284 SWAP1 PUSH2 0xAA8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD PUSH2 0x2D6 SWAP2 SWAP1 PUSH2 0xB52 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x332 SWAP3 SWAP2 SWAP1 PUSH2 0x9F6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x36D SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xA39 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x38F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x284 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xA57 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x284 SWAP1 PUSH2 0xA71 JUMP JUMPDEST PUSH2 0x462 PUSH2 0x505 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x284 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xA57 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x462 PUSH2 0x525 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x518 PUSH2 0x525 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x563 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x579 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0x588 DUP2 DUP3 DUP5 MUL ADD PUSH2 0xB5B JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x5BF JUMPI PUSH2 0x5AD DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0x5CA JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x596 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x5DA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5F0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x621 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0xB5B JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x638 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x662 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x66C PUSH1 0x80 PUSH2 0xB5B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x687 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x693 DUP7 DUP4 DUP8 ADD PUSH2 0x5CA JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0x6AD JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x6C6 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x6D2 DUP7 DUP4 DUP8 ADD PUSH2 0x553 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x6EA JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x6F7 DUP6 DUP3 DUP7 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x71C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x727 DUP2 PUSH2 0xBB2 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0x745 DUP2 PUSH2 0xBB2 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x768 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x77F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x553 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x81C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x833 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x845 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x84F PUSH1 0x40 PUSH2 0xB5B JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x85F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x86B DUP8 DUP3 DUP5 ADD PUSH2 0x651 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x87F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x88B DUP8 DUP3 DUP5 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x651 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x901 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xB82 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0x948 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x8E9 JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x9CF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0x9BB DUP3 DUP3 MLOAD PUSH2 0x8E9 JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0x981 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0x9E9 DUP2 DUP8 PUSH2 0x8E9 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0xA08 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0xB82 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xA6A PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x8E9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xAFB PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x933 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0xB36 DUP2 DUP4 PUSH2 0x8E9 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xA6A PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x933 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB9D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB85 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xBAC JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x28D JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723058 KECCAK256 BYTE AND 0xb3 0xcd NOT LOG1 ISZERO 0xb5 0xcf 0xe3 LOG4 0x2e 0x5d 0xdc 0xd7 LOG4 SHL PUSH22 0xF4A376A121A647CD429CBBF546266C6578706572696D PUSH6 0x6E74616CF564 PUSH20 0x6F6C634300050A00400000000000000000000000 ", + "sourceMap": "641:2908:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:2908:0;;;;;;;" }, "deployedBytecode": { "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b506004361061011a5760003560e01c806363d69c88116100b25780639a3b618511610081578063ae2dae1711610066578063ae2dae17146101f9578063d6d7618c14610207578063d88be12f1461021c5761011a565b80639a3b6185146101e9578063a3c2f6b6146101f15761011a565b806363d69c88146101a0578063647341eb146101b357806376f15d5b146101c15780638ee52b4e146101d65761011a565b80634582eab2116100ee5780634582eab21461017357806345fdbdb71461017b57806359c28add146101835780635ba3c7c0146101985761011a565b806209e4371461011f5780630527c28f1461012957806336b323961461013c5780633e9ef66a14610165575b600080fd5b610127610224565b005b6101276101373660046106d7565b61025f565b61014f61014a366004610714565b610262565b60405161015c9190610999565b60405180910390f35b610127610137366004610757565b610127610344565b6101276103a9565b61018b6103db565b60405161015c9190610a60565b6101276103e6565b61014f6101ae366004610685565b61044b565b61012761013736600461081c565b6101c9610454565b60405161015c9190610ad3565b6101c96101e4366004610851565b610462565b610127610468565b6101c9610473565b61012761013736600461078c565b61020f610478565b60405161015c9190610ac0565b6101c9610480565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025690610a29565b60405180910390fd5b50565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081876040516020016102b3929190610977565b604051602081830303815290604052805190602001209050600181878787604051600081526020016040526040516102ee94939291906109ba565b6020604051602081039080840390855afa158015610310573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a000000000000000000000000000000000000000000000000000000000815261025691906004016109d8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610256906109f2565b6103e3610486565b90565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a000000000000000000000000000000000000000000000000000000000815261025691906004016109d8565b50929392505050565b600080546001019081905590565b60010190565b600080546001019055565b600190565b6103e36104a6565b6104d290565b6040518060a001604052806104996104a6565b8152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b600082601f8301126104e4578081fd5b813567ffffffffffffffff8111156104fa578182fd5b60206105098182840201610adc565b828152925080830184820160005b848110156105405761052e888584358a010161054b565b83529183019190830190600101610517565b505050505092915050565b600082601f83011261055b578081fd5b813567ffffffffffffffff811115610571578182fd5b6105a260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610adc565b91508082528360208285010111156105b957600080fd5b8060208401602084013760009082016020015292915050565b6000608082840312156105e3578081fd5b6105ed6080610adc565b90506000823567ffffffffffffffff80821115610608578283fd5b6106148683870161054b565b84526020850135915063ffffffff8216821461062e578283fd5b8160208501526040850135915080821115610647578283fd5b610653868387016104d4565b6040850152606085013591508082111561066b578283fd5b506106788582860161054b565b6060840152505092915050565b600080600080600060a0868803121561069d57600080fd5b85356106a881610b33565b9450602086013593506040860135925060608601356106c681610b33565b949793965091946080013592915050565b6000602082840312156106e957600080fd5b813567ffffffffffffffff81111561070057600080fd5b61070c848285016104d4565b949350505050565b6000806000806080858703121561072a57600080fd5b84359350602085013560ff8116811461074257600080fd5b93969395505050506040820135916060013590565b60006020828403121561076957600080fd5b813567ffffffffffffffff81111561078057600080fd5b61070c8482850161054b565b60006020828403121561079d578081fd5b813567ffffffffffffffff808211156107b4578283fd5b818401604081870312156107c6578384fd5b6107d06040610adc565b92508035828111156107e0578485fd5b6107ec878284016105d2565b845250602081013582811115610800578485fd5b61080c8782840161054b565b6020850152509195945050505050565b60006020828403121561082e57600080fd5b813567ffffffffffffffff81111561084557600080fd5b61070c848285016105d2565b60006020828403121561086357600080fd5b5035919050565b60008151808452610882816020860160208601610b03565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151608084526108c9608085018261086a565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b82851015610950577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086830301845261093c82825161086a565b600195909501949387019391508601610902565b506060880151955088810360608a015261096a818761086a565b9998505050505050505050565b60008351610989818460208801610b03565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526109eb602083018461086a565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160406020840152610a7c60608401826108b4565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848203016040850152610ab7818361086a565b95945050505050565b6000602082526109eb60208301846108b4565b90815260200190565b60405181810167ffffffffffffffff81118282101715610afb57600080fd5b604052919050565b60005b83811015610b1e578181015183820152602001610b06565b83811115610b2d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461025f57600080fdfea365627a7a72305820888f51db8be2b65eeba07b18b43cdc6dad5d8e6807eb4aa7f11e06f111742aef6c6578706572696d656e74616cf564736f6c634300050a0040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x11A JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63D69C88 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x9A3B6185 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xAE2DAE17 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x1F9 JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x207 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x21C JUMPI PUSH2 0x11A JUMP JUMPDEST DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x1E9 JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x1F1 JUMPI PUSH2 0x11A JUMP JUMPDEST DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0x647341EB EQ PUSH2 0x1B3 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x1C1 JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x1D6 JUMPI PUSH2 0x11A JUMP JUMPDEST DUP1 PUSH4 0x4582EAB2 GT PUSH2 0xEE JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x173 JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x17B JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x183 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x198 JUMPI PUSH2 0x11A JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x129 JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x165 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x127 PUSH2 0x224 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x127 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x25F JUMP JUMPDEST PUSH2 0x14F PUSH2 0x14A CALLDATASIZE PUSH1 0x4 PUSH2 0x714 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15C SWAP2 SWAP1 PUSH2 0x999 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x127 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x757 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x344 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x3A9 JUMP JUMPDEST PUSH2 0x18B PUSH2 0x3DB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15C SWAP2 SWAP1 PUSH2 0xA60 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x3E6 JUMP JUMPDEST PUSH2 0x14F PUSH2 0x1AE CALLDATASIZE PUSH1 0x4 PUSH2 0x685 JUMP JUMPDEST PUSH2 0x44B JUMP JUMPDEST PUSH2 0x127 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x81C JUMP JUMPDEST PUSH2 0x1C9 PUSH2 0x454 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15C SWAP2 SWAP1 PUSH2 0xAD3 JUMP JUMPDEST PUSH2 0x1C9 PUSH2 0x1E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x851 JUMP JUMPDEST PUSH2 0x462 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x468 JUMP JUMPDEST PUSH2 0x1C9 PUSH2 0x473 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x78C JUMP JUMPDEST PUSH2 0x20F PUSH2 0x478 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15C SWAP2 SWAP1 PUSH2 0xAC0 JUMP JUMPDEST PUSH2 0x1C9 PUSH2 0x480 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x256 SWAP1 PUSH2 0xA29 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x2B3 SWAP3 SWAP2 SWAP1 PUSH2 0x977 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x2EE SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x9BA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x310 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x256 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x9D8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x256 SWAP1 PUSH2 0x9F2 JUMP JUMPDEST PUSH2 0x3E3 PUSH2 0x486 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x256 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x9D8 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x3E3 PUSH2 0x4A6 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x499 PUSH2 0x4A6 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4E4 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4FA JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0x509 DUP2 DUP3 DUP5 MUL ADD PUSH2 0xADC JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x540 JUMPI PUSH2 0x52E DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0x54B JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x517 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x55B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x571 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x5A2 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0xADC JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5E3 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x5ED PUSH1 0x80 PUSH2 0xADC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x608 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x614 DUP7 DUP4 DUP8 ADD PUSH2 0x54B JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0x62E JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x647 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x653 DUP7 DUP4 DUP8 ADD PUSH2 0x4D4 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x66B JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x678 DUP6 DUP3 DUP7 ADD PUSH2 0x54B JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x69D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x6A8 DUP2 PUSH2 0xB33 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0x6C6 DUP2 PUSH2 0xB33 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x6E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x700 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x70C DUP5 DUP3 DUP6 ADD PUSH2 0x4D4 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x72A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x742 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x769 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x780 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x70C DUP5 DUP3 DUP6 ADD PUSH2 0x54B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x79D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x7B4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x7C6 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x7D0 PUSH1 0x40 PUSH2 0xADC JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x7E0 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x7EC DUP8 DUP3 DUP5 ADD PUSH2 0x5D2 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x800 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x80C DUP8 DUP3 DUP5 ADD PUSH2 0x54B JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x82E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x845 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x70C DUP5 DUP3 DUP6 ADD PUSH2 0x5D2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x863 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x882 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xB03 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0x8C9 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x86A JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x950 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0x93C DUP3 DUP3 MLOAD PUSH2 0x86A JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0x902 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0x96A DUP2 DUP8 PUSH2 0x86A JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x989 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0xB03 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x9EB PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x86A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xA7C PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x8B4 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0xAB7 DUP2 DUP4 PUSH2 0x86A JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x9EB PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x8B4 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xAFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB1E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB06 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xB2D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723058 KECCAK256 DUP9 DUP16 MLOAD 0xdb DUP12 0xe2 0xb6 0x5e 0xeb LOG0 PUSH28 0x18B43CDC6DAD5D8E6807EB4AA7F11E06F111742AEF6C657870657269 PUSH14 0x656E74616CF564736F6C63430005 EXP STOP BLOCKHASH ", - "sourceMap": "641:2757:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:2757:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1496:107;;;:::i;:::-;;2581:63;;;;;;;;;:::i;1726:334::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2419:52;;;;;;;1389:101;;;:::i;1286:97::-;;;:::i;3151:73::-;;;:::i;:::-;;;;;;;;1609:111;;;:::i;2214:166::-;;;;;;;;;:::i;2790:52::-;;;;;;;3250:72;;;:::i;:::-;;;;;;;;989:140;;;;;;;;;:::i;3327:69::-;;;:::i;862:121::-;;;:::i;3082:64::-;;;;;;;2924:63;;;:::i;:::-;;;;;;;;1135:145;;;:::i;1496:107::-;1564:32;;;;;;;;;;;;;;;;;;;2581:63;;:::o;1726:334::-;1837:21;1874:19;:56;;;;;;;;;;;;;;;;;;;1940:20;1990:6;1998:4;1973:30;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1973:30:0;;;1963:41;;;;;;1940:64;;2021:32;2031:12;2045:1;2048;2051;2021:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2021:32:0;;;;;;1726:334;-1:-1:-1;;;;;;;;1726:334:0:o;1389:101::-;1469:13;;;;;;;;;;;;;;;;1462:21;;;;;;;1469:13;1462:21;;;;1286:97;1353:23;;;;;;;;;;;3151:73;3201:19;;:::i;:::-;3151:73;:::o;1609:111::-;1698:14;;;;;;;;;;;;;;;;1683:30;;;;;;;1698:14;1683:30;;;;2214:166;-1:-1:-1;2372:1:0;;2214:166;-1:-1:-1;;;2214:166:0:o;3250:72::-;3290:4;3305:14;;3318:1;3305:14;;;;;3250:72;:::o;989:140::-;1117:1;:5;;989:140::o;3327:69::-;3379:9;:14;;3392:1;3379:14;;;3327:69::o;862:121::-;975:1;862:121;:::o;2924:63::-;2968:15;;:::i;1135:145::-;711:4;1135:145;:::o;641:2757::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;158:685:-1:-;;276:3;269:4;261:6;257:17;253:27;243:2;;-1:-1;;284:12;243:2;331:6;318:20;20177:18;20169:6;20166:30;20163:2;;;-1:-1;;20199:12;20163:2;20244:4;353:81;20307:4;20244;20236:6;20232:17;20297:15;353:81;;;462:21;;;344:90;-1:-1;519:14;;;494:17;;;614:1;599:238;624:6;621:1;618:13;599:238;;;731:42;769:3;506:4;707:3;694:17;498:6;682:30;;731:42;;;719:55;;788:14;;;;816;;;;646:1;639:9;599:238;;;603:14;;;;;236:607;;;;;1706:432;;1803:3;1796:4;1788:6;1784:17;1780:27;1770:2;;-1:-1;;1811:12;1770:2;1858:6;1845:20;20784:18;20776:6;20773:30;20770:2;;;-1:-1;;20806:12;20770:2;1880:60;20947:4;20879:9;1796:4;20864:6;20860:17;20856:33;20937:15;1880:60;;;1871:69;;1960:6;1953:5;1946:21;2064:3;20947:4;2055:6;1988;2046:16;;2043:25;2040:2;;;2081:1;;2071:12;2040:2;23898:6;20947:4;1988:6;1984:17;20947:4;2022:5;2018:16;23875:30;23954:1;23936:16;;;20947:4;23936:16;23929:27;2022:5;1763:375;-1:-1;;1763:375;3796:1071;;3904:4;3892:9;3887:3;3883:19;3879:30;3876:2;;;-1:-1;;3912:12;3876:2;3940:20;3904:4;3940:20;;;3931:29;;4043:1;4028:17;4015:31;4066:18;;4058:6;4055:30;4052:2;;;4098:1;4095;4088:12;4052:2;4132:54;4182:3;4173:6;4162:9;4158:22;4132:54;;;4115:15;4108:79;4253:2;4310:9;4306:22;6191:20;6182:29;;23705:10;24890:5;23694:22;24866:5;24863:34;24853:2;;24911:1;24908;24901:12;24853:2;4286:48;4253:2;4272:5;4268:16;4261:74;4440:2;4429:9;4425:18;4412:32;4398:46;;4464:18;4456:6;4453:30;4450:2;;;4496:1;4493;4486:12;4450:2;4531:75;4602:3;4593:6;4582:9;4578:22;4531:75;;;4440:2;4517:5;4513:16;4506:101;4699:2;4688:9;4684:18;4671:32;4657:46;;4723:18;4715:6;4712:30;4709:2;;;4755:1;4752;4745:12;4709:2;;4790:55;4841:3;4832:6;4821:9;4817:22;4790:55;;;4699:2;4776:5;4772:16;4765:81;;;3870:997;;;;;6393:743;;;;;;6565:3;6553:9;6544:7;6540:23;6536:33;6533:2;;;-1:-1;;6572:12;6533:2;85:6;72:20;97:33;124:5;97:33;;;6624:63;-1:-1;6724:2;6763:22;;6055:20;;-1:-1;6832:2;6871:22;;6055:20;;-1:-1;6940:2;6979:22;;72:20;97:33;72:20;97:33;;;6527:609;;;;-1:-1;6527:609;;7048:3;7088:22;6055:20;;6527:609;-1:-1;;6527:609;7143:387;;7277:2;7265:9;7256:7;7252:23;7248:32;7245:2;;;-1:-1;;7283:12;7245:2;7341:17;7328:31;7379:18;7371:6;7368:30;7365:2;;;-1:-1;;7401:12;7365:2;7431:83;7506:7;7497:6;7486:9;7482:22;7431:83;;;7421:93;7239:291;-1:-1;;;;7239:291;7537:613;;;;;7690:3;7678:9;7669:7;7665:23;7661:33;7658:2;;;-1:-1;;7697:12;7658:2;1648:6;1635:20;7749:63;;7849:2;7890:9;7886:22;6325:20;23799:4;25010:5;23788:16;24987:5;24984:33;24974:2;;-1:-1;;25021:12;24974:2;7652:498;;7857:61;;-1:-1;;;;7955:2;7994:22;;1635:20;;8063:2;8102:22;1635:20;;7652:498;8157:345;;8270:2;8258:9;8249:7;8245:23;8241:32;8238:2;;;-1:-1;;8276:12;8238:2;8334:17;8321:31;8372:18;8364:6;8361:30;8358:2;;;-1:-1;;8394:12;8358:2;8424:62;8478:7;8469:6;8458:9;8454:22;8424:62;;8509:385;;8642:2;8630:9;8621:7;8617:23;8613:32;8610:2;;;8658:1;8655;8648:12;8610:2;8706:17;8693:31;8744:18;;8736:6;8733:30;8730:2;;;8776:1;8773;8766:12;8730:2;8861:6;8850:9;8846:22;3194:4;3182:9;3177:3;3173:19;3169:30;3166:2;;;3212:1;3209;3202:12;3166:2;3230:20;3194:4;3230:20;;;3221:29;;3320:17;3307:31;3358:18;3350:6;3347:30;3344:2;;;3390:1;3387;3380:12;3344:2;3424:68;3488:3;3479:6;3468:9;3464:22;3424:68;;;3407:15;3400:93;;8642:2;3578:9;3574:18;3561:32;3613:18;3605:6;3602:30;3599:2;;;3645:1;3642;3635:12;3599:2;3680:55;3731:3;3722:6;3711:9;3707:22;3680:55;;;8642:2;3662:16;;3655:81;-1:-1;3666:5;;8604:290;-1:-1;;;;;8604:290;8901:373;;9028:2;9016:9;9007:7;9003:23;8999:32;8996:2;;;-1:-1;;9034:12;8996:2;9092:17;9079:31;9130:18;9122:6;9119:30;9116:2;;;-1:-1;;9152:12;9116:2;9182:76;9250:7;9241:6;9230:9;9226:22;9182:76;;9281:241;;9385:2;9373:9;9364:7;9360:23;9356:32;9353:2;;;-1:-1;;9391:12;9353:2;-1:-1;6055:20;;9347:175;-1:-1;9347:175;11364:315;;11488:5;21885:12;22545:6;22540:3;22533:19;11571:52;11616:6;22582:4;22577:3;22573:14;22582:4;11597:5;11593:16;11571:52;;;24416:2;24396:14;24412:7;24392:28;11635:39;;;;22582:4;11635:39;;11440:239;-1:-1;;11440:239;13930:1078;;14154:15;14148:22;14077:4;14190:13;14183:37;14235:67;14077:4;14072:3;14068:14;14283:12;14235:67;;;14392:4;;;23705:10;14392:4;14385:5;14381:16;14375:23;23694:22;14459:4;14454:3;14450:14;16326:36;14560:4;14553:5;14549:16;14543:23;14612:3;14606:4;14602:14;14560:4;14590:3;14586:14;14579:38;14632:109;10052:5;21885:12;22545:6;22540:3;22533:19;22582:4;22577:3;22573:14;10064:88;;14392:4;10217;10209:6;10205:17;22577:3;10196:27;;21747:4;10295:5;21738:14;-1:-1;10340:10;;10334:341;10359:6;10356:1;10353:13;10334:341;;;10411:20;22577:3;10415:4;10411:20;;10406:3;10399:33;9641:60;9697:3;10466:6;10460:13;9641:60;;;10381:1;10374:9;;;;;10654:14;;;;10480:82;-1:-1;22393:14;;10334:341;;;10338:14;14829:4;14822:5;14818:16;14812:23;14792:43;;14881:3;14875:4;14871:14;14829:4;14859:3;14855:14;14848:38;14901:69;14965:4;14951:12;14901:69;;;14992:11;14050:958;-1:-1;;;;;;;;;14050:958;16488:401;;11161:5;21885:12;11272:52;11317:6;11312:3;11305:4;11298:5;11294:16;11272:52;;;11336:16;;;;10793:37;;;-1:-1;11305:4;16852:12;;16641:248;-1:-1;16641:248;16896:213;23499:42;23488:54;;;;9786:37;;17014:2;16999:18;;16985:124;17116:539;10793:37;;;23799:4;23788:16;;;;17475:2;17460:18;;16441:35;17558:2;17543:18;;10793:37;17641:2;17626:18;;10793:37;17314:3;17299:19;;17285:370;17662:293;;17796:2;17817:17;17810:47;17871:74;17796:2;17785:9;17781:18;17931:6;17871:74;;;17863:82;17767:188;-1:-1;;;17767:188;17962:407;18153:2;18167:47;;;12583:2;18138:18;;;22533:19;12619:66;22573:14;;;12599:87;12705:12;;;18124:245;18376:407;18567:2;18581:47;;;12956:2;18552:18;;;22533:19;12992:66;22573:14;;;12972:87;13078:12;;;18538:245;18790:377;;18966:2;18987:17;18980:47;13415:15;13409:22;13336:4;18966:2;18955:9;18951:18;13444:37;13496:95;13327:14;18955:9;13327:14;13572:12;13496:95;;;18966:2;13676:5;13672:16;13666:23;13646:43;;13725:14;18955:9;13729:4;13725:14;;13336:4;18955:9;13709:14;13702:38;13755:69;13819:4;13805:12;13755:69;;;19033:124;18937:230;-1:-1;;;;;18937:230;19174:353;;19338:2;19359:17;19352:47;19413:104;19338:2;19327:9;19323:18;19503:6;19413:104;;19534:213;10793:37;;;19652:2;19637:18;;19623:124;19754:256;19816:2;19810:9;19842:17;;;19917:18;19902:34;;19938:22;;;19899:62;19896:2;;;19974:1;;19964:12;19896:2;19816;19983:22;19794:216;;-1:-1;19794:216;23971:268;24036:1;24043:101;24057:6;24054:1;24051:13;24043:101;;;24124:11;;;24118:18;24105:11;;;24098:39;24079:2;24072:10;24043:101;;;24159:6;24156:1;24153:13;24150:2;;;24036:1;24215:6;24210:3;24206:16;24199:27;24150:2;;24020:219;;;;24433:117;23499:42;24520:5;23488:54;24495:5;24492:35;24482:2;;24541:1;;24531:12" + "object": "0x608060405234801561001057600080fd5b50600436106101355760003560e01c806363d69c88116100b25780639a3b618511610081578063ae2dae1711610066578063ae2dae1714610227578063d6d7618c14610235578063d88be12f1461024a57610135565b80639a3b618514610217578063a3c2f6b61461021f57610135565b806363d69c88146101ce578063647341eb146101e157806376f15d5b146101ef5780638ee52b4e1461020457610135565b80633e9ef66a1161010957806345fdbdb7116100ee57806345fdbdb7146101a957806359c28add146101b15780635ba3c7c0146101c657610135565b80633e9ef66a146101935780634582eab2146101a157610135565b806209e4371461013a5780630527c28f146101445780632e1a7d4d1461015757806336b323961461016a575b600080fd5b610142610252565b005b610142610152366004610756565b61028d565b6101426101653660046108d0565b610290565b61017d610178366004610793565b6102e1565b60405161018a9190610a18565b60405180910390f35b6101426101523660046107d6565b6101426103c3565b610142610428565b6101b961045a565b60405161018a9190610adf565b610142610465565b61017d6101dc366004610704565b6104ca565b61014261015236600461089b565b6101f76104d3565b60405161018a9190610b52565b6101f76102123660046108d0565b6104e1565b6101426104e7565b6101f76104f2565b61014261015236600461080b565b61023d6104f7565b60405161018a9190610b3f565b6101f76104ff565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028490610aa8565b60405180910390fd5b50565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040516102d69190610b52565b60405180910390a250565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081876040516020016103329291906109f6565b6040516020818303038152906040528051906020012090506001818787876040516000815260200160405260405161036d9493929190610a39565b6020604051602081039080840390855afa15801561038f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526102849190600401610a57565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028490610a71565b610462610505565b90565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526102849190600401610a57565b50929392505050565b600080546001019081905590565b60010190565b600080546001019055565b600190565b610462610525565b6104d290565b6040518060a00160405280610518610525565b8152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b600082601f830112610563578081fd5b813567ffffffffffffffff811115610579578182fd5b60206105888182840201610b5b565b828152925080830184820160005b848110156105bf576105ad888584358a01016105ca565b83529183019190830190600101610596565b505050505092915050565b600082601f8301126105da578081fd5b813567ffffffffffffffff8111156105f0578182fd5b61062160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610b5b565b915080825283602082850101111561063857600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610662578081fd5b61066c6080610b5b565b90506000823567ffffffffffffffff80821115610687578283fd5b610693868387016105ca565b84526020850135915063ffffffff821682146106ad578283fd5b81602085015260408501359150808211156106c6578283fd5b6106d286838701610553565b604085015260608501359150808211156106ea578283fd5b506106f7858286016105ca565b6060840152505092915050565b600080600080600060a0868803121561071c57600080fd5b853561072781610bb2565b94506020860135935060408601359250606086013561074581610bb2565b949793965091946080013592915050565b60006020828403121561076857600080fd5b813567ffffffffffffffff81111561077f57600080fd5b61078b84828501610553565b949350505050565b600080600080608085870312156107a957600080fd5b84359350602085013560ff811681146107c157600080fd5b93969395505050506040820135916060013590565b6000602082840312156107e857600080fd5b813567ffffffffffffffff8111156107ff57600080fd5b61078b848285016105ca565b60006020828403121561081c578081fd5b813567ffffffffffffffff80821115610833578283fd5b81840160408187031215610845578384fd5b61084f6040610b5b565b925080358281111561085f578485fd5b61086b87828401610651565b84525060208101358281111561087f578485fd5b61088b878284016105ca565b6020850152509195945050505050565b6000602082840312156108ad57600080fd5b813567ffffffffffffffff8111156108c457600080fd5b61078b84828501610651565b6000602082840312156108e257600080fd5b5035919050565b60008151808452610901816020860160208601610b82565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516080845261094860808501826108e9565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b828510156109cf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08683030184526109bb8282516108e9565b600195909501949387019391508601610981565b506060880151955088810360608a01526109e981876108e9565b9998505050505050505050565b60008351610a08818460208801610b82565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610a6a60208301846108e9565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160406020840152610afb6060840182610933565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848203016040850152610b3681836108e9565b95945050505050565b600060208252610a6a6020830184610933565b90815260200190565b60405181810167ffffffffffffffff81118282101715610b7a57600080fd5b604052919050565b60005b83811015610b9d578181015183820152602001610b85565b83811115610bac576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461028d57600080fdfea365627a7a723058201a16b3cd19a115b5cfe3a42e5ddcd7a41b75f4a376a121a647cd429cbbf546266c6578706572696d656e74616cf564736f6c634300050a0040", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x135 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63D69C88 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x9A3B6185 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xAE2DAE17 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x24A JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x217 JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x21F JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x1CE JUMPI DUP1 PUSH4 0x647341EB EQ PUSH2 0x1E1 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x1EF JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x204 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A GT PUSH2 0x109 JUMPI DUP1 PUSH4 0x45FDBDB7 GT PUSH2 0xEE JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x1A9 JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x1B1 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x1C6 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x193 JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x1A1 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x13A JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x144 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x157 JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x16A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x142 PUSH2 0x252 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x756 JUMP JUMPDEST PUSH2 0x28D JUMP JUMPDEST PUSH2 0x142 PUSH2 0x165 CALLDATASIZE PUSH1 0x4 PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x290 JUMP JUMPDEST PUSH2 0x17D PUSH2 0x178 CALLDATASIZE PUSH1 0x4 PUSH2 0x793 JUMP JUMPDEST PUSH2 0x2E1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x7D6 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x3C3 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x428 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x45A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xADF JUMP JUMPDEST PUSH2 0x142 PUSH2 0x465 JUMP JUMPDEST PUSH2 0x17D PUSH2 0x1DC CALLDATASIZE PUSH1 0x4 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x4CA JUMP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x89B JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4D3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xB52 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x212 CALLDATASIZE PUSH1 0x4 PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x4E1 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x4E7 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4F2 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x80B JUMP JUMPDEST PUSH2 0x23D PUSH2 0x4F7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xB3F JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4FF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x284 SWAP1 PUSH2 0xAA8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD PUSH2 0x2D6 SWAP2 SWAP1 PUSH2 0xB52 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x332 SWAP3 SWAP2 SWAP1 PUSH2 0x9F6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x36D SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xA39 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x38F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x284 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xA57 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x284 SWAP1 PUSH2 0xA71 JUMP JUMPDEST PUSH2 0x462 PUSH2 0x505 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x284 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xA57 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x462 PUSH2 0x525 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x518 PUSH2 0x525 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x563 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x579 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0x588 DUP2 DUP3 DUP5 MUL ADD PUSH2 0xB5B JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x5BF JUMPI PUSH2 0x5AD DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0x5CA JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x596 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x5DA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5F0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x621 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0xB5B JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x638 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x662 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x66C PUSH1 0x80 PUSH2 0xB5B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x687 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x693 DUP7 DUP4 DUP8 ADD PUSH2 0x5CA JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0x6AD JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x6C6 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x6D2 DUP7 DUP4 DUP8 ADD PUSH2 0x553 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x6EA JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x6F7 DUP6 DUP3 DUP7 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x71C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x727 DUP2 PUSH2 0xBB2 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0x745 DUP2 PUSH2 0xBB2 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x768 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x77F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x553 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x81C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x833 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x845 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x84F PUSH1 0x40 PUSH2 0xB5B JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x85F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x86B DUP8 DUP3 DUP5 ADD PUSH2 0x651 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x87F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x88B DUP8 DUP3 DUP5 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x651 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x901 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xB82 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0x948 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x8E9 JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x9CF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0x9BB DUP3 DUP3 MLOAD PUSH2 0x8E9 JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0x981 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0x9E9 DUP2 DUP8 PUSH2 0x8E9 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0xA08 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0xB82 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xA6A PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x8E9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xAFB PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x933 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0xB36 DUP2 DUP4 PUSH2 0x8E9 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xA6A PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x933 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB9D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB85 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xBAC JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x28D JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723058 KECCAK256 BYTE AND 0xb3 0xcd NOT LOG1 ISZERO 0xb5 0xcf 0xe3 LOG4 0x2e 0x5d 0xdc 0xd7 LOG4 SHL PUSH22 0xF4A376A121A647CD429CBBF546266C6578706572696D PUSH6 0x6E74616CF564 PUSH20 0x6F6C634300050A00400000000000000000000000 ", + "sourceMap": "641:2908:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:2908:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1496:107;;;:::i;:::-;;2732:63;;;;;;;;;:::i;2127:84::-;;;;;;;;;:::i;1726:334::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2570:52;;;;;;;1389:101;;;:::i;1286:97::-;;;:::i;3302:73::-;;;:::i;:::-;;;;;;;;1609:111;;;:::i;2365:166::-;;;;;;;;;:::i;2941:52::-;;;;;;;3401:72;;;:::i;:::-;;;;;;;;989:140;;;;;;;;;:::i;3478:69::-;;;:::i;862:121::-;;;:::i;3233:64::-;;;;;;;3075:63;;;:::i;:::-;;;;;;;;1135:145;;;:::i;1496:107::-;1564:32;;;;;;;;;;;;;;;;;;;2732:63;;:::o;2127:84::-;2188:10;2177:27;;;2200:3;2177:27;;;;;;;;;;;;;;;2127:84;:::o;1726:334::-;1837:21;1874:19;:56;;;;;;;;;;;;;;;;;;;1940:20;1990:6;1998:4;1973:30;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1973:30:0;;;1963:41;;;;;;1940:64;;2021:32;2031:12;2045:1;2048;2051;2021:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2021:32:0;;;;;;1726:334;-1:-1:-1;;;;;;;;1726:334:0:o;1389:101::-;1469:13;;;;;;;;;;;;;;;;1462:21;;;;;;;1469:13;1462:21;;;;1286:97;1353:23;;;;;;;;;;;3302:73;3352:19;;:::i;:::-;3302:73;:::o;1609:111::-;1698:14;;;;;;;;;;;;;;;;1683:30;;;;;;;1698:14;1683:30;;;;2365:166;-1:-1:-1;2523:1:0;;2365:166;-1:-1:-1;;;2365:166:0:o;3401:72::-;3441:4;3456:14;;3469:1;3456:14;;;;;3401:72;:::o;989:140::-;1117:1;:5;;989:140::o;3478:69::-;3530:9;:14;;3543:1;3530:14;;;3478:69::o;862:121::-;975:1;862:121;:::o;3075:63::-;3119:15;;:::i;1135:145::-;711:4;1135:145;:::o;641:2908::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;158:685:-1:-;;276:3;269:4;261:6;257:17;253:27;243:2;;-1:-1;;284:12;243:2;331:6;318:20;20177:18;20169:6;20166:30;20163:2;;;-1:-1;;20199:12;20163:2;20244:4;353:81;20307:4;20244;20236:6;20232:17;20297:15;353:81;;;462:21;;;344:90;-1:-1;519:14;;;494:17;;;614:1;599:238;624:6;621:1;618:13;599:238;;;731:42;769:3;506:4;707:3;694:17;498:6;682:30;;731:42;;;719:55;;788:14;;;;816;;;;646:1;639:9;599:238;;;603:14;;;;;236:607;;;;;1706:432;;1803:3;1796:4;1788:6;1784:17;1780:27;1770:2;;-1:-1;;1811:12;1770:2;1858:6;1845:20;20784:18;20776:6;20773:30;20770:2;;;-1:-1;;20806:12;20770:2;1880:60;20947:4;20879:9;1796:4;20864:6;20860:17;20856:33;20937:15;1880:60;;;1871:69;;1960:6;1953:5;1946:21;2064:3;20947:4;2055:6;1988;2046:16;;2043:25;2040:2;;;2081:1;;2071:12;2040:2;23898:6;20947:4;1988:6;1984:17;20947:4;2022:5;2018:16;23875:30;23954:1;23936:16;;;20947:4;23936:16;23929:27;2022:5;1763:375;-1:-1;;1763:375;3796:1071;;3904:4;3892:9;3887:3;3883:19;3879:30;3876:2;;;-1:-1;;3912:12;3876:2;3940:20;3904:4;3940:20;;;3931:29;;4043:1;4028:17;4015:31;4066:18;;4058:6;4055:30;4052:2;;;4098:1;4095;4088:12;4052:2;4132:54;4182:3;4173:6;4162:9;4158:22;4132:54;;;4115:15;4108:79;4253:2;4310:9;4306:22;6191:20;6182:29;;23705:10;24890:5;23694:22;24866:5;24863:34;24853:2;;24911:1;24908;24901:12;24853:2;4286:48;4253:2;4272:5;4268:16;4261:74;4440:2;4429:9;4425:18;4412:32;4398:46;;4464:18;4456:6;4453:30;4450:2;;;4496:1;4493;4486:12;4450:2;4531:75;4602:3;4593:6;4582:9;4578:22;4531:75;;;4440:2;4517:5;4513:16;4506:101;4699:2;4688:9;4684:18;4671:32;4657:46;;4723:18;4715:6;4712:30;4709:2;;;4755:1;4752;4745:12;4709:2;;4790:55;4841:3;4832:6;4821:9;4817:22;4790:55;;;4699:2;4776:5;4772:16;4765:81;;;3870:997;;;;;6393:743;;;;;;6565:3;6553:9;6544:7;6540:23;6536:33;6533:2;;;-1:-1;;6572:12;6533:2;85:6;72:20;97:33;124:5;97:33;;;6624:63;-1:-1;6724:2;6763:22;;6055:20;;-1:-1;6832:2;6871:22;;6055:20;;-1:-1;6940:2;6979:22;;72:20;97:33;72:20;97:33;;;6527:609;;;;-1:-1;6527:609;;7048:3;7088:22;6055:20;;6527:609;-1:-1;;6527:609;7143:387;;7277:2;7265:9;7256:7;7252:23;7248:32;7245:2;;;-1:-1;;7283:12;7245:2;7341:17;7328:31;7379:18;7371:6;7368:30;7365:2;;;-1:-1;;7401:12;7365:2;7431:83;7506:7;7497:6;7486:9;7482:22;7431:83;;;7421:93;7239:291;-1:-1;;;;7239:291;7537:613;;;;;7690:3;7678:9;7669:7;7665:23;7661:33;7658:2;;;-1:-1;;7697:12;7658:2;1648:6;1635:20;7749:63;;7849:2;7890:9;7886:22;6325:20;23799:4;25010:5;23788:16;24987:5;24984:33;24974:2;;-1:-1;;25021:12;24974:2;7652:498;;7857:61;;-1:-1;;;;7955:2;7994:22;;1635:20;;8063:2;8102:22;1635:20;;7652:498;8157:345;;8270:2;8258:9;8249:7;8245:23;8241:32;8238:2;;;-1:-1;;8276:12;8238:2;8334:17;8321:31;8372:18;8364:6;8361:30;8358:2;;;-1:-1;;8394:12;8358:2;8424:62;8478:7;8469:6;8458:9;8454:22;8424:62;;8509:385;;8642:2;8630:9;8621:7;8617:23;8613:32;8610:2;;;8658:1;8655;8648:12;8610:2;8706:17;8693:31;8744:18;;8736:6;8733:30;8730:2;;;8776:1;8773;8766:12;8730:2;8861:6;8850:9;8846:22;3194:4;3182:9;3177:3;3173:19;3169:30;3166:2;;;3212:1;3209;3202:12;3166:2;3230:20;3194:4;3230:20;;;3221:29;;3320:17;3307:31;3358:18;3350:6;3347:30;3344:2;;;3390:1;3387;3380:12;3344:2;3424:68;3488:3;3479:6;3468:9;3464:22;3424:68;;;3407:15;3400:93;;8642:2;3578:9;3574:18;3561:32;3613:18;3605:6;3602:30;3599:2;;;3645:1;3642;3635:12;3599:2;3680:55;3731:3;3722:6;3711:9;3707:22;3680:55;;;8642:2;3662:16;;3655:81;-1:-1;3666:5;;8604:290;-1:-1;;;;;8604:290;8901:373;;9028:2;9016:9;9007:7;9003:23;8999:32;8996:2;;;-1:-1;;9034:12;8996:2;9092:17;9079:31;9130:18;9122:6;9119:30;9116:2;;;-1:-1;;9152:12;9116:2;9182:76;9250:7;9241:6;9230:9;9226:22;9182:76;;9281:241;;9385:2;9373:9;9364:7;9360:23;9356:32;9353:2;;;-1:-1;;9391:12;9353:2;-1:-1;6055:20;;9347:175;-1:-1;9347:175;11364:315;;11488:5;21885:12;22545:6;22540:3;22533:19;11571:52;11616:6;22582:4;22577:3;22573:14;22582:4;11597:5;11593:16;11571:52;;;24416:2;24396:14;24412:7;24392:28;11635:39;;;;22582:4;11635:39;;11440:239;-1:-1;;11440:239;13930:1078;;14154:15;14148:22;14077:4;14190:13;14183:37;14235:67;14077:4;14072:3;14068:14;14283:12;14235:67;;;14392:4;;;23705:10;14392:4;14385:5;14381:16;14375:23;23694:22;14459:4;14454:3;14450:14;16326:36;14560:4;14553:5;14549:16;14543:23;14612:3;14606:4;14602:14;14560:4;14590:3;14586:14;14579:38;14632:109;10052:5;21885:12;22545:6;22540:3;22533:19;22582:4;22577:3;22573:14;10064:88;;14392:4;10217;10209:6;10205:17;22577:3;10196:27;;21747:4;10295:5;21738:14;-1:-1;10340:10;;10334:341;10359:6;10356:1;10353:13;10334:341;;;10411:20;22577:3;10415:4;10411:20;;10406:3;10399:33;9641:60;9697:3;10466:6;10460:13;9641:60;;;10381:1;10374:9;;;;;10654:14;;;;10480:82;-1:-1;22393:14;;10334:341;;;10338:14;14829:4;14822:5;14818:16;14812:23;14792:43;;14881:3;14875:4;14871:14;14829:4;14859:3;14855:14;14848:38;14901:69;14965:4;14951:12;14901:69;;;14992:11;14050:958;-1:-1;;;;;;;;;14050:958;16488:401;;11161:5;21885:12;11272:52;11317:6;11312:3;11305:4;11298:5;11294:16;11272:52;;;11336:16;;;;10793:37;;;-1:-1;11305:4;16852:12;;16641:248;-1:-1;16641:248;16896:213;23499:42;23488:54;;;;9786:37;;17014:2;16999:18;;16985:124;17116:539;10793:37;;;23799:4;23788:16;;;;17475:2;17460:18;;16441:35;17558:2;17543:18;;10793:37;17641:2;17626:18;;10793:37;17314:3;17299:19;;17285:370;17662:293;;17796:2;17817:17;17810:47;17871:74;17796:2;17785:9;17781:18;17931:6;17871:74;;;17863:82;17767:188;-1:-1;;;17767:188;17962:407;18153:2;18167:47;;;12583:2;18138:18;;;22533:19;12619:66;22573:14;;;12599:87;12705:12;;;18124:245;18376:407;18567:2;18581:47;;;12956:2;18552:18;;;22533:19;12992:66;22573:14;;;12972:87;13078:12;;;18538:245;18790:377;;18966:2;18987:17;18980:47;13415:15;13409:22;13336:4;18966:2;18955:9;18951:18;13444:37;13496:95;13327:14;18955:9;13327:14;13572:12;13496:95;;;18966:2;13676:5;13672:16;13666:23;13646:43;;13725:14;18955:9;13729:4;13725:14;;13336:4;18955:9;13709:14;13702:38;13755:69;13819:4;13805:12;13755:69;;;19033:124;18937:230;-1:-1;;;;;18937:230;19174:353;;19338:2;19359:17;19352:47;19413:104;19338:2;19327:9;19323:18;19503:6;19413:104;;19534:213;10793:37;;;19652:2;19637:18;;19623:124;19754:256;19816:2;19810:9;19842:17;;;19917:18;19902:34;;19938:22;;;19899:62;19896:2;;;19974:1;;19964:12;19896:2;19816;19983:22;19794:216;;-1:-1;19794:216;23971:268;24036:1;24043:101;24057:6;24054:1;24051:13;24043:101;;;24124:11;;;24118:18;24105:11;;;24098:39;24079:2;24072:10;24043:101;;;24159:6;24156:1;24153:13;24150:2;;;24036:1;24215:6;24210:3;24206:16;24199:27;24150:2;;24020:219;;;;24433:117;23499:42;24520:5;23488:54;24495:5;24492:35;24482:2;;24541:1;;24531:12" } } }, @@ -399,9 +430,9 @@ } }, "sourceCodes": { - "AbiGenDummy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma experimental ABIEncoderV2;\n\npragma solidity ^0.5.5;\n\n\ncontract AbiGenDummy\n{\n\n uint256 constant internal SOME_CONSTANT = 1234;\n string constant internal REVERT_REASON = \"REVERT_WITH_CONSTANT\";\n string constant internal REQUIRE_REASON = \"REQUIRE_WITH_CONSTANT\";\n\n function simplePureFunction ()\n public\n pure\n returns (uint256 result)\n {\n return 1;\n }\n\n function simplePureFunctionWithInput (uint256 x)\n public\n pure\n returns (uint256 sum)\n {\n return 1 + x;\n }\n\n function pureFunctionWithConstant ()\n public\n pure\n returns (uint256 someConstant)\n {\n return SOME_CONSTANT;\n }\n\n function simpleRevert ()\n public\n pure\n {\n revert(\"SIMPLE_REVERT\");\n }\n\n function revertWithConstant ()\n public\n pure\n {\n revert(REVERT_REASON);\n }\n\n function simpleRequire ()\n public\n pure\n {\n require(0 > 1, \"SIMPLE_REQUIRE\");\n }\n\n function requireWithConstant ()\n public\n pure\n {\n require(0 > 1, REQUIRE_REASON);\n }\n\n function ecrecoverFn(bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n public\n pure\n returns (address signerAddress)\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, hash));\n return ecrecover(prefixedHash, v, r, s);\n }\n\n // test: generated code should normalize address inputs to lowercase\n // add extra inputs to make sure it works with address in any position\n function withAddressInput(address x, uint256 a, uint256 b, address y, uint256 c)\n public\n pure\n returns (address z)\n {\n return x;\n }\n\n event AnEvent(uint8 param);\n\n function acceptsBytes(bytes memory a) public pure {}\n\n /// @dev a method that accepts an array of bytes\n /// @param a the array of bytes being accepted\n function acceptsAnArrayOfBytes(bytes[] memory a) public pure {}\n\n struct Struct {\n bytes someBytes;\n uint32 anInteger;\n bytes[] aDynamicArrayOfBytes;\n string aString;\n }\n\n function structInput(Struct memory s) public pure {}\n\n /// @dev a method that returns a struct\n /// @return a Struct struct\n function structOutput() public pure returns(Struct memory s) {}\n\n struct NestedStruct {\n Struct innerStruct;\n string description;\n }\n\n function nestedStructInput(NestedStruct memory n) public pure {}\n function nestedStructOutput() public pure returns(NestedStruct memory) {}\n\n uint someState;\n function nonPureMethod() public returns(uint) { return someState += 1; }\n function nonPureMethodThatReturnsNothing() public { someState += 1; }\n}\n" + "AbiGenDummy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma experimental ABIEncoderV2;\n\npragma solidity ^0.5.5;\n\n\ncontract AbiGenDummy\n{\n\n uint256 constant internal SOME_CONSTANT = 1234;\n string constant internal REVERT_REASON = \"REVERT_WITH_CONSTANT\";\n string constant internal REQUIRE_REASON = \"REQUIRE_WITH_CONSTANT\";\n\n function simplePureFunction ()\n public\n pure\n returns (uint256 result)\n {\n return 1;\n }\n\n function simplePureFunctionWithInput (uint256 x)\n public\n pure\n returns (uint256 sum)\n {\n return 1 + x;\n }\n\n function pureFunctionWithConstant ()\n public\n pure\n returns (uint256 someConstant)\n {\n return SOME_CONSTANT;\n }\n\n function simpleRevert ()\n public\n pure\n {\n revert(\"SIMPLE_REVERT\");\n }\n\n function revertWithConstant ()\n public\n pure\n {\n revert(REVERT_REASON);\n }\n\n function simpleRequire ()\n public\n pure\n {\n require(0 > 1, \"SIMPLE_REQUIRE\");\n }\n\n function requireWithConstant ()\n public\n pure\n {\n require(0 > 1, REQUIRE_REASON);\n }\n\n function ecrecoverFn(bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n public\n pure\n returns (address signerAddress)\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, hash));\n return ecrecover(prefixedHash, v, r, s);\n }\n\n event Withdrawal(address indexed _owner, uint _value);\n\n function withdraw(uint wad) public {\n emit Withdrawal(msg.sender, wad);\n }\n\n // test: generated code should normalize address inputs to lowercase\n // add extra inputs to make sure it works with address in any position\n function withAddressInput(address x, uint256 a, uint256 b, address y, uint256 c)\n public\n pure\n returns (address z)\n {\n return x;\n }\n\n event AnEvent(uint8 param);\n\n function acceptsBytes(bytes memory a) public pure {}\n\n /// @dev a method that accepts an array of bytes\n /// @param a the array of bytes being accepted\n function acceptsAnArrayOfBytes(bytes[] memory a) public pure {}\n\n struct Struct {\n bytes someBytes;\n uint32 anInteger;\n bytes[] aDynamicArrayOfBytes;\n string aString;\n }\n\n function structInput(Struct memory s) public pure {}\n\n /// @dev a method that returns a struct\n /// @return a Struct struct\n function structOutput() public pure returns(Struct memory s) {}\n\n struct NestedStruct {\n Struct innerStruct;\n string description;\n }\n\n function nestedStructInput(NestedStruct memory n) public pure {}\n function nestedStructOutput() public pure returns(NestedStruct memory) {}\n\n uint someState;\n function nonPureMethod() public returns(uint) { return someState += 1; }\n function nonPureMethodThatReturnsNothing() public { someState += 1; }\n}\n" }, - "sourceTreeHashHex": "0xafbcbb2a469a1062791f49abdf3076b97d06d1994fbaf9f07f46a4fe95e07880", + "sourceTreeHashHex": "0xaeec8bc1cd7fb6274f7bf4e0ea5117961795285e57c882a62c375e14f59f1bab", "compiler": { "name": "solc", "version": "soljson-v0.5.10+commit.5a6ea5b1.js", diff --git a/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol b/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol index d5fb6250b2..4531338200 100644 --- a/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol +++ b/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol @@ -90,6 +90,12 @@ contract AbiGenDummy return ecrecover(prefixedHash, v, r, s); } + event Withdrawal(address indexed _owner, uint _value); + + function withdraw(uint wad) public { + emit Withdrawal(msg.sender, wad); + } + // test: generated code should normalize address inputs to lowercase // add extra inputs to make sure it works with address in any position function withAddressInput(address x, uint256 a, uint256 b, address y, uint256 c) diff --git a/packages/abi-gen/test-cli/test_typescript/test/abi_gen_dummy_test.ts b/packages/abi-gen/test-cli/test_typescript/test/abi_gen_dummy_test.ts index ec12d5c55a..6f145a6a4f 100644 --- a/packages/abi-gen/test-cli/test_typescript/test/abi_gen_dummy_test.ts +++ b/packages/abi-gen/test-cli/test_typescript/test/abi_gen_dummy_test.ts @@ -7,8 +7,9 @@ import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; import * as ChaiBigNumber from 'chai-bignumber'; import * as dirtyChai from 'dirty-chai'; +import * as Sinon from 'sinon'; -import { AbiGenDummyContract, artifacts, TestLibDummyContract } from '../src'; +import { AbiGenDummyContract, AbiGenDummyEvents, artifacts, TestLibDummyContract } from '../src'; const txDefaults = { from: devConstants.TESTRPC_FIRST_ADDRESS, @@ -92,6 +93,36 @@ describe('AbiGenDummy Contract', () => { }); }); + describe('event subscription', () => { + const indexFilterValues = {}; + const emptyCallback = () => {}; // tslint:disable-line:no-empty + let stubs: Sinon.SinonStub[] = []; + + afterEach(() => { + stubs.forEach(s => s.restore()); + stubs = []; + }); + it('should return a subscription token', done => { + const subscriptionToken = abiGenDummy.subscribe( + AbiGenDummyEvents.Withdrawal, + indexFilterValues, + emptyCallback, + ); + expect(subscriptionToken).to.be.a('string'); + done(); + }); + it('should allow unsubscribeAll to be called successfully after an error', done => { + abiGenDummy.subscribe(AbiGenDummyEvents.Withdrawal, indexFilterValues, emptyCallback); + stubs.push( + Sinon.stub((abiGenDummy as any)._web3Wrapper, 'getBlockIfExistsAsync').throws( + new Error('JSON RPC error'), + ), + ); + abiGenDummy.unsubscribeAll(); + done(); + }); + }); + describe('withAddressInput', () => { it('should normalize address inputs to lowercase', async () => { const xAddress = devConstants.TESTRPC_FIRST_ADDRESS.toUpperCase(); diff --git a/packages/base-contract/CHANGELOG.json b/packages/base-contract/CHANGELOG.json index 29cf2b5218..905177bbe8 100644 --- a/packages/base-contract/CHANGELOG.json +++ b/packages/base-contract/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "5.2.0", + "changes": [ + { + "note": "Add SubscriptionManager", + "pr": 1970 + } + ] + }, { "timestamp": 1563957393, "version": "5.1.2", diff --git a/packages/base-contract/package.json b/packages/base-contract/package.json index 4b1c223c6c..e446571b20 100644 --- a/packages/base-contract/package.json +++ b/packages/base-contract/package.json @@ -48,8 +48,12 @@ "@0x/utils": "^4.4.1", "@0x/web3-wrapper": "^6.0.8", "ethereum-types": "^2.1.4", + "ethereumjs-blockstream": "6.0.0", + "ethereumjs-util": "^5.1.1", "ethers": "~4.0.4", - "lodash": "^4.17.11" + "js-sha3": "^0.7.0", + "lodash": "^4.17.11", + "uuid": "^3.3.2" }, "publishConfig": { "access": "public" diff --git a/packages/base-contract/src/index.ts b/packages/base-contract/src/index.ts index 156d5341e0..cf7dffede3 100644 --- a/packages/base-contract/src/index.ts +++ b/packages/base-contract/src/index.ts @@ -19,6 +19,10 @@ import * as _ from 'lodash'; import { formatABIDataItem } from './utils'; +export { SubscriptionManager } from './subscription_manager'; + +export * from './types'; + export interface AbiEncoderByFunctionSignature { [key: string]: AbiEncoder.Method; } diff --git a/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts b/packages/base-contract/src/subscription_manager.ts similarity index 82% rename from packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts rename to packages/base-contract/src/subscription_manager.ts index de4112bc41..ad7e6067a0 100644 --- a/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts +++ b/packages/base-contract/src/subscription_manager.ts @@ -12,24 +12,16 @@ import { 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'; +import { BlockRange, EventCallback, IndexedFilterValues, SubscriptionErrors } from './types'; +import { filterUtils } from './utils/filter_utils'; -export abstract class ContractWrapper { - public abstract abi: ContractAbi; - protected _networkId: number; - protected _web3Wrapper: Web3Wrapper; +const DEFAULT_BLOCK_POLLING_INTERVAL = 1000; + +export class SubscriptionManager { + public abi: ContractAbi; private _blockAndLogStreamerIfExists: BlockAndLogStreamer | undefined; - private readonly _blockPollingIntervalMs: number; private _blockAndLogStreamIntervalIfExists?: NodeJS.Timer; + private readonly _web3Wrapper: Web3Wrapper; private readonly _filters: { [filterToken: string]: FilterObject }; private readonly _filterCallbacks: { [filterToken: string]: EventCallback; @@ -43,26 +35,24 @@ export abstract class ContractWrapper { logUtils.warn(err); } } - constructor(web3Wrapper: Web3Wrapper, networkId: number, blockPollingIntervalMs?: number) { + constructor(abi: ContractAbi, web3Wrapper: Web3Wrapper) { + this.abi = abi; this._web3Wrapper = web3Wrapper; - this._networkId = networkId; - this._blockPollingIntervalMs = - blockPollingIntervalMs === undefined ? constants.DEFAULT_BLOCK_POLLING_INTERVAL : blockPollingIntervalMs; this._filters = {}; this._filterCallbacks = {}; this._blockAndLogStreamerIfExists = undefined; this._onLogAddedSubscriptionToken = undefined; this._onLogRemovedSubscriptionToken = undefined; } - protected _unsubscribeAll(): void { + public unsubscribeAll(): void { const filterTokens = _.keys(this._filterCallbacks); _.each(filterTokens, filterToken => { - this._unsubscribe(filterToken); + this.unsubscribe(filterToken); }); } - protected _unsubscribe(filterToken: string, err?: Error): void { + public unsubscribe(filterToken: string, err?: Error): void { if (this._filters[filterToken] === undefined) { - throw new Error(ContractWrappersError.SubscriptionNotFound); + throw new Error(SubscriptionErrors.SubscriptionNotFound); } if (err !== undefined) { const callback = this._filterCallbacks[filterToken]; @@ -74,24 +64,25 @@ export abstract class ContractWrapper { this._stopBlockAndLogStream(); } } - protected _subscribe( + public subscribe( address: string, eventName: ContractEvents, indexFilterValues: IndexedFilterValues, abi: ContractAbi, callback: EventCallback, isVerbose: boolean = false, + blockPollingIntervalMs?: number, ): string { const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi); if (this._blockAndLogStreamerIfExists === undefined) { - this._startBlockAndLogStream(isVerbose); + this._startBlockAndLogStream(isVerbose, blockPollingIntervalMs); } const filterToken = filterUtils.generateUUID(); this._filters[filterToken] = filter; this._filterCallbacks[filterToken] = callback as EventCallback; return filterToken; } - protected async _getLogsAsync( + public async getLogsAsync( address: string, eventName: ContractEvents, blockRange: BlockRange, @@ -123,21 +114,23 @@ export abstract class ContractWrapper { } }); } - private _startBlockAndLogStream(isVerbose: boolean): void { + private _startBlockAndLogStream(isVerbose: boolean, blockPollingIntervalMs?: number): void { if (this._blockAndLogStreamerIfExists !== undefined) { - throw new Error(ContractWrappersError.SubscriptionAlreadyPresent); + throw new Error(SubscriptionErrors.SubscriptionAlreadyPresent); } this._blockAndLogStreamerIfExists = new BlockAndLogStreamer( this._blockstreamGetBlockOrNullAsync.bind(this), this._blockstreamGetLogsAsync.bind(this), - ContractWrapper._onBlockAndLogStreamerError.bind(this, isVerbose), + SubscriptionManager._onBlockAndLogStreamerError.bind(this, isVerbose), ); const catchAllLogFilter = {}; this._blockAndLogStreamerIfExists.addLogFilter(catchAllLogFilter); + const _blockPollingIntervalMs = + blockPollingIntervalMs === undefined ? DEFAULT_BLOCK_POLLING_INTERVAL : blockPollingIntervalMs; this._blockAndLogStreamIntervalIfExists = intervalUtils.setAsyncExcludingInterval( this._reconcileBlockAsync.bind(this), - this._blockPollingIntervalMs, - ContractWrapper._onBlockAndLogStreamerError.bind(this, isVerbose), + _blockPollingIntervalMs, + SubscriptionManager._onBlockAndLogStreamerError.bind(this, isVerbose), ); let isRemoved = false; this._onLogAddedSubscriptionToken = this._blockAndLogStreamerIfExists.subscribeToOnLogAdded( @@ -176,7 +169,7 @@ export abstract class ContractWrapper { } private _stopBlockAndLogStream(): void { if (this._blockAndLogStreamerIfExists === undefined) { - throw new Error(ContractWrappersError.SubscriptionNotFound); + throw new Error(SubscriptionErrors.SubscriptionNotFound); } this._blockAndLogStreamerIfExists.unsubscribeFromOnLogAdded(this._onLogAddedSubscriptionToken as string); this._blockAndLogStreamerIfExists.unsubscribeFromOnLogRemoved(this._onLogRemovedSubscriptionToken as string); diff --git a/packages/base-contract/src/types.ts b/packages/base-contract/src/types.ts new file mode 100644 index 0000000000..e8caac5eef --- /dev/null +++ b/packages/base-contract/src/types.ts @@ -0,0 +1,38 @@ +import { BlockParam, ContractEventArg, DecodedLogArgs, LogEntryEvent, LogWithDecodedArgs } from 'ethereum-types'; + +export type LogEvent = LogEntryEvent; +export interface DecodedLogEvent { + isRemoved: boolean; + log: LogWithDecodedArgs; +} + +export type EventCallback = ( + err: null | Error, + log?: DecodedLogEvent, +) => void; + +export interface ContractEvent { + logIndex: number; + transactionIndex: number; + transactionHash: string; + blockHash: string; + blockNumber: number; + address: string; + type: string; + event: string; + args: ContractEventArgs; +} + +export enum SubscriptionErrors { + SubscriptionNotFound = 'SUBSCRIPTION_NOT_FOUND', + SubscriptionAlreadyPresent = 'SUBSCRIPTION_ALREADY_PRESENT', +} + +export interface IndexedFilterValues { + [index: string]: ContractEventArg; +} + +export interface BlockRange { + fromBlock: BlockParam; + toBlock: BlockParam; +} diff --git a/packages/base-contract/src/utils/filter_utils.ts b/packages/base-contract/src/utils/filter_utils.ts new file mode 100644 index 0000000000..a10899e9ce --- /dev/null +++ b/packages/base-contract/src/utils/filter_utils.ts @@ -0,0 +1,87 @@ +import { ContractAbi, EventAbi, FilterObject, LogEntry } 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, 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 (blockRange !== undefined) { + 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 { + const topics: Array = []; + for (const eventInput of abi.inputs) { + if (!eventInput.indexed) { + continue; + } + if (indexFilterValues[eventInput.name] === undefined) { + // 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 (filter.address !== undefined && log.address !== filter.address) { + return false; + } + if (filter.topics !== undefined) { + return filterUtils.doesMatchTopics(log.topics, filter.topics); + } + return true; + }, + doesMatchTopics(logTopics: string[], filterTopics: Array): 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/CHANGELOG.json b/packages/contract-wrappers/CHANGELOG.json index 79c36408e3..413273378d 100644 --- a/packages/contract-wrappers/CHANGELOG.json +++ b/packages/contract-wrappers/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "10.0.0", + "changes": [ + { + "note": "Constructors for `ERC20TokenWrapper`, `ERC721TokenWrapper`, and `EtherTokenWrapper` no longer accept networkId", + "pr": 1970 + } + ] + }, { "version": "9.1.8", "changes": [ diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json index d84bbe92eb..a6b48faeee 100644 --- a/packages/contract-wrappers/package.json +++ b/packages/contract-wrappers/package.json @@ -73,6 +73,7 @@ "dependencies": { "@0x/abi-gen-wrappers": "^5.0.3", "@0x/assert": "^2.1.1", + "@0x/base-contract": "^5.1.2", "@0x/contract-addresses": "^3.0.2", "@0x/contract-artifacts": "^2.0.2", "@0x/json-schemas": "^3.1.11", diff --git a/packages/contract-wrappers/src/contract_wrappers.ts b/packages/contract-wrappers/src/contract_wrappers.ts index 370a191d43..40b0651558 100644 --- a/packages/contract-wrappers/src/contract_wrappers.ts +++ b/packages/contract-wrappers/src/contract_wrappers.ts @@ -119,24 +119,9 @@ export class ContractWrappers { : config.contractAddresses; this.erc20Proxy = new ERC20ProxyWrapper(this._web3Wrapper, config.networkId, contractAddresses.erc20Proxy); this.erc721Proxy = new ERC721ProxyWrapper(this._web3Wrapper, config.networkId, contractAddresses.erc721Proxy); - 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.erc20Token = new ERC20TokenWrapper(this._web3Wrapper, this.erc20Proxy, blockPollingIntervalMs); + this.erc721Token = new ERC721TokenWrapper(this._web3Wrapper, this.erc721Proxy, blockPollingIntervalMs); + this.etherToken = new EtherTokenWrapper(this._web3Wrapper, this.erc20Token, blockPollingIntervalMs); this.exchange = new ExchangeWrapper( this._web3Wrapper, config.networkId, diff --git a/packages/contract-wrappers/src/contract_wrappers/coordinator_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/coordinator_wrapper.ts index e7c22020e9..8a1659363e 100644 --- a/packages/contract-wrappers/src/contract_wrappers/coordinator_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/coordinator_wrapper.ts @@ -25,17 +25,17 @@ import { import { decorators } from '../utils/decorators'; import { TransactionEncoder } from '../utils/transaction_encoder'; -import { ContractWrapper } from './contract_wrapper'; /** * This class includes all the functionality related to filling or cancelling orders through * the 0x V2 Coordinator extension contract. */ -export class CoordinatorWrapper extends ContractWrapper { +export class CoordinatorWrapper { public abi: ContractAbi = Coordinator.compilerOutput.abi; public networkId: number; public address: string; public exchangeAddress: string; public registryAddress: string; + private readonly _web3Wrapper: Web3Wrapper; private readonly _contractInstance: CoordinatorContract; private readonly _registryInstance: CoordinatorRegistryContract; private readonly _exchangeInstance: ExchangeContract; @@ -60,13 +60,12 @@ export class CoordinatorWrapper extends ContractWrapper { exchangeAddress?: string, registryAddress?: string, ) { - super(web3Wrapper, networkId); this.networkId = networkId; - const contractAddresses = getContractAddressesForNetworkOrThrow(networkId); this.address = address === undefined ? contractAddresses.coordinator : address; this.exchangeAddress = exchangeAddress === undefined ? contractAddresses.coordinator : exchangeAddress; this.registryAddress = registryAddress === undefined ? contractAddresses.coordinatorRegistry : registryAddress; + this._web3Wrapper = web3Wrapper; this._contractInstance = new CoordinatorContract( this.address, diff --git a/packages/contract-wrappers/src/contract_wrappers/dutch_auction_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/dutch_auction_wrapper.ts index 774ec1d16d..1cc8625acc 100644 --- a/packages/contract-wrappers/src/contract_wrappers/dutch_auction_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/dutch_auction_wrapper.ts @@ -14,12 +14,11 @@ import { DutchAuctionWrapperError, OrderTransactionOpts } from '../types'; import { assert } from '../utils/assert'; import { _getDefaultContractAddresses } from '../utils/contract_addresses'; -import { ContractWrapper } from './contract_wrapper'; - -export class DutchAuctionWrapper extends ContractWrapper { +export class DutchAuctionWrapper { public abi: ContractAbi = DutchAuction.compilerOutput.abi; public address: string; - private _dutchAuctionContractIfExists?: DutchAuctionContract; + private readonly _web3Wrapper: Web3Wrapper; + private readonly _dutchAuctionContract: DutchAuctionContract; /** * Dutch auction details are encoded with the asset data for a 0x order. This function produces a hex * encoded assetData string, containing information both about the asset being traded and the @@ -56,8 +55,13 @@ export class DutchAuctionWrapper extends ContractWrapper { * default to the known address corresponding to the networkId. */ public constructor(web3Wrapper: Web3Wrapper, networkId: number, address?: string) { - super(web3Wrapper, networkId); this.address = address === undefined ? _getDefaultContractAddresses(networkId).dutchAuction : address; + this._web3Wrapper = web3Wrapper; + this._dutchAuctionContract = new DutchAuctionContract( + this.address, + this._web3Wrapper.getProvider(), + this._web3Wrapper.getContractDefaults(), + ); } /** * Matches the buy and sell orders at an amount given the following: the current block time, the auction @@ -89,11 +93,9 @@ export class DutchAuctionWrapper extends ContractWrapper { ) { throw new Error(DutchAuctionWrapperError.AssetDataMismatch); } - // get contract - const dutchAuctionInstance = await this._getDutchAuctionContractAsync(); // validate transaction if (orderTransactionOpts.shouldValidate) { - await dutchAuctionInstance.matchOrders.callAsync( + await this._dutchAuctionContract.matchOrders.callAsync( buyOrder, sellOrder, buyOrder.signature, @@ -107,7 +109,7 @@ export class DutchAuctionWrapper extends ContractWrapper { ); } // send transaction - const txHash = await dutchAuctionInstance.matchOrders.sendTransactionAsync( + const txHash = await this._dutchAuctionContract.matchOrders.sendTransactionAsync( buyOrder, sellOrder, buyOrder.signature, @@ -129,22 +131,8 @@ export class DutchAuctionWrapper extends ContractWrapper { public async getAuctionDetailsAsync(sellOrder: SignedOrder): Promise { // type assertions assert.doesConformToSchema('sellOrder', sellOrder, schemas.signedOrderSchema); - // get contract - const dutchAuctionInstance = await this._getDutchAuctionContractAsync(); // call contract - const auctionDetails = await dutchAuctionInstance.getAuctionDetails.callAsync(sellOrder); + const auctionDetails = await this._dutchAuctionContract.getAuctionDetails.callAsync(sellOrder); return auctionDetails; } - private async _getDutchAuctionContractAsync(): Promise { - if (this._dutchAuctionContractIfExists !== undefined) { - return this._dutchAuctionContractIfExists; - } - const contractInstance = new DutchAuctionContract( - this.address, - this._web3Wrapper.getProvider(), - this._web3Wrapper.getContractDefaults(), - ); - this._dutchAuctionContractIfExists = contractInstance; - return this._dutchAuctionContractIfExists; - } } diff --git a/packages/contract-wrappers/src/contract_wrappers/erc20_proxy_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/erc20_proxy_wrapper.ts index 5574df315c..88af962471 100644 --- a/packages/contract-wrappers/src/contract_wrappers/erc20_proxy_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/erc20_proxy_wrapper.ts @@ -8,15 +8,14 @@ import * as _ from 'lodash'; import { assert } from '../utils/assert'; import { _getDefaultContractAddresses } from '../utils/contract_addresses'; -import { ContractWrapper } from './contract_wrapper'; - /** * This class includes the functionality related to interacting with the ERC20Proxy contract. */ -export class ERC20ProxyWrapper extends ContractWrapper { +export class ERC20ProxyWrapper { public abi: ContractAbi = ERC20Proxy.compilerOutput.abi; public address: string; - private _erc20ProxyContractIfExists?: ERC20ProxyContract; + private readonly _web3Wrapper: Web3Wrapper; + private readonly _erc20ProxyContract: ERC20ProxyContract; /** * Instantiate ERC20ProxyWrapper * @param web3Wrapper Web3Wrapper instance to use @@ -25,19 +24,23 @@ export class ERC20ProxyWrapper extends ContractWrapper { * default to the known address corresponding to the networkId. */ constructor(web3Wrapper: Web3Wrapper, networkId: number, address?: string) { - super(web3Wrapper, networkId); + this._web3Wrapper = web3Wrapper; this.address = address === undefined ? _getDefaultContractAddresses(networkId).erc20Proxy : address; + this._erc20ProxyContract = new ERC20ProxyContract( + this.address, + this._web3Wrapper.getProvider(), + this._web3Wrapper.getContractDefaults(), + ); } /** * Get the 4 bytes ID of this asset proxy * @return Proxy id */ public async getProxyIdAsync(): Promise { - const ERC20ProxyContractInstance = this._getERC20ProxyContract(); // Note(albrow): Below is a TSLint false positive. Code won't compile if // you remove the type assertion. /* tslint:disable-next-line:no-unnecessary-type-assertion */ - const proxyId = (await ERC20ProxyContractInstance.getProxyId.callAsync()) as AssetProxyId; + const proxyId = (await this._erc20ProxyContract.getProxyId.callAsync()) as AssetProxyId; return proxyId; } /** @@ -48,8 +51,7 @@ export class ERC20ProxyWrapper extends ContractWrapper { public async isAuthorizedAsync(exchangeContractAddress: string): Promise { assert.isETHAddressHex('exchangeContractAddress', exchangeContractAddress); const normalizedExchangeContractAddress = exchangeContractAddress.toLowerCase(); - const ERC20ProxyContractInstance = this._getERC20ProxyContract(); - const isAuthorized = await ERC20ProxyContractInstance.authorized.callAsync(normalizedExchangeContractAddress); + const isAuthorized = await this._erc20ProxyContract.authorized.callAsync(normalizedExchangeContractAddress); return isAuthorized; } /** @@ -57,20 +59,7 @@ export class ERC20ProxyWrapper extends ContractWrapper { * @return The list of authorized addresses. */ public async getAuthorizedAddressesAsync(): Promise { - const ERC20ProxyContractInstance = this._getERC20ProxyContract(); - const authorizedAddresses = await ERC20ProxyContractInstance.getAuthorizedAddresses.callAsync(); + const authorizedAddresses = await this._erc20ProxyContract.getAuthorizedAddresses.callAsync(); return authorizedAddresses; } - private _getERC20ProxyContract(): ERC20ProxyContract { - if (this._erc20ProxyContractIfExists !== undefined) { - return this._erc20ProxyContractIfExists; - } - const contractInstance = new ERC20ProxyContract( - this.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 index 989cf95193..3944424380 100644 --- a/packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts @@ -1,4 +1,5 @@ import { ERC20TokenContract, ERC20TokenEventArgs, ERC20TokenEvents } from '@0x/abi-gen-wrappers'; +import { SubscriptionManager } from '@0x/base-contract'; import { ERC20Token } from '@0x/contract-artifacts'; import { schemas } from '@0x/json-schemas'; import { BigNumber } from '@0x/utils'; @@ -20,7 +21,6 @@ import { assert } from '../utils/assert'; import { constants } from '../utils/constants'; import { utils } from '../utils/utils'; -import { ContractWrapper } from './contract_wrapper'; import { ERC20ProxyWrapper } from './erc20_proxy_wrapper'; /** @@ -28,27 +28,28 @@ import { ERC20ProxyWrapper } from './erc20_proxy_wrapper'; * 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 { +export class ERC20TokenWrapper { public abi: ContractAbi = ERC20Token.compilerOutput.abi; public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS; + private readonly _web3Wrapper: Web3Wrapper; + private readonly _blockPollingIntervalMs?: number; + private readonly _subscriptionManager: SubscriptionManager; private readonly _tokenContractsByAddress: { [address: string]: ERC20TokenContract }; private readonly _erc20ProxyWrapper: ERC20ProxyWrapper; /** * Instantiate ERC20TokenWrapper * @param web3Wrapper Web3Wrapper instance to use - * @param networkId Desired networkId * @param erc20ProxyWrapper The ERC20ProxyWrapper instance to use - * @param blockPollingIntervalMs The block polling interval to use for active subscriptions */ - constructor( - web3Wrapper: Web3Wrapper, - networkId: number, - erc20ProxyWrapper: ERC20ProxyWrapper, - blockPollingIntervalMs?: number, - ) { - super(web3Wrapper, networkId, blockPollingIntervalMs); + constructor(web3Wrapper: Web3Wrapper, erc20ProxyWrapper: ERC20ProxyWrapper, blockPollingIntervalMs?: number) { + this._web3Wrapper = web3Wrapper; this._tokenContractsByAddress = {}; this._erc20ProxyWrapper = erc20ProxyWrapper; + this._blockPollingIntervalMs = blockPollingIntervalMs; + this._subscriptionManager = new SubscriptionManager( + ERC20TokenContract.ABI(), + web3Wrapper, + ); } /** * Retrieves an owner's ERC20 token balance. @@ -371,13 +372,14 @@ export class ERC20TokenWrapper extends ContractWrapper { assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); assert.isFunction('callback', callback); const normalizedTokenAddress = tokenAddress.toLowerCase(); - const subscriptionToken = this._subscribe( + const subscriptionToken = this._subscriptionManager.subscribe( normalizedTokenAddress, eventName, indexFilterValues, ERC20Token.compilerOutput.abi, callback, isVerbose, + this._blockPollingIntervalMs, ); return subscriptionToken; } @@ -387,13 +389,13 @@ export class ERC20TokenWrapper extends ContractWrapper { */ public unsubscribe(subscriptionToken: string): void { assert.isValidSubscriptionToken('subscriptionToken', subscriptionToken); - this._unsubscribe(subscriptionToken); + this._subscriptionManager.unsubscribe(subscriptionToken); // doesn't matter which contract is used } /** * Cancels all existing subscriptions */ public unsubscribeAll(): void { - super._unsubscribeAll(); + this._subscriptionManager.unsubscribeAll(); } /** * Gets historical logs without creating a subscription @@ -415,7 +417,7 @@ export class ERC20TokenWrapper extends ContractWrapper { assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); const normalizedTokenAddress = tokenAddress.toLowerCase(); - const logs = await this._getLogsAsync( + const logs = await this._subscriptionManager.getLogsAsync( normalizedTokenAddress, eventName, blockRange, diff --git a/packages/contract-wrappers/src/contract_wrappers/erc721_proxy_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/erc721_proxy_wrapper.ts index 801e393a3f..30fe1e77c6 100644 --- a/packages/contract-wrappers/src/contract_wrappers/erc721_proxy_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/erc721_proxy_wrapper.ts @@ -8,15 +8,14 @@ import * as _ from 'lodash'; import { assert } from '../utils/assert'; import { _getDefaultContractAddresses } from '../utils/contract_addresses'; -import { ContractWrapper } from './contract_wrapper'; - /** * This class includes the functionality related to interacting with the ERC721Proxy contract. */ -export class ERC721ProxyWrapper extends ContractWrapper { +export class ERC721ProxyWrapper { public abi: ContractAbi = ERC721Proxy.compilerOutput.abi; public address: string; - private _erc721ProxyContractIfExists?: ERC721ProxyContract; + private readonly _web3Wrapper: Web3Wrapper; + private readonly _erc721ProxyContract: ERC721ProxyContract; /** * Instantiate ERC721ProxyWrapper * @param web3Wrapper Web3Wrapper instance to use @@ -25,19 +24,23 @@ export class ERC721ProxyWrapper extends ContractWrapper { * will default to the known address corresponding to the networkId. */ constructor(web3Wrapper: Web3Wrapper, networkId: number, address?: string) { - super(web3Wrapper, networkId); + this._web3Wrapper = web3Wrapper; this.address = address === undefined ? _getDefaultContractAddresses(networkId).erc721Proxy : address; + this._erc721ProxyContract = new ERC721ProxyContract( + this.address, + this._web3Wrapper.getProvider(), + this._web3Wrapper.getContractDefaults(), + ); } /** * Get the 4 bytes ID of this asset proxy * @return Proxy id */ public async getProxyIdAsync(): Promise { - const ERC721ProxyContractInstance = await this._getERC721ProxyContract(); // Note(albrow): Below is a TSLint false positive. Code won't compile if // you remove the type assertion. /* tslint:disable-next-line:no-unnecessary-type-assertion */ - const proxyId = (await ERC721ProxyContractInstance.getProxyId.callAsync()) as AssetProxyId; + const proxyId = (await this._erc721ProxyContract.getProxyId.callAsync()) as AssetProxyId; return proxyId; } /** @@ -48,8 +51,7 @@ export class ERC721ProxyWrapper extends ContractWrapper { public async isAuthorizedAsync(exchangeContractAddress: string): Promise { assert.isETHAddressHex('exchangeContractAddress', exchangeContractAddress); const normalizedExchangeContractAddress = exchangeContractAddress.toLowerCase(); - const ERC721ProxyContractInstance = await this._getERC721ProxyContract(); - const isAuthorized = await ERC721ProxyContractInstance.authorized.callAsync(normalizedExchangeContractAddress); + const isAuthorized = await this._erc721ProxyContract.authorized.callAsync(normalizedExchangeContractAddress); return isAuthorized; } /** @@ -57,20 +59,7 @@ export class ERC721ProxyWrapper extends ContractWrapper { * @return The list of authorized addresses. */ public async getAuthorizedAddressesAsync(): Promise { - const ERC721ProxyContractInstance = await this._getERC721ProxyContract(); - const authorizedAddresses = await ERC721ProxyContractInstance.getAuthorizedAddresses.callAsync(); + const authorizedAddresses = await this._erc721ProxyContract.getAuthorizedAddresses.callAsync(); return authorizedAddresses; } - private _getERC721ProxyContract(): ERC721ProxyContract { - if (this._erc721ProxyContractIfExists !== undefined) { - return this._erc721ProxyContractIfExists; - } - const contractInstance = new ERC721ProxyContract( - this.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 index 12c899cf4f..8b6711daae 100644 --- a/packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts @@ -1,4 +1,5 @@ import { ERC721TokenContract, ERC721TokenEventArgs, ERC721TokenEvents } from '@0x/abi-gen-wrappers'; +import { SubscriptionManager } from '@0x/base-contract'; import { ERC721Token } from '@0x/contract-artifacts'; import { schemas } from '@0x/json-schemas'; import { BigNumber } from '@0x/utils'; @@ -20,7 +21,6 @@ import { assert } from '../utils/assert'; import { constants } from '../utils/constants'; import { utils } from '../utils/utils'; -import { ContractWrapper } from './contract_wrapper'; import { ERC721ProxyWrapper } from './erc721_proxy_wrapper'; /** @@ -28,26 +28,27 @@ import { ERC721ProxyWrapper } from './erc721_proxy_wrapper'; * 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 { +export class ERC721TokenWrapper { public abi: ContractAbi = ERC721Token.compilerOutput.abi; + private readonly _web3Wrapper: Web3Wrapper; + private readonly _subscriptionManager: SubscriptionManager; + private readonly _blockPollingIntervalMs?: number; private readonly _tokenContractsByAddress: { [address: string]: ERC721TokenContract }; private readonly _erc721ProxyWrapper: ERC721ProxyWrapper; /** * Instantiate ERC721TokenWrapper * @param web3Wrapper Web3Wrapper instance to use - * @param networkId Desired networkId * @param erc721ProxyWrapper The ERC721ProxyWrapper instance to use - * @param blockPollingIntervalMs The block polling interval to use for active subscriptions */ - constructor( - web3Wrapper: Web3Wrapper, - networkId: number, - erc721ProxyWrapper: ERC721ProxyWrapper, - blockPollingIntervalMs?: number, - ) { - super(web3Wrapper, networkId, blockPollingIntervalMs); + constructor(web3Wrapper: Web3Wrapper, erc721ProxyWrapper: ERC721ProxyWrapper, blockPollingIntervalMs?: number) { + this._web3Wrapper = web3Wrapper; this._tokenContractsByAddress = {}; this._erc721ProxyWrapper = erc721ProxyWrapper; + this._blockPollingIntervalMs = blockPollingIntervalMs; + this._subscriptionManager = new SubscriptionManager( + ERC721TokenContract.ABI(), + web3Wrapper, + ); } /** * Count all NFTs assigned to an owner @@ -398,13 +399,14 @@ export class ERC721TokenWrapper extends ContractWrapper { assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); assert.isFunction('callback', callback); const normalizedTokenAddress = tokenAddress.toLowerCase(); - const subscriptionToken = this._subscribe( + const subscriptionToken = this._subscriptionManager.subscribe( normalizedTokenAddress, eventName, indexFilterValues, ERC721Token.compilerOutput.abi, callback, isVerbose, + this._blockPollingIntervalMs, ); return subscriptionToken; } @@ -414,13 +416,13 @@ export class ERC721TokenWrapper extends ContractWrapper { */ public unsubscribe(subscriptionToken: string): void { assert.isValidSubscriptionToken('subscriptionToken', subscriptionToken); - this._unsubscribe(subscriptionToken); + this._subscriptionManager.unsubscribe(subscriptionToken); } /** * Cancels all existing subscriptions */ public unsubscribeAll(): void { - super._unsubscribeAll(); + this._subscriptionManager.unsubscribeAll(); } /** * Gets historical logs without creating a subscription @@ -442,7 +444,7 @@ export class ERC721TokenWrapper extends ContractWrapper { assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); const normalizedTokenAddress = tokenAddress.toLowerCase(); - const logs = await this._getLogsAsync( + const logs = await this._subscriptionManager.getLogsAsync( normalizedTokenAddress, eventName, blockRange, diff --git a/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts index b1805ecc87..599c73dcc0 100644 --- a/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts @@ -1,4 +1,5 @@ import { WETH9Contract, WETH9EventArgs, WETH9Events } from '@0x/abi-gen-wrappers'; +import { SubscriptionManager } from '@0x/base-contract'; import { WETH9 } from '@0x/contract-artifacts'; import { schemas } from '@0x/json-schemas'; import { BigNumber } from '@0x/utils'; @@ -10,15 +11,17 @@ import { BlockRange, ContractWrappersError, EventCallback, IndexedFilterValues, import { assert } from '../utils/assert'; import { utils } from '../utils/utils'; -import { ContractWrapper } from './contract_wrapper'; import { ERC20TokenWrapper } from './erc20_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 { +export class EtherTokenWrapper { public abi: ContractAbi = WETH9.compilerOutput.abi; + private readonly _web3Wrapper: Web3Wrapper; + private readonly _subscriptionManager: SubscriptionManager; + private readonly _blockPollingIntervalMs?: number; private readonly _etherTokenContractsByAddress: { [address: string]: WETH9Contract; } = {}; @@ -26,18 +29,16 @@ export class EtherTokenWrapper extends ContractWrapper { /** * Instantiate EtherTokenWrapper. * @param web3Wrapper Web3Wrapper instance to use - * @param networkId Desired networkId * @param erc20TokenWrapper The ERC20TokenWrapper instance to use - * @param blockPollingIntervalMs The block polling interval to use for active subscriptions */ - constructor( - web3Wrapper: Web3Wrapper, - networkId: number, - erc20TokenWrapper: ERC20TokenWrapper, - blockPollingIntervalMs?: number, - ) { - super(web3Wrapper, networkId, blockPollingIntervalMs); + constructor(web3Wrapper: Web3Wrapper, erc20TokenWrapper: ERC20TokenWrapper, blockPollingIntervalMs?: number) { + this._web3Wrapper = web3Wrapper; this._erc20TokenWrapper = erc20TokenWrapper; + this._blockPollingIntervalMs = blockPollingIntervalMs; + this._subscriptionManager = new SubscriptionManager( + WETH9Contract.ABI(), + web3Wrapper, + ); } /** * Deposit ETH into the Wrapped ETH smart contract and issues the equivalent number of wrapped ETH tokens @@ -138,7 +139,7 @@ export class EtherTokenWrapper extends ContractWrapper { assert.doesBelongToStringEnum('eventName', eventName, WETH9Events); assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); - const logs = await this._getLogsAsync( + const logs = await this._subscriptionManager.getLogsAsync( normalizedEtherTokenAddress, eventName, blockRange, @@ -169,13 +170,14 @@ export class EtherTokenWrapper extends ContractWrapper { assert.doesBelongToStringEnum('eventName', eventName, WETH9Events); assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); assert.isFunction('callback', callback); - const subscriptionToken = this._subscribe( + const subscriptionToken = this._subscriptionManager.subscribe( normalizedEtherTokenAddress, eventName, indexFilterValues, WETH9.compilerOutput.abi, callback, isVerbose, + this._blockPollingIntervalMs, ); return subscriptionToken; } @@ -185,13 +187,13 @@ export class EtherTokenWrapper extends ContractWrapper { */ public unsubscribe(subscriptionToken: string): void { assert.isValidSubscriptionToken('subscriptionToken', subscriptionToken); - this._unsubscribe(subscriptionToken); + this._subscriptionManager.unsubscribe(subscriptionToken); } /** * Cancels all existing subscriptions */ public unsubscribeAll(): void { - super._unsubscribeAll(); + this._subscriptionManager.unsubscribeAll(); } private async _getEtherTokenContractAsync(etherTokenAddress: string): Promise { let etherTokenContract = this._etherTokenContractsByAddress[etherTokenAddress]; diff --git a/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts index a3b26a9724..bb948ee8a2 100644 --- a/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts @@ -37,7 +37,6 @@ import { _getDefaultContractAddresses } from '../utils/contract_addresses'; import { decorators } from '../utils/decorators'; import { TransactionEncoder } from '../utils/transaction_encoder'; -import { ContractWrapper } from './contract_wrapper'; import { ERC20TokenWrapper } from './erc20_token_wrapper'; import { ERC721TokenWrapper } from './erc721_token_wrapper'; @@ -45,11 +44,13 @@ import { ERC721TokenWrapper } from './erc721_token_wrapper'; * 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 { +export class ExchangeWrapper { public abi: ContractAbi = Exchange.compilerOutput.abi; public address: string; public zrxTokenAddress: string; - private _exchangeContractIfExists?: ExchangeContract; + private readonly _web3Wrapper: Web3Wrapper; + private readonly _exchangeContract: ExchangeContract; + private readonly _blockPollingIntervalMs?: number; private readonly _erc721TokenWrapper: ERC721TokenWrapper; private readonly _erc20TokenWrapper: ERC20TokenWrapper; /** @@ -74,12 +75,18 @@ export class ExchangeWrapper extends ContractWrapper { zrxTokenAddress?: string, blockPollingIntervalMs?: number, ) { - super(web3Wrapper, networkId, blockPollingIntervalMs); + this._web3Wrapper = web3Wrapper; this._erc20TokenWrapper = erc20TokenWrapper; this._erc721TokenWrapper = erc721TokenWrapper; + this._blockPollingIntervalMs = blockPollingIntervalMs; this.address = address === undefined ? _getDefaultContractAddresses(networkId).exchange : address; this.zrxTokenAddress = zrxTokenAddress === undefined ? _getDefaultContractAddresses(networkId).zrxToken : zrxTokenAddress; + this._exchangeContract = new ExchangeContract( + this.address, + this._web3Wrapper.getProvider(), + this._web3Wrapper.getContractDefaults(), + ); } /** * Retrieve the address of an asset proxy by signature. @@ -90,10 +97,13 @@ export class ExchangeWrapper extends ContractWrapper { public async getAssetProxyBySignatureAsync(proxyId: AssetProxyId, methodOpts: MethodOpts = {}): Promise { assert.doesBelongToStringEnum('proxyId', proxyId, AssetProxyId); assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema); - const exchangeContract = await this._getExchangeContractAsync(); const callData = {}; - const assetProxy = await exchangeContract.getAssetProxy.callAsync(proxyId, callData, methodOpts.defaultBlock); + const assetProxy = await this._exchangeContract.getAssetProxy.callAsync( + proxyId, + callData, + methodOpts.defaultBlock, + ); return assetProxy; } /** @@ -105,10 +115,9 @@ export class ExchangeWrapper extends ContractWrapper { public async getFilledTakerAssetAmountAsync(orderHash: string, methodOpts: MethodOpts = {}): Promise { assert.doesConformToSchema('orderHash', orderHash, schemas.orderHashSchema); assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema); - const exchangeContract = await this._getExchangeContractAsync(); const callData = {}; - const filledTakerAssetAmountInBaseUnits = await exchangeContract.filled.callAsync( + const filledTakerAssetAmountInBaseUnits = await this._exchangeContract.filled.callAsync( orderHash, callData, methodOpts.defaultBlock, @@ -122,10 +131,8 @@ export class ExchangeWrapper extends ContractWrapper { */ public async getVersionAsync(methodOpts: MethodOpts = {}): Promise { assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema); - const exchangeContract = await this._getExchangeContractAsync(); - const callData = {}; - const version = await exchangeContract.VERSION.callAsync(callData, methodOpts.defaultBlock); + const version = await this._exchangeContract.VERSION.callAsync(callData, methodOpts.defaultBlock); return version; } /** @@ -144,10 +151,8 @@ export class ExchangeWrapper extends ContractWrapper { assert.isETHAddressHex('makerAddress', makerAddress); assert.isETHAddressHex('senderAddress', senderAddress); assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema); - const exchangeContract = await this._getExchangeContractAsync(); - const callData = {}; - const orderEpoch = await exchangeContract.orderEpoch.callAsync( + const orderEpoch = await this._exchangeContract.orderEpoch.callAsync( makerAddress, senderAddress, callData, @@ -164,10 +169,12 @@ export class ExchangeWrapper extends ContractWrapper { public async isCancelledAsync(orderHash: string, methodOpts: MethodOpts = {}): Promise { assert.doesConformToSchema('orderHash', orderHash, schemas.orderHashSchema); assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema); - const exchangeContract = await this._getExchangeContractAsync(); - const callData = {}; - const isCancelled = await exchangeContract.cancelled.callAsync(orderHash, callData, methodOpts.defaultBlock); + const isCancelled = await this._exchangeContract.cancelled.callAsync( + orderHash, + callData, + methodOpts.defaultBlock, + ); return isCancelled; } /** @@ -192,9 +199,8 @@ export class ExchangeWrapper extends ContractWrapper { 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, { + await this._exchangeContract.fillOrder.callAsync(signedOrder, takerAssetFillAmount, signedOrder.signature, { from: normalizedTakerAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, @@ -202,7 +208,7 @@ export class ExchangeWrapper extends ContractWrapper { }); } - const txHash = await exchangeInstance.fillOrder.sendTransactionAsync( + const txHash = await this._exchangeContract.fillOrder.sendTransactionAsync( signedOrder, takerAssetFillAmount, signedOrder.signature, @@ -237,9 +243,8 @@ export class ExchangeWrapper extends ContractWrapper { assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); const normalizedTakerAddress = takerAddress.toLowerCase(); - const exchangeInstance = await this._getExchangeContractAsync(); if (orderTransactionOpts.shouldValidate) { - await exchangeInstance.fillOrderNoThrow.callAsync( + await this._exchangeContract.fillOrderNoThrow.callAsync( signedOrder, takerAssetFillAmount, signedOrder.signature, @@ -251,7 +256,7 @@ export class ExchangeWrapper extends ContractWrapper { }, ); } - const txHash = await exchangeInstance.fillOrderNoThrow.sendTransactionAsync( + const txHash = await this._exchangeContract.fillOrderNoThrow.sendTransactionAsync( signedOrder, takerAssetFillAmount, signedOrder.signature, @@ -287,16 +292,20 @@ export class ExchangeWrapper extends ContractWrapper { 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, - nonce: orderTransactionOpts.nonce, - }); + await this._exchangeContract.fillOrKillOrder.callAsync( + signedOrder, + takerAssetFillAmount, + signedOrder.signature, + { + from: normalizedTakerAddress, + gas: orderTransactionOpts.gasLimit, + gasPrice: orderTransactionOpts.gasPrice, + nonce: orderTransactionOpts.nonce, + }, + ); } - const txHash = await exchangeInstance.fillOrKillOrder.sendTransactionAsync( + const txHash = await this._exchangeContract.fillOrKillOrder.sendTransactionAsync( signedOrder, takerAssetFillAmount, signedOrder.signature, @@ -338,16 +347,15 @@ export class ExchangeWrapper extends ContractWrapper { 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, { + await this._exchangeContract.executeTransaction.callAsync(salt, signerAddress, data, signature, { from: normalizedSenderAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, nonce: orderTransactionOpts.nonce, }); } - const txHash = await exchangeInstance.executeTransaction.sendTransactionAsync( + const txHash = await this._exchangeContract.executeTransaction.sendTransactionAsync( salt, signerAddress, data, @@ -385,17 +393,16 @@ export class ExchangeWrapper extends ContractWrapper { 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, { + await this._exchangeContract.batchFillOrders.callAsync(signedOrders, takerAssetFillAmounts, signatures, { from: normalizedTakerAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, nonce: orderTransactionOpts.nonce, }); } - const txHash = await exchangeInstance.batchFillOrders.sendTransactionAsync( + const txHash = await this._exchangeContract.batchFillOrders.sendTransactionAsync( signedOrders, takerAssetFillAmounts, signatures, @@ -430,17 +437,16 @@ export class ExchangeWrapper extends ContractWrapper { 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, { + await this._exchangeContract.marketBuyOrders.callAsync(signedOrders, makerAssetFillAmount, signatures, { from: normalizedTakerAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, nonce: orderTransactionOpts.nonce, }); } - const txHash = await exchangeInstance.marketBuyOrders.sendTransactionAsync( + const txHash = await this._exchangeContract.marketBuyOrders.sendTransactionAsync( signedOrders, makerAssetFillAmount, signatures, @@ -475,17 +481,16 @@ export class ExchangeWrapper extends ContractWrapper { 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, { + await this._exchangeContract.marketSellOrders.callAsync(signedOrders, takerAssetFillAmount, signatures, { from: normalizedTakerAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, nonce: orderTransactionOpts.nonce, }); } - const txHash = await exchangeInstance.marketSellOrders.sendTransactionAsync( + const txHash = await this._exchangeContract.marketSellOrders.sendTransactionAsync( signedOrders, takerAssetFillAmount, signatures, @@ -520,17 +525,21 @@ export class ExchangeWrapper extends ContractWrapper { 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, - nonce: orderTransactionOpts.nonce, - }); + await this._exchangeContract.marketBuyOrdersNoThrow.callAsync( + signedOrders, + makerAssetFillAmount, + signatures, + { + from: normalizedTakerAddress, + gas: orderTransactionOpts.gasLimit, + gasPrice: orderTransactionOpts.gasPrice, + nonce: orderTransactionOpts.nonce, + }, + ); } - const txHash = await exchangeInstance.marketBuyOrdersNoThrow.sendTransactionAsync( + const txHash = await this._exchangeContract.marketBuyOrdersNoThrow.sendTransactionAsync( signedOrders, makerAssetFillAmount, signatures, @@ -565,17 +574,21 @@ export class ExchangeWrapper extends ContractWrapper { 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, - nonce: orderTransactionOpts.nonce, - }); + await this._exchangeContract.marketSellOrdersNoThrow.callAsync( + signedOrders, + takerAssetFillAmount, + signatures, + { + from: normalizedTakerAddress, + gas: orderTransactionOpts.gasLimit, + gasPrice: orderTransactionOpts.gasPrice, + nonce: orderTransactionOpts.nonce, + }, + ); } - const txHash = await exchangeInstance.marketSellOrdersNoThrow.sendTransactionAsync( + const txHash = await this._exchangeContract.marketSellOrdersNoThrow.sendTransactionAsync( signedOrders, takerAssetFillAmount, signatures, @@ -612,17 +625,21 @@ export class ExchangeWrapper extends ContractWrapper { 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, - nonce: orderTransactionOpts.nonce, - }); + await this._exchangeContract.batchFillOrdersNoThrow.callAsync( + signedOrders, + takerAssetFillAmounts, + signatures, + { + from: normalizedTakerAddress, + gas: orderTransactionOpts.gasLimit, + gasPrice: orderTransactionOpts.gasPrice, + nonce: orderTransactionOpts.nonce, + }, + ); } - const txHash = await exchangeInstance.batchFillOrdersNoThrow.sendTransactionAsync( + const txHash = await this._exchangeContract.batchFillOrdersNoThrow.sendTransactionAsync( signedOrders, takerAssetFillAmounts, signatures, @@ -659,17 +676,21 @@ export class ExchangeWrapper extends ContractWrapper { 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, - nonce: orderTransactionOpts.nonce, - }); + await this._exchangeContract.batchFillOrKillOrders.callAsync( + signedOrders, + takerAssetFillAmounts, + signatures, + { + from: normalizedTakerAddress, + gas: orderTransactionOpts.gasLimit, + gasPrice: orderTransactionOpts.gasPrice, + nonce: orderTransactionOpts.nonce, + }, + ); } - const txHash = await exchangeInstance.batchFillOrKillOrders.sendTransactionAsync( + const txHash = await this._exchangeContract.batchFillOrKillOrders.sendTransactionAsync( signedOrders, takerAssetFillAmounts, signatures, @@ -700,16 +721,15 @@ export class ExchangeWrapper extends ContractWrapper { await assert.isSenderAddressAsync('makerAddress', makerAddress, this._web3Wrapper); const normalizedMakerAddress = makerAddress.toLowerCase(); - const exchangeInstance = await this._getExchangeContractAsync(); if (orderTransactionOpts.shouldValidate) { - await exchangeInstance.batchCancelOrders.callAsync(orders, { + await this._exchangeContract.batchCancelOrders.callAsync(orders, { from: normalizedMakerAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, nonce: orderTransactionOpts.nonce, }); } - const txHash = await exchangeInstance.batchCancelOrders.sendTransactionAsync(orders, { + const txHash = await this._exchangeContract.batchCancelOrders.sendTransactionAsync(orders, { from: normalizedMakerAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, @@ -746,9 +766,8 @@ export class ExchangeWrapper extends ContractWrapper { ) { throw new Error(ExchangeWrapperError.AssetDataMismatch); } - const exchangeInstance = await this._getExchangeContractAsync(); if (orderTransactionOpts.shouldValidate) { - await exchangeInstance.matchOrders.callAsync( + await this._exchangeContract.matchOrders.callAsync( leftSignedOrder, rightSignedOrder, leftSignedOrder.signature, @@ -761,7 +780,7 @@ export class ExchangeWrapper extends ContractWrapper { }, ); } - const txHash = await exchangeInstance.matchOrders.sendTransactionAsync( + const txHash = await this._exchangeContract.matchOrders.sendTransactionAsync( leftSignedOrder, rightSignedOrder, leftSignedOrder.signature, @@ -799,16 +818,15 @@ export class ExchangeWrapper extends ContractWrapper { 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, { + await this._exchangeContract.preSign.callAsync(hash, signerAddress, signature, { from: normalizedTakerAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, nonce: orderTransactionOpts.nonce, }); } - const txHash = await exchangeInstance.preSign.sendTransactionAsync(hash, signerAddress, signature, { + const txHash = await this._exchangeContract.preSign.sendTransactionAsync(hash, signerAddress, signature, { from: normalizedTakerAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, @@ -835,9 +853,8 @@ export class ExchangeWrapper extends ContractWrapper { assert.isETHAddressHex('signerAddress', signerAddress); assert.isHexString('signature', signature); assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema); - const exchangeInstance = await this._getExchangeContractAsync(); const callData = {}; - const isValidSignature = await exchangeInstance.isValidSignature.callAsync( + const isValidSignature = await this._exchangeContract.isValidSignature.callAsync( hash, signerAddress, signature, @@ -866,9 +883,8 @@ export class ExchangeWrapper extends ContractWrapper { } const normalizedSignerAddress = signerAddress.toLowerCase(); const normalizedValidatorAddress = validatorAddress.toLowerCase(); - const exchangeInstance = await this._getExchangeContractAsync(); const callData = {}; - const isValidSignature = await exchangeInstance.allowedValidators.callAsync( + const isValidSignature = await this._exchangeContract.allowedValidators.callAsync( normalizedSignerAddress, normalizedValidatorAddress, callData, @@ -890,10 +906,9 @@ export class ExchangeWrapper extends ContractWrapper { if (methodOpts !== undefined) { assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema); } - const exchangeInstance = await this._getExchangeContractAsync(); const callData = {}; - const isPreSigned = await exchangeInstance.preSigned.callAsync( + const isPreSigned = await this._exchangeContract.preSigned.callAsync( hash, signerAddress, callData, @@ -914,9 +929,8 @@ export class ExchangeWrapper extends ContractWrapper { if (methodOpts !== undefined) { assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema); } - const exchangeInstance = await this._getExchangeContractAsync(); const callData = {}; - const isExecuted = await exchangeInstance.transactions.callAsync( + const isExecuted = await this._exchangeContract.transactions.callAsync( transactionHash, callData, methodOpts.defaultBlock, @@ -935,9 +949,8 @@ export class ExchangeWrapper extends ContractWrapper { if (methodOpts !== undefined) { assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema); } - const exchangeInstance = await this._getExchangeContractAsync(); const callData = {}; - const orderInfo = await exchangeInstance.getOrderInfo.callAsync(order, callData, methodOpts.defaultBlock); + const orderInfo = await this._exchangeContract.getOrderInfo.callAsync(order, callData, methodOpts.defaultBlock); return orderInfo; } /** @@ -955,9 +968,12 @@ export class ExchangeWrapper extends ContractWrapper { if (methodOpts !== undefined) { assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema); } - const exchangeInstance = await this._getExchangeContractAsync(); const callData = {}; - const ordersInfo = await exchangeInstance.getOrdersInfo.callAsync(orders, callData, methodOpts.defaultBlock); + const ordersInfo = await this._exchangeContract.getOrdersInfo.callAsync( + orders, + callData, + methodOpts.defaultBlock, + ); return ordersInfo; } /** @@ -976,16 +992,15 @@ export class ExchangeWrapper extends ContractWrapper { assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); const normalizedMakerAddress = order.makerAddress.toLowerCase(); - const exchangeInstance = await this._getExchangeContractAsync(); if (orderTransactionOpts.shouldValidate) { - await exchangeInstance.cancelOrder.callAsync(order, { + await this._exchangeContract.cancelOrder.callAsync(order, { from: normalizedMakerAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, nonce: orderTransactionOpts.nonce, }); } - const txHash = await exchangeInstance.cancelOrder.sendTransactionAsync(order, { + const txHash = await this._exchangeContract.cancelOrder.sendTransactionAsync(order, { from: normalizedMakerAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, @@ -1014,16 +1029,15 @@ export class ExchangeWrapper extends ContractWrapper { assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); const normalizedSenderAddress = senderAddress.toLowerCase(); - const exchangeInstance = await this._getExchangeContractAsync(); if (orderTransactionOpts.shouldValidate) { - await exchangeInstance.setSignatureValidatorApproval.callAsync(validatorAddress, isApproved, { + await this._exchangeContract.setSignatureValidatorApproval.callAsync(validatorAddress, isApproved, { from: normalizedSenderAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, nonce: orderTransactionOpts.nonce, }); } - const txHash = await exchangeInstance.setSignatureValidatorApproval.sendTransactionAsync( + const txHash = await this._exchangeContract.setSignatureValidatorApproval.sendTransactionAsync( validatorAddress, isApproved, { @@ -1054,16 +1068,15 @@ export class ExchangeWrapper extends ContractWrapper { assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]); const normalizedSenderAddress = senderAddress.toLowerCase(); - const exchangeInstance = await this._getExchangeContractAsync(); if (orderTransactionOpts.shouldValidate) { - await exchangeInstance.cancelOrdersUpTo.callAsync(targetOrderEpoch, { + await this._exchangeContract.cancelOrdersUpTo.callAsync(targetOrderEpoch, { from: normalizedSenderAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, nonce: orderTransactionOpts.nonce, }); } - const txHash = await exchangeInstance.cancelOrdersUpTo.sendTransactionAsync(targetOrderEpoch, { + const txHash = await this._exchangeContract.cancelOrdersUpTo.sendTransactionAsync(targetOrderEpoch, { from: normalizedSenderAddress, gas: orderTransactionOpts.gasLimit, gasPrice: orderTransactionOpts.gasPrice, @@ -1089,13 +1102,12 @@ export class ExchangeWrapper extends ContractWrapper { assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents); assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); assert.isFunction('callback', callback); - const subscriptionToken = this._subscribe( - this.address, + const subscriptionToken = this._exchangeContract.subscribe( eventName, indexFilterValues, - Exchange.compilerOutput.abi, callback, isVerbose, + this._blockPollingIntervalMs, ); return subscriptionToken; } @@ -1104,13 +1116,13 @@ export class ExchangeWrapper extends ContractWrapper { * @param subscriptionToken Subscription token returned by `subscribe()` */ public unsubscribe(subscriptionToken: string): void { - this._unsubscribe(subscriptionToken); + this._exchangeContract.unsubscribe(subscriptionToken); } /** * Cancels all existing subscriptions */ public unsubscribeAll(): void { - super._unsubscribeAll(); + this._exchangeContract.unsubscribeAll(); } /** * Gets historical logs without creating a subscription @@ -1128,13 +1140,7 @@ export class ExchangeWrapper extends ContractWrapper { assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents); assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); - const logs = await this._getLogsAsync( - this.address, - eventName, - blockRange, - indexFilterValues, - Exchange.compilerOutput.abi, - ); + const logs = await this._exchangeContract.getLogsAsync(eventName, blockRange, indexFilterValues); return logs; } /** @@ -1260,21 +1266,7 @@ export class ExchangeWrapper extends ContractWrapper { * @return TransactionEncoder */ public async transactionEncoderAsync(): Promise { - const exchangeInstance = await this._getExchangeContractAsync(); - const encoder = new TransactionEncoder(exchangeInstance); + const encoder = new TransactionEncoder(this._exchangeContract); return encoder; } - // tslint:enable:no-unused-variable - private async _getExchangeContractAsync(): Promise { - if (this._exchangeContractIfExists !== undefined) { - return this._exchangeContractIfExists; - } - const contractInstance = new ExchangeContract( - this.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 index d189aa6def..ecca85c1bd 100644 --- a/packages/contract-wrappers/src/contract_wrappers/forwarder_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/forwarder_wrapper.ts @@ -17,17 +17,16 @@ import { _getDefaultContractAddresses } from '../utils/contract_addresses'; import { decorators } from '../utils/decorators'; import { utils } from '../utils/utils'; -import { ContractWrapper } from './contract_wrapper'; - /** * This class includes the functionality related to interacting with the Forwarder contract. */ -export class ForwarderWrapper extends ContractWrapper { +export class ForwarderWrapper { public abi: ContractAbi = Forwarder.compilerOutput.abi; public address: string; public zrxTokenAddress: string; public etherTokenAddress: string; - private _forwarderContractIfExists?: ForwarderContract; + private readonly _web3Wrapper: Web3Wrapper; + private readonly _forwarderContract: ForwarderContract; /** * Instantiate ForwarderWrapper @@ -49,12 +48,17 @@ export class ForwarderWrapper extends ContractWrapper { zrxTokenAddress?: string, etherTokenAddress?: string, ) { - super(web3Wrapper, networkId); + this._web3Wrapper = web3Wrapper; this.address = address === undefined ? _getDefaultContractAddresses(networkId).exchange : address; this.zrxTokenAddress = zrxTokenAddress === undefined ? _getDefaultContractAddresses(networkId).zrxToken : zrxTokenAddress; this.etherTokenAddress = etherTokenAddress === undefined ? _getDefaultContractAddresses(networkId).etherToken : etherTokenAddress; + this._forwarderContract = new ForwarderContract( + this.address, + this._web3Wrapper.getProvider(), + this._web3Wrapper.getContractDefaults(), + ); } /** * Purchases as much of orders' makerAssets as possible by selling up to 95% of transaction's ETH value. @@ -106,11 +110,9 @@ export class ForwarderWrapper extends ContractWrapper { // compile signatures const signatures = _.map(optimizedMarketOrders, order => order.signature); const feeSignatures = _.map(optimizedFeeOrders, order => order.signature); - // get contract - const forwarderContractInstance = await this._getForwarderContractAsync(); // validate transaction if (orderTransactionOpts.shouldValidate) { - await forwarderContractInstance.marketSellOrdersWithEth.callAsync( + await this._forwarderContract.marketSellOrdersWithEth.callAsync( optimizedMarketOrders, signatures, optimizedFeeOrders, @@ -127,7 +129,7 @@ export class ForwarderWrapper extends ContractWrapper { ); } // send transaction - const txHash = await forwarderContractInstance.marketSellOrdersWithEth.sendTransactionAsync( + const txHash = await this._forwarderContract.marketSellOrdersWithEth.sendTransactionAsync( optimizedMarketOrders, signatures, optimizedFeeOrders, @@ -196,11 +198,9 @@ export class ForwarderWrapper extends ContractWrapper { // compile signatures const signatures = _.map(optimizedMarketOrders, order => order.signature); const feeSignatures = _.map(optimizedFeeOrders, order => order.signature); - // get contract - const forwarderContractInstance = await this._getForwarderContractAsync(); // validate transaction if (orderTransactionOpts.shouldValidate) { - await forwarderContractInstance.marketBuyOrdersWithEth.callAsync( + await this._forwarderContract.marketBuyOrdersWithEth.callAsync( optimizedMarketOrders, makerAssetFillAmount, signatures, @@ -218,7 +218,7 @@ export class ForwarderWrapper extends ContractWrapper { ); } // send transaction - const txHash = await forwarderContractInstance.marketBuyOrdersWithEth.sendTransactionAsync( + const txHash = await this._forwarderContract.marketBuyOrdersWithEth.sendTransactionAsync( optimizedMarketOrders, makerAssetFillAmount, signatures, @@ -236,16 +236,4 @@ export class ForwarderWrapper extends ContractWrapper { ); return txHash; } - private async _getForwarderContractAsync(): Promise { - if (this._forwarderContractIfExists !== undefined) { - return this._forwarderContractIfExists; - } - const contractInstance = new ForwarderContract( - this.address, - this._web3Wrapper.getProvider(), - this._web3Wrapper.getContractDefaults(), - ); - this._forwarderContractIfExists = contractInstance; - return this._forwarderContractIfExists; - } } diff --git a/packages/contract-wrappers/src/contract_wrappers/order_validator_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/order_validator_wrapper.ts index 02bacf000c..e5c1ce8a6c 100644 --- a/packages/contract-wrappers/src/contract_wrappers/order_validator_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/order_validator_wrapper.ts @@ -11,15 +11,14 @@ import { BalanceAndAllowance, OrderAndTraderInfo, TraderInfo } from '../types'; import { assert } from '../utils/assert'; import { _getDefaultContractAddresses } from '../utils/contract_addresses'; -import { ContractWrapper } from './contract_wrapper'; - /** * This class includes the functionality related to interacting with the OrderValidator contract. */ -export class OrderValidatorWrapper extends ContractWrapper { +export class OrderValidatorWrapper { public abi: ContractAbi = OrderValidator.compilerOutput.abi; public address: string; - private _orderValidatorContractIfExists?: OrderValidatorContract; + private readonly _web3Wrapper: Web3Wrapper; + private readonly _orderValidatorContract: OrderValidatorContract; /** * Instantiate OrderValidatorWrapper * @param web3Wrapper Web3Wrapper instance to use. @@ -28,8 +27,13 @@ export class OrderValidatorWrapper extends ContractWrapper { * will default to the known address corresponding to the networkId. */ constructor(web3Wrapper: Web3Wrapper, networkId: number, address?: string) { - super(web3Wrapper, networkId); + this._web3Wrapper = web3Wrapper; this.address = address === undefined ? _getDefaultContractAddresses(networkId).orderValidator : address; + this._orderValidatorContract = new OrderValidatorContract( + this.address, + this._web3Wrapper.getProvider(), + this._web3Wrapper.getContractDefaults(), + ); } /** * Get an object conforming to OrderAndTraderInfo containing on-chain information of the provided order and address @@ -40,8 +44,7 @@ export class OrderValidatorWrapper extends ContractWrapper { public async getOrderAndTraderInfoAsync(order: SignedOrder, takerAddress: string): Promise { assert.doesConformToSchema('order', order, schemas.signedOrderSchema); assert.isETHAddressHex('takerAddress', takerAddress); - const OrderValidatorContractInstance = await this._getOrderValidatorContractAsync(); - const orderAndTraderInfo = await OrderValidatorContractInstance.getOrderAndTraderInfo.callAsync( + const orderAndTraderInfo = await this._orderValidatorContract.getOrderAndTraderInfo.callAsync( order, takerAddress, ); @@ -66,8 +69,7 @@ export class OrderValidatorWrapper extends ContractWrapper { assert.isETHAddressHex(`takerAddresses[${index}]`, takerAddress), ); assert.assert(orders.length === takerAddresses.length, 'Expected orders.length to equal takerAddresses.length'); - const OrderValidatorContractInstance = await this._getOrderValidatorContractAsync(); - const ordersAndTradersInfo = await OrderValidatorContractInstance.getOrdersAndTradersInfo.callAsync( + const ordersAndTradersInfo = await this._orderValidatorContract.getOrdersAndTradersInfo.callAsync( orders, takerAddresses, ); @@ -91,8 +93,7 @@ export class OrderValidatorWrapper extends ContractWrapper { public async getTraderInfoAsync(order: SignedOrder, takerAddress: string): Promise { assert.doesConformToSchema('order', order, schemas.signedOrderSchema); assert.isETHAddressHex('takerAddress', takerAddress); - const OrderValidatorContractInstance = await this._getOrderValidatorContractAsync(); - const result = await OrderValidatorContractInstance.getTraderInfo.callAsync(order, takerAddress); + const result = await this._orderValidatorContract.getTraderInfo.callAsync(order, takerAddress); return result; } /** @@ -107,8 +108,7 @@ export class OrderValidatorWrapper extends ContractWrapper { assert.isETHAddressHex(`takerAddresses[${index}]`, takerAddress), ); assert.assert(orders.length === takerAddresses.length, 'Expected orders.length to equal takerAddresses.length'); - const OrderValidatorContractInstance = await this._getOrderValidatorContractAsync(); - const result = await OrderValidatorContractInstance.getTradersInfo.callAsync(orders, takerAddresses); + const result = await this._orderValidatorContract.getTradersInfo.callAsync(orders, takerAddresses); return result; } /** @@ -120,8 +120,7 @@ export class OrderValidatorWrapper extends ContractWrapper { public async getBalanceAndAllowanceAsync(address: string, assetData: string): Promise { assert.isETHAddressHex('address', address); assert.isHexString('assetData', assetData); - const OrderValidatorContractInstance = await this._getOrderValidatorContractAsync(); - const balanceAndAllowance = await OrderValidatorContractInstance.getBalanceAndAllowance.callAsync( + const balanceAndAllowance = await this._orderValidatorContract.getBalanceAndAllowance.callAsync( address, assetData, ); @@ -140,8 +139,7 @@ export class OrderValidatorWrapper extends ContractWrapper { public async getBalancesAndAllowancesAsync(address: string, assetDatas: string[]): Promise { assert.isETHAddressHex('address', address); _.forEach(assetDatas, (assetData, index) => assert.isHexString(`assetDatas[${index}]`, assetData)); - const OrderValidatorContractInstance = await this._getOrderValidatorContractAsync(); - const balancesAndAllowances = await OrderValidatorContractInstance.getBalancesAndAllowances.callAsync( + const balancesAndAllowances = await this._orderValidatorContract.getBalancesAndAllowances.callAsync( address, assetDatas, ); @@ -165,20 +163,7 @@ export class OrderValidatorWrapper extends ContractWrapper { public async getERC721TokenOwnerAsync(tokenAddress: string, tokenId: BigNumber): Promise { assert.isETHAddressHex('tokenAddress', tokenAddress); assert.isBigNumber('tokenId', tokenId); - const OrderValidatorContractInstance = await this._getOrderValidatorContractAsync(); - const result = await OrderValidatorContractInstance.getERC721TokenOwner.callAsync(tokenAddress, tokenId); + const result = await this._orderValidatorContract.getERC721TokenOwner.callAsync(tokenAddress, tokenId); return result; } - private async _getOrderValidatorContractAsync(): Promise { - if (this._orderValidatorContractIfExists !== undefined) { - return this._orderValidatorContractIfExists; - } - const contractInstance = new OrderValidatorContract( - this.address, - this._web3Wrapper.getProvider(), - this._web3Wrapper.getContractDefaults(), - ); - this._orderValidatorContractIfExists = contractInstance; - return this._orderValidatorContractIfExists; - } } diff --git a/yarn.lock b/yarn.lock index a5f471f336..1bb3183d1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,7 +5,6 @@ "@0x-lerna-fork/add@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/add/-/add-3.16.3.tgz#f3f28fbc5f9b7f5a03ff85d5138c8668f41206a9" - integrity sha512-0JYhYofJTPsrEsgfdg1DQrK2jFfTyVru0HUvDYvOuTmpdEu355qTH4OLbikzkKQCXjyYgj78wnCHSEXsI8bHFg== dependencies: "@0x-lerna-fork/bootstrap" "3.16.3" "@0x-lerna-fork/command" "3.16.3" @@ -21,7 +20,6 @@ "@0x-lerna-fork/batch-packages@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/batch-packages/-/batch-packages-3.16.3.tgz#608a732569380e1656d9ca244abe15e1e501dc01" - integrity sha512-vQOfaHCpVezOs4QJumWB9Zh6MqFEON0Q9qq3VGDzh4uCHLNktf12/j5D9bo3hi5t+u6IyqlpSdBBXTEuUNEqYw== dependencies: "@0x-lerna-fork/package-graph" "3.16.3" npmlog "^4.1.2" @@ -29,7 +27,6 @@ "@0x-lerna-fork/bootstrap@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/bootstrap/-/bootstrap-3.16.3.tgz#3dbe62fabe5cb560f0161dd69746c4e9fd73c046" - integrity sha512-Dy/uyCz5XDKYbnOCxmOFgb5U9xsy+C+vtTYjFFFiVSv0LhW9vMj5Htj28Xn24R+mARuDfN7fuayfXML53dfqbQ== dependencies: "@0x-lerna-fork/batch-packages" "3.16.3" "@0x-lerna-fork/command" "3.16.3" @@ -59,7 +56,6 @@ "@0x-lerna-fork/changed@3.16.9": version "3.16.9" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/changed/-/changed-3.16.9.tgz#79cd1597cae00a1700b8248c27f00f8aebf75873" - integrity sha512-njwFVyTlERlMuuAvdqsU1No7tv3MsNlCoquRjQORw7DhdfNENPWs4LzYqwu2OdlLlUiIt12GQI2pGOHJROZ7lg== dependencies: "@0x-lerna-fork/collect-updates" "3.16.3" "@0x-lerna-fork/command" "3.16.3" @@ -70,7 +66,6 @@ "@0x-lerna-fork/check-working-tree@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/check-working-tree/-/check-working-tree-3.16.3.tgz#0792cd0f56f19cee42893bcbbec15223bf22c292" - integrity sha512-9625yZIN8gwEZrX5oMzZGt4SLu1pcaWIKPpyvfcsbfm8+vu1ShV7U7WunXQ1zlfPR+h4sinp9KNYTgTpRo77Xw== dependencies: "@0x-lerna-fork/collect-uncommitted" "3.16.3" "@0x-lerna-fork/describe-ref" "3.16.3" @@ -79,7 +74,6 @@ "@0x-lerna-fork/child-process@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/child-process/-/child-process-3.16.3.tgz#7f2a764b8ff9399e16a7dfde0149e82129ca64aa" - integrity sha512-T90h77/9hmBe11p2+YrWG9wJKtjGnYDwgFE7R2HWk4R+a2JTKnV03Xa/1dZHIqzD2rf1Ih7nzXQcYi13wrsUhA== dependencies: chalk "^2.3.1" execa "^1.0.0" @@ -88,7 +82,6 @@ "@0x-lerna-fork/clean@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/clean/-/clean-3.16.3.tgz#c5843174279305d8aa078528fa95a8d62070e783" - integrity sha512-GwvySg2k6BQNm3W8/AoCcbw/vFhWdIiAxV6qGDG/xzN3OUx6vj90UdzI+c3oiISU/MIvS3ioD8/iQ3+5bJEMww== dependencies: "@0x-lerna-fork/command" "3.16.3" "@0x-lerna-fork/filter-options" "3.16.3" @@ -102,7 +95,6 @@ "@0x-lerna-fork/cli@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/cli/-/cli-3.16.3.tgz#d12da92b6fceb91e27cc3e426584bbe8d746253d" - integrity sha512-P0i1HiIBG8dLH3YsYeIlAmixj1LwHUDb4zOOcMss7LjuEateAATqm5Uma0SDqpsV2+3b9xVakSCzth6FJortCQ== dependencies: "@0x-lerna-fork/global-options" "3.16.3" dedent "^0.7.0" @@ -112,7 +104,6 @@ "@0x-lerna-fork/collect-uncommitted@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/collect-uncommitted/-/collect-uncommitted-3.16.3.tgz#f424cda5ab3bb237fd992010f9324bcf2d7f8c22" - integrity sha512-hi9EmQltk/jzPT/Jb7k+P1dqCNDkanZvq2V1Q2SKQg3gwpX6lrSQJZVhnWPSySE89nBe5fhnswW8/KC7w0T4Wg== dependencies: "@0x-lerna-fork/child-process" "3.16.3" chalk "^2.3.1" @@ -122,7 +113,6 @@ "@0x-lerna-fork/collect-updates@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/collect-updates/-/collect-updates-3.16.3.tgz#bc45dc911b36f623443febabc8ce59647361903c" - integrity sha512-rCsR5e9Ce3FcEMJvh0zWSd/RQyrM8wHzm3RNkZ/Jh1ipoUItAdRUbeTKSKQzXqFhpZJWKgDAH0bDyCgZYfRgrQ== dependencies: "@0x-lerna-fork/child-process" "3.16.3" "@0x-lerna-fork/describe-ref" "3.16.3" @@ -133,7 +123,6 @@ "@0x-lerna-fork/command@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/command/-/command-3.16.3.tgz#5e10612a592869bdb7b588fd1f133e2c2c60fb26" - integrity sha512-Xvbt3VlsgDqCYFWw9djGmoYqztYjgvEc3GTevEke4VfOQffvhQ0IhjjOkGnBE2shhWvX59FSDu8FqnQejh+oEA== dependencies: "@0x-lerna-fork/child-process" "3.16.3" "@0x-lerna-fork/package-graph" "3.16.3" @@ -149,7 +138,6 @@ "@0x-lerna-fork/conventional-commits@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/conventional-commits/-/conventional-commits-3.16.3.tgz#03badecf115d788bee198f0cfd73ff9792b90428" - integrity sha512-BPS4pRnGoxL+IVagnWs6E5vUeWharFL5U6aXuNyvD/+eYm49NBkzrRio6QwlI7O0cifDt0F4Xh4AdTiZ1A4AdQ== dependencies: "@0x-lerna-fork/validation-error" "3.16.3" conventional-changelog-angular "^5.0.3" @@ -166,7 +154,6 @@ "@0x-lerna-fork/create-symlink@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/create-symlink/-/create-symlink-3.16.3.tgz#d6b5e5cf9a693713bbb4a98085d845b8abd88cd9" - integrity sha512-AZkH+ScxWc0hJ14s1ldwTOQB7Gf7FROtSqO6xAJejBX7Cckwg6Akrm0SeR8w9Rt4P1pbeHJnRrJzqbh5a3iN5g== dependencies: cmd-shim "^2.0.2" fs-extra "^8.1.0" @@ -175,7 +162,6 @@ "@0x-lerna-fork/create@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/create/-/create-3.16.3.tgz#9db40df227b84ac6b199e2d80e6023119b2a1aee" - integrity sha512-S6aaPk1uMDbHLzUE7C2A2UjxiSFnOKJOSIXaVMtN6tGFtj5Y0+Z5IVE3VruYNlpYSUTTxomi32kAYP7dAXnQEg== dependencies: "@0x-lerna-fork/child-process" "3.16.3" "@0x-lerna-fork/command" "3.16.3" @@ -199,7 +185,6 @@ "@0x-lerna-fork/describe-ref@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/describe-ref/-/describe-ref-3.16.3.tgz#62849dc0d7f0550c84a87637c2452e3c0d28e012" - integrity sha512-eYFnppVNzlvVnBS+erIbKPTkx9SDfLmXBoYd9FCSG+Xwr3VZhOkpD0kw4l3fzGfXccg13A8EREoWKTu26O18Zw== dependencies: "@0x-lerna-fork/child-process" "3.16.3" npmlog "^4.1.2" @@ -207,7 +192,6 @@ "@0x-lerna-fork/diff@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/diff/-/diff-3.16.3.tgz#eb7e5474ba7897887ac7c0a8f319fb12512a4027" - integrity sha512-Wb2fbRnR66/kTdp+KgkGAhqB6IP9SZeESAyVfLLUjvADttVqMXLAgiPIUa1/ENZJzR0V6RLDMrw8rj1zQx/1TQ== dependencies: "@0x-lerna-fork/child-process" "3.16.3" "@0x-lerna-fork/command" "3.16.3" @@ -217,7 +201,6 @@ "@0x-lerna-fork/exec@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/exec/-/exec-3.16.3.tgz#548e7c7f8042fcfad2076c193bf9034d97ffb279" - integrity sha512-CDOjLsrutJse6ZndUVdj0cB+W8CndvJT2QHv9dizK4cO/L/73n8FhyE8f1Eh5O7/vwWmoiuMhvDa9XfVVTXMpA== dependencies: "@0x-lerna-fork/child-process" "3.16.3" "@0x-lerna-fork/command" "3.16.3" @@ -229,7 +212,6 @@ "@0x-lerna-fork/filter-options@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/filter-options/-/filter-options-3.16.3.tgz#597f96acf5b2b5608a292b3dbba76a3e1abdfc5c" - integrity sha512-54gsepEYQsyld4tdsSKLSHjjWMSdsIzq7jSdxb+6mUjRFytOBsuGZEDE/Rm09hCM5DkE/E74mmiuVE9IuHmdvA== dependencies: "@0x-lerna-fork/collect-updates" "3.16.3" "@0x-lerna-fork/filter-packages" "3.16.3" @@ -238,7 +220,6 @@ "@0x-lerna-fork/filter-packages@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/filter-packages/-/filter-packages-3.16.3.tgz#867b39186306501d22b254b3182b235c6c244c7c" - integrity sha512-t1/6iuaEmeFdR1+IICGtBzKs3mF0tfyZ5UbZyIZIhBfk2sXBf6WRKtY2U4HOjCQMkcyHZ6BfB7S/lpt4CV8SHw== dependencies: "@0x-lerna-fork/validation-error" "3.16.3" multimatch "^3.0.0" @@ -247,14 +228,12 @@ "@0x-lerna-fork/get-npm-exec-opts@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/get-npm-exec-opts/-/get-npm-exec-opts-3.16.3.tgz#32d11026165d417609079b694f7b58cb8ddf550d" - integrity sha512-7OU/dRMNh8WHEc99iGVIUni4sYRneP5TuNkB82xFDsKUMxLtMGaty9bSeNI/1kMthc3W35Sn5Vvh1zSREvxwaw== dependencies: npmlog "^4.1.2" "@0x-lerna-fork/get-packed@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/get-packed/-/get-packed-3.16.3.tgz#cce3b63bf4aaf2d213e1ace78176f4ead1aba535" - integrity sha512-DpdSqfWOg8++p0Ub9PiYP9WBRmCfUvF2u7tT7FTD9gT9+x1a25RlTiuY2TDbwq+veih6+/l6ZfhtwDqqtBDgwQ== dependencies: fs-extra "^8.1.0" ssri "^6.0.1" @@ -263,7 +242,6 @@ "@0x-lerna-fork/github-client@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/github-client/-/github-client-3.16.3.tgz#d9bdb373a061749496b4df91f633127b5850aff7" - integrity sha512-VvjK8QeqqLmPUp4BeTexVgOGsZcucqRmLr1NU6gs2hA6g4KJKYU8wrRUvtfGlyPqwUBgvERTdglVNW/ldOi8fg== dependencies: "@0x-lerna-fork/child-process" "3.16.3" "@octokit/plugin-enterprise-rest" "^3.6.1" @@ -274,7 +252,6 @@ "@0x-lerna-fork/gitlab-client@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/gitlab-client/-/gitlab-client-3.16.3.tgz#7ef534d6d5189e8897d4ad267818aaeb0b35500d" - integrity sha512-DSslgao9+WgFnelMVS2QcY1WADNWi3JgXnlDyFynfSB0RIsecpbOtJzoiQMcW67YrtyWYf2QuJ4Axyc6HrrqHQ== dependencies: node-fetch "^2.5.0" npmlog "^4.1.2" @@ -283,12 +260,10 @@ "@0x-lerna-fork/global-options@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/global-options/-/global-options-3.16.3.tgz#53b20023263d041a0b6f58903f3904652b072c9e" - integrity sha512-zdrBxvm2upaWD3bbS5F81kImqc18Po1oMp7QpKbLxReZfjCI8jAsmiqpC7Kr4aDxnBJ9ZtlTQNWO+tKvhMlKuA== "@0x-lerna-fork/has-npm-version@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/has-npm-version/-/has-npm-version-3.16.3.tgz#8a17bf37c54f2718c02659988352d3ded182c542" - integrity sha512-kMqg4Py7NujF9r182/dYByYC6eRuCh9YSAwJsC8PiGZkoum5e7twvTuLP5IEUvhjK7LsypgeQpeYLRC/SuNs7w== dependencies: "@0x-lerna-fork/child-process" "3.16.3" semver "^6.2.0" @@ -296,7 +271,6 @@ "@0x-lerna-fork/import@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/import/-/import-3.16.3.tgz#5d31c451f1a75887be6a03c2220f0b3ee17435c0" - integrity sha512-x3smfILkOT2f/9DoS1pe/4k+r8LG7jEGBu7jOq5Yx1KAxGcuzG7m8oqAkW0EX9MDDfENTcbcM4WVrVrPgvvXsQ== dependencies: "@0x-lerna-fork/child-process" "3.16.3" "@0x-lerna-fork/command" "3.16.3" @@ -310,7 +284,6 @@ "@0x-lerna-fork/init@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/init/-/init-3.16.3.tgz#314d2335ae59930cb4b2c3e094f6caa6b0a14d25" - integrity sha512-atmitRb0fzshUkbPoB0kB3+yc+9Oh/kqyhVMVIT95WPpiDPcy9pzzcUhts1droAW+YcjzTXOF/twh25wkQft4g== dependencies: "@0x-lerna-fork/child-process" "3.16.3" "@0x-lerna-fork/command" "3.16.3" @@ -321,7 +294,6 @@ "@0x-lerna-fork/lerna@3.16.9": version "3.16.9" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/lerna/-/lerna-3.16.9.tgz#9a68fc960545a50ecf03b03ad88300f884e23fe9" - integrity sha512-4XegTdnSZCJG2Tg2aVtY0j09AyJ54z7ZMaH3c6zEwFk/opdXFsE1HkyYY9Ar2Qmzlo8HkoWLzo4wn2tsd9Bkiw== dependencies: "@0x-lerna-fork/add" "3.16.3" "@0x-lerna-fork/bootstrap" "3.16.3" @@ -344,7 +316,6 @@ "@0x-lerna-fork/link@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/link/-/link-3.16.3.tgz#63016f105f6f5861a23af26a945a4fbf58493088" - integrity sha512-/nrrFVDP5UcTNU9XdB+6lBXER7GRCI/QQqp70D4NTZg8B8LZ6BbSR9JJDs3l//vaL54WlYGXEGHFXhT9XaO5cg== dependencies: "@0x-lerna-fork/command" "3.16.3" "@0x-lerna-fork/package-graph" "3.16.3" @@ -355,7 +326,6 @@ "@0x-lerna-fork/list@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/list/-/list-3.16.3.tgz#4d3cbaa753daaae63741aa05b7ad18b8a035c2a1" - integrity sha512-jzAiSqO1aHgowQOWQ44Hckd7hwRXrJNA3P35R6gHzarGtjUwNqwJW6pte08+QVMZvaG4E/xnQH9J/6Eg52s6VA== dependencies: "@0x-lerna-fork/command" "3.16.3" "@0x-lerna-fork/filter-options" "3.16.3" @@ -365,7 +335,6 @@ "@0x-lerna-fork/listable@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/listable/-/listable-3.16.3.tgz#e7e94e76852f5aed704fec90d4a3584b6210cd9d" - integrity sha512-affHM7YlHYizk7y3yBBwd6A+xBpfxyAUeAA2rSmKt2x5GkSajhisb0qXqwNVSp8+LKxw7EO3xiLGeO05LeiTGA== dependencies: "@0x-lerna-fork/query-graph" "3.16.3" chalk "^2.3.1" @@ -374,7 +343,6 @@ "@0x-lerna-fork/log-packed@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/log-packed/-/log-packed-3.16.3.tgz#9515f92698dc5c21353c924cddeb2ac143b17e78" - integrity sha512-7yZ/16xh3Sa/bYECx33w5cGzYM88tUaEXfxQ1c1BClt7twNPES51uG9XR5gcPA6Ss7iJURREd7iAJxzO0KaKtA== dependencies: byte-size "^5.0.1" columnify "^1.5.4" @@ -384,7 +352,6 @@ "@0x-lerna-fork/npm-conf@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/npm-conf/-/npm-conf-3.16.3.tgz#6b611ba4795abed600bc2ce85f8a48f59fa6ecdd" - integrity sha512-cUmvOg7o+t2eFEK+1WBm0vdPwkXkxJMqGculvc0xylYePYfljCo3cXUr8FMCDsYvQG10sjcYuI1jv4YUwNt8yw== dependencies: config-chain "^1.1.11" pify "^4.0.1" @@ -392,7 +359,6 @@ "@0x-lerna-fork/npm-dist-tag@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/npm-dist-tag/-/npm-dist-tag-3.16.3.tgz#d2c1e8fecf7c3689d56b79d7cb9a2256b02f4ecf" - integrity sha512-ZvLrIwjznTTaGO9iJbRpbbhWOg1S7vFxMaEFPU0WGBq4n90pwpWYbGMb7EpJtJfDGAyqRpcSBB6vmPhInokhTw== dependencies: "@0x-lerna-fork/otplease" "3.16.3" "@evocateur/npm-registry-fetch" "^4.0.0" @@ -403,7 +369,6 @@ "@0x-lerna-fork/npm-install@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/npm-install/-/npm-install-3.16.3.tgz#ff34709ac883685a9c455bf45e5bd289f06919dc" - integrity sha512-if38uM0xY2MvKgSNXR9vfjjO++N9/r+9KIlDPBRGSDMnbjw0ty+//DSKH32DP4m1gv45OdExz3YmCZ4A6r5Hdg== dependencies: "@0x-lerna-fork/child-process" "3.16.3" "@0x-lerna-fork/get-npm-exec-opts" "3.16.3" @@ -416,7 +381,6 @@ "@0x-lerna-fork/npm-publish@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/npm-publish/-/npm-publish-3.16.3.tgz#82c40a3db67ca1528f4bc981462640815d47854e" - integrity sha512-p/0Y5ryGq7hHG37pQB85uAuedrOQ+LH9cPUYqAw6aLomf+j22edo9VsLvAHwd8oYzcUZhFBUvhHzAPta0Ql8gg== dependencies: "@0x-lerna-fork/otplease" "3.16.3" "@0x-lerna-fork/run-lifecycle" "3.16.3" @@ -431,7 +395,6 @@ "@0x-lerna-fork/npm-run-script@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/npm-run-script/-/npm-run-script-3.16.3.tgz#fcc9ae96763fde5a8262cc4d0345a278ada4632c" - integrity sha512-S57W0omTjaMoSGZ64nmtFepkbM6Ro+n8DC5fpK7bjlZ7HXxP8OOySvHIcItIiwswchVwOhm5lmNnoIOwY6IW6A== dependencies: "@0x-lerna-fork/child-process" "3.16.3" "@0x-lerna-fork/get-npm-exec-opts" "3.16.3" @@ -440,7 +403,6 @@ "@0x-lerna-fork/otplease@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/otplease/-/otplease-3.16.3.tgz#fc4a0b3c802b234a241016e5ba6ef74311ee39b1" - integrity sha512-pABSUlJY7UtbjMxal9vpQLvB/zQIMC3WnTspfiY8ysE4KDIsQU8XIBMvQYDzhD/+RzWWmXHB8p83Oso16Aezig== dependencies: "@0x-lerna-fork/prompt" "3.16.3" figgy-pudding "^3.5.1" @@ -448,14 +410,12 @@ "@0x-lerna-fork/output@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/output/-/output-3.16.3.tgz#d6fb8e2490d0f0befb84fd6f37d44269acb499c5" - integrity sha512-tRNZdY4tsN3/V28PQQFzTgA1rifhIq6hmhW9smXcG+ulq1lSSED5GJyxY9SDu4IpuSRnfQdcXkJS5Ms1iLNTQg== dependencies: npmlog "^4.1.2" "@0x-lerna-fork/pack-directory@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/pack-directory/-/pack-directory-3.16.3.tgz#eea63417786c883f500cb95a83bed8239a54f89f" - integrity sha512-waU4vGkfwAGDHkKUNhR3L5A2/Bdi0QMy1o86EGlTRLsqcw8OSdy/q+sHoq2SHw+BTPOxRYHHvvQEcH5dwubWdQ== dependencies: "@0x-lerna-fork/get-packed" "3.16.3" "@0x-lerna-fork/package" "3.16.3" @@ -469,7 +429,6 @@ "@0x-lerna-fork/package-graph@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/package-graph/-/package-graph-3.16.3.tgz#4db4b0be44c947df1326bdb2b61eed858e7f1d9f" - integrity sha512-43Gb4SUTEVZkw0TdtRQgAyXCkW3slf1gnd/xvdX60mwevyV/0m/mpxETLK3YqEdjCDZZwYbA5OV/VB2SCC/dIw== dependencies: "@0x-lerna-fork/prerelease-id-from-version" "3.16.3" "@0x-lerna-fork/validation-error" "3.16.3" @@ -480,7 +439,6 @@ "@0x-lerna-fork/package@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/package/-/package-3.16.3.tgz#1391f60401f9b26a6d11368b0f24972d1f403ede" - integrity sha512-D6It1svcFUpcdE1nlPd1KW0aSvugIwQaynBDwclVJtH3F/ISJhsnnK4zerURxvtc3JExa5AVUHpPiaLtLV3LDw== dependencies: load-json-file "^5.3.0" npm-package-arg "^6.1.0" @@ -489,14 +447,12 @@ "@0x-lerna-fork/prerelease-id-from-version@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/prerelease-id-from-version/-/prerelease-id-from-version-3.16.3.tgz#e5b91f8852f8a54c338b91fad652a835fb421c33" - integrity sha512-NCtbhukd2UrCQMxkMSsJQkvQ6tELz67jb5eAzRAhD1IDywS5+9sc/jKMSXQBHqEukbtYcvSNlqfK+HMEnNdovA== dependencies: semver "^6.2.0" "@0x-lerna-fork/project@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/project/-/project-3.16.3.tgz#f087a4b328b3cda028d69bf3bb60f801afab6239" - integrity sha512-6RPORjsKX+JRp+EvnWnVZFIUPeTC/wX2Uq+BaSQnrKNlMJSHLLo9EoYibaBMWPJbiWB4WU6Crc9Nbxk2MEMijg== dependencies: "@0x-lerna-fork/package" "3.16.3" "@0x-lerna-fork/validation-error" "3.16.3" @@ -514,7 +470,6 @@ "@0x-lerna-fork/prompt@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/prompt/-/prompt-3.16.3.tgz#e62bd75a983ca43134400baf713a8c922d904b82" - integrity sha512-hPj/P+7HMmN8l6HupH6gnVk54EQSZzo7rpnQDCKdh9PPVb4HfVCA4JBx07TC1ghZoheCkrWJw2DwgQgtIMAdOA== dependencies: inquirer "^6.2.0" npmlog "^4.1.2" @@ -522,7 +477,6 @@ "@0x-lerna-fork/publish@3.16.9": version "3.16.9" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/publish/-/publish-3.16.9.tgz#282a4bcb660036f39c5f8bab18c8744ed8a073c9" - integrity sha512-OVafQ6TmhRSxNSUEtSSbwIS63VXdbzCt73j10HYvMEpzm7SjQhM5JvRDraBBn9gRjm/M4oH7mVffKcQBQYUw/w== dependencies: "@0x-lerna-fork/check-working-tree" "3.16.3" "@0x-lerna-fork/child-process" "3.16.3" @@ -558,14 +512,12 @@ "@0x-lerna-fork/pulse-till-done@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/pulse-till-done/-/pulse-till-done-3.16.3.tgz#b637ebb059bcd13e6786f4c8837a83a240b0d7a2" - integrity sha512-4zC5YPyCF52biguzTrlkSlvU1yxG6X2GZ4ObtF8+e1T+/0S5OHFa7aMEPgwKm6ZFd4Ue54YRRku+62MnaMtgrA== dependencies: npmlog "^4.1.2" "@0x-lerna-fork/query-graph@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/query-graph/-/query-graph-3.16.3.tgz#213a0838def9e4001a07860abf9b6919370f796e" - integrity sha512-TnGRvx1d3LQOK1dgLHqjyQyHkJSawGImhNHBxB6ZQ3gaobR0k3iUPEltfBJNcT9xw7QEuuqhLGRBmfmp5M64IA== dependencies: "@0x-lerna-fork/package-graph" "3.16.3" figgy-pudding "^3.5.1" @@ -573,7 +525,6 @@ "@0x-lerna-fork/resolve-symlink@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/resolve-symlink/-/resolve-symlink-3.16.3.tgz#d5704ca27ff5112077ba66978716758c50354f55" - integrity sha512-YOfbzQubTbFnra3guht6UOBz0+hTMg7IdMbf7s1BGRp2WLy8UiXa2StwUu2XTxsn2TsEH+0Se7HQeH9mlYJ+7Q== dependencies: fs-extra "^8.1.0" npmlog "^4.1.2" @@ -582,7 +533,6 @@ "@0x-lerna-fork/rimraf-dir@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/rimraf-dir/-/rimraf-dir-3.16.3.tgz#7102ca950826020527755de967af06402d87f7f4" - integrity sha512-iigmNltw9UUn3h0QB7GAywC/MA3Vn1nZdDPlJcxMK5vqUv6p7WlTpK0JzVHbFgucwyIKFcvWCKYbUbCKKyCu3A== dependencies: "@0x-lerna-fork/child-process" "3.16.3" npmlog "^4.1.2" @@ -592,7 +542,6 @@ "@0x-lerna-fork/run-lifecycle@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/run-lifecycle/-/run-lifecycle-3.16.3.tgz#e33e760f178e98bb209346bdc794c7751357d430" - integrity sha512-5z+9PnSxUBy/YbacU347VlN9GcAd5hpk8c9c+cwPmACwuIBaRQ7kz36zz0VgG2WYCiYpLzL776a0/MU2KXereQ== dependencies: "@0x-lerna-fork/npm-conf" "3.16.3" figgy-pudding "^3.5.1" @@ -602,7 +551,6 @@ "@0x-lerna-fork/run-parallel-batches@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/run-parallel-batches/-/run-parallel-batches-3.16.3.tgz#c4a780acaf79d42175f8179df6dba2edd924b10a" - integrity sha512-FEB9g/XjjCOochhFhyrT3QbamgyrFFZM1TlVp+IwHeP1W3tXMOISSD3QYKQfurZLX/jFZbnm6VSd8NR4kCafQg== dependencies: p-map "^2.1.0" p-map-series "^1.0.0" @@ -610,7 +558,6 @@ "@0x-lerna-fork/run-topologically@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/run-topologically/-/run-topologically-3.16.3.tgz#d82e0924c74875c9aca26f6c15353383aad3cc67" - integrity sha512-VDUSQayQ4+7BH+rihBOSrZdmTCIlfu1/uV6DAAlaxYTsAkLHsi93339iWMxwWpICH8sMHxO83zi1GYzEBa20Mg== dependencies: "@0x-lerna-fork/query-graph" "3.16.3" figgy-pudding "^3.5.1" @@ -619,7 +566,6 @@ "@0x-lerna-fork/run@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/run/-/run-3.16.3.tgz#4da4fab40d6366f808c528ee4451626a29387575" - integrity sha512-mU15Q4aC7cRj7y5a6xtW5LDfXXdl2nbc4SNPbJQw/8Csu/ewQvbcP0gcWFL4AgV/xemooPStb8UzFSznweJO4Q== dependencies: "@0x-lerna-fork/command" "3.16.3" "@0x-lerna-fork/filter-options" "3.16.3" @@ -633,7 +579,6 @@ "@0x-lerna-fork/symlink-binary@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/symlink-binary/-/symlink-binary-3.16.3.tgz#f55ea0bd5098f22778350b2acb3cc4ac9df2a904" - integrity sha512-ayiOMWvZVxfwDLFz0CZcX4eKukIegiuqbSU966LLt32QpkxH2AMr1W5TZP9uQterZwz7N5IQedIUovmZrE9oQQ== dependencies: "@0x-lerna-fork/create-symlink" "3.16.3" "@0x-lerna-fork/package" "3.16.3" @@ -643,7 +588,6 @@ "@0x-lerna-fork/symlink-dependencies@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/symlink-dependencies/-/symlink-dependencies-3.16.3.tgz#36f8179cae48c615aecfa0723febdb253c58d4cf" - integrity sha512-hhU1/d9XAAGKOxwADdAqsTnVV8T+RdDag2cBarFP1wcZqdS2PaNd22BeQ5++tKq87JyBBduV7/sYbW2X6QsmlA== dependencies: "@0x-lerna-fork/create-symlink" "3.16.3" "@0x-lerna-fork/resolve-symlink" "3.16.3" @@ -656,19 +600,16 @@ "@0x-lerna-fork/timer@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/timer/-/timer-3.16.3.tgz#d40dbf675140a24410f0fe54fb8293ec8b71cd2c" - integrity sha512-N6rMAHu31Fu7PTIA+C1DYpmNuAjQSpGQYxlERtbGCzfbm8nLUaurn0px7Lj1rLL6jyyGCO8fiI20Dw3g09bH5w== "@0x-lerna-fork/validation-error@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/validation-error/-/validation-error-3.16.3.tgz#169da7cac66e91aa42fbd68d451b2fd7e57a38df" - integrity sha512-ql6NOzvYSJpLzIx4qff5yt35f+BQm3z0OE6Iwrm78CeyvWgNFd1Hx/mwRljcX0gZNVztOkOqVOHXd4lgJcTlyg== dependencies: npmlog "^4.1.2" "@0x-lerna-fork/version@3.16.9": version "3.16.9" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/version/-/version-3.16.9.tgz#71df8f8f7af117b72764219577301b7b66c2accf" - integrity sha512-QkHjxElSdh0UdAQ3bEgk1ANDeaNwLkdCXA2gwEIg9FLS+Z/Dc6U2DZRng7rqX99tRkKjdnFOZJeawieCy5t0Sg== dependencies: "@0x-lerna-fork/check-working-tree" "3.16.3" "@0x-lerna-fork/child-process" "3.16.3" @@ -698,7 +639,6 @@ "@0x-lerna-fork/write-log-file@3.16.3": version "3.16.3" resolved "https://registry.yarnpkg.com/@0x-lerna-fork/write-log-file/-/write-log-file-3.16.3.tgz#5400b33a7f6eb58d052ff4bc423fde1f61b340be" - integrity sha512-slzqULAtnP2GS1h4mG2Il3/phqmXMOM9e+uDNYMaF8B9mF/zhKPKldyV1njwO5sHUTkInW+rmBRx5Gas/PvULg== dependencies: npmlog "^4.1.2" write-file-atomic "^2.3.0" @@ -966,7 +906,6 @@ "@evocateur/libnpmaccess@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845" - integrity sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg== dependencies: "@evocateur/npm-registry-fetch" "^4.0.0" aproba "^2.0.0" @@ -977,7 +916,6 @@ "@evocateur/libnpmpublish@^1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz#55df09d2dca136afba9c88c759ca272198db9f1a" - integrity sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg== dependencies: "@evocateur/npm-registry-fetch" "^4.0.0" aproba "^2.0.0" @@ -992,7 +930,6 @@ "@evocateur/npm-registry-fetch@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz#8c4c38766d8d32d3200fcb0a83f064b57365ed66" - integrity sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g== dependencies: JSONStream "^1.3.4" bluebird "^3.5.1" @@ -1005,7 +942,6 @@ "@evocateur/pacote@^9.6.3": version "9.6.3" resolved "https://registry.yarnpkg.com/@evocateur/pacote/-/pacote-9.6.3.tgz#bcd7adbd3c2ef303aa89bd24166f06dd9c080d89" - integrity sha512-ExqNqcbdHQprEgKnY/uQz7WRtyHRbQxRl4JnVkSkmtF8qffRrF9K+piZKNLNSkRMOT/3H0e3IP44QVCHaXMWOQ== dependencies: "@evocateur/npm-registry-fetch" "^4.0.0" bluebird "^3.5.3" @@ -1652,12 +1588,10 @@ "@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== "@octokit/endpoint@^5.1.0": version "5.3.1" resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.3.1.tgz#4a1714c7d35c1ed074e898c5f4a9897541581f79" - integrity sha512-4mKqSQfeTRFpQMUGIUG1ewdQT64b2YpvjG2dE1x7nhQupdI/AjdgdcIsmPtRFEXlih/uLQLRWJL4FrivpQdC7A== dependencies: deepmerge "4.0.0" is-plain-object "^3.0.0" @@ -1667,12 +1601,10 @@ "@octokit/plugin-enterprise-rest@^3.6.1": version "3.6.2" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-3.6.2.tgz#74de25bef21e0182b4fa03a8678cd00a4e67e561" - integrity sha512-3wF5eueS5OHQYuAEudkpN+xVeUsg8vYEMMenEzLphUZ7PRZ8OJtDcsreL3ad9zxXmBbaFWzLmFcdob5CLyZftA== "@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.0.4.tgz#15e1dc22123ba4a9a4391914d80ec1e5303a23be" - integrity sha512-L4JaJDXn8SGT+5G0uX79rZLv0MNJmfGa4vb4vy1NnpjSnWDLJRy6m90udGwvMmavwsStgbv2QNkPzzTCMmL+ig== dependencies: deprecation "^2.0.0" once "^1.4.0" @@ -1680,7 +1612,6 @@ "@octokit/request@^5.0.0": version "5.0.1" resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.0.1.tgz#6705c9a883db0ac0f58cee717e806b6575d4a199" - integrity sha512-SHOk/APYpfrzV1RNf7Ux8SZi+vZXhMIB2dBr4TQR6ExMX8R4jcy/0gHw26HLe1dWV7Wxe9WzYyDSEC0XwnoCSQ== dependencies: "@octokit/endpoint" "^5.1.0" "@octokit/request-error" "^1.0.1" @@ -1693,7 +1624,6 @@ "@octokit/rest@^16.28.4": version "16.28.5" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.28.5.tgz#56a5a37fc45a6520199189ac3e5eb09420c0ef6f" - integrity sha512-W8hHSm6103c+lNdTuQBMKdZNDCOFFXJdatj92g2d6Hqk134EMDHRc02QWI/Fs1WGnWZ8Leb0QFbXPKO2njeevQ== dependencies: "@octokit/request" "^5.0.0" "@octokit/request-error" "^1.0.2" @@ -1887,7 +1817,6 @@ "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== dependencies: "@types/events" "*" "@types/minimatch" "*" @@ -1996,7 +1925,6 @@ "@types/mocha@^5.2.7": version "5.2.7" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" - integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== "@types/nock@^10.0.1": version "10.0.1" @@ -2612,7 +2540,6 @@ ansi-align@^2.0.0: ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== ansi-colors@^3.0.0: version "3.1.0" @@ -2699,7 +2626,6 @@ anymatch@^2.0.0: anymatch@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.0.3.tgz#2fb624fe0e84bccab00afee3d0006ed310f22f09" - integrity sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -2770,7 +2696,6 @@ array-differ@^1.0.0: array-differ@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" - integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w== array-each@^1.0.1: version "1.0.1" @@ -2815,7 +2740,6 @@ array-slice@^1.0.0: array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" @@ -2898,7 +2822,6 @@ async-each@^1.0.0: async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async-eventemitter@^0.2.2: version "0.2.4" @@ -2959,7 +2882,6 @@ asynckit@^0.4.0: atob-lite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" - integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= atob@^2.0.0: version "2.1.0" @@ -3838,7 +3760,6 @@ beeper@^1.0.0: before-after-hook@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" - integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== bfj@^6.1.1: version "6.1.1" @@ -3884,7 +3805,6 @@ binary-extensions@^1.0.0: binary-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== bindings@^1.2.1, bindings@^1.3.0: version "1.3.0" @@ -3962,7 +3882,6 @@ bluebird@^3.5.0, bluebird@^3.5.1: bluebird@^3.5.3, bluebird@^3.5.5: version "3.5.5" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" - integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== bn.js@4.11.6: version "4.11.6" @@ -4096,7 +4015,6 @@ braces@^2.3.1, braces@^2.3.2: braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" @@ -4131,7 +4049,6 @@ browser-resolve@^1.11.3: browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6: version "1.2.0" @@ -4245,7 +4162,6 @@ bser@^2.0.0: btoa-lite@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" - integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= buffer-compare@=1.1.1: version "1.1.1" @@ -4346,7 +4262,6 @@ byte-size@^4.0.3: byte-size@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" - integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== bytes@3.0.0, bytes@^3.0.0: version "3.0.0" @@ -4405,7 +4320,6 @@ cacache@^11.0.1, cacache@^11.0.2, cacache@^11.2.0: cacache@^12.0.0: version "12.0.2" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.2.tgz#8db03205e36089a3df6954c66ce92541441ac46c" - integrity sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -4459,14 +4373,12 @@ call-me-maybe@^1.0.1: caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= dependencies: callsites "^2.0.0" caller-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= dependencies: caller-callsite "^2.0.0" @@ -4521,7 +4433,6 @@ camelcase@^4.0.0, camelcase@^4.1.0: camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== caniuse-api@^1.5.2: version "1.6.1" @@ -4706,7 +4617,6 @@ chokidar-cli@^1.2.0: chokidar@^1.0.1: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -4722,7 +4632,6 @@ chokidar@^1.0.1: chokidar@^2.0.0, chokidar@^2.0.2: version "2.1.6" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" - integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== dependencies: anymatch "^2.0.0" async-each "^1.0.1" @@ -4741,7 +4650,6 @@ chokidar@^2.0.0, chokidar@^2.0.2: chokidar@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.2.tgz#0d1cd6d04eb2df0327446188cd13736a3367d681" - integrity sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA== dependencies: anymatch "^3.0.1" braces "^3.0.2" @@ -4760,7 +4668,6 @@ chownr@^1.0.1: chownr@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" - integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== chrome-trace-event@^1.0.0: version "1.0.0" @@ -4775,7 +4682,6 @@ ci-info@^1.0.0: ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -5087,7 +4993,6 @@ commander@~2.13.0: commander@~2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== commander@~2.8.1: version "2.8.1" @@ -5166,7 +5071,6 @@ concat-stream@^1.5.0: concat-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" - integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" @@ -5238,7 +5142,6 @@ conventional-changelog-angular@^5.0.1: conventional-changelog-angular@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz#299fdd43df5a1f095283ac16aeedfb0a682ecab0" - integrity sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA== dependencies: compare-func "^1.3.1" q "^1.5.1" @@ -5264,7 +5167,6 @@ conventional-changelog-core@^3.1.0: conventional-changelog-core@^3.1.6: version "3.2.2" resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.2.2.tgz#de41e6b4a71011a18bcee58e744f6f8f0e7c29c0" - integrity sha512-cssjAKajxaOX5LNAJLB+UOcoWjAIBvXtDMedv/58G+YEmAXMNfC16mmPl0JDOuVJVfIqM0nqQiZ8UCm8IXbE0g== dependencies: conventional-changelog-writer "^4.0.5" conventional-commits-parser "^3.0.2" @@ -5287,7 +5189,6 @@ conventional-changelog-preset-loader@^2.0.1: conventional-changelog-preset-loader@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.1.1.tgz#65bb600547c56d5627d23135154bcd9a907668c4" - integrity sha512-K4avzGMLm5Xw0Ek/6eE3vdOXkqnpf9ydb68XYmCc16cJ99XMMbc2oaNMuPwAsxVK6CC1yA4/I90EhmWNj0Q6HA== conventional-changelog-writer@^4.0.0: version "4.0.0" @@ -5307,7 +5208,6 @@ conventional-changelog-writer@^4.0.0: conventional-changelog-writer@^4.0.5: version "4.0.6" resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.6.tgz#24db578ac8e7c89a409ef9bba12cf3c095990148" - integrity sha512-ou/sbrplJMM6KQpR5rKFYNVQYesFjN7WpNGdudQSWNi6X+RgyFUcSv871YBYkrUYV9EX8ijMohYVzn9RUb+4ag== dependencies: compare-func "^1.3.1" conventional-commits-filter "^2.0.2" @@ -5330,7 +5230,6 @@ conventional-commits-filter@^2.0.0: conventional-commits-filter@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz#f122f89fbcd5bb81e2af2fcac0254d062d1039c1" - integrity sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ== dependencies: lodash.ismatch "^4.4.0" modify-values "^1.0.0" @@ -5350,7 +5249,6 @@ conventional-commits-parser@^3.0.0: conventional-commits-parser@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.3.tgz#c3f972fd4e056aa8b9b4f5f3d0e540da18bf396d" - integrity sha512-KaA/2EeUkO4bKjinNfGUyqPTX/6w9JGshuQRik4r/wJz7rUw3+D3fDG6sZSEqJvKILzKXFQuFkpPLclcsAuZcg== dependencies: JSONStream "^1.0.4" is-text-path "^2.0.0" @@ -5376,7 +5274,6 @@ conventional-recommended-bump@^4.0.1: conventional-recommended-bump@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-5.0.0.tgz#019d45a1f3d2cc14a26e9bad1992406ded5baa23" - integrity sha512-CsfdICpbUe0pmM4MTG90GPUqnFgB1SWIR2HAh+vS+JhhJdPWvc0brs8oadWoYGhFOQpQwe57JnvzWEWU0m2OSg== dependencies: concat-stream "^2.0.0" conventional-changelog-preset-loader "^2.1.1" @@ -5495,7 +5392,6 @@ cosmiconfig@^5.0.2: cosmiconfig@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== dependencies: import-fresh "^2.0.0" is-directory "^0.3.1" @@ -5871,7 +5767,6 @@ debug@3.1.0, debug@=3.1.0, debug@^3.1.0: debug@3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" @@ -6007,7 +5902,6 @@ deep-is@~0.1.3: deepmerge@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.0.0.tgz#3e3110ca29205f120d7cb064960a39c3d2087c09" - integrity sha512-YZ1rOP5+kHor4hMAH+HRQnBQHg+wvS1un1hAOuIcxcBy0hzcUf6Jg2a1w65kpoOUnurOfZbERwjI1TfZxNjcww== deepmerge@^2.0.1: version "2.1.1" @@ -6149,7 +6043,6 @@ deprecated@^0.0.1: deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== deps-regex@^0.1.4: version "0.1.4" @@ -6225,7 +6118,6 @@ dir-glob@^2.0.0: dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== dependencies: path-type "^3.0.0" @@ -6570,7 +6462,6 @@ entities@^1.1.1, entities@~1.1.1: env-paths@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" - integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA= enzyme-adapter-react-16@^1.5.0: version "1.5.0" @@ -7257,7 +7148,6 @@ eventemitter3@^3.0.0: eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== events@1.1.1, events@^1.0.0: version "1.1.1" @@ -7583,7 +7473,6 @@ fast-glob@^2.0.2: fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== dependencies: "@mrmlnc/readdir-enhanced" "^2.2.1" "@nodelib/fs.stat" "^1.1.2" @@ -7749,7 +7638,6 @@ fill-range@^4.0.0: fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" @@ -7870,7 +7758,6 @@ flat-cache@^1.2.1: flat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== dependencies: is-buffer "~2.0.3" @@ -8062,7 +7949,6 @@ fs-extra@^7.0.0: fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" jsonfile "^4.0.0" @@ -8113,7 +7999,6 @@ fsevents@^1.0.0, fsevents@^1.2.3: fsevents@^1.2.7: version "1.2.9" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== dependencies: nan "^2.12.1" node-pre-gyp "^0.12.0" @@ -8121,7 +8006,6 @@ fsevents@^1.2.7: fsevents@^2.0.6: version "2.0.7" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.7.tgz#382c9b443c6cbac4c57187cdda23aa3bf1ccfc2a" - integrity sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ== fstream@^1.0.0, fstream@^1.0.2, fstream@^1.0.8: version "1.0.11" @@ -8226,7 +8110,6 @@ genfun@^4.0.1: genfun@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" - integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== get-caller-file@^1.0.1: version "1.0.2" @@ -8235,7 +8118,6 @@ get-caller-file@^1.0.1: get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-func-name@^2.0.0: version "2.0.0" @@ -8258,7 +8140,6 @@ get-port@^3.2.0: get-port@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" - integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== get-size@^2.0.0: version "2.0.3" @@ -8312,7 +8193,6 @@ ghauth@^2.0.0: git-raw-commits@2.0.0, git-raw-commits@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.0.tgz#d92addf74440c14bcc5c83ecce3fb7f8a79118b5" - integrity sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg== dependencies: dargs "^4.0.1" lodash.template "^4.0.2" @@ -8337,7 +8217,6 @@ git-semver-tags@^2.0.0: git-semver-tags@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-2.0.2.tgz#f506ec07caade191ac0c8d5a21bdb8131b4934e3" - integrity sha512-34lMF7Yo1xEmsK2EkbArdoU79umpvm0MfzaDkSNYSJqtM5QLAVTPWgpiXSVI5o/O9EvZPSrP4Zvnec/CqhSd5w== dependencies: meow "^4.0.0" semver "^5.5.0" @@ -8345,7 +8224,6 @@ git-semver-tags@^2.0.2: git-up@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" - integrity sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw== dependencies: is-ssh "^1.3.0" parse-url "^5.0.0" @@ -8353,7 +8231,6 @@ git-up@^4.0.0: git-url-parse@^11.1.2: version "11.1.2" resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.1.2.tgz#aff1a897c36cc93699270587bea3dbcbbb95de67" - integrity sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ== dependencies: git-up "^4.0.0" @@ -8396,7 +8273,6 @@ glob-parent@^3.1.0: glob-parent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" - integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== dependencies: is-glob "^4.0.1" @@ -8486,7 +8362,6 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, gl glob@^7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -8593,7 +8468,6 @@ globby@^8.0.1: globby@^9.2.0: version "9.2.0" resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== dependencies: "@types/glob" "^7.1.1" array-union "^1.0.2" @@ -8661,7 +8535,7 @@ got@^6.7.1: graceful-fs@4.1.15, graceful-fs@^3.0.0, graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@~1.2.0: version "4.1.15" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -8670,7 +8544,6 @@ graceful-fs@4.1.15, graceful-fs@^3.0.0, graceful-fs@^4.0.0, graceful-fs@^4.1.10, growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== growly@^1.3.0: version "1.3.0" @@ -8748,7 +8621,6 @@ handle-thing@^1.2.5: handlebars@^4.0.1, handlebars@^4.0.11, handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6, handlebars@^4.1.0, handlebars@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -8935,7 +8807,6 @@ he@1.1.x: he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== header-case@^1.0.0: version "1.0.1" @@ -9271,7 +9142,6 @@ ignore@^3.3.5: ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== image-size@~0.5.0: version "0.5.5" @@ -9294,7 +9164,6 @@ immutable@3.8.2: import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= dependencies: caller-path "^2.0.0" resolve-from "^3.0.0" @@ -9355,7 +9224,6 @@ indexof@0.0.1: infer-owner@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" @@ -9560,7 +9428,6 @@ is-binary-path@^1.0.0: is-binary-path@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" @@ -9575,7 +9442,6 @@ is-buffer@^1.1.4, is-buffer@^1.1.5: is-buffer@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" - integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== is-builtin-module@^1.0.0: version "1.0.0" @@ -9600,7 +9466,6 @@ is-ci@^1.0.10: is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" @@ -9721,7 +9586,6 @@ is-glob@^4.0.0: is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" @@ -9789,7 +9653,6 @@ is-number@^4.0.0: is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.0: version "1.0.1" @@ -9840,7 +9703,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: is-plain-object@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" - integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== dependencies: isobject "^4.0.0" @@ -9879,7 +9741,6 @@ is-retry-allowed@^1.0.0: is-ssh@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.1.tgz#f349a8cadd24e65298037a522cf7520f2e81a0f3" - integrity sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg== dependencies: protocols "^1.1.0" @@ -9914,7 +9775,6 @@ is-text-path@^1.0.0: is-text-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" - integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== dependencies: text-extensions "^2.0.0" @@ -9995,7 +9855,6 @@ isobject@^3.0.0, isobject@^3.0.1: isobject@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== isomorphic-fetch@2.2.1, isomorphic-fetch@^2.1.1: version "2.2.1" @@ -10473,7 +10332,6 @@ js-tokens@^4.0.0: js-yaml@3.13.1, js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -11143,7 +11001,6 @@ load-json-file@^4.0.0: load-json-file@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" - integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== dependencies: graceful-fs "^4.1.15" parse-json "^4.0.0" @@ -11258,7 +11115,6 @@ lodash.camelcase@^4.3.0: lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= lodash.deburr@^3.0.0: version "3.2.0" @@ -11319,7 +11175,6 @@ lodash.isequal@^4.0.0, lodash.isequal@^4.5.0: lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" - integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= lodash.isplainobject@^4.0.6: version "4.0.6" @@ -11364,7 +11219,6 @@ lodash.restparam@^3.0.0: lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= lodash.sortby@^4.7.0: version "4.7.0" @@ -11394,7 +11248,6 @@ lodash.template@^4.0.2: lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== dependencies: lodash._reinterpolate "^3.0.0" lodash.templatesettings "^4.0.0" @@ -11453,7 +11306,6 @@ lodash@^4.17.10: lodash@^4.17.14: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== lodash@~1.0.1: version "1.0.2" @@ -11570,7 +11422,6 @@ lru-cache@^4.1.2, lru-cache@^4.1.3: lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" @@ -11597,7 +11448,6 @@ macaddress@^0.2.8: macos-release@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" - integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== make-dir@^1.0.0: version "1.2.0" @@ -11608,7 +11458,6 @@ make-dir@^1.0.0: make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: pify "^4.0.1" semver "^5.6.0" @@ -11640,7 +11489,6 @@ make-fetch-happen@^4.0.1: make-fetch-happen@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.0.tgz#a8e3fe41d3415dd656fe7b8e8172e1fb4458b38d" - integrity sha512-nFr/vpL1Jc60etMVKeaLOqfGjMMb3tAHFVJWxHOFCFS04Zmd7kGlMxo0l1tzfhoQje0/UPnd0X8OeGUiXXnfPA== dependencies: agentkeepalive "^3.4.1" cacache "^12.0.0" @@ -11873,7 +11721,6 @@ merge2@^1.2.1: merge2@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" - integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== merge@^1.2.0: version "1.2.0" @@ -12054,7 +11901,6 @@ minipass@^2.2.1, minipass@^2.3.3: minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" @@ -12068,7 +11914,6 @@ minizlib@^1.1.0: minizlib@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== dependencies: minipass "^2.2.1" @@ -12135,7 +11980,6 @@ mobx@^4.2.0: mocha@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.0.tgz#f896b642843445d1bb8bca60eabd9206b8916e56" - integrity sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ== dependencies: ansi-colors "3.2.3" browser-stdout "1.3.1" @@ -12227,7 +12071,6 @@ multimatch@^2.1.0: multimatch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" - integrity sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA== dependencies: array-differ "^2.0.3" array-union "^1.0.2" @@ -12267,7 +12110,6 @@ nan@^2.11.0: nan@^2.12.1: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nano-json-stream-parser@^0.1.2: version "0.1.2" @@ -12339,7 +12181,6 @@ neo-async@^2.5.0: neo-async@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== next-tick@1: version "1.0.0" @@ -12388,7 +12229,6 @@ node-abi@^2.2.0: node-environment-flags@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" - integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== dependencies: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" @@ -12415,7 +12255,6 @@ node-fetch@^1.0.1, node-fetch@^1.3.3, node-fetch@~1.7.1: node-fetch@^2.3.0, node-fetch@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== node-forge@0.7.1: version "0.7.1" @@ -12441,7 +12280,6 @@ node-gyp@^3.6.2: node-gyp@^5.0.2: version "5.0.3" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.0.3.tgz#80d64c23790244991b6d44532f0a351bedd3dd45" - integrity sha512-z/JdtkFGUm0QaQUusvloyYuGDub3nUbOo5de1Fz57cM++osBTvQatBUSTlF1k/w8vFHPxxXW6zxGvkxXSpaBkQ== dependencies: env-paths "^1.0.0" glob "^7.0.3" @@ -12522,7 +12360,6 @@ node-pre-gyp@^0.10.0, node-pre-gyp@^0.10.3: node-pre-gyp@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -12599,7 +12436,6 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package- normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" resolve "^1.10.0" @@ -12615,7 +12451,6 @@ normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" @@ -12637,7 +12472,6 @@ normalize-url@^1.4.0: normalize-url@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== now-and-later@^2.0.0: version "2.0.0" @@ -12665,7 +12499,6 @@ npm-lifecycle@^2.0.0: npm-lifecycle@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.0.tgz#684d8340e85c8ad1893c231e50903d1b78f46af4" - integrity sha512-G11f/KhHvvrBN9uPG9rj/3plT5eu2T4NKurP4diIDnHQHleppPhT2SaCJq0DQG2WHrAgI+8pH0kKQlwbAwHQNg== dependencies: byline "^5.0.0" graceful-fs "^4.1.15" @@ -12709,7 +12542,6 @@ npm-packlist@^1.1.6: npm-packlist@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" - integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -12724,7 +12556,6 @@ npm-pick-manifest@^2.1.0: npm-pick-manifest@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40" - integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA== dependencies: figgy-pudding "^3.5.1" npm-package-arg "^6.0.0" @@ -12991,7 +12822,6 @@ obuf@^1.0.0, obuf@^1.1.1: octokit-pagination-methods@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" - integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== on-finished@~2.3.0: version "2.3.0" @@ -13173,7 +13003,6 @@ os-locale@^3.0.0: os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== dependencies: execa "^1.0.0" lcid "^2.0.0" @@ -13182,7 +13011,6 @@ os-locale@^3.1.0: os-name@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" - integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== dependencies: macos-release "^2.2.0" windows-release "^3.1.0" @@ -13257,7 +13085,6 @@ p-map@^1.1.1, p-map@^1.2.0: p-map@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== p-pipe@^1.2.0: version "1.2.0" @@ -13266,7 +13093,6 @@ p-pipe@^1.2.0: p-queue@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-4.0.0.tgz#ed0eee8798927ed6f2c2f5f5b77fdb2061a5d346" - integrity sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg== dependencies: eventemitter3 "^3.1.0" @@ -13447,7 +13273,6 @@ parse-passwd@^1.0.0: parse-path@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.1.tgz#0ec769704949778cb3b8eda5e994c32073a1adff" - integrity sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA== dependencies: is-ssh "^1.3.0" protocols "^1.4.0" @@ -13455,7 +13280,6 @@ parse-path@^4.0.0: parse-url@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.1.tgz#99c4084fc11be14141efa41b3d117a96fcb9527f" - integrity sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg== dependencies: is-ssh "^1.3.0" normalize-url "^3.3.0" @@ -13530,7 +13354,6 @@ path-parse@^1.0.5: path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-root-regex@^0.1.0: version "0.1.2" @@ -13611,7 +13434,6 @@ performance-now@^2.1.0: picomatch@^2.0.4: version "2.0.7" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" - integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" @@ -13624,7 +13446,6 @@ pify@^3.0.0: pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" @@ -14164,7 +13985,6 @@ proto-list@~1.2.1: protocols@^1.1.0, protocols@^1.4.0: version "1.4.7" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32" - integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== protoduck@^5.0.0: version "5.0.0" @@ -14175,7 +13995,6 @@ protoduck@^5.0.0: protoduck@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" - integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== dependencies: genfun "^5.0.0" @@ -14994,7 +14813,6 @@ readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0 "readable-stream@2 || 3", readable-stream@^3.0.2: version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -15038,7 +14856,6 @@ readdirp@^2.0.0: readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: graceful-fs "^4.1.11" micromatch "^3.1.10" @@ -15047,7 +14864,6 @@ readdirp@^2.2.1: readdirp@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.1.tgz#b158123ac343c8b0f31d65680269cc0fc1025db1" - integrity sha512-XXdSXZrQuvqoETj50+JAitxz1UPdt5dupjT6T5nVB+WvjMv2XKYj+s7hPeAVCXvmJrL36O4YYyWlIC3an2ePiQ== dependencies: picomatch "^2.0.4" @@ -15498,7 +15314,6 @@ require-main-filename@^1.0.1: require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== require-package-name@^2.0.1: version "2.0.1" @@ -15560,7 +15375,6 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: resolve@^1.10.0: version "1.11.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== dependencies: path-parse "^1.0.6" @@ -15615,7 +15429,6 @@ rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6 rimraf@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" @@ -15750,7 +15563,6 @@ safe-buffer@5.1.2, safe-buffer@^5.1.2: safe-buffer@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== safe-regex@^1.1.0: version "1.1.0" @@ -15929,12 +15741,10 @@ semver@^5.5.1: semver@^5.6.0, semver@^5.7.0: version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== semver@^6.0.0, semver@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" - integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== semver@~5.3.0: version "5.3.0" @@ -16178,7 +15988,6 @@ slash@^1.0.0: slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slice-ansi@0.0.4: version "0.0.4" @@ -16854,7 +16663,6 @@ stylis@^3.5.0: supports-color@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== dependencies: has-flag "^3.0.0" @@ -17082,7 +16890,6 @@ tar@^4, tar@^4.4.3: tar@^4.4.10, tar@^4.4.8: version "4.4.10" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" - integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" @@ -17176,7 +16983,6 @@ text-extensions@^1.0.0: text-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.0.0.tgz#43eabd1b495482fae4a2bf65e5f56c29f69220f6" - integrity sha512-F91ZqLgvi1E0PdvmxMgp+gcf6q8fMH7mhdwWfzXnl1k+GbpQDmi8l7DzLC5JTASKbwpY3TfxajAUzAXcv2NmsQ== text-table@^0.2.0: version "0.2.0" @@ -17235,7 +17041,6 @@ through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2. through2@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== dependencies: readable-stream "2 || 3" @@ -17338,7 +17143,6 @@ to-regex-range@^2.1.0: to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" @@ -17585,7 +17389,6 @@ type-detect@^4.0.0, type-detect@^4.0.5: type-fest@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== type-is@~1.6.15, type-is@~1.6.16: version "1.6.16" @@ -17717,7 +17520,6 @@ uglify-js@3.4.x, uglify-js@^3.0.0: uglify-js@^3.1.4: version "3.6.0" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" - integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== dependencies: commander "~2.20.0" source-map "~0.6.1" @@ -17848,7 +17650,6 @@ unique-filename@^1.1.0: unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: unique-slug "^2.0.0" @@ -17902,7 +17703,6 @@ unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: universal-user-agent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-3.0.0.tgz#4cc88d68097bffd7ac42e3b7c903e7481424b4b9" - integrity sha512-T3siHThqoj5X0benA5H0qcDnrKGXzU8TKoX15x/tQHw1hQBvIEBHjxQ2klizYsqBOO/Q+WuxoQUihadeeqDnoA== dependencies: os-name "^3.0.0" @@ -17932,7 +17732,6 @@ unzip-response@^2.0.1: upath@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== update-notifier@^2.3.0, update-notifier@^2.5.0: version "2.5.0" @@ -18002,7 +17801,6 @@ url-set-query@^1.0.0: url-template@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= url-to-options@^1.0.1: version "1.0.1" @@ -18883,7 +18681,6 @@ which-pm-runs@^1.0.0: which@1, which@1.3.1, which@^1.2.12, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" @@ -18896,7 +18693,6 @@ which@^1.1.1, which@^1.2.14, which@^1.2.9, which@^1.3.0: wide-align@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" @@ -18923,7 +18719,6 @@ window-size@^0.2.0: windows-release@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" - integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== dependencies: execa "^1.0.0" @@ -19006,7 +18801,6 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.1.0, write-file-atomic@^2.3.0: write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -19026,7 +18820,6 @@ write-json-file@^2.2.0, write-json-file@^2.3.0: write-json-file@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" - integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== dependencies: detect-indent "^5.0.0" graceful-fs "^4.1.15" @@ -19210,7 +19003,6 @@ yallist@^3.0.0, yallist@^3.0.2: yallist@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== yargonaut@^1.1.2: version "1.1.4" @@ -19229,7 +19021,6 @@ yargs-parser@10.x, yargs-parser@^10.0.0, yargs-parser@^10.1.0: yargs-parser@13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" - integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -19237,7 +19028,6 @@ yargs-parser@13.0.0: yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -19245,7 +19035,6 @@ yargs-parser@^11.1.1: yargs-parser@^13.0.0: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -19278,7 +19067,6 @@ yargs-parser@^9.0.2: yargs-unparser@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" - integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== dependencies: flat "^4.1.0" lodash "^4.17.11" @@ -19321,7 +19109,6 @@ yargs@12.0.2, yargs@^12.0.2: yargs@13.2.2: version "13.2.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" - integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== dependencies: cliui "^4.0.0" find-up "^3.0.0" @@ -19389,7 +19176,6 @@ yargs@^12.0.1: yargs@^12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== dependencies: cliui "^4.0.0" decamelize "^1.2.0"