Rebase and address review comments.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user