From 4aae7348d1a6b2548f87edf8b9785d55b21098a9 Mon Sep 17 00:00:00 2001 From: Lawrence Forman Date: Mon, 1 Apr 2019 13:24:42 -0400 Subject: [PATCH] Update `fill-scenarios`, `contract-wrappers`, `contract-artifacts`, `abi-gen-wrappers` to use new domain schema and `Order` format. --- .../src/generated-wrappers/coordinator.ts | 70 ++++++++++--------- .../src/generated-wrappers/exchange.ts | 28 ++++---- .../src/utils/transaction_encoder.ts | 6 +- .../test/calldata_decoder_test.ts | 8 ++- .../test/utils/dutch_auction_utils.ts | 2 +- packages/fill-scenarios/src/fill_scenarios.ts | 9 +-- 6 files changed, 66 insertions(+), 57 deletions(-) diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/coordinator.ts b/packages/abi-gen-wrappers/src/generated-wrappers/coordinator.ts index 087b75cdd8..c80c8a3986 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/coordinator.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/coordinator.ts @@ -184,14 +184,14 @@ export class CoordinatorContract extends BaseContract { }; public getTransactionHash = { async callAsync( - transaction: {salt: BigNumber;signerAddress: string;data: string}, + transaction: { salt: BigNumber; signerAddress: string; data: string }, callData: Partial = {}, defaultBlock?: BlockParam, - ): Promise { - const self = this as any as CoordinatorContract; - const encodedData = self._strictEncodeArguments('getTransactionHash((uint256,address,bytes))', [transaction - ]); + ): Promise { + const self = (this as any) as CoordinatorContract; + const encodedData = self._strictEncodeArguments('getTransactionHash((uint256,address,bytes))', [ + transaction, + ]); const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( { to: self.address, @@ -204,22 +204,27 @@ export class CoordinatorContract extends BaseContract { BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); const abiEncoder = self._lookupAbiEncoder('getTransactionHash((uint256,address,bytes))'); // tslint:disable boolean-naming - const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); // tslint:enable boolean-naming return result; }, }; public getCoordinatorApprovalHash = { async callAsync( - approval: {txOrigin: string;transactionHash: string;transactionSignature: string;approvalExpirationTimeSeconds: BigNumber}, + approval: { + txOrigin: string; + transactionHash: string; + transactionSignature: string; + approvalExpirationTimeSeconds: BigNumber; + }, callData: Partial = {}, defaultBlock?: BlockParam, - ): Promise { - const self = this as any as CoordinatorContract; - const encodedData = self._strictEncodeArguments('getCoordinatorApprovalHash((address,bytes32,bytes,uint256))', [approval - ]); + ): Promise { + const self = (this as any) as CoordinatorContract; + const encodedData = self._strictEncodeArguments( + 'getCoordinatorApprovalHash((address,bytes32,bytes,uint256))', + [approval], + ); const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( { to: self.address, @@ -232,8 +237,7 @@ export class CoordinatorContract extends BaseContract { BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); const abiEncoder = self._lookupAbiEncoder('getCoordinatorApprovalHash((address,bytes32,bytes,uint256))'); // tslint:disable boolean-naming - const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); // tslint:enable boolean-naming return result; }, @@ -476,12 +480,8 @@ export class CoordinatorContract extends BaseContract { }, }; public EIP712_EXCHANGE_DOMAIN_HASH = { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise { - const self = this as any as CoordinatorContract; + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + const self = (this as any) as CoordinatorContract; const encodedData = self._strictEncodeArguments('EIP712_EXCHANGE_DOMAIN_HASH()', []); const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( { @@ -495,8 +495,7 @@ export class CoordinatorContract extends BaseContract { BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); const abiEncoder = self._lookupAbiEncoder('EIP712_EXCHANGE_DOMAIN_HASH()'); // tslint:disable boolean-naming - const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); // tslint:enable boolean-naming return result; }, @@ -697,7 +696,8 @@ export class CoordinatorContract extends BaseContract { artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, txDefaults: Partial, - _exchange: string, + exchange: string, + chainId: BigNumber, ): Promise { assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ schemas.addressSchema, @@ -710,14 +710,15 @@ export class CoordinatorContract extends BaseContract { const provider = providerUtils.standardizeOrThrow(supportedProvider); const bytecode = artifact.compilerOutput.evm.bytecode.object; const abi = artifact.compilerOutput.abi; - return CoordinatorContract.deployAsync(bytecode, abi, provider, txDefaults, _exchange); + return CoordinatorContract.deployAsync(bytecode, abi, provider, txDefaults, exchange, chainId); } public static async deployAsync( bytecode: string, abi: ContractAbi, supportedProvider: SupportedProvider, txDefaults: Partial, - _exchange: string, + exchange: string, + chainId: BigNumber, ): Promise { assert.isHexString('bytecode', bytecode); assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ @@ -727,14 +728,14 @@ export class CoordinatorContract extends BaseContract { ]); const provider = providerUtils.standardizeOrThrow(supportedProvider); const constructorAbi = BaseContract._lookupConstructorAbi(abi); - [_exchange] = BaseContract._formatABIDataItemList( + [exchange, chainId] = BaseContract._formatABIDataItemList( constructorAbi.inputs, - [_exchange], + [exchange, chainId], BaseContract._bigNumberToString, ); const iface = new ethers.utils.Interface(abi); const deployInfo = iface.deployFunction; - const txData = deployInfo.encode(bytecode, [_exchange]); + const txData = deployInfo.encode(bytecode, [exchange, chainId]); const web3Wrapper = new Web3Wrapper(provider); const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( { data: txData }, @@ -745,8 +746,13 @@ export class CoordinatorContract extends BaseContract { logUtils.log(`transactionHash: ${txHash}`); const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); logUtils.log(`Coordinator successfully deployed at ${txReceipt.contractAddress}`); - const contractInstance = new CoordinatorContract(txReceipt.contractAddress as string, provider, txDefaults); - contractInstance.constructorArgs = [_exchange]; + const contractInstance = new CoordinatorContract( + abi, + txReceipt.contractAddress as string, + provider, + txDefaults, + ); + contractInstance.constructorArgs = [exchange, chainId]; return contractInstance; } diff --git a/packages/abi-gen-wrappers/src/generated-wrappers/exchange.ts b/packages/abi-gen-wrappers/src/generated-wrappers/exchange.ts index ee3aa0dcbb..3a211e037b 100644 --- a/packages/abi-gen-wrappers/src/generated-wrappers/exchange.ts +++ b/packages/abi-gen-wrappers/src/generated-wrappers/exchange.ts @@ -4559,8 +4559,8 @@ export class ExchangeContract extends BaseContract { artifact: ContractArtifact | SimpleContractArtifact, supportedProvider: SupportedProvider, txDefaults: Partial, - _zrxAssetData: string, - _chainId: BigNumber, + zrxAssetData: string, + chainId: BigNumber, ): Promise { assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ schemas.addressSchema, @@ -4573,8 +4573,8 @@ export class ExchangeContract extends BaseContract { const provider = providerUtils.standardizeOrThrow(supportedProvider); const bytecode = artifact.compilerOutput.evm.bytecode.object; const abi = artifact.compilerOutput.abi; - return ExchangeContract.deployAsync(bytecode, abi, provider, txDefaults, _zrxAssetData, -_chainId + return ExchangeContract.deployAsync(bytecode, abi, provider, txDefaults, zrxAssetData, +chainId ); } public static async deployAsync( @@ -4582,8 +4582,8 @@ _chainId abi: ContractAbi, supportedProvider: SupportedProvider, txDefaults: Partial, - _zrxAssetData: string, - _chainId: BigNumber, + zrxAssetData: string, + chainId: BigNumber, ): Promise { assert.isHexString('bytecode', bytecode); assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ @@ -4593,19 +4593,19 @@ _chainId ]); const provider = providerUtils.standardizeOrThrow(supportedProvider); const constructorAbi = BaseContract._lookupConstructorAbi(abi); - [_zrxAssetData, -_chainId + [zrxAssetData, +chainId ] = BaseContract._formatABIDataItemList( constructorAbi.inputs, - [_zrxAssetData, -_chainId + [zrxAssetData, +chainId ], BaseContract._bigNumberToString, ); const iface = new ethers.utils.Interface(abi); const deployInfo = iface.deployFunction; - const txData = deployInfo.encode(bytecode, [_zrxAssetData, -_chainId + const txData = deployInfo.encode(bytecode, [zrxAssetData, +chainId ]); const web3Wrapper = new Web3Wrapper(provider); const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( @@ -4618,8 +4618,8 @@ _chainId const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); logUtils.log(`Exchange successfully deployed at ${txReceipt.contractAddress}`); const contractInstance = new ExchangeContract(abi, txReceipt.contractAddress as string, provider, txDefaults); - contractInstance.constructorArgs = [_zrxAssetData, -_chainId + contractInstance.constructorArgs = [zrxAssetData, +chainId ]; return contractInstance; } diff --git a/packages/contract-wrappers/src/utils/transaction_encoder.ts b/packages/contract-wrappers/src/utils/transaction_encoder.ts index fec9e0a028..6612503ea8 100644 --- a/packages/contract-wrappers/src/utils/transaction_encoder.ts +++ b/packages/contract-wrappers/src/utils/transaction_encoder.ts @@ -31,11 +31,13 @@ export class TransactionEncoder { public getTransactionHashHex(data: string, salt: BigNumber, signerAddress: string): string { const exchangeAddress = this._getExchangeContract().address; const transaction = { - verifyingContractAddress: exchangeAddress, - chainId: this._chainId, salt, signerAddress, data, + domain: { + verifyingContractAddress: exchangeAddress, + chainId: this._chainId, + }, }; const hashHex = transactionHashUtils.getTransactionHashHex(transaction); return hashHex; diff --git a/packages/contract-wrappers/test/calldata_decoder_test.ts b/packages/contract-wrappers/test/calldata_decoder_test.ts index 3ffe321a25..180c157ef6 100644 --- a/packages/contract-wrappers/test/calldata_decoder_test.ts +++ b/packages/contract-wrappers/test/calldata_decoder_test.ts @@ -38,6 +38,10 @@ describe('ABI Decoding Calldata', () => { const [privateKeyLeft, privateKeyRight] = constants.TESTRPC_PRIVATE_KEYS; const exchangeAddress = addressUtils.generatePseudoRandomAddress(); const feeRecipientAddress = addressUtils.generatePseudoRandomAddress(); + const domain = { + verifyingContractAddress: exchangeAddress, + chainId, + }; // Create orders to match. // Values are arbitrary, with the exception of maker addresses (generated above). orderLeft = { @@ -69,9 +73,9 @@ describe('ABI Decoding Calldata', () => { salt: new BigNumber(50010), }; const orderFactoryLeft = new OrderFactory(privateKeyLeft, orderLeft); - signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({ exchangeAddress, chainId }); + signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({ domain }); const orderFactoryRight = new OrderFactory(privateKeyRight, orderRight); - signedOrderRight = await orderFactoryRight.newSignedOrderAsync({ exchangeAddress, chainId }); + signedOrderRight = await orderFactoryRight.newSignedOrderAsync({ domain }); // Encode match orders transaction contractAddresses = await migrateOnceAsync(); await blockchainLifecycle.startAsync(); diff --git a/packages/contract-wrappers/test/utils/dutch_auction_utils.ts b/packages/contract-wrappers/test/utils/dutch_auction_utils.ts index a7f11b3920..26de76bcda 100644 --- a/packages/contract-wrappers/test/utils/dutch_auction_utils.ts +++ b/packages/contract-wrappers/test/utils/dutch_auction_utils.ts @@ -89,7 +89,7 @@ export class DutchAuctionUtils { sellOrder.takerAssetData, sellOrder.makerAssetAmount, sellOrder.makerAssetData, - sellOrder.exchangeAddress, + sellOrder.domain.verifyingContractAddress, { senderAddress, makerFee, diff --git a/packages/fill-scenarios/src/fill_scenarios.ts b/packages/fill-scenarios/src/fill_scenarios.ts index 207daa1a94..855465dcf8 100644 --- a/packages/fill-scenarios/src/fill_scenarios.ts +++ b/packages/fill-scenarios/src/fill_scenarios.ts @@ -1,7 +1,7 @@ import { DummyERC20TokenContract, DummyERC721TokenContract, ExchangeContract } from '@0x/abi-gen-wrappers'; import { assetDataUtils } from '@0x/order-utils'; import { orderFactory } from '@0x/order-utils/lib/src/order_factory'; -import { OrderWithoutExchangeAddress, SignedOrder } from '@0x/types'; +import { OrderWithoutDomain, SignedOrder } from '@0x/types'; import { BigNumber } from '@0x/utils'; import { Web3Wrapper } from '@0x/web3-wrapper'; import { SupportedProvider } from 'ethereum-types'; @@ -119,15 +119,12 @@ export class FillScenarios { fillableAmount, ); const exchangeInstance = new ExchangeContract( - signedOrder.exchangeAddress, + signedOrder.domain.verifyingContractAddress, this._web3Wrapper.getProvider(), this._web3Wrapper.getContractDefaults(), ); - const orderWithoutExchangeAddress = _.omit(signedOrder, [ - 'signature', - 'exchangeAddress', - ]) as OrderWithoutExchangeAddress; + const orderWithoutExchangeAddress = _.omit(signedOrder, ['signature', 'exchangeAddress']) as OrderWithoutDomain; const txHash = await exchangeInstance.fillOrder.sendTransactionAsync( orderWithoutExchangeAddress,