diff --git a/contracts/asset-proxy/test/proxies.ts b/contracts/asset-proxy/test/proxies.ts index da109a3891..222f299779 100644 --- a/contracts/asset-proxy/test/proxies.ts +++ b/contracts/asset-proxy/test/proxies.ts @@ -28,6 +28,12 @@ import * as chai from 'chai'; import { LogWithDecodedArgs } from 'ethereum-types'; import * as _ from 'lodash'; +import { + encodeERC1155AssetData, + encodeERC20AssetData, + encodeERC721AssetData, + encodeMultiAssetData, +} from '../src/asset_data'; import { ERC1155ProxyWrapper } from '../src/erc1155_proxy_wrapper'; import { ERC20Wrapper } from '../src/erc20_wrapper'; import { ERC721Wrapper } from '../src/erc721_wrapper'; @@ -40,7 +46,6 @@ chaiSetup.configure(); const expect = chai.expect; const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper); const assetProxyInterface = new IAssetProxyContract(constants.NULL_ADDRESS, provider); -const assetDataInterface = new IAssetDataContract(constants.NULL_ADDRESS, provider); // tslint:disable:no-unnecessary-type-assertion describe('Asset Transfer Proxies', () => { @@ -218,9 +223,7 @@ describe('Asset Transfer Proxies', () => { describe('transferFrom', () => { it('should successfully transfer tokens', async () => { // Construct ERC20 asset data - const encodedAssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC20AssetData(erc20TokenA.address); // Perform a transfer from fromAddress to toAddress const erc20Balances = await erc20Wrapper.getBalancesAsync(); const amount = new BigNumber(10); @@ -247,9 +250,7 @@ describe('Asset Transfer Proxies', () => { it('should successfully transfer tokens that do not return a value', async () => { // Construct ERC20 asset data - const encodedAssetData = assetDataInterface - .ERC20Token(noReturnErc20Token.address) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC20AssetData(noReturnErc20Token.address); // Perform a transfer from fromAddress to toAddress const initialFromBalance = await noReturnErc20Token.balanceOf(fromAddress).callAsync(); const initialToBalance = await noReturnErc20Token.balanceOf(toAddress).callAsync(); @@ -275,9 +276,7 @@ describe('Asset Transfer Proxies', () => { it('should successfully transfer tokens and ignore extra assetData', async () => { // Construct ERC20 asset data const extraData = '0102030405060708'; - const encodedAssetData = `${assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData()}${extraData}`; + const encodedAssetData = `${encodeERC20AssetData(erc20TokenA.address)}${extraData}`; // Perform a transfer from fromAddress to toAddress const erc20Balances = await erc20Wrapper.getBalancesAsync(); const amount = new BigNumber(10); @@ -304,9 +303,7 @@ describe('Asset Transfer Proxies', () => { it('should do nothing if transferring 0 amount of a token', async () => { // Construct ERC20 asset data - const encodedAssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC20AssetData(erc20TokenA.address); // Perform a transfer from fromAddress to toAddress const erc20Balances = await erc20Wrapper.getBalancesAsync(); const amount = new BigNumber(0); @@ -333,9 +330,7 @@ describe('Asset Transfer Proxies', () => { it('should revert if allowances are too low', async () => { // Construct ERC20 asset data - const encodedAssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC20AssetData(erc20TokenA.address); // Create allowance less than transfer amount. Set allowance on proxy. const allowance = new BigNumber(0); const amount = new BigNumber(10); @@ -361,9 +356,7 @@ describe('Asset Transfer Proxies', () => { it('should revert if allowances are too low and token does not return a value', async () => { // Construct ERC20 asset data - const encodedAssetData = assetDataInterface - .ERC20Token(noReturnErc20Token.address) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC20AssetData(noReturnErc20Token.address); // Create allowance less than transfer amount. Set allowance on proxy. const allowance = new BigNumber(0); const amount = new BigNumber(10); @@ -392,9 +385,7 @@ describe('Asset Transfer Proxies', () => { it('should revert if caller is not authorized', async () => { // Construct ERC20 asset data - const encodedAssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC20AssetData(erc20TokenA.address); // Perform a transfer from fromAddress to toAddress const amount = new BigNumber(10); const data = assetProxyInterface @@ -415,9 +406,7 @@ describe('Asset Transfer Proxies', () => { it('should revert if token returns more than 32 bytes', async () => { // Construct ERC20 asset data - const encodedAssetData = assetDataInterface - .ERC20Token(multipleReturnErc20Token.address) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC20AssetData(multipleReturnErc20Token.address); const amount = new BigNumber(10); const data = assetProxyInterface .transferFrom(encodedAssetData, fromAddress, toAddress, amount) @@ -461,9 +450,7 @@ describe('Asset Transfer Proxies', () => { describe('transferFrom', () => { it('should successfully transfer tokens', async () => { // Construct ERC721 asset data - const encodedAssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); // Verify pre-condition const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync(); expect(ownerFromAsset).to.be.equal(fromAddress); @@ -488,9 +475,10 @@ describe('Asset Transfer Proxies', () => { it('should successfully transfer tokens and ignore extra assetData', async () => { // Construct ERC721 asset data const extraData = '0102030405060708'; - const encodedAssetData = `${assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData()}${extraData}`; + const encodedAssetData = `${encodeERC721AssetData( + erc721TokenA.address, + erc721AFromTokenId, + )}${extraData}`; // Verify pre-condition const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync(); expect(ownerFromAsset).to.be.equal(fromAddress); @@ -514,9 +502,7 @@ describe('Asset Transfer Proxies', () => { it('should not call onERC721Received when transferring to a smart contract', async () => { // Construct ERC721 asset data - const encodedAssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); // Verify pre-condition const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync(); expect(ownerFromAsset).to.be.equal(fromAddress); @@ -543,9 +529,7 @@ describe('Asset Transfer Proxies', () => { it('should revert if transferring 0 amount of a token', async () => { // Construct ERC721 asset data - const encodedAssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); // Verify pre-condition const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync(); expect(ownerFromAsset).to.be.equal(fromAddress); @@ -568,9 +552,7 @@ describe('Asset Transfer Proxies', () => { it('should revert if transferring > 1 amount of a token', async () => { // Construct ERC721 asset data - const encodedAssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); // Verify pre-condition const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync(); expect(ownerFromAsset).to.be.equal(fromAddress); @@ -593,9 +575,7 @@ describe('Asset Transfer Proxies', () => { it('should revert if allowances are too low', async () => { // Construct ERC721 asset data - const encodedAssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); // Verify pre-condition const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync(); expect(ownerFromAsset).to.be.equal(fromAddress); @@ -626,9 +606,7 @@ describe('Asset Transfer Proxies', () => { it('should revert if caller is not authorized', async () => { // Construct ERC721 asset data - const encodedAssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const encodedAssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); // Verify pre-condition const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync(); expect(ownerFromAsset).to.be.equal(fromAddress); @@ -672,14 +650,10 @@ describe('Asset Transfer Proxies', () => { it('should transfer a single ERC20 token', async () => { const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const amounts = [erc20Amount]; const nestedAssetData = [erc20AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -704,14 +678,10 @@ describe('Asset Transfer Proxies', () => { it('should dispatch an ERC20 transfer when input amount is 0', async () => { const inputAmount = constants.ZERO_AMOUNT; const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const amounts = [erc20Amount]; const nestedAssetData = [erc20AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -736,17 +706,11 @@ describe('Asset Transfer Proxies', () => { const inputAmount = new BigNumber(1); const erc20Amount1 = new BigNumber(10); const erc20Amount2 = new BigNumber(20); - const erc20AssetData1 = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); - const erc20AssetData2 = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData1 = encodeERC20AssetData(erc20TokenA.address); + const erc20AssetData2 = encodeERC20AssetData(erc20TokenA.address); const amounts = [erc20Amount1, erc20Amount2]; const nestedAssetData = [erc20AssetData1, erc20AssetData2]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -772,17 +736,11 @@ describe('Asset Transfer Proxies', () => { const inputAmount = new BigNumber(1); const erc20Amount1 = new BigNumber(10); const erc20Amount2 = new BigNumber(20); - const erc20AssetData1 = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); - const erc20AssetData2 = assetDataInterface - .ERC20Token(erc20TokenB.address) - .getABIEncodedTransactionData(); + const erc20AssetData1 = encodeERC20AssetData(erc20TokenA.address); + const erc20AssetData2 = encodeERC20AssetData(erc20TokenB.address); const amounts = [erc20Amount1, erc20Amount2]; const nestedAssetData = [erc20AssetData1, erc20AssetData2]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -814,14 +772,10 @@ describe('Asset Transfer Proxies', () => { it('should transfer a single ERC721 token', async () => { const inputAmount = new BigNumber(1); const erc721Amount = new BigNumber(1); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const amounts = [erc721Amount]; const nestedAssetData = [erc721AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -841,19 +795,13 @@ describe('Asset Transfer Proxies', () => { it('should successfully transfer multiple of the same ERC721 token', async () => { const erc721Balances = await erc721Wrapper.getBalancesAsync(); const erc721AFromTokenId2 = erc721Balances[fromAddress][erc721TokenA.address][1]; - const erc721AssetData1 = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); - const erc721AssetData2 = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId2) - .getABIEncodedTransactionData(); + const erc721AssetData1 = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); + const erc721AssetData2 = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId2); const inputAmount = new BigNumber(1); const erc721Amount = new BigNumber(1); const amounts = [erc721Amount, erc721Amount]; const nestedAssetData = [erc721AssetData1, erc721AssetData2]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -876,19 +824,13 @@ describe('Asset Transfer Proxies', () => { expect(newOwnerFromAsset2).to.be.equal(toAddress); }); it('should successfully transfer multiple different ERC721 tokens', async () => { - const erc721AssetData1 = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); - const erc721AssetData2 = assetDataInterface - .ERC721Token(erc721TokenB.address, erc721BFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData1 = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); + const erc721AssetData2 = encodeERC721AssetData(erc721TokenB.address, erc721BFromTokenId); const inputAmount = new BigNumber(1); const erc721Amount = new BigNumber(1); const amounts = [erc721Amount, erc721Amount]; const nestedAssetData = [erc721AssetData1, erc721AssetData2]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -926,16 +868,17 @@ describe('Asset Transfer Proxies', () => { ]; await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances); // encode erc1155 asset data - const erc1155AssetData = assetDataInterface - .ERC1155Assets(erc1155Contract.address, tokensToTransfer, valuesToTransfer, receiverCallbackData) - .getABIEncodedTransactionData(); + const erc1155AssetData = encodeERC1155AssetData( + erc1155Contract.address, + tokensToTransfer, + valuesToTransfer, + receiverCallbackData, + ); // encode multi-asset data const multiAssetAmount = new BigNumber(5); const amounts = [valueMultiplier]; const nestedAssetData = [erc1155AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, multiAssetAmount) .getABIEncodedTransactionData(); @@ -978,16 +921,17 @@ describe('Asset Transfer Proxies', () => { ]; await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances); // encode erc1155 asset data - const erc1155AssetData = assetDataInterface - .ERC1155Assets(erc1155Contract.address, tokensToTransfer, valuesToTransfer, receiverCallbackData) - .getABIEncodedTransactionData(); + const erc1155AssetData = encodeERC1155AssetData( + erc1155Contract.address, + tokensToTransfer, + valuesToTransfer, + receiverCallbackData, + ); // encode multi-asset data const multiAssetAmount = new BigNumber(5); const amounts = [valueMultiplier]; const nestedAssetData = [erc1155AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, multiAssetAmount) .getABIEncodedTransactionData(); @@ -1038,16 +982,17 @@ describe('Asset Transfer Proxies', () => { ]; await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances); // encode erc1155 asset data - const erc1155AssetData = assetDataInterface - .ERC1155Assets(erc1155Contract.address, tokensToTransfer, valuesToTransfer, receiverCallbackData) - .getABIEncodedTransactionData(); + const erc1155AssetData = encodeERC1155AssetData( + erc1155Contract.address, + tokensToTransfer, + valuesToTransfer, + receiverCallbackData, + ); // encode multi-asset data const multiAssetAmount = new BigNumber(1); const amounts = [valueMultiplier]; const nestedAssetData = [erc1155AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, multiAssetAmount) .getABIEncodedTransactionData(); @@ -1092,19 +1037,23 @@ describe('Asset Transfer Proxies', () => { await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances); await erc1155Wrapper2.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances); // encode erc1155 asset data - const erc1155AssetData1 = assetDataInterface - .ERC1155Assets(erc1155Contract.address, tokensToTransfer, valuesToTransfer, receiverCallbackData) - .getABIEncodedTransactionData(); - const erc1155AssetData2 = assetDataInterface - .ERC1155Assets(erc1155Contract2.address, tokensToTransfer, valuesToTransfer, receiverCallbackData) - .getABIEncodedTransactionData(); + const erc1155AssetData1 = encodeERC1155AssetData( + erc1155Contract.address, + tokensToTransfer, + valuesToTransfer, + receiverCallbackData, + ); + const erc1155AssetData2 = encodeERC1155AssetData( + erc1155Contract2.address, + tokensToTransfer, + valuesToTransfer, + receiverCallbackData, + ); // encode multi-asset data const multiAssetAmount = new BigNumber(5); const amounts = [valueMultiplier, valueMultiplier]; const nestedAssetData = [erc1155AssetData1, erc1155AssetData2]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, multiAssetAmount) .getABIEncodedTransactionData(); @@ -1132,31 +1081,23 @@ describe('Asset Transfer Proxies', () => { // setup test parameters const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const erc721Amount = new BigNumber(1); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const erc1155TokenHolders = [fromAddress, toAddress]; const erc1155TokensToTransfer = erc1155FungibleTokens.slice(0, 1); const erc1155ValuesToTransfer = [new BigNumber(25)]; const erc1155Amount = new BigNumber(23); const erc1155ReceiverCallbackData = '0x0102030405'; - const erc1155AssetData = assetDataInterface - .ERC1155Assets( - erc1155Contract.address, - erc1155TokensToTransfer, - erc1155ValuesToTransfer, - erc1155ReceiverCallbackData, - ) - .getABIEncodedTransactionData(); + const erc1155AssetData = encodeERC1155AssetData( + erc1155Contract.address, + erc1155TokensToTransfer, + erc1155ValuesToTransfer, + erc1155ReceiverCallbackData, + ); const amounts = [erc20Amount, erc721Amount, erc1155Amount]; const nestedAssetData = [erc20AssetData, erc721AssetData, erc1155AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1208,18 +1149,12 @@ describe('Asset Transfer Proxies', () => { it('should successfully transfer a combination of ERC20 and ERC721 tokens', async () => { const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const erc721Amount = new BigNumber(1); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const amounts = [erc20Amount, erc721Amount]; const nestedAssetData = [erc20AssetData, erc721AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1249,19 +1184,13 @@ describe('Asset Transfer Proxies', () => { it.skip('should successfully transfer tokens and ignore extra assetData', async () => { const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const erc721Amount = new BigNumber(1); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const amounts = [erc20Amount, erc721Amount]; const nestedAssetData = [erc20AssetData, erc721AssetData]; const extraData = '0102030405060708090001020304050607080900010203040506070809000102'; - const assetData = `${assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData()}${extraData}`; + const assetData = `${encodeMultiAssetData(amounts, nestedAssetData)}${extraData}`; const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1291,17 +1220,11 @@ describe('Asset Transfer Proxies', () => { const inputAmount = new BigNumber(100); const erc20Amount1 = new BigNumber(10); const erc20Amount2 = new BigNumber(20); - const erc20AssetData1 = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); - const erc20AssetData2 = assetDataInterface - .ERC20Token(erc20TokenB.address) - .getABIEncodedTransactionData(); + const erc20AssetData1 = encodeERC20AssetData(erc20TokenA.address); + const erc20AssetData2 = encodeERC20AssetData(erc20TokenB.address); const amounts = [erc20Amount1, erc20Amount2]; const nestedAssetData = [erc20AssetData1, erc20AssetData2]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1334,28 +1257,16 @@ describe('Asset Transfer Proxies', () => { const inputAmount = new BigNumber(1); const erc20Amount1 = new BigNumber(10); const erc20Amount2 = new BigNumber(20); - const erc20AssetData1 = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); - const erc20AssetData2 = assetDataInterface - .ERC20Token(erc20TokenB.address) - .getABIEncodedTransactionData(); + const erc20AssetData1 = encodeERC20AssetData(erc20TokenA.address); + const erc20AssetData2 = encodeERC20AssetData(erc20TokenB.address); const erc721Amount = new BigNumber(1); const erc721Balances = await erc721Wrapper.getBalancesAsync(); const erc721AFromTokenId2 = erc721Balances[fromAddress][erc721TokenA.address][1]; const erc721BFromTokenId2 = erc721Balances[fromAddress][erc721TokenB.address][1]; - const erc721AssetData1 = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); - const erc721AssetData2 = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId2) - .getABIEncodedTransactionData(); - const erc721AssetData3 = assetDataInterface - .ERC721Token(erc721TokenB.address, erc721BFromTokenId) - .getABIEncodedTransactionData(); - const erc721AssetData4 = assetDataInterface - .ERC721Token(erc721TokenB.address, erc721BFromTokenId2) - .getABIEncodedTransactionData(); + const erc721AssetData1 = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); + const erc721AssetData2 = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId2); + const erc721AssetData3 = encodeERC721AssetData(erc721TokenB.address, erc721BFromTokenId); + const erc721AssetData4 = encodeERC721AssetData(erc721TokenB.address, erc721BFromTokenId2); const amounts = [erc721Amount, erc20Amount1, erc721Amount, erc20Amount2, erc721Amount, erc721Amount]; const nestedAssetData = [ erc721AssetData1, @@ -1365,9 +1276,7 @@ describe('Asset Transfer Proxies', () => { erc721AssetData3, erc721AssetData4, ]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1416,19 +1325,13 @@ describe('Asset Transfer Proxies', () => { it('should revert if a single transfer fails', async () => { const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); // 2 is an invalid erc721 amount const erc721Amount = new BigNumber(2); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const amounts = [erc20Amount, erc721Amount]; const nestedAssetData = [erc20AssetData, erc721AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1444,20 +1347,14 @@ describe('Asset Transfer Proxies', () => { it('should revert if an AssetProxy is not registered', async () => { const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const erc721Amount = new BigNumber(1); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const invalidProxyId = '0x12345678'; const invalidErc721AssetData = `${invalidProxyId}${erc721AssetData.slice(10)}`; const amounts = [erc20Amount, erc721Amount]; const nestedAssetData = [erc20AssetData, invalidErc721AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1473,17 +1370,11 @@ describe('Asset Transfer Proxies', () => { it('should revert if the length of `amounts` does not match the length of `nestedAssetData`', async () => { const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const amounts = [erc20Amount]; const nestedAssetData = [erc20AssetData, erc721AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1499,14 +1390,10 @@ describe('Asset Transfer Proxies', () => { it('should revert if amounts multiplication results in an overflow', async () => { const inputAmount = new BigNumber(2).pow(128); const erc20Amount = new BigNumber(2).pow(128); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const amounts = [erc20Amount]; const nestedAssetData = [erc20AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1522,16 +1409,12 @@ describe('Asset Transfer Proxies', () => { it('should revert if an element of `nestedAssetData` is < 4 bytes long', async () => { const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const erc721Amount = new BigNumber(1); const erc721AssetData = '0x123456'; const amounts = [erc20Amount, erc721Amount]; const nestedAssetData = [erc20AssetData, erc721AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1547,18 +1430,12 @@ describe('Asset Transfer Proxies', () => { it('should revert if caller is not authorized', async () => { const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const erc721Amount = new BigNumber(1); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const amounts = [erc20Amount, erc721Amount]; const nestedAssetData = [erc20AssetData, erc721AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1574,18 +1451,12 @@ describe('Asset Transfer Proxies', () => { it('should revert if asset data overflows beyond the bounds of calldata', async () => { const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const erc721Amount = new BigNumber(1); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const amounts = [erc20Amount, erc721Amount]; const nestedAssetData = [erc20AssetData, erc721AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1607,18 +1478,12 @@ describe('Asset Transfer Proxies', () => { it('should revert if asset data resolves to a location beyond the bounds of calldata', async () => { const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const erc721Amount = new BigNumber(1); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const amounts = [erc20Amount, erc721Amount]; const nestedAssetData = [erc20AssetData, erc721AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const data = assetProxyInterface .transferFrom(assetData, fromAddress, toAddress, inputAmount) .getABIEncodedTransactionData(); @@ -1641,18 +1506,12 @@ describe('Asset Transfer Proxies', () => { // setup test parameters const inputAmount = new BigNumber(1); const erc20Amount = new BigNumber(10); - const erc20AssetData = assetDataInterface - .ERC20Token(erc20TokenA.address) - .getABIEncodedTransactionData(); + const erc20AssetData = encodeERC20AssetData(erc20TokenA.address); const erc721Amount = new BigNumber(1); - const erc721AssetData = assetDataInterface - .ERC721Token(erc721TokenA.address, erc721AFromTokenId) - .getABIEncodedTransactionData(); + const erc721AssetData = encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId); const amounts = [erc20Amount, erc721Amount]; const nestedAssetData = [erc20AssetData, erc721AssetData]; - const assetData = assetDataInterface - .MultiAsset(amounts, nestedAssetData) - .getABIEncodedTransactionData(); + const assetData = encodeMultiAssetData(amounts, nestedAssetData); const extraData = '01'; const assetDataWithExtraData = `${assetData}${extraData}`; const badData = assetProxyInterface diff --git a/contracts/coordinator/src/hash_utils.ts b/contracts/coordinator/src/hash_utils.ts index e42a0c1a0f..9c8980ae25 100644 --- a/contracts/coordinator/src/hash_utils.ts +++ b/contracts/coordinator/src/hash_utils.ts @@ -9,7 +9,7 @@ export const hashUtils = { return hashBuffer; }, getApprovalHashHex(transaction: SignedZeroExTransaction, verifyingContract: string, txOrigin: string): string { - const hashHex = hexUtils.concat(hashUtils.getApprovalHashBuffer(transaction, verifyingContract, txOrigin)); + const hashHex = hexUtils.toHex(hashUtils.getApprovalHashBuffer(transaction, verifyingContract, txOrigin)); return hashHex; }, }; diff --git a/contracts/integrations/test/coordinator/coordinator_test.ts b/contracts/integrations/test/coordinator/coordinator_test.ts index c47091a7c4..f795533bb0 100644 --- a/contracts/integrations/test/coordinator/coordinator_test.ts +++ b/contracts/integrations/test/coordinator/coordinator_test.ts @@ -119,7 +119,7 @@ blockchainTests.resets('Coordinator integration tests', env => { order = await maker.signOrderAsync(); data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, [order]); transaction = await taker.signTransactionAsync({ data }); - approval = await feeRecipient.signCoordinatorApprovalAsync(transaction, taker.address); + approval = feeRecipient.signCoordinatorApproval(transaction, taker.address); }); it(`${fnName} should fill the order with a signed approval`, async () => { @@ -253,7 +253,7 @@ blockchainTests.resets('Coordinator integration tests', env => { orders = [await maker.signOrderAsync(), await maker.signOrderAsync()]; data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders); transaction = await taker.signTransactionAsync({ data }); - approval = await feeRecipient.signCoordinatorApprovalAsync(transaction, taker.address); + approval = feeRecipient.signCoordinatorApproval(transaction, taker.address); }); it(`${fnName} should fill the orders with a signed approval`, async () => { diff --git a/contracts/integrations/test/framework/actors/fee_recipient.ts b/contracts/integrations/test/framework/actors/fee_recipient.ts index fb31dbe711..a2716df1f6 100644 --- a/contracts/integrations/test/framework/actors/fee_recipient.ts +++ b/contracts/integrations/test/framework/actors/fee_recipient.ts @@ -10,11 +10,11 @@ interface FeeRecipientConfig extends ActorConfig { export interface FeeRecipientInterface { approvalFactory?: ApprovalFactory; - signCoordinatorApprovalAsync: ( + signCoordinatorApproval: ( transaction: SignedZeroExTransaction, txOrigin: string, signatureType?: SignatureType, - ) => Promise; + ) => SignedCoordinatorApproval; } /** @@ -46,11 +46,11 @@ export function FeeRecipientMixin(Base: TBase): TBase /** * Signs an coordinator transaction. */ - public async signCoordinatorApprovalAsync( + public signCoordinatorApproval( transaction: SignedZeroExTransaction, txOrigin: string, signatureType: SignatureType = SignatureType.EthSign, - ): Promise { + ): SignedCoordinatorApproval { if (this.approvalFactory === undefined) { throw new Error('No verifying contract provided in FeeRecipient constructor'); } diff --git a/contracts/integrations/test/fuzz_tests/exchange_signature_validation_test.ts b/contracts/integrations/test/fuzz_tests/exchange_signature_validation_test.ts index 5a9b08778b..9202ee6c76 100644 --- a/contracts/integrations/test/fuzz_tests/exchange_signature_validation_test.ts +++ b/contracts/integrations/test/fuzz_tests/exchange_signature_validation_test.ts @@ -200,7 +200,7 @@ tests('Exchange signature validation fuzz tests', env => { exchangeAddress: mangled.order!.exchangeAddress, chainId: mangled.order!.chainId, }); - mangled.hash = await orderHashUtils.getOrderHashHex(mangled.order); + mangled.hash = orderHashUtils.getOrderHashHex(mangled.order); break; case 'RANDOM_TRANSACTION': mangled.transaction = randomTransaction({ @@ -398,7 +398,7 @@ tests('Exchange signature validation fuzz tests', env => { fields.validator || (signatureType === SignatureType.Validator ? walletContractAddress : undefined); const signerKey = fields.signerKey || privateKeys[signer]; const order = fields.order || randomOrder({ makerAddress: signer }); - const hash = fields.hash || (await orderHashUtils.getOrderHashHex(order)); + const hash = fields.hash || orderHashUtils.getOrderHashHex(order); const payload = fields.payload || (STRICT_LENGTH_SIGNATURE_TYPES.includes(signatureType) ? constants.NULL_BYTES : randomPayload());