// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma enum-naming // tslint:disable:whitespace no-unbound-method no-trailing-whitespace // tslint:disable:no-unused-variable import { AwaitTransactionSuccessOpts, ContractFunctionObj, ContractTxFunctionObj, SendTransactionOpts, BaseContract, SubscriptionManager, PromiseWithTransactionHash, methodAbiToFunctionSignature, linkLibrariesInBytecode, } from '@0x/base-contract'; import { schemas } from '@0x/json-schemas'; import { BlockParam, BlockParamLiteral, BlockRange, CallData, ContractAbi, ContractArtifact, DecodedLogArgs, LogWithDecodedArgs, MethodAbi, TransactionReceiptWithDecodedLogs, TxData, TxDataPayable, SupportedProvider, } from 'ethereum-types'; import { BigNumber, classUtils, hexUtils, logUtils, providerUtils } from '@0x/utils'; import { EventCallback, IndexedFilterValues, SimpleContractArtifact } from '@0x/types'; import { Web3Wrapper } from '@0x/web3-wrapper'; import { assert } from '@0x/assert'; import * as ethers from 'ethers'; // tslint:enable:no-unused-variable export type IZeroExEventArgs = | IZeroExMetaTransactionExecutedEventArgs | IZeroExMigratedEventArgs | IZeroExOwnershipTransferredEventArgs | IZeroExProxyFunctionUpdatedEventArgs | IZeroExQuoteSignerUpdatedEventArgs | IZeroExTransformedERC20EventArgs | IZeroExTransformerDeployerUpdatedEventArgs; export enum IZeroExEvents { MetaTransactionExecuted = 'MetaTransactionExecuted', Migrated = 'Migrated', OwnershipTransferred = 'OwnershipTransferred', ProxyFunctionUpdated = 'ProxyFunctionUpdated', QuoteSignerUpdated = 'QuoteSignerUpdated', TransformedERC20 = 'TransformedERC20', TransformerDeployerUpdated = 'TransformerDeployerUpdated', } export interface IZeroExMetaTransactionExecutedEventArgs extends DecodedLogArgs { hash: string; selector: string; signer: string; sender: string; } export interface IZeroExMigratedEventArgs extends DecodedLogArgs { caller: string; migrator: string; newOwner: string; } export interface IZeroExOwnershipTransferredEventArgs extends DecodedLogArgs { previousOwner: string; newOwner: string; } export interface IZeroExProxyFunctionUpdatedEventArgs extends DecodedLogArgs { selector: string; oldImpl: string; newImpl: string; } export interface IZeroExQuoteSignerUpdatedEventArgs extends DecodedLogArgs { quoteSigner: string; } export interface IZeroExTransformedERC20EventArgs extends DecodedLogArgs { taker: string; inputToken: string; outputToken: string; inputTokenAmount: BigNumber; outputTokenAmount: BigNumber; } export interface IZeroExTransformerDeployerUpdatedEventArgs extends DecodedLogArgs { transformerDeployer: string; } /* istanbul ignore next */ // tslint:disable:array-type // tslint:disable:no-parameter-reassignment // tslint:disable-next-line:class-name export class IZeroExContract extends BaseContract { /** * @ignore */ public static deployedBytecode: string | undefined; public static contractName = 'IZeroEx'; private readonly _methodABIIndex: { [name: string]: number } = {}; private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, txDefaults: Partial, logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, ): Promise { assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ schemas.addressSchema, schemas.numberSchema, schemas.jsNumber, ]); if (artifact.compilerOutput === undefined) { throw new Error('Compiler output not found in the artifact file'); } const provider = providerUtils.standardizeOrThrow(supportedProvider); const bytecode = artifact.compilerOutput.evm.bytecode.object; const abi = artifact.compilerOutput.abi; const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {}; if (Object.keys(logDecodeDependencies) !== undefined) { for (const key of Object.keys(logDecodeDependencies)) { logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi; } } return IZeroExContract.deployAsync(bytecode, abi, provider, txDefaults, logDecodeDependenciesAbiOnly); } public static async deployWithLibrariesFrom0xArtifactAsync( artifact: ContractArtifact, libraryArtifacts: { [libraryName: string]: ContractArtifact }, supportedProvider: SupportedProvider, txDefaults: Partial, logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, ): Promise { assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ schemas.addressSchema, schemas.numberSchema, schemas.jsNumber, ]); if (artifact.compilerOutput === undefined) { throw new Error('Compiler output not found in the artifact file'); } const provider = providerUtils.standardizeOrThrow(supportedProvider); const abi = artifact.compilerOutput.abi; const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {}; if (Object.keys(logDecodeDependencies) !== undefined) { for (const key of Object.keys(logDecodeDependencies)) { logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi; } } const libraryAddresses = await IZeroExContract._deployLibrariesAsync( artifact, libraryArtifacts, new Web3Wrapper(provider), txDefaults, ); const bytecode = linkLibrariesInBytecode(artifact, libraryAddresses); return IZeroExContract.deployAsync(bytecode, abi, provider, txDefaults, logDecodeDependenciesAbiOnly); } public static async deployAsync( bytecode: string, abi: ContractAbi, supportedProvider: SupportedProvider, txDefaults: Partial, logDecodeDependencies: { [contractName: string]: ContractAbi }, ): Promise { assert.isHexString('bytecode', bytecode); assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ schemas.addressSchema, schemas.numberSchema, schemas.jsNumber, ]); const provider = providerUtils.standardizeOrThrow(supportedProvider); const constructorAbi = BaseContract._lookupConstructorAbi(abi); [] = BaseContract._formatABIDataItemList(constructorAbi.inputs, [], BaseContract._bigNumberToString); const iface = new ethers.utils.Interface(abi); const deployInfo = iface.deployFunction; const txData = deployInfo.encode(bytecode, []); const web3Wrapper = new Web3Wrapper(provider); const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync( { data: txData, ...txDefaults, }, web3Wrapper.estimateGasAsync.bind(web3Wrapper), ); const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); logUtils.log(`transactionHash: ${txHash}`); const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); logUtils.log(`IZeroEx successfully deployed at ${txReceipt.contractAddress}`); const contractInstance = new IZeroExContract( txReceipt.contractAddress as string, provider, txDefaults, logDecodeDependencies, ); contractInstance.constructorArgs = []; return contractInstance; } /** * @returns The contract ABI */ public static ABI(): ContractAbi { const abi = [ { anonymous: false, inputs: [ { name: 'hash', type: 'bytes32', indexed: false, }, { name: 'selector', type: 'bytes4', indexed: true, }, { name: 'signer', type: 'address', indexed: false, }, { name: 'sender', type: 'address', indexed: false, }, ], name: 'MetaTransactionExecuted', outputs: [], type: 'event', }, { anonymous: false, inputs: [ { name: 'caller', type: 'address', indexed: false, }, { name: 'migrator', type: 'address', indexed: false, }, { name: 'newOwner', type: 'address', indexed: false, }, ], name: 'Migrated', outputs: [], type: 'event', }, { anonymous: false, inputs: [ { name: 'previousOwner', type: 'address', indexed: true, }, { name: 'newOwner', type: 'address', indexed: true, }, ], name: 'OwnershipTransferred', outputs: [], type: 'event', }, { anonymous: false, inputs: [ { name: 'selector', type: 'bytes4', indexed: true, }, { name: 'oldImpl', type: 'address', indexed: false, }, { name: 'newImpl', type: 'address', indexed: false, }, ], name: 'ProxyFunctionUpdated', outputs: [], type: 'event', }, { anonymous: false, inputs: [ { name: 'quoteSigner', type: 'address', indexed: false, }, ], name: 'QuoteSignerUpdated', outputs: [], type: 'event', }, { anonymous: false, inputs: [ { name: 'taker', type: 'address', indexed: true, }, { name: 'inputToken', type: 'address', indexed: false, }, { name: 'outputToken', type: 'address', indexed: false, }, { name: 'inputTokenAmount', type: 'uint256', indexed: false, }, { name: 'outputTokenAmount', type: 'uint256', indexed: false, }, ], name: 'TransformedERC20', outputs: [], type: 'event', }, { anonymous: false, inputs: [ { name: 'transformerDeployer', type: 'address', indexed: false, }, ], name: 'TransformerDeployerUpdated', outputs: [], type: 'event', }, { inputs: [ { name: 'sender', type: 'address', }, { name: 'mtx', type: 'tuple', components: [ { name: 'signer', type: 'address', }, { name: 'sender', type: 'address', }, { name: 'minGasPrice', type: 'uint256', }, { name: 'maxGasPrice', type: 'uint256', }, { name: 'expirationTimeSeconds', type: 'uint256', }, { name: 'salt', type: 'uint256', }, { name: 'callData', type: 'bytes', }, { name: 'value', type: 'uint256', }, { name: 'feeToken', type: 'address', }, { name: 'feeAmount', type: 'uint256', }, ], }, { name: 'signature', type: 'bytes', }, ], name: '_executeMetaTransaction', outputs: [ { name: 'returnResult', type: 'bytes', }, ], stateMutability: 'payable', type: 'function', }, { inputs: [ { name: 'token', type: 'address', }, { name: 'owner', type: 'address', }, { name: 'to', type: 'address', }, { name: 'amount', type: 'uint256', }, ], name: '_spendERC20Tokens', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { name: 'args', type: 'tuple', components: [ { name: 'taker', type: 'address', }, { name: 'inputToken', type: 'address', }, { name: 'outputToken', type: 'address', }, { name: 'inputTokenAmount', type: 'uint256', }, { name: 'minOutputTokenAmount', type: 'uint256', }, { name: 'transformations', type: 'tuple[]', components: [ { name: 'deploymentNonce', type: 'uint32', }, { name: 'data', type: 'bytes', }, ], }, { name: 'callDataHash', type: 'bytes32', }, { name: 'callDataSignature', type: 'bytes', }, ], }, ], name: '_transformERC20', outputs: [ { name: 'outputTokenAmount', type: 'uint256', }, ], stateMutability: 'payable', type: 'function', }, { inputs: [ { name: 'mtxs', type: 'tuple[]', components: [ { name: 'signer', type: 'address', }, { name: 'sender', type: 'address', }, { name: 'minGasPrice', type: 'uint256', }, { name: 'maxGasPrice', type: 'uint256', }, { name: 'expirationTimeSeconds', type: 'uint256', }, { name: 'salt', type: 'uint256', }, { name: 'callData', type: 'bytes', }, { name: 'value', type: 'uint256', }, { name: 'feeToken', type: 'address', }, { name: 'feeAmount', type: 'uint256', }, ], }, { name: 'signatures', type: 'bytes[]', }, ], name: 'batchExecuteMetaTransactions', outputs: [ { name: 'returnResults', type: 'bytes[]', }, ], stateMutability: 'payable', type: 'function', }, { inputs: [], name: 'createTransformWallet', outputs: [ { name: 'wallet', type: 'address', }, ], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { name: 'mtx', type: 'tuple', components: [ { name: 'signer', type: 'address', }, { name: 'sender', type: 'address', }, { name: 'minGasPrice', type: 'uint256', }, { name: 'maxGasPrice', type: 'uint256', }, { name: 'expirationTimeSeconds', type: 'uint256', }, { name: 'salt', type: 'uint256', }, { name: 'callData', type: 'bytes', }, { name: 'value', type: 'uint256', }, { name: 'feeToken', type: 'address', }, { name: 'feeAmount', type: 'uint256', }, ], }, { name: 'signature', type: 'bytes', }, ], name: 'executeMetaTransaction', outputs: [ { name: 'returnResult', type: 'bytes', }, ], stateMutability: 'payable', type: 'function', }, { inputs: [ { name: 'selector', type: 'bytes4', }, { name: 'impl', type: 'address', }, ], name: 'extend', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [], name: 'getAllowanceTarget', outputs: [ { name: 'target', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { name: 'selector', type: 'bytes4', }, ], name: 'getFunctionImplementation', outputs: [ { name: 'impl', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { name: 'mtx', type: 'tuple', components: [ { name: 'signer', type: 'address', }, { name: 'sender', type: 'address', }, { name: 'minGasPrice', type: 'uint256', }, { name: 'maxGasPrice', type: 'uint256', }, { name: 'expirationTimeSeconds', type: 'uint256', }, { name: 'salt', type: 'uint256', }, { name: 'callData', type: 'bytes', }, { name: 'value', type: 'uint256', }, { name: 'feeToken', type: 'address', }, { name: 'feeAmount', type: 'uint256', }, ], }, ], name: 'getMetaTransactionExecutedBlock', outputs: [ { name: 'blockNumber', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { name: 'mtx', type: 'tuple', components: [ { name: 'signer', type: 'address', }, { name: 'sender', type: 'address', }, { name: 'minGasPrice', type: 'uint256', }, { name: 'maxGasPrice', type: 'uint256', }, { name: 'expirationTimeSeconds', type: 'uint256', }, { name: 'salt', type: 'uint256', }, { name: 'callData', type: 'bytes', }, { name: 'value', type: 'uint256', }, { name: 'feeToken', type: 'address', }, { name: 'feeAmount', type: 'uint256', }, ], }, ], name: 'getMetaTransactionHash', outputs: [ { name: 'mtxHash', type: 'bytes32', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { name: 'mtxHash', type: 'bytes32', }, ], name: 'getMetaTransactionHashExecutedBlock', outputs: [ { name: 'blockNumber', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'getQuoteSigner', outputs: [ { name: 'signer', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { name: 'selector', type: 'bytes4', }, { name: 'idx', type: 'uint256', }, ], name: 'getRollbackEntryAtIndex', outputs: [ { name: 'impl', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { name: 'selector', type: 'bytes4', }, ], name: 'getRollbackLength', outputs: [ { name: 'rollbackLength', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { name: 'token', type: 'address', }, { name: 'owner', type: 'address', }, ], name: 'getSpendableERC20BalanceOf', outputs: [ { name: 'amount', type: 'uint256', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'getTransformWallet', outputs: [ { name: 'wallet', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'getTransformerDeployer', outputs: [ { name: 'deployer', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { name: 'hash', type: 'bytes32', }, { name: 'signer', type: 'address', }, { name: 'signature', type: 'bytes', }, ], name: 'isValidHashSignature', outputs: [ { name: 'isValid', type: 'bool', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { name: 'target', type: 'address', }, { name: 'data', type: 'bytes', }, { name: 'newOwner', type: 'address', }, ], name: 'migrate', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [], name: 'owner', outputs: [ { name: 'ownerAddress', type: 'address', }, ], stateMutability: 'view', type: 'function', }, { inputs: [ { name: 'selector', type: 'bytes4', }, { name: 'targetImpl', type: 'address', }, ], name: 'rollback', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { name: 'tokens', type: 'address[]', }, { name: 'sellAmount', type: 'uint256', }, { name: 'minBuyAmount', type: 'uint256', }, { name: 'isSushi', type: 'bool', }, ], name: 'sellToUniswap', outputs: [ { name: 'buyAmount', type: 'uint256', }, ], stateMutability: 'payable', type: 'function', }, { inputs: [ { name: 'quoteSigner', type: 'address', }, ], name: 'setQuoteSigner', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { name: 'transformerDeployer', type: 'address', }, ], name: 'setTransformerDeployer', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { name: 'newOwner', type: 'address', }, ], name: 'transferOwnership', outputs: [], stateMutability: 'nonpayable', type: 'function', }, { inputs: [ { name: 'inputToken', type: 'address', }, { name: 'outputToken', type: 'address', }, { name: 'inputTokenAmount', type: 'uint256', }, { name: 'minOutputTokenAmount', type: 'uint256', }, { name: 'transformations', type: 'tuple[]', components: [ { name: 'deploymentNonce', type: 'uint32', }, { name: 'data', type: 'bytes', }, ], }, ], name: 'transformERC20', outputs: [ { name: 'outputTokenAmount', type: 'uint256', }, ], stateMutability: 'payable', type: 'function', }, { inputs: [ { name: 'hash', type: 'bytes32', }, { name: 'signer', type: 'address', }, { name: 'signature', type: 'bytes', }, ], name: 'validateHashSignature', outputs: [], stateMutability: 'view', type: 'function', }, ] as ContractAbi; return abi; } protected static async _deployLibrariesAsync( artifact: ContractArtifact, libraryArtifacts: { [libraryName: string]: ContractArtifact }, web3Wrapper: Web3Wrapper, txDefaults: Partial, libraryAddresses: { [libraryName: string]: string } = {}, ): Promise<{ [libraryName: string]: string }> { const links = artifact.compilerOutput.evm.bytecode.linkReferences; // Go through all linked libraries, recursively deploying them if necessary. for (const link of Object.values(links)) { for (const libraryName of Object.keys(link)) { if (!libraryAddresses[libraryName]) { // Library not yet deployed. const libraryArtifact = libraryArtifacts[libraryName]; if (!libraryArtifact) { throw new Error(`Missing artifact for linked library "${libraryName}"`); } // Deploy any dependent libraries used by this library. await IZeroExContract._deployLibrariesAsync( libraryArtifact, libraryArtifacts, web3Wrapper, txDefaults, libraryAddresses, ); // Deploy this library. const linkedLibraryBytecode = linkLibrariesInBytecode(libraryArtifact, libraryAddresses); const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync( { data: linkedLibraryBytecode, ...txDefaults, }, web3Wrapper.estimateGasAsync.bind(web3Wrapper), ); const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); logUtils.log(`transactionHash: ${txHash}`); const { contractAddress } = await web3Wrapper.awaitTransactionSuccessAsync(txHash); logUtils.log(`${libraryArtifact.contractName} successfully deployed at ${contractAddress}`); libraryAddresses[libraryArtifact.contractName] = contractAddress as string; } } } return libraryAddresses; } public getFunctionSignature(methodName: string): string { const index = this._methodABIIndex[methodName]; const methodAbi = IZeroExContract.ABI()[index] as MethodAbi; // tslint:disable-line:no-unnecessary-type-assertion const functionSignature = methodAbiToFunctionSignature(methodAbi); return functionSignature; } public getABIDecodedTransactionData(methodName: string, callData: string): T { const functionSignature = this.getFunctionSignature(methodName); const self = (this as any) as IZeroExContract; const abiEncoder = self._lookupAbiEncoder(functionSignature); const abiDecodedCallData = abiEncoder.strictDecode(callData); return abiDecodedCallData; } public getABIDecodedReturnData(methodName: string, callData: string): T { const functionSignature = this.getFunctionSignature(methodName); const self = (this as any) as IZeroExContract; const abiEncoder = self._lookupAbiEncoder(functionSignature); const abiDecodedCallData = abiEncoder.strictDecodeReturnValue(callData); return abiDecodedCallData; } public getSelector(methodName: string): string { const functionSignature = this.getFunctionSignature(methodName); const self = (this as any) as IZeroExContract; const abiEncoder = self._lookupAbiEncoder(functionSignature); return abiEncoder.getSelector(); } /** * Execute a meta-transaction via `sender`. Privileged variant. * Only callable from within. * @param sender Who is executing the meta-transaction.. * @param mtx The meta-transaction. * @param signature The signature by `mtx.signer`. */ public _executeMetaTransaction( sender: string, mtx: { signer: string; sender: string; minGasPrice: BigNumber; maxGasPrice: BigNumber; expirationTimeSeconds: BigNumber; salt: BigNumber; callData: string; value: BigNumber; feeToken: string; feeAmount: BigNumber; }, signature: string, ): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('sender', sender); assert.isString('signature', signature); const functionSignature = '_executeMetaTransaction(address,(address,address,uint256,uint256,uint256,uint256,bytes,uint256,address,uint256),bytes)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [sender.toLowerCase(), mtx, signature]); }, }; } /** * Transfers ERC20 tokens from `owner` to `to`. * Only callable from within. * @param token The token to spend. * @param owner The owner of the tokens. * @param to The recipient of the tokens. * @param amount The amount of `token` to transfer. */ public _spendERC20Tokens(token: string, owner: string, to: string, amount: BigNumber): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('token', token); assert.isString('owner', owner); assert.isString('to', to); assert.isBigNumber('amount', amount); const functionSignature = '_spendERC20Tokens(address,address,address,uint256)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [ token.toLowerCase(), owner.toLowerCase(), to.toLowerCase(), amount, ]); }, }; } /** * Internal version of `transformERC20()`. Only callable from within. * @param args A `TransformERC20Args` struct. */ public _transformERC20(args: { taker: string; inputToken: string; outputToken: string; inputTokenAmount: BigNumber; minOutputTokenAmount: BigNumber; transformations: Array<{ deploymentNonce: number | BigNumber; data: string }>; callDataHash: string; callDataSignature: string; }): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; const functionSignature = '_transformERC20((address,address,address,uint256,uint256,(uint32,bytes)[],bytes32,bytes))'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [args]); }, }; } /** * Execute multiple meta-transactions. * @param mtxs The meta-transactions. * @param signatures The signature by each respective `mtx.signer`. */ public batchExecuteMetaTransactions( mtxs: Array<{ signer: string; sender: string; minGasPrice: BigNumber; maxGasPrice: BigNumber; expirationTimeSeconds: BigNumber; salt: BigNumber; callData: string; value: BigNumber; feeToken: string; feeAmount: BigNumber; }>, signatures: string[], ): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isArray('mtxs', mtxs); assert.isArray('signatures', signatures); const functionSignature = 'batchExecuteMetaTransactions((address,address,uint256,uint256,uint256,uint256,bytes,uint256,address,uint256)[],bytes[])'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [mtxs, signatures]); }, }; } /** * Deploy a new flash wallet instance and replace the current one with it. * Useful if we somehow break the current wallet instance. * Only callable by the owner. */ public createTransformWallet(): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; const functionSignature = 'createTransformWallet()'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, []); }, }; } /** * Execute a single meta-transaction. * @param mtx The meta-transaction. * @param signature The signature by `mtx.signer`. */ public executeMetaTransaction( mtx: { signer: string; sender: string; minGasPrice: BigNumber; maxGasPrice: BigNumber; expirationTimeSeconds: BigNumber; salt: BigNumber; callData: string; value: BigNumber; feeToken: string; feeAmount: BigNumber; }, signature: string, ): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('signature', signature); const functionSignature = 'executeMetaTransaction((address,address,uint256,uint256,uint256,uint256,bytes,uint256,address,uint256),bytes)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [mtx, signature]); }, }; } /** * Register or replace a function. * @param selector The function selector. * @param impl The implementation contract for the function. */ public extend(selector: string, impl: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('selector', selector); assert.isString('impl', impl); const functionSignature = 'extend(bytes4,address)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [selector, impl.toLowerCase()]); }, }; } /** * Get the address of the allowance target. */ public getAllowanceTarget(): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; const functionSignature = 'getAllowanceTarget()'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, []); }, }; } /** * Get the implementation contract of a registered function. * @param selector The function selector. */ public getFunctionImplementation(selector: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('selector', selector); const functionSignature = 'getFunctionImplementation(bytes4)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [selector]); }, }; } /** * Get the block at which a meta-transaction has been executed. * @param mtx The meta-transaction. */ public getMetaTransactionExecutedBlock(mtx: { signer: string; sender: string; minGasPrice: BigNumber; maxGasPrice: BigNumber; expirationTimeSeconds: BigNumber; salt: BigNumber; callData: string; value: BigNumber; feeToken: string; feeAmount: BigNumber; }): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; const functionSignature = 'getMetaTransactionExecutedBlock((address,address,uint256,uint256,uint256,uint256,bytes,uint256,address,uint256))'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [mtx]); }, }; } /** * Get the EIP712 hash of a meta-transaction. * @param mtx The meta-transaction. */ public getMetaTransactionHash(mtx: { signer: string; sender: string; minGasPrice: BigNumber; maxGasPrice: BigNumber; expirationTimeSeconds: BigNumber; salt: BigNumber; callData: string; value: BigNumber; feeToken: string; feeAmount: BigNumber; }): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; const functionSignature = 'getMetaTransactionHash((address,address,uint256,uint256,uint256,uint256,bytes,uint256,address,uint256))'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [mtx]); }, }; } /** * Get the block at which a meta-transaction hash has been executed. * @param mtxHash The meta-transaction hash. */ public getMetaTransactionHashExecutedBlock(mtxHash: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('mtxHash', mtxHash); const functionSignature = 'getMetaTransactionHashExecutedBlock(bytes32)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [mtxHash]); }, }; } /** * Return the optional signer for `transformERC20()` calldata. */ public getQuoteSigner(): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; const functionSignature = 'getQuoteSigner()'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, []); }, }; } /** * Retrieve an entry in the rollback history for a function. * @param selector The function selector. * @param idx The index in the rollback history. */ public getRollbackEntryAtIndex(selector: string, idx: BigNumber): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('selector', selector); assert.isBigNumber('idx', idx); const functionSignature = 'getRollbackEntryAtIndex(bytes4,uint256)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [selector, idx]); }, }; } /** * Retrieve the length of the rollback history for a function. * @param selector The function selector. */ public getRollbackLength(selector: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('selector', selector); const functionSignature = 'getRollbackLength(bytes4)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [selector]); }, }; } /** * Gets the maximum amount of an ERC20 token `token` that can be * pulled from `owner`. * @param token The token to spend. * @param owner The owner of the tokens. */ public getSpendableERC20BalanceOf(token: string, owner: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('token', token); assert.isString('owner', owner); const functionSignature = 'getSpendableERC20BalanceOf(address,address)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [token.toLowerCase(), owner.toLowerCase()]); }, }; } /** * Return the current wallet instance that will serve as the execution * context for transformations. */ public getTransformWallet(): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; const functionSignature = 'getTransformWallet()'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, []); }, }; } /** * Return the allowed deployer for transformers. */ public getTransformerDeployer(): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; const functionSignature = 'getTransformerDeployer()'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, []); }, }; } /** * Check that `hash` was signed by `signer` given `signature`. * @param hash The hash that was signed. * @param signer The signer of the hash. * @param signature The signature. The last byte of this signature should * be a member of the `SignatureType` enum. */ public isValidHashSignature(hash: string, signer: string, signature: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('hash', hash); assert.isString('signer', signer); assert.isString('signature', signature); const functionSignature = 'isValidHashSignature(bytes32,address,bytes)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [hash, signer.toLowerCase(), signature]); }, }; } /** * Execute a migration function in the context of the ZeroEx contract. * The result of the function being called should be the magic bytes * 0x2c64c5ef (`keccack('MIGRATE_SUCCESS')`). Only callable by the owner. * The owner will be temporarily set to `address(this)` inside the call. * Before returning, the owner will be set to `newOwner`. * @param target The migrator contract address. * @param data The call data. * @param newOwner The address of the new owner. */ public migrate(target: string, data: string, newOwner: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('target', target); assert.isString('data', data); assert.isString('newOwner', newOwner); const functionSignature = 'migrate(address,bytes,address)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [ target.toLowerCase(), data, newOwner.toLowerCase(), ]); }, }; } /** * The owner of this contract. */ public owner(): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; const functionSignature = 'owner()'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, []); }, }; } /** * Roll back to a prior implementation of a function. * @param selector The function selector. * @param targetImpl The address of an older implementation of the function. */ public rollback(selector: string, targetImpl: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('selector', selector); assert.isString('targetImpl', targetImpl); const functionSignature = 'rollback(bytes4,address)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [selector, targetImpl.toLowerCase()]); }, }; } /** * Efficiently sell directly to uniswap/sushiswap. * @param tokens Sell path. * @param sellAmount of `tokens[0]` Amount to sell. * @param minBuyAmount Minimum amount of `tokens[-1]` to buy. * @param isSushi Use sushiswap if true. */ public sellToUniswap( tokens: string[], sellAmount: BigNumber, minBuyAmount: BigNumber, isSushi: boolean, ): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isArray('tokens', tokens); assert.isBigNumber('sellAmount', sellAmount); assert.isBigNumber('minBuyAmount', minBuyAmount); assert.isBoolean('isSushi', isSushi); const functionSignature = 'sellToUniswap(address[],uint256,uint256,bool)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [tokens, sellAmount, minBuyAmount, isSushi]); }, }; } /** * Replace the optional signer for `transformERC20()` calldata. * Only callable by the owner. * @param quoteSigner The address of the new calldata signer. */ public setQuoteSigner(quoteSigner: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('quoteSigner', quoteSigner); const functionSignature = 'setQuoteSigner(address)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [quoteSigner.toLowerCase()]); }, }; } /** * Replace the allowed deployer for transformers. * Only callable by the owner. * @param transformerDeployer The address of the new trusted deployer * for transformers. */ public setTransformerDeployer(transformerDeployer: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('transformerDeployer', transformerDeployer); const functionSignature = 'setTransformerDeployer(address)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [transformerDeployer.toLowerCase()]); }, }; } /** * Transfers ownership of the contract to a new address. * @param newOwner The address that will become the owner. */ public transferOwnership(newOwner: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('newOwner', newOwner); const functionSignature = 'transferOwnership(address)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [newOwner.toLowerCase()]); }, }; } /** * Executes a series of transformations to convert an ERC20 `inputToken` * to an ERC20 `outputToken`. * @param inputToken The token being provided by the sender. If * `0xeee...`, ETH is implied and should be provided with the call.` * @param outputToken The token to be acquired by the sender. `0xeee...` * implies ETH. * @param inputTokenAmount The amount of `inputToken` to take from the sender. * @param minOutputTokenAmount The minimum amount of `outputToken` the sender * must receive for the entire transformation to succeed. * @param transformations The transformations to execute on the token * balance(s) in sequence. */ public transformERC20( inputToken: string, outputToken: string, inputTokenAmount: BigNumber, minOutputTokenAmount: BigNumber, transformations: Array<{ deploymentNonce: number | BigNumber; data: string }>, ): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('inputToken', inputToken); assert.isString('outputToken', outputToken); assert.isBigNumber('inputTokenAmount', inputTokenAmount); assert.isBigNumber('minOutputTokenAmount', minOutputTokenAmount); assert.isArray('transformations', transformations); const functionSignature = 'transformERC20(address,address,uint256,uint256,(uint32,bytes)[])'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [ inputToken.toLowerCase(), outputToken.toLowerCase(), inputTokenAmount, minOutputTokenAmount, transformations, ]); }, }; } /** * Validate that `hash` was signed by `signer` given `signature`. * Reverts otherwise. * @param hash The hash that was signed. * @param signer The signer of the hash. * @param signature The signature. The last byte of this signature should * be a member of the `SignatureType` enum. */ public validateHashSignature(hash: string, signer: string, signature: string): ContractTxFunctionObj { const self = (this as any) as IZeroExContract; assert.isString('hash', hash); assert.isString('signer', signer); assert.isString('signature', signature); const functionSignature = 'validateHashSignature(bytes32,address,bytes)'; return { async sendTransactionAsync( txData?: Partial | undefined, opts: SendTransactionOpts = { shouldValidate: true }, ): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( { data: this.getABIEncodedTransactionData(), ...txData }, this.estimateGasAsync.bind(this), ); if (opts.shouldValidate !== false) { await this.callAsync(txDataWithDefaults); } return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults); }, awaitTransactionSuccessAsync( txData?: Partial, opts: AwaitTransactionSuccessOpts = { shouldValidate: true }, ): PromiseWithTransactionHash { return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts); }, async estimateGasAsync(txData?: Partial | undefined): Promise { const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({ data: this.getABIEncodedTransactionData(), ...txData, }); return self._web3Wrapper.estimateGasAsync(txDataWithDefaults); }, async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._performCallAsync( { data: this.getABIEncodedTransactionData(), ...callData }, defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { return self._strictEncodeArguments(functionSignature, [hash, signer.toLowerCase(), signature]); }, }; } /** * Subscribe to an event type emitted by the IZeroEx contract. * @param eventName The IZeroEx 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: IZeroExEvents, indexFilterValues: IndexedFilterValues, callback: EventCallback, isVerbose: boolean = false, blockPollingIntervalMs?: number, ): string { assert.doesBelongToStringEnum('eventName', eventName, IZeroExEvents); assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); assert.isFunction('callback', callback); const subscriptionToken = this._subscriptionManager.subscribe( this.address, eventName, indexFilterValues, IZeroExContract.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 IZeroEx 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: IZeroExEvents, blockRange: BlockRange, indexFilterValues: IndexedFilterValues, ): Promise>> { assert.doesBelongToStringEnum('eventName', eventName, IZeroExEvents); assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema); assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema); const logs = await this._subscriptionManager.getLogsAsync( this.address, eventName, blockRange, indexFilterValues, IZeroExContract.ABI(), ); return logs; } constructor( address: string, supportedProvider: SupportedProvider, txDefaults?: Partial, logDecodeDependencies?: { [contractName: string]: ContractAbi }, deployedBytecode: string | undefined = IZeroExContract.deployedBytecode, ) { super( 'IZeroEx', IZeroExContract.ABI(), address, supportedProvider, txDefaults, logDecodeDependencies, deployedBytecode, ); classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); this._subscriptionManager = new SubscriptionManager( IZeroExContract.ABI(), this._web3Wrapper, ); IZeroExContract.ABI().forEach((item, index) => { if (item.type === 'function') { const methodAbi = item as MethodAbi; this._methodABIIndex[methodAbi.name] = index; } }); } } // tslint:disable:max-file-line-count // tslint:enable:no-unbound-method no-parameter-reassignment no-consecutive-blank-lines ordered-imports align // tslint:enable:trailing-comma whitespace no-trailing-whitespace