removed erc1155 proxy tests from general proxy test file
This commit is contained in:
@@ -11,33 +11,21 @@ import {
|
||||
import { BlockchainLifecycle } from '@0x/dev-utils';
|
||||
import { assetDataUtils } from '@0x/order-utils';
|
||||
import { RevertReason } from '@0x/types';
|
||||
import { BigNumber, AbiEncoder } from '@0x/utils';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
import * as chai from 'chai';
|
||||
import { LogWithDecodedArgs } from 'ethereum-types';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
import {
|
||||
artifacts,
|
||||
DummyERC20TokenContract,
|
||||
DummyERC20TokenTransferEventArgs,
|
||||
DummyERC721ReceiverContract,
|
||||
DummyERC721TokenContract,
|
||||
DummyMultipleReturnERC20TokenContract,
|
||||
DummyNoReturnERC20TokenContract,
|
||||
ERC20ProxyContract,
|
||||
ERC20Wrapper,
|
||||
ERC721ProxyContract,
|
||||
ERC721Wrapper,
|
||||
ERC1155ProxyWrapper,
|
||||
ERC1155ProxyContract,
|
||||
IAssetDataContract,
|
||||
IAssetProxyContract,
|
||||
MultiAssetProxyContract,
|
||||
ERC1155MintableContract,
|
||||
DummyERC1155ReceiverContract,
|
||||
DummyERC1155ReceiverBatchTokenReceivedEventArgs,
|
||||
} from '../src';
|
||||
import values from 'ramda/es/values';
|
||||
import { Erc1155Wrapper } from '../../erc1155/lib/src';
|
||||
|
||||
chaiSetup.configure();
|
||||
@@ -48,11 +36,6 @@ const assetProxyInterface = new IAssetProxyContract(
|
||||
constants.NULL_ADDRESS,
|
||||
provider,
|
||||
);
|
||||
const assetDataInterface = new IAssetDataContract(
|
||||
artifacts.IAssetData.compilerOutput.abi,
|
||||
constants.NULL_ADDRESS,
|
||||
provider,
|
||||
);
|
||||
|
||||
// tslint:disable:no-unnecessary-type-assertion
|
||||
describe.only('ERC1155Proxy', () => {
|
||||
|
||||
@@ -23,7 +23,7 @@ import {
|
||||
import { BlockchainLifecycle } from '@0x/dev-utils';
|
||||
import { assetDataUtils } from '@0x/order-utils';
|
||||
import { RevertReason } from '@0x/types';
|
||||
import { BigNumber, AbiEncoder } from '@0x/utils';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
import * as chai from 'chai';
|
||||
import { LogWithDecodedArgs } from 'ethereum-types';
|
||||
import * as _ from 'lodash';
|
||||
@@ -34,16 +34,10 @@ import {
|
||||
ERC20Wrapper,
|
||||
ERC721ProxyContract,
|
||||
ERC721Wrapper,
|
||||
ERC1155ProxyWrapper,
|
||||
ERC1155ProxyContract,
|
||||
IAssetDataContract,
|
||||
IAssetProxyContract,
|
||||
MultiAssetProxyContract,
|
||||
ERC1155MintableContract,
|
||||
DummyERC1155ReceiverContract,
|
||||
DummyERC1155ReceiverBatchTokenReceivedEventArgs,
|
||||
} from '../src';
|
||||
import values from 'ramda/es/values';
|
||||
|
||||
chaiSetup.configure();
|
||||
const expect = chai.expect;
|
||||
@@ -74,22 +68,15 @@ describe('Asset Transfer Proxies', () => {
|
||||
let erc721Receiver: DummyERC721ReceiverContract;
|
||||
let erc20Proxy: ERC20ProxyContract;
|
||||
let erc721Proxy: ERC721ProxyContract;
|
||||
let erc1155Proxy: ERC721ProxyContract;
|
||||
let erc1155Receiver: DummyERC1155ReceiverContract;
|
||||
let noReturnErc20Token: DummyNoReturnERC20TokenContract;
|
||||
let multipleReturnErc20Token: DummyMultipleReturnERC20TokenContract;
|
||||
let multiAssetProxy: MultiAssetProxyContract;
|
||||
|
||||
let erc20Wrapper: ERC20Wrapper;
|
||||
let erc721Wrapper: ERC721Wrapper;
|
||||
let erc1155ProxyWrapper: ERC1155ProxyWrapper;
|
||||
let erc721AFromTokenId: BigNumber;
|
||||
let erc721BFromTokenId: BigNumber;
|
||||
|
||||
let erc1155Token: ERC1155MintableContract;
|
||||
let erc1155FungibleTokenIds: BigNumber[];
|
||||
let erc1155NonFungibleTokenIds: BigNumber[];
|
||||
|
||||
before(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
});
|
||||
@@ -102,12 +89,10 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
|
||||
erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner);
|
||||
erc1155ProxyWrapper = new ERC1155ProxyWrapper(provider, usedAddresses, owner);
|
||||
|
||||
// Deploy AssetProxies
|
||||
erc20Proxy = await erc20Wrapper.deployProxyAsync();
|
||||
erc721Proxy = await erc721Wrapper.deployProxyAsync();
|
||||
erc1155Proxy = await erc1155ProxyWrapper.deployProxyAsync();
|
||||
multiAssetProxy = await MultiAssetProxyContract.deployFrom0xArtifactAsync(
|
||||
artifacts.MultiAssetProxy,
|
||||
provider,
|
||||
@@ -142,20 +127,6 @@ describe('Asset Transfer Proxies', () => {
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
|
||||
// Configure ERC1155Proxy
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await erc1155Proxy.addAuthorizedAddress.sendTransactionAsync(authorized, {
|
||||
from: owner,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await erc1155Proxy.addAuthorizedAddress.sendTransactionAsync(multiAssetProxy.address, {
|
||||
from: owner,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
|
||||
// Configure MultiAssetProxy
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await multiAssetProxy.addAuthorizedAddress.sendTransactionAsync(authorized, {
|
||||
@@ -237,22 +208,11 @@ describe('Asset Transfer Proxies', () => {
|
||||
provider,
|
||||
txDefaults,
|
||||
);
|
||||
|
||||
await erc721Wrapper.setBalancesAndAllowancesAsync();
|
||||
const erc721Balances = await erc721Wrapper.getBalancesAsync();
|
||||
erc721AFromTokenId = erc721Balances[fromAddress][erc721TokenA.address][0];
|
||||
erc721BFromTokenId = erc721Balances[fromAddress][erc721TokenB.address][0];
|
||||
|
||||
// Deploy and configure ERC1155 tokens and receiver
|
||||
const [erc1155Wrapper] = await erc1155ProxyWrapper.deployDummyTokensAsync();
|
||||
erc1155Token = erc1155Wrapper.getContract();
|
||||
erc1155Receiver = await DummyERC1155ReceiverContract.deployFrom0xArtifactAsync(
|
||||
artifacts.DummyERC1155Receiver,
|
||||
provider,
|
||||
txDefaults,
|
||||
);
|
||||
await erc1155ProxyWrapper.setBalancesAndAllowancesAsync();
|
||||
erc1155FungibleTokenIds = erc1155ProxyWrapper.getFungibleTokenIds();
|
||||
erc1155NonFungibleTokenIds = erc1155ProxyWrapper.getNonFungibleTokenIds();
|
||||
});
|
||||
beforeEach(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
@@ -517,6 +477,7 @@ describe('Asset Transfer Proxies', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('ERC721Proxy', () => {
|
||||
it('should revert if undefined function is called', async () => {
|
||||
const undefinedSelector = '0x01020304';
|
||||
@@ -1325,698 +1286,6 @@ describe('Asset Transfer Proxies', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
describe('ERC1155Proxy', () => {
|
||||
it('should revert if undefined function is called', async () => {
|
||||
const undefinedSelector = '0x01020304';
|
||||
await expectTransactionFailedWithoutReasonAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
from: owner,
|
||||
to: erc1155Proxy.address,
|
||||
value: constants.ZERO_AMOUNT,
|
||||
data: undefinedSelector,
|
||||
}),
|
||||
);
|
||||
});
|
||||
it('should have an id of 0x9645780d', async () => {
|
||||
const proxyId = await erc1155Proxy.getProxyId.callAsync();
|
||||
// proxy computed using -- bytes4(keccak256("ERC1155Token(address,uint256[],uint256[],bytes)"));
|
||||
const expectedProxyId = '0x9645780d';
|
||||
expect(proxyId).to.equal(expectedProxyId);
|
||||
});
|
||||
describe('transferFrom', () => {
|
||||
it('should successfully transfer value for a single token', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const fungibleTokenIdToTransfer = erc1155FungibleTokenIds[0];
|
||||
const tokenIdsToTransfer = [fungibleTokenIdToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(10)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Verify pre-condition
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const initialSenderBalance = initialHoldingsByOwner.fungible[fromAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const initialReceiverBalance = initialHoldingsByOwner.fungible[toAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1000);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
// Verify transfer was successful
|
||||
const totalValueTransferred = tokenValuesToTransfer[0].times(perUnitValue);
|
||||
const newHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const newSenderBalance = newHoldingsByOwner.fungible[fromAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const expectedNewSenderBalance = initialSenderBalance.minus(totalValueTransferred);
|
||||
const newReceiverBalance = newHoldingsByOwner.fungible[toAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const expectedNewReceiverBalance = initialReceiverBalance.plus(totalValueTransferred);
|
||||
expect(newSenderBalance).to.be.bignumber.equal(expectedNewSenderBalance);
|
||||
expect(newReceiverBalance).to.be.bignumber.equal(expectedNewReceiverBalance);
|
||||
});
|
||||
it('should successfully transfer value for a collection of fungible tokens of the same id', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const fungibleTokenIdToTransfer = erc1155FungibleTokenIds[0];
|
||||
const tokenIdsToTransfer = [fungibleTokenIdToTransfer, fungibleTokenIdToTransfer, fungibleTokenIdToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(10), new BigNumber(20), new BigNumber(30)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Verify pre-condition
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const initialSenderBalance = initialHoldingsByOwner.fungible[fromAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const initialReceiverBalance = initialHoldingsByOwner.fungible[toAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1000);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
// Verify transfer was successful
|
||||
const totalValueTransferred = _.reduce(tokenValuesToTransfer, (sum: BigNumber, value: BigNumber) => {return sum.plus(value)}, new BigNumber(0)).times(perUnitValue);
|
||||
const newHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const newSenderBalance = newHoldingsByOwner.fungible[fromAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const expectedNewSenderBalance = initialSenderBalance.minus(totalValueTransferred);
|
||||
const newReceiverBalance = newHoldingsByOwner.fungible[toAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const expectedNewReceiverBalance = initialReceiverBalance.plus(totalValueTransferred);
|
||||
expect(newSenderBalance).to.be.bignumber.equal(expectedNewSenderBalance);
|
||||
expect(newReceiverBalance).to.be.bignumber.equal(expectedNewReceiverBalance);
|
||||
});
|
||||
it('should successfully transfer value for a collection of fungible tokens of different ids', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const tokenIdsToTransfer = erc1155FungibleTokenIds.slice(0, 2);
|
||||
const tokenValuesToTransfer = [new BigNumber(10), new BigNumber(20)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Verify pre-condition
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const initialSenderBalances: BigNumber[] = [];
|
||||
const initialReceiverBalances: BigNumber[] = [];
|
||||
_.each(tokenIdsToTransfer, (tokenIdToTransfer: BigNumber) => {
|
||||
initialSenderBalances.push(initialHoldingsByOwner.fungible[fromAddress][erc1155Token.address][tokenIdToTransfer.toString()]);
|
||||
initialReceiverBalances.push(initialHoldingsByOwner.fungible[toAddress][erc1155Token.address][tokenIdToTransfer.toString()]);
|
||||
});
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1000);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
// Verify transfer was successful
|
||||
const newHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
_.each(tokenIdsToTransfer, (tokenIdToTransfer: BigNumber, i: number) => {
|
||||
const totalValueTransferred = tokenValuesToTransfer[i].times(perUnitValue);
|
||||
const newSenderBalance = newHoldingsByOwner.fungible[fromAddress][erc1155Token.address][tokenIdToTransfer.toString()];
|
||||
const expectedNewSenderBalance = initialSenderBalances[i].minus(totalValueTransferred);
|
||||
const newReceiverBalance = newHoldingsByOwner.fungible[toAddress][erc1155Token.address][tokenIdToTransfer.toString()];
|
||||
const expectedNewReceiverBalance = initialReceiverBalances[i].plus(totalValueTransferred);
|
||||
expect(newSenderBalance).to.be.bignumber.equal(expectedNewSenderBalance);
|
||||
expect(newReceiverBalance).to.be.bignumber.equal(expectedNewReceiverBalance);
|
||||
});
|
||||
});
|
||||
it('should successfully transfer a non-fungible token', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const nonFungibleTokenIdToTransfer = erc1155NonFungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const nftToTransfer = initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()][0];
|
||||
const tokenIdsToTransfer = [nftToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Verify precondition
|
||||
const nftHolder = await erc1155ProxyWrapper.ownerOfNonFungibleAsync(erc1155Token.address, nftToTransfer);
|
||||
expect(nftHolder).to.be.equal(fromAddress);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
// Verify transfer was successful
|
||||
const newNftHolder = await erc1155ProxyWrapper.ownerOfNonFungibleAsync(erc1155Token.address, nftToTransfer);
|
||||
expect(newNftHolder).to.be.equal(toAddress);
|
||||
// Verify balances updated successfully
|
||||
const newHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const newNftsForFromAddress = newHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()];
|
||||
const newNftsForToAddress = newHoldingsByOwner.nonFungible[toAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()];
|
||||
expect(_.find(newNftsForFromAddress, nftToTransfer)).to.be.undefined();
|
||||
expect(_.find(newNftsForToAddress, nftToTransfer)).to.be.not.undefined();
|
||||
});
|
||||
it('should successfully transfer value for a combination of fungible/non-fungible tokens', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const fungibleTokenIdToTransfer = erc1155FungibleTokenIds[0];
|
||||
const nonFungibleTokenIdToTransfer = erc1155NonFungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const nftToTransfer = initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()][0];
|
||||
const tokenIdsToTransfer = [fungibleTokenIdToTransfer, nftToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(10), new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Verify precondition
|
||||
const initialSenderBalance = initialHoldingsByOwner.fungible[fromAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const initialReceiverBalance = initialHoldingsByOwner.fungible[toAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const nftHolder = await erc1155ProxyWrapper.ownerOfNonFungibleAsync(erc1155Token.address, nftToTransfer);
|
||||
expect(nftHolder).to.be.equal(fromAddress);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
// Verify non-fungible transfer was successful
|
||||
const newNftHolder = await erc1155ProxyWrapper.ownerOfNonFungibleAsync(erc1155Token.address, nftToTransfer);
|
||||
expect(newNftHolder).to.be.equal(toAddress);
|
||||
// Verify non-fungible balances updated successfully
|
||||
const newHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const newNftsForFromAddress = newHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()];
|
||||
const newNftsForToAddress = newHoldingsByOwner.nonFungible[toAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()];
|
||||
expect(_.find(newNftsForFromAddress, nftToTransfer)).to.be.undefined();
|
||||
expect(_.find(newNftsForToAddress, nftToTransfer)).to.be.not.undefined();
|
||||
// Verify fungible transfer was successful
|
||||
const totalValueTransferred = tokenValuesToTransfer[0].times(perUnitValue);
|
||||
const newSenderBalance = newHoldingsByOwner.fungible[fromAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const expectedNewSenderBalance = initialSenderBalance.minus(totalValueTransferred);
|
||||
const newReceiverBalance = newHoldingsByOwner.fungible[toAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const expectedNewReceiverBalance = initialReceiverBalance.plus(totalValueTransferred);
|
||||
expect(newSenderBalance).to.be.bignumber.equal(expectedNewSenderBalance);
|
||||
expect(newReceiverBalance).to.be.bignumber.equal(expectedNewReceiverBalance);
|
||||
});
|
||||
it('should successfully transfer value for a combination of several fungible/non-fungible tokens', async () => {
|
||||
// Check inital balances and construct asset data
|
||||
const erc1155Wrapper = erc1155ProxyWrapper.getTokenWrapper(erc1155Token.address);
|
||||
const spenderInitialFungibleBalance = constants.INITIAL_ERC1155_FUNGIBLE_BALANCE;
|
||||
const receiverInitialFungibleBalance = constants.INITIAL_ERC1155_FUNGIBLE_BALANCE;
|
||||
const expectedInitialBalances = [
|
||||
// spender balances
|
||||
spenderInitialFungibleBalance,
|
||||
spenderInitialFungibleBalance,
|
||||
spenderInitialFungibleBalance,
|
||||
new BigNumber(1),
|
||||
new BigNumber(1),
|
||||
// receiver balances
|
||||
receiverInitialFungibleBalance,
|
||||
receiverInitialFungibleBalance,
|
||||
receiverInitialFungibleBalance,
|
||||
new BigNumber(0),
|
||||
new BigNumber(0),
|
||||
];
|
||||
const tokenHolders = [
|
||||
fromAddress,
|
||||
toAddress,
|
||||
];
|
||||
const fungibleTokenIdsToTransfer = erc1155FungibleTokenIds.slice(0, 3);
|
||||
const nonFungibleTokenIdsToTransfer = erc1155NonFungibleTokenIds.slice(0, 2);
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const nftsToTransfer = [
|
||||
initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdsToTransfer[0].toString()][0],
|
||||
initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdsToTransfer[1].toString()][0],
|
||||
];
|
||||
const tokenIdsToTransfer = fungibleTokenIdsToTransfer.concat(nftsToTransfer);
|
||||
await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokenIdsToTransfer, expectedInitialBalances);
|
||||
const callbackData = "0x";
|
||||
const tokenValuesToTransfer = [spenderInitialFungibleBalance, spenderInitialFungibleBalance, spenderInitialFungibleBalance, new BigNumber(1),new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
// Check final balances
|
||||
const expectedFinalBalances = [
|
||||
// spender balances
|
||||
new BigNumber(0),
|
||||
new BigNumber(0),
|
||||
new BigNumber(0),
|
||||
new BigNumber(0),
|
||||
new BigNumber(0),
|
||||
// receiver balances
|
||||
receiverInitialFungibleBalance.plus(spenderInitialFungibleBalance),
|
||||
receiverInitialFungibleBalance.plus(spenderInitialFungibleBalance),
|
||||
receiverInitialFungibleBalance.plus(spenderInitialFungibleBalance),
|
||||
new BigNumber(1),
|
||||
new BigNumber(1),
|
||||
];
|
||||
await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokenIdsToTransfer, expectedFinalBalances);
|
||||
});
|
||||
it('should successfully transfer value and ignore extra assetData', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const fungibleTokenIdToTransfer = erc1155FungibleTokenIds[0];
|
||||
const tokenIdsToTransfer = [fungibleTokenIdToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(10)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
const extraData = '0102030405060708';
|
||||
const encodedAssetDataPlusExtraData = `${encodedAssetData}${extraData}`;
|
||||
// Verify pre-condition
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const initialSenderBalance = initialHoldingsByOwner.fungible[fromAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const initialReceiverBalance = initialHoldingsByOwner.fungible[toAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1000);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetDataPlusExtraData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
// Verify transfer was successful
|
||||
const totalValueTransferred = tokenValuesToTransfer[0].times(perUnitValue);
|
||||
const newHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const newSenderBalance = newHoldingsByOwner.fungible[fromAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const expectedNewSenderBalance = initialSenderBalance.minus(totalValueTransferred);
|
||||
const newReceiverBalance = newHoldingsByOwner.fungible[toAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
const expectedNewReceiverBalance = initialReceiverBalance.plus(totalValueTransferred);
|
||||
expect(newSenderBalance).to.be.bignumber.equal(expectedNewSenderBalance);
|
||||
expect(newReceiverBalance).to.be.bignumber.equal(expectedNewReceiverBalance);
|
||||
});
|
||||
it('should successfully execute callback when transferring to a smart contract', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const nonFungibleTokenIdToTransfer = erc1155NonFungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const nftToTransfer = initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()][0];
|
||||
const tokenIdsToTransfer = [nftToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Verify precondition
|
||||
const nftHolder = await erc1155ProxyWrapper.ownerOfNonFungibleAsync(erc1155Token.address, nftToTransfer);
|
||||
expect(nftHolder).to.be.equal(fromAddress);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
erc1155Receiver.address,
|
||||
perUnitValue,
|
||||
);
|
||||
const logDecoder = new LogDecoder(web3Wrapper, artifacts);
|
||||
const txReceipt = await logDecoder.getTxWithDecodedLogsAsync(
|
||||
await web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
})
|
||||
);
|
||||
// Verify logs
|
||||
expect(txReceipt.logs.length).to.be.equal(2);
|
||||
const receiverLog = txReceipt.logs[1] as LogWithDecodedArgs<DummyERC1155ReceiverBatchTokenReceivedEventArgs>;
|
||||
expect(receiverLog.args.operator).to.be.equal(erc1155Proxy.address);
|
||||
expect(receiverLog.args.from).to.be.equal(fromAddress);
|
||||
expect(receiverLog.args.tokenIds.length).to.be.deep.equal(1);
|
||||
expect(receiverLog.args.tokenIds[0]).to.be.bignumber.equal(tokenIdsToTransfer[0]);
|
||||
expect(receiverLog.args.tokenValues.length).to.be.deep.equal(1);
|
||||
expect(receiverLog.args.tokenValues[0]).to.be.bignumber.equal(tokenValuesToTransfer[0]);
|
||||
expect(receiverLog.args.data).to.be.deep.equal(callbackData);
|
||||
// Verify transfer was successful
|
||||
const newNftHolder = await erc1155ProxyWrapper.ownerOfNonFungibleAsync(erc1155Token.address, nftToTransfer);
|
||||
expect(newNftHolder).to.be.equal(erc1155Receiver.address);
|
||||
});
|
||||
it('should successfully execute callback when transferring to a smart contract when there is callback data', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x12345678";
|
||||
const nonFungibleTokenIdToTransfer = erc1155NonFungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const nftToTransfer = initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()][0];
|
||||
const tokenIdsToTransfer = [nftToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Verify precondition
|
||||
const nftHolder = await erc1155ProxyWrapper.ownerOfNonFungibleAsync(erc1155Token.address, nftToTransfer);
|
||||
expect(nftHolder).to.be.equal(fromAddress);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
erc1155Receiver.address,
|
||||
perUnitValue,
|
||||
);
|
||||
const logDecoder = new LogDecoder(web3Wrapper, artifacts);
|
||||
const txReceipt = await logDecoder.getTxWithDecodedLogsAsync(
|
||||
await web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
})
|
||||
);
|
||||
// Verify logs
|
||||
expect(txReceipt.logs.length).to.be.equal(2);
|
||||
const receiverLog = txReceipt.logs[1] as LogWithDecodedArgs<DummyERC1155ReceiverBatchTokenReceivedEventArgs>;
|
||||
expect(receiverLog.args.operator).to.be.equal(erc1155Proxy.address);
|
||||
expect(receiverLog.args.from).to.be.equal(fromAddress);
|
||||
expect(receiverLog.args.tokenIds.length).to.be.deep.equal(1);
|
||||
expect(receiverLog.args.tokenIds[0]).to.be.bignumber.equal(tokenIdsToTransfer[0]);
|
||||
expect(receiverLog.args.tokenValues.length).to.be.deep.equal(1);
|
||||
expect(receiverLog.args.tokenValues[0]).to.be.bignumber.equal(tokenValuesToTransfer[0]);
|
||||
expect(receiverLog.args.data).to.be.deep.equal(callbackData);
|
||||
// Verify transfer was successful
|
||||
const newNftHolder = await erc1155ProxyWrapper.ownerOfNonFungibleAsync(erc1155Token.address, nftToTransfer);
|
||||
expect(newNftHolder).to.be.equal(erc1155Receiver.address);
|
||||
});
|
||||
it('should propagate revert reason from erc1155 contract failure', async () => {
|
||||
// Disable transfers
|
||||
const shouldRejectTransfer = true;
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await erc1155Receiver.setRejectTransferFlag.sendTransactionAsync(shouldRejectTransfer),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x12345678";
|
||||
const nonFungibleTokenIdToTransfer = erc1155NonFungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const nftToTransfer = initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()][0];
|
||||
const tokenIdsToTransfer = [nftToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
erc1155Receiver.address,
|
||||
perUnitValue,
|
||||
);
|
||||
await expectTransactionFailedAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
RevertReason.TransferRejected,
|
||||
);
|
||||
});
|
||||
it('should revert if transferring the same non-fungible token more than once', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x12345678";
|
||||
const nonFungibleTokenIdToTransfer = erc1155NonFungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const nftToTransfer = initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()][0];
|
||||
const tokenIdsToTransfer = [nftToTransfer, nftToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(1), new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Verify precondition
|
||||
const nftHolder = await erc1155ProxyWrapper.ownerOfNonFungibleAsync(erc1155Token.address, nftToTransfer);
|
||||
expect(nftHolder).to.be.equal(fromAddress);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
erc1155Receiver.address,
|
||||
perUnitValue,
|
||||
);
|
||||
await expectTransactionFailedAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
RevertReason.nftNotOwnedByFromAddress,
|
||||
);
|
||||
});
|
||||
it('should revert if tansferring 0 amount of any token', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x12345678";
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const tokenIdsToTransfer = [
|
||||
initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][erc1155NonFungibleTokenIds[0].toString()][0],
|
||||
initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][erc1155NonFungibleTokenIds[1].toString()][0],
|
||||
initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][erc1155NonFungibleTokenIds[2].toString()][0],
|
||||
];
|
||||
const tokenValuesToTransfer = [new BigNumber(1), new BigNumber(0), new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
erc1155Receiver.address,
|
||||
perUnitValue,
|
||||
);
|
||||
await expectTransactionFailedAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
RevertReason.transferGreaterThanZeroRequired,
|
||||
);
|
||||
});
|
||||
it('should revert if there is a multiplication overflow', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const fungibleTokenIdToTransfer = erc1155FungibleTokenIds[0];
|
||||
const tokenIdsToTransfer = [fungibleTokenIdToTransfer];
|
||||
const maxUintValue = (new BigNumber(2)).pow(256).minus(1);
|
||||
const tokenValuesToTransfer = [maxUintValue];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(2);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await expectTransactionFailedAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
RevertReason.Uint256Overflow,
|
||||
);
|
||||
});
|
||||
it('should revert if there is a multiplication overflow, when transferring multiple tokens', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const tokenIdsToTransfer = erc1155FungibleTokenIds.slice(3);
|
||||
const maxUintValue = (new BigNumber(2)).pow(256).minus(1);
|
||||
// Note - the second token will fail
|
||||
const tokenValuesToTransfer = [new BigNumber(1), maxUintValue, new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(2);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await expectTransactionFailedAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
RevertReason.Uint256Overflow,
|
||||
);
|
||||
});
|
||||
it('should revert if transferring > 1 instances of a non-fungible token (amount field >1)', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const nonFungibleTokenIdToTransfer = erc1155NonFungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const nftToTransfer = initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()][0];
|
||||
const tokenIdsToTransfer = [nftToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(2);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await expectTransactionFailedAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
RevertReason.amountEqualToOneRequired,
|
||||
);
|
||||
});
|
||||
it('should revert if transferring > 1 instances of a non-fungible token (value field >1)', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const nonFungibleTokenIdToTransfer = erc1155NonFungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const nftToTransfer = initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()][0];
|
||||
const tokenIdsToTransfer = [nftToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(2)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await expectTransactionFailedAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
RevertReason.amountEqualToOneRequired,
|
||||
);
|
||||
});
|
||||
it('should revert if sender balance is insufficient', async () => {
|
||||
// Verify pre-condition
|
||||
const fungibleTokenIdToTransfer = erc1155FungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const initialSenderBalance = initialHoldingsByOwner.fungible[fromAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const tokenIdsToTransfer = [fungibleTokenIdToTransfer];
|
||||
const tokenValuesToTransfer = [initialSenderBalance.plus(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await expectTransactionFailedAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
RevertReason.Uint256Underflow,
|
||||
);
|
||||
});
|
||||
it('should revert if sender allowance is insufficient', async () => {
|
||||
// Unapprove ERC1155 proxy
|
||||
const wrapper = erc1155ProxyWrapper.getTokenWrapper(erc1155Token.address);
|
||||
const isApproved = false;
|
||||
await wrapper.setApprovalForAllAsync(fromAddress, erc1155Proxy.address, isApproved);
|
||||
const isApprovedActualValue = await wrapper.isApprovedForAllAsync(fromAddress, erc1155Proxy.address);
|
||||
expect(isApprovedActualValue).to.be.equal(isApproved);
|
||||
// Verify pre-condition
|
||||
const fungibleTokenIdToTransfer = erc1155FungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const initialSenderBalance = initialHoldingsByOwner.fungible[fromAddress][erc1155Token.address][fungibleTokenIdToTransfer.toString()];
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x";
|
||||
const tokenIdsToTransfer = [fungibleTokenIdToTransfer];
|
||||
const tokenValuesToTransfer = [initialSenderBalance];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
toAddress,
|
||||
perUnitValue,
|
||||
);
|
||||
await expectTransactionFailedAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: authorized,
|
||||
}),
|
||||
RevertReason.InsufficientAllowance,
|
||||
);
|
||||
});
|
||||
it('should revert if caller is not authorized', async () => {
|
||||
// Construct ERC1155 asset data
|
||||
const callbackData = "0x12345678";
|
||||
const nonFungibleTokenIdToTransfer = erc1155NonFungibleTokenIds[0];
|
||||
const initialHoldingsByOwner = await erc1155ProxyWrapper.getBalancesAsync();
|
||||
const nftToTransfer = initialHoldingsByOwner.nonFungible[fromAddress][erc1155Token.address][nonFungibleTokenIdToTransfer.toString()][0];
|
||||
const tokenIdsToTransfer = [nftToTransfer];
|
||||
const tokenValuesToTransfer = [new BigNumber(1)];
|
||||
const encodedAssetData = assetDataUtils.encodeERC1155AssetData(erc1155Token.address, tokenIdsToTransfer, tokenValuesToTransfer, callbackData);
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const perUnitValue = new BigNumber(1);
|
||||
const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
|
||||
encodedAssetData,
|
||||
fromAddress,
|
||||
erc1155Receiver.address,
|
||||
perUnitValue,
|
||||
);
|
||||
await expectTransactionFailedAsync(
|
||||
web3Wrapper.sendTransactionAsync({
|
||||
to: erc1155Proxy.address,
|
||||
data,
|
||||
from: notAuthorized,
|
||||
}),
|
||||
RevertReason.SenderNotAuthorized,
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
// tslint:enable:no-unnecessary-type-assertion
|
||||
// tslint:disable:max-file-line-count
|
||||
|
||||
Reference in New Issue
Block a user