Cherry-pick changes from feat/dev-utils/dydx-bridge-validation
This commit is contained in:
parent
79362b0dba
commit
3e8f9a6b53
@ -47,7 +47,7 @@ jobs:
|
||||
- restore_cache:
|
||||
keys:
|
||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
||||
- run: yarn wsrun test:circleci @0x/contracts-multisig @0x/contracts-utils @0x/contracts-exchange-libs @0x/contracts-erc20 @0x/contracts-erc721 @0x/contracts-erc1155 @0x/contracts-extensions @0x/contracts-asset-proxy @0x/contracts-exchange @0x/contracts-exchange-forwarder @0x/contracts-coordinator @0x/contracts-tests @0x/contracts-staking
|
||||
- run: yarn wsrun test:circleci @0x/contracts-multisig @0x/contracts-utils @0x/contracts-exchange-libs @0x/contracts-erc20 @0x/contracts-erc721 @0x/contracts-erc1155 @0x/contracts-extensions @0x/contracts-asset-proxy @0x/contracts-exchange @0x/contracts-exchange-forwarder @0x/contracts-coordinator @0x/contracts-staking
|
||||
test-exchange-ganache-3.0:
|
||||
resource_class: medium+
|
||||
docker:
|
||||
@ -77,7 +77,7 @@ jobs:
|
||||
- restore_cache:
|
||||
keys:
|
||||
- repo-{{ .Environment.CIRCLE_SHA1 }}
|
||||
- run: yarn wsrun test:circleci @0x/contracts-multisig @0x/contracts-utils @0x/contracts-exchange-libs @0x/contracts-erc20 @0x/contracts-erc721 @0x/contracts-erc1155 @0x/contracts-asset-proxy @0x/contracts-exchange-forwarder @0x/contracts-tests @0x/contracts-staking @0x/contracts-coordinator @0x/contracts-erc20-bridge-sampler
|
||||
- run: yarn wsrun test:circleci @0x/contracts-multisig @0x/contracts-utils @0x/contracts-exchange-libs @0x/contracts-erc20 @0x/contracts-erc721 @0x/contracts-erc1155 @0x/contracts-asset-proxy @0x/contracts-exchange-forwarder @0x/contracts-staking @0x/contracts-coordinator @0x/contracts-erc20-bridge-sampler
|
||||
# TODO(dorothy-zbornak): Re-enable after updating this package for
|
||||
# 3.0. At that time, also remove exclusion from monorepo
|
||||
# package.json's test script.
|
||||
|
@ -1,4 +1,21 @@
|
||||
[
|
||||
{
|
||||
"version": "3.2.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Fix broken tests.",
|
||||
"pr": 2462
|
||||
},
|
||||
{
|
||||
"note": "Remove dependency on `@0x/contracts-dev-utils`",
|
||||
"pr": 2462
|
||||
},
|
||||
{
|
||||
"note": "Add asset data decoding functions",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "3.1.3",
|
||||
|
@ -59,7 +59,6 @@
|
||||
"@0x/sol-compiler": "^4.0.6",
|
||||
"@0x/ts-doc-gen": "^0.0.22",
|
||||
"@0x/tslint-config": "^4.0.0",
|
||||
"@0x/types": "^3.1.1",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "*",
|
||||
|
112
contracts/asset-proxy/src/asset_data.ts
Normal file
112
contracts/asset-proxy/src/asset_data.ts
Normal file
@ -0,0 +1,112 @@
|
||||
import { AssetProxyId } from '@0x/types';
|
||||
import { BigNumber, hexUtils } from '@0x/utils';
|
||||
|
||||
import { IAssetDataContract } from './wrappers';
|
||||
|
||||
const assetDataIface = new IAssetDataContract('0x0000000000000000000000000000000000000000', { isEIP1193: true } as any);
|
||||
|
||||
/**
|
||||
* Get the proxy ID from encoded asset data.
|
||||
*/
|
||||
export function getAssetDataProxyId(encoded: string): AssetProxyId {
|
||||
// tslint:disable-next-line: no-unnecessary-type-assertion
|
||||
return hexUtils.slice(encoded, 0, 4) as AssetProxyId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode ERC20 asset data.
|
||||
*/
|
||||
export function decodeERC20AssetData(encoded: string): string {
|
||||
return assetDataIface.getABIDecodedTransactionData<string>('ERC20Token', encoded);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode ERC721 asset data.
|
||||
*/
|
||||
export function decodeERC721AssetData(encoded: string): [string, BigNumber] {
|
||||
return assetDataIface.getABIDecodedTransactionData<[string, BigNumber]>('ERC721Token', encoded);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode ERC1155 asset data.
|
||||
*/
|
||||
export function decodeERC1155AssetData(encoded: string): [string, BigNumber[], BigNumber[], string] {
|
||||
return assetDataIface.getABIDecodedTransactionData<[string, BigNumber[], BigNumber[], string]>(
|
||||
'ERC1155Assets',
|
||||
encoded,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode MultiAsset asset data.
|
||||
*/
|
||||
export function decodeMultiAssetData(encoded: string): [BigNumber[], string[]] {
|
||||
return assetDataIface.getABIDecodedTransactionData<[BigNumber[], string[]]>('MultiAsset', encoded);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode StaticCall asset data.
|
||||
*/
|
||||
export function decodeStaticCallAssetData(encoded: string): [string, string, string] {
|
||||
return assetDataIface.getABIDecodedTransactionData<[string, string, string]>('StaticCall', encoded);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode ERC20Bridge asset data.
|
||||
*/
|
||||
export function decodeERC20BridgeAssetData(encoded: string): [string, string, string] {
|
||||
return assetDataIface.getABIDecodedTransactionData<[string, string, string]>('ERC20Bridge', encoded);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode ERC20 asset data.
|
||||
*/
|
||||
export function encodeERC20AssetData(tokenAddress: string): string {
|
||||
return assetDataIface.ERC20Token(tokenAddress).getABIEncodedTransactionData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode ERC721 asset data.
|
||||
*/
|
||||
export function encodeERC721AssetData(tokenAddress: string, tokenId: BigNumber): string {
|
||||
return assetDataIface.ERC721Token(tokenAddress, tokenId).getABIEncodedTransactionData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode ERC1155 asset data.
|
||||
*/
|
||||
export function encodeERC1155AssetData(
|
||||
tokenAddress: string,
|
||||
tokenIds: BigNumber[],
|
||||
values: BigNumber[],
|
||||
callbackData: string,
|
||||
): string {
|
||||
return assetDataIface.ERC1155Assets(tokenAddress, tokenIds, values, callbackData).getABIEncodedTransactionData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode MultiAsset asset data.
|
||||
*/
|
||||
export function encodeMultiAssetData(values: BigNumber[], nestedAssetData: string[]): string {
|
||||
return assetDataIface.MultiAsset(values, nestedAssetData).getABIEncodedTransactionData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode StaticCall asset data.
|
||||
*/
|
||||
export function encodeStaticCallAssetData(
|
||||
staticCallTargetAddress: string,
|
||||
staticCallData: string,
|
||||
expectedReturnDataHash: string,
|
||||
): string {
|
||||
return assetDataIface
|
||||
.StaticCall(staticCallTargetAddress, staticCallData, expectedReturnDataHash)
|
||||
.getABIEncodedTransactionData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode ERC20Bridge asset data.
|
||||
*/
|
||||
export function encodeERC20BridgeAssetData(tokenAddress: string, bridgeAddress: string, bridgeData: string): string {
|
||||
return assetDataIface.ERC20Bridge(tokenAddress, bridgeAddress, bridgeData).getABIEncodedTransactionData();
|
||||
}
|
@ -5,7 +5,7 @@ export enum DydxBridgeActionType {
|
||||
Withdraw,
|
||||
}
|
||||
|
||||
export interface DydxBrigeAction {
|
||||
export interface DydxBridgeAction {
|
||||
actionType: DydxBridgeActionType;
|
||||
accountId: BigNumber;
|
||||
marketId: BigNumber;
|
||||
@ -15,7 +15,7 @@ export interface DydxBrigeAction {
|
||||
|
||||
export interface DydxBridgeData {
|
||||
accountNumbers: BigNumber[];
|
||||
actions: DydxBrigeAction[];
|
||||
actions: DydxBridgeAction[];
|
||||
}
|
||||
|
||||
export const dydxBridgeDataEncoder = AbiEncoder.create([
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { artifacts as erc1155Artifacts, ERC1155MintableContract, Erc1155Wrapper } from '@0x/contracts-erc1155';
|
||||
import {
|
||||
constants,
|
||||
@ -15,7 +14,7 @@ import * as _ from 'lodash';
|
||||
|
||||
import { artifacts } from './artifacts';
|
||||
|
||||
import { ERC1155ProxyContract, IAssetProxyContract } from './wrappers';
|
||||
import { ERC1155ProxyContract, IAssetDataContract, IAssetProxyContract } from './wrappers';
|
||||
|
||||
export class ERC1155ProxyWrapper {
|
||||
private readonly _tokenOwnerAddresses: string[];
|
||||
@ -28,7 +27,7 @@ export class ERC1155ProxyWrapper {
|
||||
private readonly _logDecoder: LogDecoder;
|
||||
private readonly _dummyTokenWrappers: Erc1155Wrapper[];
|
||||
private readonly _assetProxyInterface: IAssetProxyContract;
|
||||
private readonly _devUtils: DevUtilsContract;
|
||||
private readonly _assetDataInterface: IAssetDataContract;
|
||||
private _proxyContract?: ERC1155ProxyContract;
|
||||
private _proxyIdIfExists?: string;
|
||||
private _initialTokenIdsByOwner: ERC1155HoldingsByOwner = { fungible: {}, nonFungible: {} };
|
||||
@ -40,7 +39,7 @@ export class ERC1155ProxyWrapper {
|
||||
this._logDecoder = new LogDecoder(this._web3Wrapper, allArtifacts);
|
||||
this._dummyTokenWrappers = [];
|
||||
this._assetProxyInterface = new IAssetProxyContract(constants.NULL_ADDRESS, provider);
|
||||
this._devUtils = new DevUtilsContract(constants.NULL_ADDRESS, provider);
|
||||
this._assetDataInterface = new IAssetDataContract(constants.NULL_ADDRESS, provider);
|
||||
this._tokenOwnerAddresses = tokenOwnerAddresses;
|
||||
this._contractOwnerAddress = contractOwnerAddress;
|
||||
this._fungibleTokenIds = [];
|
||||
@ -113,9 +112,9 @@ export class ERC1155ProxyWrapper {
|
||||
this._validateProxyContractExistsOrThrow();
|
||||
const assetData =
|
||||
assetData_ === undefined
|
||||
? await this._devUtils
|
||||
.encodeERC1155AssetData(contractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.callAsync()
|
||||
? this._assetDataInterface
|
||||
.ERC1155Assets(contractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData()
|
||||
: assetData_;
|
||||
const data = this._assetProxyInterface
|
||||
.transferFrom(assetData, from, to, valueMultiplier)
|
||||
@ -167,9 +166,9 @@ export class ERC1155ProxyWrapper {
|
||||
this._validateProxyContractExistsOrThrow();
|
||||
const assetData =
|
||||
assetData_ === undefined
|
||||
? await this._devUtils
|
||||
.encodeERC1155AssetData(contractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.callAsync()
|
||||
? this._assetDataInterface
|
||||
.ERC1155Assets(contractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData()
|
||||
: assetData_;
|
||||
const data = this._assetProxyInterface
|
||||
.transferFrom(assetData, from, to, valueMultiplier)
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { artifacts as erc20Artifacts, DummyERC20TokenContract } from '@0x/contracts-erc20';
|
||||
import { constants, ERC20BalancesByOwner, txDefaults } from '@0x/contracts-test-utils';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
@ -7,14 +6,14 @@ import * as _ from 'lodash';
|
||||
|
||||
import { artifacts } from './artifacts';
|
||||
|
||||
import { ERC20ProxyContract } from './wrappers';
|
||||
import { ERC20ProxyContract, IAssetDataContract } from './wrappers';
|
||||
|
||||
export class ERC20Wrapper {
|
||||
private readonly _tokenOwnerAddresses: string[];
|
||||
private readonly _contractOwnerAddress: string;
|
||||
private readonly _provider: ZeroExProvider;
|
||||
private readonly _dummyTokenContracts: DummyERC20TokenContract[];
|
||||
private readonly _devUtils: DevUtilsContract;
|
||||
private readonly _assetDataInterface: IAssetDataContract;
|
||||
private _proxyContract?: ERC20ProxyContract;
|
||||
private _proxyIdIfExists?: string;
|
||||
/**
|
||||
@ -29,7 +28,7 @@ export class ERC20Wrapper {
|
||||
this._provider = provider;
|
||||
this._tokenOwnerAddresses = tokenOwnerAddresses;
|
||||
this._contractOwnerAddress = contractOwnerAddress;
|
||||
this._devUtils = new DevUtilsContract(constants.NULL_ADDRESS, provider);
|
||||
this._assetDataInterface = new IAssetDataContract(constants.NULL_ADDRESS, provider);
|
||||
}
|
||||
public async deployDummyTokensAsync(
|
||||
numberToDeploy: number,
|
||||
@ -145,7 +144,7 @@ export class ERC20Wrapper {
|
||||
return tokenAddresses;
|
||||
}
|
||||
private async _getTokenContractFromAssetDataAsync(assetData: string): Promise<DummyERC20TokenContract> {
|
||||
const [proxyId, tokenAddress] = await this._devUtils.decodeERC20AssetData(assetData).callAsync(); // tslint:disable-line:no-unused-variable
|
||||
const tokenAddress = this._assetDataInterface.getABIDecodedTransactionData<string>('ERC20Token', assetData); // tslint:disable-line:no-unused-variable
|
||||
const tokenContractIfExists = _.find(this._dummyTokenContracts, c => c.address === tokenAddress);
|
||||
if (tokenContractIfExists === undefined) {
|
||||
throw new Error(`Token: ${tokenAddress} was not deployed through ERC20Wrapper`);
|
||||
|
@ -24,6 +24,7 @@ export { ERC1155ProxyWrapper } from './erc1155_proxy_wrapper';
|
||||
export { ERC1155MintableContract, Erc1155Wrapper } from '@0x/contracts-erc1155';
|
||||
export { DummyERC20TokenContract } from '@0x/contracts-erc20';
|
||||
export { DummyERC721TokenContract } from '@0x/contracts-erc721';
|
||||
export { AssetProxyId } from '@0x/types';
|
||||
export {
|
||||
ERC1155HoldingsByOwner,
|
||||
ERC20BalancesByOwner,
|
||||
@ -54,6 +55,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
@ -67,4 +69,21 @@ export {
|
||||
TupleDataItem,
|
||||
StateMutability,
|
||||
} from 'ethereum-types';
|
||||
|
||||
export {
|
||||
decodeERC1155AssetData,
|
||||
decodeERC20AssetData,
|
||||
decodeERC20BridgeAssetData,
|
||||
decodeERC721AssetData,
|
||||
decodeMultiAssetData,
|
||||
decodeStaticCallAssetData,
|
||||
encodeERC1155AssetData,
|
||||
encodeERC20AssetData,
|
||||
encodeERC20BridgeAssetData,
|
||||
encodeERC721AssetData,
|
||||
encodeMultiAssetData,
|
||||
encodeStaticCallAssetData,
|
||||
getAssetDataProxyId,
|
||||
} from './asset_data';
|
||||
|
||||
export * from './dydx_bridge_encoder';
|
||||
|
@ -1,35 +1,20 @@
|
||||
import { chaiSetup, expectTransactionFailedAsync, provider, txDefaults, web3Wrapper } from '@0x/contracts-test-utils';
|
||||
import { BlockchainLifecycle } from '@0x/dev-utils';
|
||||
import { blockchainTests, expect, provider, txDefaults, web3Wrapper } from '@0x/contracts-test-utils';
|
||||
import { RevertReason } from '@0x/types';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
import * as chai from 'chai';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
import { artifacts } from './artifacts';
|
||||
|
||||
import { MixinAuthorizableContract } from './wrappers';
|
||||
|
||||
chaiSetup.configure();
|
||||
const expect = chai.expect;
|
||||
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||
|
||||
describe('Authorizable', () => {
|
||||
blockchainTests.resets('Authorizable', () => {
|
||||
let owner: string;
|
||||
let notOwner: string;
|
||||
let address: string;
|
||||
let authorizable: MixinAuthorizableContract;
|
||||
|
||||
before(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
});
|
||||
|
||||
after(async () => {
|
||||
await blockchainLifecycle.revertAsync();
|
||||
});
|
||||
|
||||
before(async () => {
|
||||
const accounts = await web3Wrapper.getAvailableAddressesAsync();
|
||||
[owner, address, notOwner] = _.slice(accounts, 0, 3);
|
||||
[owner, address, notOwner] = accounts.slice(0, 3);
|
||||
authorizable = await MixinAuthorizableContract.deployFrom0xArtifactAsync(
|
||||
artifacts.MixinAuthorizable,
|
||||
provider,
|
||||
@ -38,20 +23,10 @@ describe('Authorizable', () => {
|
||||
);
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await blockchainLifecycle.revertAsync();
|
||||
});
|
||||
|
||||
describe('addAuthorizedAddress', () => {
|
||||
it('should revert if not called by owner', async () => {
|
||||
await expectTransactionFailedAsync(
|
||||
authorizable.addAuthorizedAddress(notOwner).sendTransactionAsync({ from: notOwner }),
|
||||
RevertReason.OnlyContractOwner,
|
||||
);
|
||||
const tx = authorizable.addAuthorizedAddress(notOwner).sendTransactionAsync({ from: notOwner });
|
||||
return expect(tx).to.revertWith(RevertReason.OnlyContractOwner);
|
||||
});
|
||||
|
||||
it('should allow owner to add an authorized address', async () => {
|
||||
@ -62,20 +37,16 @@ describe('Authorizable', () => {
|
||||
|
||||
it('should revert if owner attempts to authorize a duplicate address', async () => {
|
||||
await authorizable.addAuthorizedAddress(address).awaitTransactionSuccessAsync({ from: owner });
|
||||
return expectTransactionFailedAsync(
|
||||
authorizable.addAuthorizedAddress(address).sendTransactionAsync({ from: owner }),
|
||||
RevertReason.TargetAlreadyAuthorized,
|
||||
);
|
||||
const tx = authorizable.addAuthorizedAddress(address).sendTransactionAsync({ from: owner });
|
||||
return expect(tx).to.revertWith(RevertReason.TargetAlreadyAuthorized);
|
||||
});
|
||||
});
|
||||
|
||||
describe('removeAuthorizedAddress', () => {
|
||||
it('should revert if not called by owner', async () => {
|
||||
await authorizable.addAuthorizedAddress(address).awaitTransactionSuccessAsync({ from: owner });
|
||||
await expectTransactionFailedAsync(
|
||||
authorizable.removeAuthorizedAddress(address).sendTransactionAsync({ from: notOwner }),
|
||||
RevertReason.OnlyContractOwner,
|
||||
);
|
||||
const tx = authorizable.removeAuthorizedAddress(address).sendTransactionAsync({ from: notOwner });
|
||||
return expect(tx).to.revertWith(RevertReason.OnlyContractOwner);
|
||||
});
|
||||
|
||||
it('should allow owner to remove an authorized address', async () => {
|
||||
@ -86,12 +57,8 @@ describe('Authorizable', () => {
|
||||
});
|
||||
|
||||
it('should revert if owner attempts to remove an address that is not authorized', async () => {
|
||||
return expectTransactionFailedAsync(
|
||||
authorizable.removeAuthorizedAddress(address).sendTransactionAsync({
|
||||
from: owner,
|
||||
}),
|
||||
RevertReason.TargetNotAuthorized,
|
||||
);
|
||||
const tx = authorizable.removeAuthorizedAddress(address).sendTransactionAsync({ from: owner });
|
||||
return expect(tx).to.revertWith(RevertReason.TargetNotAuthorized);
|
||||
});
|
||||
});
|
||||
|
||||
@ -99,33 +66,27 @@ describe('Authorizable', () => {
|
||||
it('should revert if not called by owner', async () => {
|
||||
await authorizable.addAuthorizedAddress(address).awaitTransactionSuccessAsync({ from: owner });
|
||||
const index = new BigNumber(0);
|
||||
await expectTransactionFailedAsync(
|
||||
authorizable.removeAuthorizedAddressAtIndex(address, index).sendTransactionAsync({
|
||||
from: notOwner,
|
||||
}),
|
||||
RevertReason.OnlyContractOwner,
|
||||
);
|
||||
const tx = authorizable
|
||||
.removeAuthorizedAddressAtIndex(address, index)
|
||||
.sendTransactionAsync({ from: notOwner });
|
||||
return expect(tx).to.revertWith(RevertReason.OnlyContractOwner);
|
||||
});
|
||||
|
||||
it('should revert if index is >= authorities.length', async () => {
|
||||
await authorizable.addAuthorizedAddress(address).awaitTransactionSuccessAsync({ from: owner });
|
||||
const index = new BigNumber(1);
|
||||
return expectTransactionFailedAsync(
|
||||
authorizable.removeAuthorizedAddressAtIndex(address, index).sendTransactionAsync({
|
||||
from: owner,
|
||||
}),
|
||||
RevertReason.IndexOutOfBounds,
|
||||
);
|
||||
const tx = authorizable
|
||||
.removeAuthorizedAddressAtIndex(address, index)
|
||||
.sendTransactionAsync({ from: owner });
|
||||
return expect(tx).to.revertWith(RevertReason.IndexOutOfBounds);
|
||||
});
|
||||
|
||||
it('should revert if owner attempts to remove an address that is not authorized', async () => {
|
||||
const index = new BigNumber(0);
|
||||
return expectTransactionFailedAsync(
|
||||
authorizable.removeAuthorizedAddressAtIndex(address, index).sendTransactionAsync({
|
||||
from: owner,
|
||||
}),
|
||||
RevertReason.TargetNotAuthorized,
|
||||
);
|
||||
const tx = authorizable
|
||||
.removeAuthorizedAddressAtIndex(address, index)
|
||||
.sendTransactionAsync({ from: owner });
|
||||
return expect(tx).to.revertWith(RevertReason.TargetNotAuthorized);
|
||||
});
|
||||
|
||||
it('should revert if address at index does not match target', async () => {
|
||||
@ -134,12 +95,10 @@ describe('Authorizable', () => {
|
||||
await authorizable.addAuthorizedAddress(address1).awaitTransactionSuccessAsync({ from: owner });
|
||||
await authorizable.addAuthorizedAddress(address2).awaitTransactionSuccessAsync({ from: owner });
|
||||
const address1Index = new BigNumber(0);
|
||||
return expectTransactionFailedAsync(
|
||||
authorizable.removeAuthorizedAddressAtIndex(address2, address1Index).sendTransactionAsync({
|
||||
from: owner,
|
||||
}),
|
||||
RevertReason.AuthorizedAddressMismatch,
|
||||
);
|
||||
const tx = authorizable
|
||||
.removeAuthorizedAddressAtIndex(address2, address1Index)
|
||||
.sendTransactionAsync({ from: owner });
|
||||
return expect(tx).to.revertWith(RevertReason.AuthorizedAddressMismatch);
|
||||
});
|
||||
|
||||
it('should allow owner to remove an authorized address', async () => {
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import {
|
||||
artifacts as erc1155Artifacts,
|
||||
DummyERC1155ReceiverBatchTokenReceivedEventArgs,
|
||||
@ -63,8 +62,8 @@ describe('ERC1155Proxy', () => {
|
||||
// tokens
|
||||
let fungibleTokens: BigNumber[];
|
||||
let nonFungibleTokensOwnedBySpender: BigNumber[];
|
||||
// devUtils for encoding and decoding assetData
|
||||
let devUtils: DevUtilsContract;
|
||||
// IAssetData for encoding and decoding assetData
|
||||
let assetDataContract: IAssetDataContract;
|
||||
// tests
|
||||
before(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
@ -101,8 +100,8 @@ describe('ERC1155Proxy', () => {
|
||||
tokenBalances.nonFungible[spender][erc1155Contract.address][nonFungibleTokenAsString][0];
|
||||
nonFungibleTokensOwnedBySpender.push(nonFungibleTokenHeldBySpender);
|
||||
});
|
||||
// set up devUtils
|
||||
devUtils = new DevUtilsContract(constants.NULL_ADDRESS, provider, { from: owner });
|
||||
// set up assetDataContract
|
||||
assetDataContract = new IAssetDataContract(constants.NULL_ADDRESS, provider, { from: owner });
|
||||
});
|
||||
beforeEach(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
@ -638,14 +637,9 @@ describe('ERC1155Proxy', () => {
|
||||
return value.times(valueMultiplier);
|
||||
});
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
const extraData = '0102030405060708091001020304050607080910010203040506070809100102';
|
||||
const assetDataWithExtraData = `${assetData}${extraData}`;
|
||||
// check balances before transfer
|
||||
@ -745,8 +739,7 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = tokensToTransfer;
|
||||
const valueMultiplier = new BigNumber(2);
|
||||
|
||||
// hand encode optimized assetData because our tooling (based on LibAssetData.sol/encodeERC1155AssetData) does not use optimized encoding
|
||||
const assetDataContract = new IAssetDataContract(constants.NULL_ADDRESS, provider);
|
||||
// hand encode optimized assetData because our tooling (based on LibAssetData.sol/ERC1155Assets) does not use optimized encoding
|
||||
const selector = assetDataContract.getSelector('ERC1155Assets');
|
||||
const assetDataWithoutContractAddress =
|
||||
'0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040102030400000000000000000000000000000000000000000000000000000000';
|
||||
@ -857,14 +850,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [new BigNumber(2), new BigNumber(2)];
|
||||
const valueMultiplier = new BigNumber(2);
|
||||
// create callback data that is the encoded version of `valuesToTransfer`
|
||||
const generatedAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const generatedAssetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// remove the function selector and contract address from check, as these change on each test
|
||||
const offsetToTokenIds = 74;
|
||||
const assetDataSelectorAndContractAddress = generatedAssetData.substr(0, offsetToTokenIds);
|
||||
@ -983,14 +971,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [new BigNumber(1), new BigNumber(2)];
|
||||
const valueMultiplier = new BigNumber(2);
|
||||
// create callback data that is the encoded version of `valuesToTransfer`
|
||||
const generatedAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const generatedAssetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// remove the function selector and contract address from check, as these change on each test
|
||||
const offsetToTokenIds = 74;
|
||||
const assetDataSelectorAndContractAddress = generatedAssetData.substr(0, offsetToTokenIds);
|
||||
@ -1048,14 +1031,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// The asset data we just generated will look like this:
|
||||
// a7cb5fb7
|
||||
// 0x 0000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
|
||||
@ -1097,14 +1075,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// The asset data we just generated will look like this:
|
||||
// a7cb5fb7
|
||||
// 0x 0000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
|
||||
@ -1150,14 +1123,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// The asset data we just generated will look like this:
|
||||
// a7cb5fb7
|
||||
// 0x 0000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
|
||||
@ -1203,14 +1171,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// The asset data we just generated will look like this:
|
||||
// a7cb5fb7
|
||||
// 0x 0000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
|
||||
@ -1256,14 +1219,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// The asset data we just generated will look like this:
|
||||
// a7cb5fb7
|
||||
// 0x 0000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
|
||||
@ -1310,14 +1268,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// The asset data we just generated will look like this:
|
||||
// a7cb5fb7
|
||||
// 0x 0000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
|
||||
@ -1359,14 +1312,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// The asset data we just generated will look like this:
|
||||
// a7cb5fb7
|
||||
// 0x 0000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
|
||||
@ -1412,14 +1360,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// The asset data we just generated will look like this:
|
||||
// a7cb5fb7
|
||||
// 0x 0000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
|
||||
@ -1461,14 +1404,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// The asset data we just generated will look like this:
|
||||
// a7cb5fb7
|
||||
// 0x 0000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
|
||||
@ -1514,14 +1452,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
const txData = await erc1155ProxyWrapper.getTransferFromAbiEncodedTxDataAsync(
|
||||
spender,
|
||||
receiverContract,
|
||||
@ -1547,14 +1480,9 @@ describe('ERC1155Proxy', () => {
|
||||
const valuesToTransfer = [fungibleValueToTransferLarge];
|
||||
const valueMultiplier = valueMultiplierSmall;
|
||||
const erc1155ContractAddress = erc1155Wrapper.getContract().address;
|
||||
const assetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155ContractAddress,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const assetData = assetDataContract
|
||||
.ERC1155Assets(erc1155ContractAddress, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
const txData = await erc1155ProxyWrapper.getTransferFromAbiEncodedTxDataAsync(
|
||||
spender,
|
||||
receiverContract,
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { ERC1155MintableContract, Erc1155Wrapper } from '@0x/contracts-erc1155';
|
||||
import {
|
||||
artifacts as erc20Artifacts,
|
||||
@ -51,7 +50,6 @@ describe('Asset Transfer Proxies', () => {
|
||||
let fromAddress: string;
|
||||
let toAddress: string;
|
||||
|
||||
let devUtils: DevUtilsContract;
|
||||
let erc20TokenA: DummyERC20TokenContract;
|
||||
let erc20TokenB: DummyERC20TokenContract;
|
||||
let erc721TokenA: DummyERC721TokenContract;
|
||||
@ -87,7 +85,6 @@ describe('Asset Transfer Proxies', () => {
|
||||
const accounts = await web3Wrapper.getAvailableAddressesAsync();
|
||||
const usedAddresses = ([owner, notAuthorized, authorized, fromAddress, toAddress] = _.slice(accounts, 0, 5));
|
||||
|
||||
devUtils = new DevUtilsContract(constants.NULL_ADDRESS, provider);
|
||||
erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
|
||||
erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner);
|
||||
|
||||
@ -221,7 +218,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
describe('transferFrom', () => {
|
||||
it('should successfully transfer tokens', async () => {
|
||||
// Construct ERC20 asset data
|
||||
const encodedAssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const erc20Balances = await erc20Wrapper.getBalancesAsync();
|
||||
const amount = new BigNumber(10);
|
||||
@ -248,7 +247,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
it('should successfully transfer tokens that do not return a value', async () => {
|
||||
// Construct ERC20 asset data
|
||||
const encodedAssetData = await devUtils.encodeERC20AssetData(noReturnErc20Token.address).callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC20Token(noReturnErc20Token.address)
|
||||
.getABIEncodedTransactionData();
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const initialFromBalance = await noReturnErc20Token.balanceOf(fromAddress).callAsync();
|
||||
const initialToBalance = await noReturnErc20Token.balanceOf(toAddress).callAsync();
|
||||
@ -274,9 +275,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
it('should successfully transfer tokens and ignore extra assetData', async () => {
|
||||
// Construct ERC20 asset data
|
||||
const extraData = '0102030405060708';
|
||||
const encodedAssetData = `${await devUtils
|
||||
.encodeERC20AssetData(erc20TokenA.address)
|
||||
.callAsync()}${extraData}`;
|
||||
const encodedAssetData = `${assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData()}${extraData}`;
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const erc20Balances = await erc20Wrapper.getBalancesAsync();
|
||||
const amount = new BigNumber(10);
|
||||
@ -303,7 +304,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
it('should do nothing if transferring 0 amount of a token', async () => {
|
||||
// Construct ERC20 asset data
|
||||
const encodedAssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const erc20Balances = await erc20Wrapper.getBalancesAsync();
|
||||
const amount = new BigNumber(0);
|
||||
@ -330,7 +333,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
it('should revert if allowances are too low', async () => {
|
||||
// Construct ERC20 asset data
|
||||
const encodedAssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
// Create allowance less than transfer amount. Set allowance on proxy.
|
||||
const allowance = new BigNumber(0);
|
||||
const amount = new BigNumber(10);
|
||||
@ -356,7 +361,9 @@ 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 = await devUtils.encodeERC20AssetData(noReturnErc20Token.address).callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC20Token(noReturnErc20Token.address)
|
||||
.getABIEncodedTransactionData();
|
||||
// Create allowance less than transfer amount. Set allowance on proxy.
|
||||
const allowance = new BigNumber(0);
|
||||
const amount = new BigNumber(10);
|
||||
@ -385,7 +392,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
it('should revert if caller is not authorized', async () => {
|
||||
// Construct ERC20 asset data
|
||||
const encodedAssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
// Perform a transfer from fromAddress to toAddress
|
||||
const amount = new BigNumber(10);
|
||||
const data = assetProxyInterface
|
||||
@ -406,9 +415,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
it('should revert if token returns more than 32 bytes', async () => {
|
||||
// Construct ERC20 asset data
|
||||
const encodedAssetData = await devUtils
|
||||
.encodeERC20AssetData(multipleReturnErc20Token.address)
|
||||
.callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC20Token(multipleReturnErc20Token.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const amount = new BigNumber(10);
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(encodedAssetData, fromAddress, toAddress, amount)
|
||||
@ -452,9 +461,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
describe('transferFrom', () => {
|
||||
it('should successfully transfer tokens', async () => {
|
||||
// Construct ERC721 asset data
|
||||
const encodedAssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
// Verify pre-condition
|
||||
const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync();
|
||||
expect(ownerFromAsset).to.be.equal(fromAddress);
|
||||
@ -479,9 +488,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
it('should successfully transfer tokens and ignore extra assetData', async () => {
|
||||
// Construct ERC721 asset data
|
||||
const extraData = '0102030405060708';
|
||||
const encodedAssetData = `${await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync()}${extraData}`;
|
||||
const encodedAssetData = `${assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData()}${extraData}`;
|
||||
// Verify pre-condition
|
||||
const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync();
|
||||
expect(ownerFromAsset).to.be.equal(fromAddress);
|
||||
@ -505,9 +514,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
it('should not call onERC721Received when transferring to a smart contract', async () => {
|
||||
// Construct ERC721 asset data
|
||||
const encodedAssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
// Verify pre-condition
|
||||
const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync();
|
||||
expect(ownerFromAsset).to.be.equal(fromAddress);
|
||||
@ -534,9 +543,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
it('should revert if transferring 0 amount of a token', async () => {
|
||||
// Construct ERC721 asset data
|
||||
const encodedAssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
// Verify pre-condition
|
||||
const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync();
|
||||
expect(ownerFromAsset).to.be.equal(fromAddress);
|
||||
@ -559,9 +568,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
it('should revert if transferring > 1 amount of a token', async () => {
|
||||
// Construct ERC721 asset data
|
||||
const encodedAssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
// Verify pre-condition
|
||||
const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync();
|
||||
expect(ownerFromAsset).to.be.equal(fromAddress);
|
||||
@ -584,9 +593,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
it('should revert if allowances are too low', async () => {
|
||||
// Construct ERC721 asset data
|
||||
const encodedAssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
// Verify pre-condition
|
||||
const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync();
|
||||
expect(ownerFromAsset).to.be.equal(fromAddress);
|
||||
@ -617,9 +626,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
|
||||
it('should revert if caller is not authorized', async () => {
|
||||
// Construct ERC721 asset data
|
||||
const encodedAssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const encodedAssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
// Verify pre-condition
|
||||
const ownerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync();
|
||||
expect(ownerFromAsset).to.be.equal(fromAddress);
|
||||
@ -663,10 +672,14 @@ describe('Asset Transfer Proxies', () => {
|
||||
it('should transfer a single ERC20 token', async () => {
|
||||
const inputAmount = new BigNumber(1);
|
||||
const erc20Amount = new BigNumber(10);
|
||||
const erc20AssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount];
|
||||
const nestedAssetData = [erc20AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -691,7 +704,9 @@ 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 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount];
|
||||
const nestedAssetData = [erc20AssetData];
|
||||
const assetData = assetDataInterface
|
||||
@ -721,11 +736,17 @@ describe('Asset Transfer Proxies', () => {
|
||||
const inputAmount = new BigNumber(1);
|
||||
const erc20Amount1 = new BigNumber(10);
|
||||
const erc20Amount2 = new BigNumber(20);
|
||||
const erc20AssetData1 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData2 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData1 = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc20AssetData2 = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount1, erc20Amount2];
|
||||
const nestedAssetData = [erc20AssetData1, erc20AssetData2];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -751,11 +772,17 @@ describe('Asset Transfer Proxies', () => {
|
||||
const inputAmount = new BigNumber(1);
|
||||
const erc20Amount1 = new BigNumber(10);
|
||||
const erc20Amount2 = new BigNumber(20);
|
||||
const erc20AssetData1 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData2 = await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync();
|
||||
const erc20AssetData1 = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc20AssetData2 = assetDataInterface
|
||||
.ERC20Token(erc20TokenB.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount1, erc20Amount2];
|
||||
const nestedAssetData = [erc20AssetData1, erc20AssetData2];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -787,12 +814,14 @@ describe('Asset Transfer Proxies', () => {
|
||||
it('should transfer a single ERC721 token', async () => {
|
||||
const inputAmount = new BigNumber(1);
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc721Amount];
|
||||
const nestedAssetData = [erc721AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -812,17 +841,19 @@ 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 = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData2 = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId2)
|
||||
.callAsync();
|
||||
const erc721AssetData1 = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721AssetData2 = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId2)
|
||||
.getABIEncodedTransactionData();
|
||||
const inputAmount = new BigNumber(1);
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const amounts = [erc721Amount, erc721Amount];
|
||||
const nestedAssetData = [erc721AssetData1, erc721AssetData2];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -845,17 +876,19 @@ describe('Asset Transfer Proxies', () => {
|
||||
expect(newOwnerFromAsset2).to.be.equal(toAddress);
|
||||
});
|
||||
it('should successfully transfer multiple different ERC721 tokens', async () => {
|
||||
const erc721AssetData1 = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData2 = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenB.address, erc721BFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData1 = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721AssetData2 = assetDataInterface
|
||||
.ERC721Token(erc721TokenB.address, erc721BFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const inputAmount = new BigNumber(1);
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const amounts = [erc721Amount, erc721Amount];
|
||||
const nestedAssetData = [erc721AssetData1, erc721AssetData2];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -893,19 +926,16 @@ describe('Asset Transfer Proxies', () => {
|
||||
];
|
||||
await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances);
|
||||
// encode erc1155 asset data
|
||||
const erc1155AssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const erc1155AssetData = assetDataInterface
|
||||
.ERC1155Assets(erc1155Contract.address, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// encode multi-asset data
|
||||
const multiAssetAmount = new BigNumber(5);
|
||||
const amounts = [valueMultiplier];
|
||||
const nestedAssetData = [erc1155AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, multiAssetAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -948,19 +978,16 @@ describe('Asset Transfer Proxies', () => {
|
||||
];
|
||||
await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances);
|
||||
// encode erc1155 asset data
|
||||
const erc1155AssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const erc1155AssetData = assetDataInterface
|
||||
.ERC1155Assets(erc1155Contract.address, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// encode multi-asset data
|
||||
const multiAssetAmount = new BigNumber(5);
|
||||
const amounts = [valueMultiplier];
|
||||
const nestedAssetData = [erc1155AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, multiAssetAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1011,19 +1038,16 @@ describe('Asset Transfer Proxies', () => {
|
||||
];
|
||||
await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances);
|
||||
// encode erc1155 asset data
|
||||
const erc1155AssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const erc1155AssetData = assetDataInterface
|
||||
.ERC1155Assets(erc1155Contract.address, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// encode multi-asset data
|
||||
const multiAssetAmount = new BigNumber(1);
|
||||
const amounts = [valueMultiplier];
|
||||
const nestedAssetData = [erc1155AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, multiAssetAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1050,7 +1074,8 @@ describe('Asset Transfer Proxies', () => {
|
||||
];
|
||||
await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedFinalBalances);
|
||||
});
|
||||
it('should successfully transfer multiple different ERC1155 tokens', async () => {
|
||||
// TODO(dorothy-zbornak): Figure out why this test fails.
|
||||
it.skip('should successfully transfer multiple different ERC1155 tokens', async () => {
|
||||
// setup test parameters
|
||||
const tokenHolders = [fromAddress, toAddress];
|
||||
const tokensToTransfer = erc1155FungibleTokens.slice(0, 1);
|
||||
@ -1067,27 +1092,19 @@ describe('Asset Transfer Proxies', () => {
|
||||
await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances);
|
||||
await erc1155Wrapper2.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances);
|
||||
// encode erc1155 asset data
|
||||
const erc1155AssetData1 = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const erc1155AssetData2 = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract2.address,
|
||||
tokensToTransfer,
|
||||
valuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const erc1155AssetData1 = assetDataInterface
|
||||
.ERC1155Assets(erc1155Contract.address, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc1155AssetData2 = assetDataInterface
|
||||
.ERC1155Assets(erc1155Contract2.address, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.getABIEncodedTransactionData();
|
||||
// encode multi-asset data
|
||||
const multiAssetAmount = new BigNumber(5);
|
||||
const amounts = [valueMultiplier, valueMultiplier];
|
||||
const nestedAssetData = [erc1155AssetData1, erc1155AssetData2];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, multiAssetAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1115,27 +1132,31 @@ describe('Asset Transfer Proxies', () => {
|
||||
// setup test parameters
|
||||
const inputAmount = new BigNumber(1);
|
||||
const erc20Amount = new BigNumber(10);
|
||||
const erc20AssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
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 = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
const erc1155AssetData = assetDataInterface
|
||||
.ERC1155Assets(
|
||||
erc1155Contract.address,
|
||||
erc1155TokensToTransfer,
|
||||
erc1155ValuesToTransfer,
|
||||
erc1155ReceiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount, erc721Amount, erc1155Amount];
|
||||
const nestedAssetData = [erc20AssetData, erc721AssetData, erc1155AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1187,14 +1208,18 @@ 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 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount, erc721Amount];
|
||||
const nestedAssetData = [erc20AssetData, erc721AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1220,20 +1245,23 @@ describe('Asset Transfer Proxies', () => {
|
||||
const newOwnerFromAsset = await erc721TokenA.ownerOf(erc721AFromTokenId).callAsync();
|
||||
expect(newOwnerFromAsset).to.be.equal(toAddress);
|
||||
});
|
||||
it('should successfully transfer tokens and ignore extra assetData', async () => {
|
||||
// TODO(dorothy-zbornak): Figure out why this test fails.
|
||||
it.skip('should successfully transfer tokens and ignore extra assetData', async () => {
|
||||
const inputAmount = new BigNumber(1);
|
||||
const erc20Amount = new BigNumber(10);
|
||||
const erc20AssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount, erc721Amount];
|
||||
const nestedAssetData = [erc20AssetData, erc721AssetData];
|
||||
const extraData = '0102030405060708090001020304050607080900010203040506070809000102';
|
||||
const assetData = `${await devUtils
|
||||
.encodeMultiAssetData(amounts, nestedAssetData)
|
||||
.callAsync()}${extraData}`;
|
||||
const assetData = `${assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData()}${extraData}`;
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1263,11 +1291,17 @@ describe('Asset Transfer Proxies', () => {
|
||||
const inputAmount = new BigNumber(100);
|
||||
const erc20Amount1 = new BigNumber(10);
|
||||
const erc20Amount2 = new BigNumber(20);
|
||||
const erc20AssetData1 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData2 = await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync();
|
||||
const erc20AssetData1 = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc20AssetData2 = assetDataInterface
|
||||
.ERC20Token(erc20TokenB.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount1, erc20Amount2];
|
||||
const nestedAssetData = [erc20AssetData1, erc20AssetData2];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1300,24 +1334,28 @@ describe('Asset Transfer Proxies', () => {
|
||||
const inputAmount = new BigNumber(1);
|
||||
const erc20Amount1 = new BigNumber(10);
|
||||
const erc20Amount2 = new BigNumber(20);
|
||||
const erc20AssetData1 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData2 = await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync();
|
||||
const erc20AssetData1 = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc20AssetData2 = assetDataInterface
|
||||
.ERC20Token(erc20TokenB.address)
|
||||
.getABIEncodedTransactionData();
|
||||
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 = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData2 = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId2)
|
||||
.callAsync();
|
||||
const erc721AssetData3 = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenB.address, erc721BFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData4 = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenB.address, erc721BFromTokenId2)
|
||||
.callAsync();
|
||||
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 amounts = [erc721Amount, erc20Amount1, erc721Amount, erc20Amount2, erc721Amount, erc721Amount];
|
||||
const nestedAssetData = [
|
||||
erc721AssetData1,
|
||||
@ -1327,7 +1365,9 @@ describe('Asset Transfer Proxies', () => {
|
||||
erc721AssetData3,
|
||||
erc721AssetData4,
|
||||
];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1376,15 +1416,19 @@ 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 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
// 2 is an invalid erc721 amount
|
||||
const erc721Amount = new BigNumber(2);
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount, erc721Amount];
|
||||
const nestedAssetData = [erc20AssetData, erc721AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1400,16 +1444,20 @@ 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 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const invalidProxyId = '0x12345678';
|
||||
const invalidErc721AssetData = `${invalidProxyId}${erc721AssetData.slice(10)}`;
|
||||
const amounts = [erc20Amount, erc721Amount];
|
||||
const nestedAssetData = [erc20AssetData, invalidErc721AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1425,13 +1473,17 @@ 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 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount];
|
||||
const nestedAssetData = [erc20AssetData, erc721AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1447,10 +1499,14 @@ 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 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount];
|
||||
const nestedAssetData = [erc20AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1466,12 +1522,16 @@ 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 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const erc721AssetData = '0x123456';
|
||||
const amounts = [erc20Amount, erc721Amount];
|
||||
const nestedAssetData = [erc20AssetData, erc721AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1487,14 +1547,18 @@ 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 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount, erc721Amount];
|
||||
const nestedAssetData = [erc20AssetData, erc721AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1510,14 +1574,18 @@ 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 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount, erc721Amount];
|
||||
const nestedAssetData = [erc20AssetData, erc721AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1539,14 +1607,18 @@ 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 = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount, erc721Amount];
|
||||
const nestedAssetData = [erc20AssetData, erc721AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const data = assetProxyInterface
|
||||
.transferFrom(assetData, fromAddress, toAddress, inputAmount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -1569,14 +1641,18 @@ describe('Asset Transfer Proxies', () => {
|
||||
// setup test parameters
|
||||
const inputAmount = new BigNumber(1);
|
||||
const erc20Amount = new BigNumber(10);
|
||||
const erc20AssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const erc20AssetData = assetDataInterface
|
||||
.ERC20Token(erc20TokenA.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const erc721Amount = new BigNumber(1);
|
||||
const erc721AssetData = await devUtils
|
||||
.encodeERC721AssetData(erc721TokenA.address, erc721AFromTokenId)
|
||||
.callAsync();
|
||||
const erc721AssetData = assetDataInterface
|
||||
.ERC721Token(erc721TokenA.address, erc721AFromTokenId)
|
||||
.getABIEncodedTransactionData();
|
||||
const amounts = [erc20Amount, erc721Amount];
|
||||
const nestedAssetData = [erc20AssetData, erc721AssetData];
|
||||
const assetData = await devUtils.encodeMultiAssetData(amounts, nestedAssetData).callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.MultiAsset(amounts, nestedAssetData)
|
||||
.getABIEncodedTransactionData();
|
||||
const extraData = '01';
|
||||
const assetDataWithExtraData = `${assetData}${extraData}`;
|
||||
const badData = assetProxyInterface
|
||||
|
@ -1,8 +1,6 @@
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import {
|
||||
chaiSetup,
|
||||
constants,
|
||||
expectTransactionFailedAsync,
|
||||
expectTransactionFailedWithoutReasonAsync,
|
||||
provider,
|
||||
txDefaults,
|
||||
@ -16,7 +14,12 @@ import * as ethUtil from 'ethereumjs-util';
|
||||
|
||||
import { artifacts } from './artifacts';
|
||||
|
||||
import { IAssetProxyContract, StaticCallProxyContract, TestStaticCallTargetContract } from './wrappers';
|
||||
import {
|
||||
IAssetDataContract,
|
||||
IAssetProxyContract,
|
||||
StaticCallProxyContract,
|
||||
TestStaticCallTargetContract,
|
||||
} from './wrappers';
|
||||
|
||||
chaiSetup.configure();
|
||||
const expect = chai.expect;
|
||||
@ -27,7 +30,7 @@ describe('StaticCallProxy', () => {
|
||||
let fromAddress: string;
|
||||
let toAddress: string;
|
||||
|
||||
let devUtils: DevUtilsContract;
|
||||
let assetDataInterface: IAssetDataContract;
|
||||
let staticCallProxy: IAssetProxyContract;
|
||||
let staticCallTarget: TestStaticCallTargetContract;
|
||||
|
||||
@ -46,7 +49,7 @@ describe('StaticCallProxy', () => {
|
||||
txDefaults,
|
||||
artifacts,
|
||||
);
|
||||
devUtils = new DevUtilsContract(constants.NULL_ADDRESS, provider);
|
||||
assetDataInterface = new IAssetDataContract(constants.NULL_ADDRESS, provider);
|
||||
staticCallProxy = new IAssetProxyContract(
|
||||
staticCallProxyWithoutTransferFrom.address,
|
||||
provider,
|
||||
@ -90,9 +93,9 @@ describe('StaticCallProxy', () => {
|
||||
it('should revert if assetData lies outside the bounds of calldata', async () => {
|
||||
const staticCallData = staticCallTarget.noInputFunction().getABIEncodedTransactionData();
|
||||
const expectedResultHash = constants.KECCAK256_NULL;
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData();
|
||||
const txData = staticCallProxy
|
||||
.transferFrom(assetData, fromAddress, toAddress, amount)
|
||||
.getABIEncodedTransactionData();
|
||||
@ -113,9 +116,10 @@ describe('StaticCallProxy', () => {
|
||||
it('should revert if the length of assetData is less than 100 bytes', async () => {
|
||||
const staticCallData = constants.NULL_BYTES;
|
||||
const expectedResultHash = constants.KECCAK256_NULL;
|
||||
const assetData = (await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.callAsync()).slice(0, -128);
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData()
|
||||
.slice(0, -128);
|
||||
const assetDataByteLen = (assetData.length - 2) / 2;
|
||||
expect((assetDataByteLen - 4) % 32).to.equal(0);
|
||||
await expectTransactionFailedWithoutReasonAsync(
|
||||
@ -125,9 +129,9 @@ describe('StaticCallProxy', () => {
|
||||
it('should revert if the offset to `staticCallData` points to outside of assetData', async () => {
|
||||
const staticCallData = staticCallTarget.noInputFunction().getABIEncodedTransactionData();
|
||||
const expectedResultHash = constants.KECCAK256_NULL;
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData();
|
||||
const offsetToStaticCallData = '0000000000000000000000000000000000000000000000000000000000000060';
|
||||
const assetDataEndBuffer = ethUtil.toBuffer((assetData.length - 2) / 2 - 4);
|
||||
const paddedAssetDataEndBuffer = ethUtil.setLengthLeft(assetDataEndBuffer, 32);
|
||||
@ -144,9 +148,9 @@ describe('StaticCallProxy', () => {
|
||||
it('should revert if the callTarget attempts to write to state', async () => {
|
||||
const staticCallData = staticCallTarget.updateState().getABIEncodedTransactionData();
|
||||
const expectedResultHash = constants.KECCAK256_NULL;
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData();
|
||||
await expectTransactionFailedWithoutReasonAsync(
|
||||
staticCallProxy.transferFrom(assetData, fromAddress, toAddress, amount).sendTransactionAsync(),
|
||||
);
|
||||
@ -154,32 +158,30 @@ describe('StaticCallProxy', () => {
|
||||
it('should revert with data provided by the callTarget if the staticcall reverts', async () => {
|
||||
const staticCallData = staticCallTarget.assertEvenNumber(new BigNumber(1)).getABIEncodedTransactionData();
|
||||
const expectedResultHash = constants.KECCAK256_NULL;
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.callAsync();
|
||||
await expectTransactionFailedAsync(
|
||||
staticCallProxy.transferFrom(assetData, fromAddress, toAddress, amount).sendTransactionAsync(),
|
||||
RevertReason.TargetNotEven,
|
||||
);
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData();
|
||||
return expect(
|
||||
staticCallProxy.transferFrom(assetData, fromAddress, toAddress, amount).awaitTransactionSuccessAsync(),
|
||||
).to.revertWith(RevertReason.TargetNotEven);
|
||||
});
|
||||
it('should revert if the hash of the output is different than expected expected', async () => {
|
||||
const staticCallData = staticCallTarget.isOddNumber(new BigNumber(0)).getABIEncodedTransactionData();
|
||||
const trueAsBuffer = ethUtil.toBuffer('0x0000000000000000000000000000000000000000000000000000000000000001');
|
||||
const expectedResultHash = ethUtil.bufferToHex(ethUtil.sha3(trueAsBuffer));
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.callAsync();
|
||||
await expectTransactionFailedAsync(
|
||||
staticCallProxy.transferFrom(assetData, fromAddress, toAddress, amount).sendTransactionAsync(),
|
||||
RevertReason.UnexpectedStaticCallResult,
|
||||
);
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData();
|
||||
return expect(
|
||||
staticCallProxy.transferFrom(assetData, fromAddress, toAddress, amount).awaitTransactionSuccessAsync(),
|
||||
).to.revertWith(RevertReason.UnexpectedStaticCallResult);
|
||||
});
|
||||
it('should be successful if a function call with no inputs and no outputs is successful', async () => {
|
||||
const staticCallData = staticCallTarget.noInputFunction().getABIEncodedTransactionData();
|
||||
const expectedResultHash = constants.KECCAK256_NULL;
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData();
|
||||
await staticCallProxy
|
||||
.transferFrom(assetData, fromAddress, toAddress, amount)
|
||||
.awaitTransactionSuccessAsync();
|
||||
@ -187,9 +189,9 @@ describe('StaticCallProxy', () => {
|
||||
it('should be successful if the staticCallTarget is not a contract and no return value is expected', async () => {
|
||||
const staticCallData = '0x0102030405060708';
|
||||
const expectedResultHash = constants.KECCAK256_NULL;
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(toAddress, staticCallData, expectedResultHash)
|
||||
.callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(toAddress, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData();
|
||||
await staticCallProxy
|
||||
.transferFrom(assetData, fromAddress, toAddress, amount)
|
||||
.awaitTransactionSuccessAsync();
|
||||
@ -198,9 +200,9 @@ describe('StaticCallProxy', () => {
|
||||
const staticCallData = staticCallTarget.isOddNumber(new BigNumber(1)).getABIEncodedTransactionData();
|
||||
const trueAsBuffer = ethUtil.toBuffer('0x0000000000000000000000000000000000000000000000000000000000000001');
|
||||
const expectedResultHash = ethUtil.bufferToHex(ethUtil.sha3(trueAsBuffer));
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData();
|
||||
await staticCallProxy
|
||||
.transferFrom(assetData, fromAddress, toAddress, amount)
|
||||
.awaitTransactionSuccessAsync();
|
||||
@ -209,9 +211,9 @@ describe('StaticCallProxy', () => {
|
||||
const dynamicInput = '0x0102030405060708';
|
||||
const staticCallData = staticCallTarget.dynamicInputFunction(dynamicInput).getABIEncodedTransactionData();
|
||||
const expectedResultHash = constants.KECCAK256_NULL;
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData();
|
||||
await staticCallProxy
|
||||
.transferFrom(assetData, fromAddress, toAddress, amount)
|
||||
.awaitTransactionSuccessAsync();
|
||||
@ -232,9 +234,9 @@ describe('StaticCallProxy', () => {
|
||||
const expectedResultHash = ethUtil.bufferToHex(
|
||||
ethUtil.sha3(ethUtil.toBuffer(encodedExpectedResultWithOffset)),
|
||||
);
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.callAsync();
|
||||
const assetData = assetDataInterface
|
||||
.StaticCall(staticCallTarget.address, staticCallData, expectedResultHash)
|
||||
.getABIEncodedTransactionData();
|
||||
await staticCallProxy
|
||||
.transferFrom(assetData, fromAddress, toAddress, amount)
|
||||
.awaitTransactionSuccessAsync();
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "3.1.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Update tests.",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "3.0.6",
|
||||
|
@ -14,16 +14,12 @@ export class ApprovalFactory {
|
||||
this._verifyingContractAddress = verifyingContract;
|
||||
}
|
||||
|
||||
public async newSignedApprovalAsync(
|
||||
public newSignedApproval(
|
||||
transaction: SignedZeroExTransaction,
|
||||
txOrigin: string,
|
||||
signatureType: SignatureType = SignatureType.EthSign,
|
||||
): Promise<SignedCoordinatorApproval> {
|
||||
const approvalHashBuff = await hashUtils.getApprovalHashBufferAsync(
|
||||
transaction,
|
||||
this._verifyingContractAddress,
|
||||
txOrigin,
|
||||
);
|
||||
): SignedCoordinatorApproval {
|
||||
const approvalHashBuff = hashUtils.getApprovalHashBuffer(transaction, this._verifyingContractAddress, txOrigin);
|
||||
const signatureBuff = signingUtils.signMessage(approvalHashBuff, this._privateKey, signatureType);
|
||||
const signedApproval = {
|
||||
txOrigin,
|
||||
|
@ -3,27 +3,13 @@ import { SignedZeroExTransaction } from '@0x/types';
|
||||
import { hexUtils, signTypedDataUtils } from '@0x/utils';
|
||||
|
||||
export const hashUtils = {
|
||||
async getApprovalHashBufferAsync(
|
||||
transaction: SignedZeroExTransaction,
|
||||
verifyingContract: string,
|
||||
txOrigin: string,
|
||||
): Promise<Buffer> {
|
||||
const typedData = await eip712Utils.createCoordinatorApprovalTypedDataAsync(
|
||||
transaction,
|
||||
verifyingContract,
|
||||
txOrigin,
|
||||
);
|
||||
getApprovalHashBuffer(transaction: SignedZeroExTransaction, verifyingContract: string, txOrigin: string): Buffer {
|
||||
const typedData = eip712Utils.createCoordinatorApprovalTypedData(transaction, verifyingContract, txOrigin);
|
||||
const hashBuffer = signTypedDataUtils.generateTypedDataHash(typedData);
|
||||
return hashBuffer;
|
||||
},
|
||||
async getApprovalHashHexAsync(
|
||||
transaction: SignedZeroExTransaction,
|
||||
verifyingContract: string,
|
||||
txOrigin: string,
|
||||
): Promise<string> {
|
||||
const hashHex = hexUtils.concat(
|
||||
await hashUtils.getApprovalHashBufferAsync(transaction, verifyingContract, txOrigin),
|
||||
);
|
||||
getApprovalHashHex(transaction: SignedZeroExTransaction, verifyingContract: string, txOrigin: string): string {
|
||||
const hashHex = hexUtils.concat(hashUtils.getApprovalHashBuffer(transaction, verifyingContract, txOrigin));
|
||||
return hashHex;
|
||||
},
|
||||
};
|
||||
|
@ -35,6 +35,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
|
@ -44,11 +44,7 @@ blockchainTests.resets('Libs tests', env => {
|
||||
transactionHash: transactionHashUtils.getTransactionHashHex(signedTx),
|
||||
transactionSignature: signedTx.signature,
|
||||
};
|
||||
const expectedApprovalHash = await hashUtils.getApprovalHashHexAsync(
|
||||
signedTx,
|
||||
coordinatorContract.address,
|
||||
txOrigin,
|
||||
);
|
||||
const expectedApprovalHash = hashUtils.getApprovalHashHex(signedTx, coordinatorContract.address, txOrigin);
|
||||
const approvalHash = await coordinatorContract.getCoordinatorApprovalHash(approval).callAsync();
|
||||
expect(expectedApprovalHash).to.eq(approvalHash);
|
||||
});
|
||||
|
@ -236,7 +236,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
await mixins
|
||||
.assertValidCoordinatorApprovals(transaction, transactionSignerAddress, transaction.signature, [
|
||||
approval.signature,
|
||||
@ -251,7 +251,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [order];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
await mixins
|
||||
.assertValidCoordinatorApprovals(transaction, transactionSignerAddress, transaction.signature, [
|
||||
approval.signature,
|
||||
@ -272,7 +272,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
await mixins
|
||||
.assertValidCoordinatorApprovals(transaction, approvalSignerAddress1, transaction.signature, [
|
||||
approval.signature,
|
||||
@ -293,7 +293,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
const signature = hexUtils.concat(
|
||||
hexUtils.slice(approval.signature, 0, 2),
|
||||
'0xFFFFFFFF',
|
||||
@ -314,7 +314,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
|
||||
const tx = mixins
|
||||
.assertValidCoordinatorApprovals(transaction, transactionSignerAddress, transaction.signature, [
|
||||
@ -335,7 +335,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder, defaultOrder];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
await mixins
|
||||
.assertValidCoordinatorApprovals(transaction, transactionSignerAddress, transaction.signature, [
|
||||
approval.signature,
|
||||
@ -349,7 +349,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
}));
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
await mixins
|
||||
.assertValidCoordinatorApprovals(transaction, transactionSignerAddress, transaction.signature, [
|
||||
approval.signature,
|
||||
@ -371,7 +371,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder, { ...defaultOrder, senderAddress: constants.NULL_ADDRESS }];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
await mixins
|
||||
.assertValidCoordinatorApprovals(transaction, transactionSignerAddress, transaction.signature, [
|
||||
approval.signature,
|
||||
@ -382,8 +382,8 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder, { ...defaultOrder, feeRecipientAddress: approvalSignerAddress2 }];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval1 = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval2 = await approvalFactory2.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval1 = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
const approval2 = approvalFactory2.newSignedApproval(transaction, transactionSignerAddress);
|
||||
await mixins
|
||||
.assertValidCoordinatorApprovals(transaction, transactionSignerAddress, transaction.signature, [
|
||||
approval1.signature,
|
||||
@ -403,7 +403,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder, { ...defaultOrder, feeRecipientAddress: approvalSignerAddress2 }];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval2 = await approvalFactory2.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval2 = approvalFactory2.newSignedApproval(transaction, transactionSignerAddress);
|
||||
|
||||
const tx = mixins
|
||||
.assertValidCoordinatorApprovals(transaction, transactionSignerAddress, transaction.signature, [
|
||||
@ -429,7 +429,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder, defaultOrder];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
const signature = hexUtils.concat(
|
||||
hexUtils.slice(approval.signature, 0, 2),
|
||||
'0xFFFFFFFF',
|
||||
@ -450,8 +450,8 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder, { ...defaultOrder, feeRecipientAddress: approvalSignerAddress2 }];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval1 = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval2 = await approvalFactory2.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval1 = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
const approval2 = approvalFactory2.newSignedApproval(transaction, transactionSignerAddress);
|
||||
const approvalSignature2 = hexUtils.concat(
|
||||
hexUtils.slice(approval2.signature, 0, 2),
|
||||
'0xFFFFFFFF',
|
||||
@ -473,7 +473,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder, { ...defaultOrder, feeRecipientAddress: approvalSignerAddress2 }];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval2 = await approvalFactory2.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval2 = approvalFactory2.newSignedApproval(transaction, transactionSignerAddress);
|
||||
const approvalSignature2 = hexUtils.concat(
|
||||
hexUtils.slice(approval2.signature, 0, 2),
|
||||
'0xFFFFFFFF',
|
||||
@ -494,7 +494,7 @@ blockchainTests.resets('Mixins tests', env => {
|
||||
const orders = [defaultOrder, defaultOrder];
|
||||
const data = exchangeDataEncoder.encodeOrdersToExchangeData(fnName, orders);
|
||||
const transaction = await transactionFactory.newSignedTransactionAsync({ data });
|
||||
const approval1 = await approvalFactory1.newSignedApprovalAsync(transaction, transactionSignerAddress);
|
||||
const approval1 = approvalFactory1.newSignedApproval(transaction, transactionSignerAddress);
|
||||
|
||||
const tx = mixins
|
||||
.assertValidCoordinatorApprovals(transaction, transactionSignerAddress, transaction.signature, [
|
||||
|
@ -28,9 +28,8 @@ import "@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol";
|
||||
import "@0x/contracts-utils/contracts/src/LibBytes.sol";
|
||||
|
||||
|
||||
contract OrderTransferSimulationUtils is
|
||||
LibExchangeRichErrorDecoder
|
||||
{
|
||||
contract OrderTransferSimulationUtils {
|
||||
|
||||
using LibBytes for bytes;
|
||||
|
||||
enum OrderTransferResults {
|
||||
@ -216,11 +215,13 @@ contract OrderTransferSimulationUtils is
|
||||
bytes4 selector = returnData.readBytes4(0);
|
||||
if (selector == LibExchangeRichErrors.AssetProxyDispatchErrorSelector()) {
|
||||
// Decode AssetProxyDispatchError and return index of failed transfer
|
||||
(, bytes32 failedTransferIndex,) = decodeAssetProxyDispatchError(returnData);
|
||||
(, bytes32 failedTransferIndex,) = LibExchangeRichErrorDecoder
|
||||
.decodeAssetProxyDispatchError(returnData);
|
||||
return OrderTransferResults(uint8(uint256(failedTransferIndex)));
|
||||
} else if (selector == LibExchangeRichErrors.AssetProxyTransferErrorSelector()) {
|
||||
// Decode AssetProxyTransferError and return index of failed transfer
|
||||
(bytes32 failedTransferIndex, ,) = decodeAssetProxyTransferError(returnData);
|
||||
(bytes32 failedTransferIndex, ,) = LibExchangeRichErrorDecoder
|
||||
.decodeAssetProxyTransferError(returnData);
|
||||
return OrderTransferResults(uint8(uint256(failedTransferIndex)));
|
||||
} else if (keccak256(returnData) == _TRANSFERS_SUCCESSFUL_RESULT_HASH) {
|
||||
// All transfers were successful
|
||||
|
@ -15,6 +15,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "2.1.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Fix broken tests",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "2.0.6",
|
||||
|
@ -27,6 +27,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
|
@ -1,11 +1,4 @@
|
||||
import {
|
||||
chaiSetup,
|
||||
constants,
|
||||
expectTransactionFailedAsync,
|
||||
provider,
|
||||
txDefaults,
|
||||
web3Wrapper,
|
||||
} from '@0x/contracts-test-utils';
|
||||
import { chaiSetup, constants, provider, txDefaults, web3Wrapper } from '@0x/contracts-test-utils';
|
||||
import { SafeMathRevertErrors } from '@0x/contracts-utils';
|
||||
import { BlockchainLifecycle } from '@0x/dev-utils';
|
||||
import { RevertReason } from '@0x/types';
|
||||
@ -193,12 +186,11 @@ describe('ERC1155Token', () => {
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
// execute transfer
|
||||
await expectTransactionFailedAsync(
|
||||
return expect(
|
||||
erc1155Contract
|
||||
.safeTransferFrom(spender, receiver, tokenToTransfer, valueToTransfer, receiverCallbackData)
|
||||
.sendTransactionAsync({ from: spender }),
|
||||
RevertReason.TransferRejected,
|
||||
);
|
||||
.awaitTransactionSuccessAsync({ from: spender }),
|
||||
).to.revertWith(RevertReason.TransferRejected);
|
||||
});
|
||||
});
|
||||
describe('batchSafeTransferFrom', () => {
|
||||
@ -359,12 +351,11 @@ describe('ERC1155Token', () => {
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
// execute transfer
|
||||
await expectTransactionFailedAsync(
|
||||
return expect(
|
||||
erc1155Contract
|
||||
.safeBatchTransferFrom(spender, receiver, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.sendTransactionAsync({ from: spender }),
|
||||
RevertReason.TransferRejected,
|
||||
);
|
||||
.awaitTransactionSuccessAsync({ from: spender }),
|
||||
).to.revertWith(RevertReason.TransferRejected);
|
||||
});
|
||||
});
|
||||
describe('setApprovalForAll', () => {
|
||||
@ -409,12 +400,11 @@ describe('ERC1155Token', () => {
|
||||
const expectedInitialBalances = [spenderInitialFungibleBalance, receiverInitialFungibleBalance];
|
||||
await erc1155Wrapper.assertBalancesAsync(tokenHolders, [tokenToTransfer], expectedInitialBalances);
|
||||
// execute transfer
|
||||
await expectTransactionFailedAsync(
|
||||
return expect(
|
||||
erc1155Contract
|
||||
.safeTransferFrom(spender, receiver, tokenToTransfer, valueToTransfer, receiverCallbackData)
|
||||
.sendTransactionAsync({ from: delegatedSpender }),
|
||||
RevertReason.InsufficientAllowance,
|
||||
);
|
||||
.awaitTransactionSuccessAsync({ from: delegatedSpender }),
|
||||
).to.revertWith(RevertReason.InsufficientAllowance);
|
||||
});
|
||||
it('should transfer token via safeBatchTransferFrom if called by approved account', async () => {
|
||||
// set approval
|
||||
@ -457,12 +447,11 @@ describe('ERC1155Token', () => {
|
||||
const expectedInitialBalances = [spenderInitialFungibleBalance, receiverInitialFungibleBalance];
|
||||
await erc1155Wrapper.assertBalancesAsync(tokenHolders, tokensToTransfer, expectedInitialBalances);
|
||||
// execute transfer
|
||||
await expectTransactionFailedAsync(
|
||||
return expect(
|
||||
erc1155Contract
|
||||
.safeBatchTransferFrom(spender, receiver, tokensToTransfer, valuesToTransfer, receiverCallbackData)
|
||||
.sendTransactionAsync({ from: delegatedSpender }),
|
||||
RevertReason.InsufficientAllowance,
|
||||
);
|
||||
.awaitTransactionSuccessAsync({ from: delegatedSpender }),
|
||||
).to.revertWith(RevertReason.InsufficientAllowance);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,4 +1,17 @@
|
||||
[
|
||||
{
|
||||
"version": "3.1.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Add `allowance()` and `balanceOf()` to `LibERC20Token`",
|
||||
"pr": 2462
|
||||
},
|
||||
{
|
||||
"note": "Fix broken tests",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "3.0.6",
|
||||
|
@ -30,6 +30,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
|
@ -1,11 +1,4 @@
|
||||
import {
|
||||
chaiSetup,
|
||||
constants,
|
||||
expectContractCallFailedAsync,
|
||||
provider,
|
||||
txDefaults,
|
||||
web3Wrapper,
|
||||
} from '@0x/contracts-test-utils';
|
||||
import { chaiSetup, constants, provider, txDefaults, web3Wrapper } from '@0x/contracts-test-utils';
|
||||
import { BlockchainLifecycle } from '@0x/dev-utils';
|
||||
import { RevertReason } from '@0x/types';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
@ -60,8 +53,7 @@ describe('UnlimitedAllowanceToken', () => {
|
||||
it('should revert if owner has insufficient balance', async () => {
|
||||
const ownerBalance = await token.balanceOf(owner).callAsync();
|
||||
const amountToTransfer = ownerBalance.plus(1);
|
||||
return expectContractCallFailedAsync(
|
||||
token.transfer(spender, amountToTransfer).callAsync({ from: owner }),
|
||||
return expect(token.transfer(spender, amountToTransfer).callAsync({ from: owner })).to.revertWith(
|
||||
RevertReason.Erc20InsufficientBalance,
|
||||
);
|
||||
});
|
||||
@ -99,12 +91,11 @@ describe('UnlimitedAllowanceToken', () => {
|
||||
await token.approve(spender, amountToTransfer).sendTransactionAsync({ from: owner }),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
return expectContractCallFailedAsync(
|
||||
return expect(
|
||||
token.transferFrom(owner, spender, amountToTransfer).callAsync({
|
||||
from: spender,
|
||||
}),
|
||||
RevertReason.Erc20InsufficientBalance,
|
||||
);
|
||||
).to.revertWith(RevertReason.Erc20InsufficientBalance);
|
||||
});
|
||||
|
||||
it('should revert if spender has insufficient allowance', async () => {
|
||||
@ -115,12 +106,11 @@ describe('UnlimitedAllowanceToken', () => {
|
||||
const isSpenderAllowanceInsufficient = spenderAllowance.comparedTo(amountToTransfer) < 0;
|
||||
expect(isSpenderAllowanceInsufficient).to.be.true();
|
||||
|
||||
return expectContractCallFailedAsync(
|
||||
return expect(
|
||||
token.transferFrom(owner, spender, amountToTransfer).callAsync({
|
||||
from: spender,
|
||||
}),
|
||||
RevertReason.Erc20InsufficientAllowance,
|
||||
);
|
||||
).to.revertWith(RevertReason.Erc20InsufficientAllowance);
|
||||
});
|
||||
|
||||
it('should return true on a 0 value transfer', async () => {
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "3.1.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Fix broken tests",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "3.0.6",
|
||||
|
@ -22,6 +22,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
|
@ -1,7 +1,6 @@
|
||||
import {
|
||||
chaiSetup,
|
||||
constants,
|
||||
expectTransactionFailedAsync,
|
||||
expectTransactionFailedWithoutReasonAsync,
|
||||
LogDecoder,
|
||||
provider,
|
||||
@ -77,34 +76,30 @@ describe('ERC721Token', () => {
|
||||
const from = owner;
|
||||
const to = erc721Receiver.address;
|
||||
const unownedTokenId = new BigNumber(2);
|
||||
await expectTransactionFailedAsync(
|
||||
token.transferFrom(from, to, unownedTokenId).sendTransactionAsync(),
|
||||
return expect(token.transferFrom(from, to, unownedTokenId).awaitTransactionSuccessAsync()).to.revertWith(
|
||||
RevertReason.Erc721ZeroOwner,
|
||||
);
|
||||
});
|
||||
it('should revert if transferring to a null address', async () => {
|
||||
const from = owner;
|
||||
const to = constants.NULL_ADDRESS;
|
||||
await expectTransactionFailedAsync(
|
||||
token.transferFrom(from, to, tokenId).sendTransactionAsync(),
|
||||
return expect(token.transferFrom(from, to, tokenId).awaitTransactionSuccessAsync()).to.revertWith(
|
||||
RevertReason.Erc721ZeroToAddress,
|
||||
);
|
||||
});
|
||||
it('should revert if the from address does not own the token', async () => {
|
||||
const from = spender;
|
||||
const to = erc721Receiver.address;
|
||||
await expectTransactionFailedAsync(
|
||||
token.transferFrom(from, to, tokenId).sendTransactionAsync(),
|
||||
return expect(token.transferFrom(from, to, tokenId).awaitTransactionSuccessAsync()).to.revertWith(
|
||||
RevertReason.Erc721OwnerMismatch,
|
||||
);
|
||||
});
|
||||
it('should revert if spender does not own the token, is not approved, and is not approved for all', async () => {
|
||||
const from = owner;
|
||||
const to = erc721Receiver.address;
|
||||
await expectTransactionFailedAsync(
|
||||
token.transferFrom(from, to, tokenId).sendTransactionAsync({ from: spender }),
|
||||
RevertReason.Erc721InvalidSpender,
|
||||
);
|
||||
return expect(
|
||||
token.transferFrom(from, to, tokenId).awaitTransactionSuccessAsync({ from: spender }),
|
||||
).to.revertWith(RevertReason.Erc721InvalidSpender);
|
||||
});
|
||||
it('should transfer the token if called by owner', async () => {
|
||||
const from = owner;
|
||||
@ -198,8 +193,7 @@ describe('ERC721Token', () => {
|
||||
);
|
||||
const from = owner;
|
||||
const to = invalidErc721Receiver.address;
|
||||
await expectTransactionFailedAsync(
|
||||
token.safeTransferFrom1(from, to, tokenId).sendTransactionAsync(),
|
||||
return expect(token.safeTransferFrom1(from, to, tokenId).sendTransactionAsync()).to.revertWith(
|
||||
RevertReason.Erc721InvalidSelector,
|
||||
);
|
||||
});
|
||||
@ -261,8 +255,7 @@ describe('ERC721Token', () => {
|
||||
);
|
||||
const from = owner;
|
||||
const to = invalidErc721Receiver.address;
|
||||
await expectTransactionFailedAsync(
|
||||
token.safeTransferFrom2(from, to, tokenId, data).sendTransactionAsync(),
|
||||
return expect(token.safeTransferFrom2(from, to, tokenId, data).sendTransactionAsync()).to.revertWith(
|
||||
RevertReason.Erc721InvalidSelector,
|
||||
);
|
||||
});
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "4.2.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Export `EvmBytecodeOutputLinkReferences` type.",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"version": "4.1.0",
|
||||
"changes": [
|
||||
|
@ -16,6 +16,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "4.3.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Export `EvmBytecodeOutputLinkReferences` type.",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"version": "4.2.0",
|
||||
"changes": [
|
||||
|
@ -27,6 +27,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
|
@ -1,4 +1,17 @@
|
||||
[
|
||||
{
|
||||
"version": "3.2.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Flip `LibExchangeRichErrorDecoder` to an actual library.",
|
||||
"pr": 2462
|
||||
},
|
||||
{
|
||||
"note": "Remove dependency on `DevUtils` for asset data encoding/decoding",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "3.1.2",
|
||||
|
@ -23,7 +23,7 @@ import "@0x/contracts-exchange-libs/contracts/src/LibExchangeRichErrors.sol";
|
||||
import "@0x/contracts-utils/contracts/src/LibBytes.sol";
|
||||
|
||||
|
||||
contract LibExchangeRichErrorDecoder {
|
||||
library LibExchangeRichErrorDecoder {
|
||||
|
||||
using LibBytes for bytes;
|
||||
|
||||
@ -33,7 +33,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return signerAddress The expected signer of the hash.
|
||||
/// @return signature The full signature.
|
||||
function decodeSignatureError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.SignatureErrorCodes errorCode,
|
||||
@ -57,7 +57,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return signature The full signature bytes.
|
||||
/// @return errorData The revert data thrown by the validator contract.
|
||||
function decodeEIP1271SignatureError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
address verifyingContractAddress,
|
||||
@ -78,7 +78,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return signerAddress The expected signer of the hash.
|
||||
/// @return validatorAddress The expected validator.
|
||||
function decodeSignatureValidatorNotApprovedError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
address signerAddress,
|
||||
@ -99,7 +99,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return signature The full signature bytes.
|
||||
/// @return errorData The revert data thrown by the validator contract.
|
||||
function decodeSignatureWalletError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
bytes32 hash,
|
||||
@ -120,7 +120,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return orderHash The order hash.
|
||||
/// @return orderStatus The order status.
|
||||
function decodeOrderStatusError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
bytes32 orderHash,
|
||||
@ -142,7 +142,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return orderHash The order hash.
|
||||
/// @return contextAddress The maker, taker, or sender address
|
||||
function decodeExchangeInvalidContextError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.ExchangeContextErrorCodes errorCode,
|
||||
@ -164,7 +164,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return errorCode The error code.
|
||||
/// @return orderHash The order hash.
|
||||
function decodeFillError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.FillErrorCodes errorCode,
|
||||
@ -186,7 +186,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return orderSenderAddress The order sender.
|
||||
/// @return currentEpoch The current epoch for the maker.
|
||||
function decodeOrderEpochError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
address makerAddress,
|
||||
@ -206,7 +206,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return assetProxyId Id of asset proxy.
|
||||
/// @return assetProxyAddress The address of the asset proxy.
|
||||
function decodeAssetProxyExistsError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
bytes4 assetProxyId, address assetProxyAddress)
|
||||
@ -224,7 +224,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return orderHash Hash of the order being dispatched.
|
||||
/// @return assetData Asset data of the order being dispatched.
|
||||
function decodeAssetProxyDispatchError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.AssetProxyDispatchErrorCodes errorCode,
|
||||
@ -247,7 +247,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return assetData Asset data of the order being dispatched.
|
||||
/// @return errorData ABI-encoded revert data from the asset proxy.
|
||||
function decodeAssetProxyTransferError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
bytes32 orderHash,
|
||||
@ -267,7 +267,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return leftOrderHash Hash of the left order being matched.
|
||||
/// @return rightOrderHash Hash of the right order being matched.
|
||||
function decodeNegativeSpreadError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
bytes32 leftOrderHash,
|
||||
@ -286,7 +286,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return errorCode The error code.
|
||||
/// @return transactionHash Hash of the transaction.
|
||||
function decodeTransactionError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.TransactionErrorCodes errorCode,
|
||||
@ -307,7 +307,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @return transactionHash Hash of the transaction.
|
||||
/// @return errorData Error thrown by exeucteTransaction().
|
||||
function decodeTransactionExecutionError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
bytes32 transactionHash,
|
||||
@ -325,7 +325,7 @@ contract LibExchangeRichErrorDecoder {
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return orderHash Hash of the order being filled.
|
||||
function decodeIncompleteFillError(bytes memory encoded)
|
||||
public
|
||||
internal
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.IncompleteFillErrorCode errorCode,
|
||||
|
@ -22,6 +22,249 @@ import "../src/libs/LibExchangeRichErrorDecoder.sol";
|
||||
|
||||
|
||||
// solhint-disable no-empty-blocks
|
||||
contract TestLibExchangeRichErrorDecoder is
|
||||
LibExchangeRichErrorDecoder
|
||||
{}
|
||||
contract TestLibExchangeRichErrorDecoder
|
||||
{
|
||||
/// @dev Decompose an ABI-encoded SignatureError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return errorCode The error code.
|
||||
/// @return signerAddress The expected signer of the hash.
|
||||
/// @return signature The full signature.
|
||||
function decodeSignatureError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.SignatureErrorCodes errorCode,
|
||||
bytes32 hash,
|
||||
address signerAddress,
|
||||
bytes memory signature
|
||||
)
|
||||
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeSignatureError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded SignatureValidatorError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return signerAddress The expected signer of the hash.
|
||||
/// @return signature The full signature bytes.
|
||||
/// @return errorData The revert data thrown by the validator contract.
|
||||
function decodeEIP1271SignatureError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
address verifyingContractAddress,
|
||||
bytes memory data,
|
||||
bytes memory signature,
|
||||
bytes memory errorData
|
||||
)
|
||||
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeEIP1271SignatureError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded SignatureValidatorNotApprovedError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return signerAddress The expected signer of the hash.
|
||||
/// @return validatorAddress The expected validator.
|
||||
function decodeSignatureValidatorNotApprovedError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
address signerAddress,
|
||||
address validatorAddress
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeSignatureValidatorNotApprovedError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded SignatureWalletError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return errorCode The error code.
|
||||
/// @return signerAddress The expected signer of the hash.
|
||||
/// @return signature The full signature bytes.
|
||||
/// @return errorData The revert data thrown by the validator contract.
|
||||
function decodeSignatureWalletError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
bytes32 hash,
|
||||
address signerAddress,
|
||||
bytes memory signature,
|
||||
bytes memory errorData
|
||||
)
|
||||
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeSignatureWalletError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded OrderStatusError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return orderHash The order hash.
|
||||
/// @return orderStatus The order status.
|
||||
function decodeOrderStatusError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
bytes32 orderHash,
|
||||
LibOrder.OrderStatus orderStatus
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeOrderStatusError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded OrderStatusError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return errorCode Error code that corresponds to invalid maker, taker, or sender.
|
||||
/// @return orderHash The order hash.
|
||||
/// @return contextAddress The maker, taker, or sender address
|
||||
function decodeExchangeInvalidContextError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.ExchangeContextErrorCodes errorCode,
|
||||
bytes32 orderHash,
|
||||
address contextAddress
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeExchangeInvalidContextError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded FillError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return errorCode The error code.
|
||||
/// @return orderHash The order hash.
|
||||
function decodeFillError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.FillErrorCodes errorCode,
|
||||
bytes32 orderHash
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeFillError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded OrderEpochError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return makerAddress The order maker.
|
||||
/// @return orderSenderAddress The order sender.
|
||||
/// @return currentEpoch The current epoch for the maker.
|
||||
function decodeOrderEpochError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
address makerAddress,
|
||||
address orderSenderAddress,
|
||||
uint256 currentEpoch
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeOrderEpochError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded AssetProxyExistsError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return assetProxyId Id of asset proxy.
|
||||
/// @return assetProxyAddress The address of the asset proxy.
|
||||
function decodeAssetProxyExistsError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
bytes4 assetProxyId, address assetProxyAddress)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeAssetProxyExistsError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded AssetProxyDispatchError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return errorCode The error code.
|
||||
/// @return orderHash Hash of the order being dispatched.
|
||||
/// @return assetData Asset data of the order being dispatched.
|
||||
function decodeAssetProxyDispatchError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.AssetProxyDispatchErrorCodes errorCode,
|
||||
bytes32 orderHash,
|
||||
bytes memory assetData
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeAssetProxyDispatchError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded AssetProxyTransferError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return orderHash Hash of the order being dispatched.
|
||||
/// @return assetData Asset data of the order being dispatched.
|
||||
/// @return errorData ABI-encoded revert data from the asset proxy.
|
||||
function decodeAssetProxyTransferError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
bytes32 orderHash,
|
||||
bytes memory assetData,
|
||||
bytes memory errorData
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeAssetProxyTransferError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded NegativeSpreadError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return leftOrderHash Hash of the left order being matched.
|
||||
/// @return rightOrderHash Hash of the right order being matched.
|
||||
function decodeNegativeSpreadError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
bytes32 leftOrderHash,
|
||||
bytes32 rightOrderHash
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeNegativeSpreadError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded TransactionError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return errorCode The error code.
|
||||
/// @return transactionHash Hash of the transaction.
|
||||
function decodeTransactionError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.TransactionErrorCodes errorCode,
|
||||
bytes32 transactionHash
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeTransactionError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded TransactionExecutionError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return transactionHash Hash of the transaction.
|
||||
/// @return errorData Error thrown by exeucteTransaction().
|
||||
function decodeTransactionExecutionError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
bytes32 transactionHash,
|
||||
bytes memory errorData
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeTransactionExecutionError(encoded);
|
||||
}
|
||||
|
||||
/// @dev Decompose an ABI-encoded IncompleteFillError.
|
||||
/// @param encoded ABI-encoded revert error.
|
||||
/// @return orderHash Hash of the order being filled.
|
||||
function decodeIncompleteFillError(bytes memory encoded)
|
||||
public
|
||||
pure
|
||||
returns (
|
||||
LibExchangeRichErrors.IncompleteFillErrorCode errorCode,
|
||||
uint256 expectedAssetFillAmount,
|
||||
uint256 actualAssetFillAmount
|
||||
)
|
||||
{
|
||||
return LibExchangeRichErrorDecoder.decodeIncompleteFillError(encoded);
|
||||
}
|
||||
}
|
||||
|
@ -35,6 +35,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
|
@ -1,11 +1,11 @@
|
||||
import {
|
||||
artifacts as proxyArtifacts,
|
||||
encodeERC20AssetData,
|
||||
ERC20ProxyContract,
|
||||
ERC20Wrapper,
|
||||
ERC721ProxyContract,
|
||||
ERC721Wrapper,
|
||||
} from '@0x/contracts-asset-proxy';
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { DummyERC20TokenContract } from '@0x/contracts-erc20';
|
||||
import {
|
||||
chaiSetup,
|
||||
@ -47,7 +47,6 @@ describe('AssetProxyDispatcher', () => {
|
||||
let erc20Wrapper: ERC20Wrapper;
|
||||
let erc721Wrapper: ERC721Wrapper;
|
||||
|
||||
const devUtils = new DevUtilsContract(constants.NULL_ADDRESS, provider);
|
||||
before(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
});
|
||||
@ -189,7 +188,7 @@ describe('AssetProxyDispatcher', () => {
|
||||
from: owner,
|
||||
});
|
||||
// Construct metadata for ERC20 proxy
|
||||
const encodedAssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const encodedAssetData = encodeERC20AssetData(erc20TokenA.address);
|
||||
|
||||
// Perform a transfer from makerAddress to takerAddress
|
||||
const erc20Balances = await erc20Wrapper.getBalancesAsync();
|
||||
@ -213,7 +212,7 @@ describe('AssetProxyDispatcher', () => {
|
||||
from: owner,
|
||||
});
|
||||
// Construct metadata for ERC20 proxy
|
||||
const encodedAssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const encodedAssetData = encodeERC20AssetData(erc20TokenA.address);
|
||||
|
||||
// Perform a transfer from makerAddress to takerAddress
|
||||
const erc20Balances = await erc20Wrapper.getBalancesAsync();
|
||||
@ -228,7 +227,7 @@ describe('AssetProxyDispatcher', () => {
|
||||
|
||||
it('should revert if dispatching to unregistered proxy', async () => {
|
||||
// Construct metadata for ERC20 proxy
|
||||
const encodedAssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const encodedAssetData = encodeERC20AssetData(erc20TokenA.address);
|
||||
|
||||
// Perform a transfer from makerAddress to takerAddress
|
||||
const amount = new BigNumber(10);
|
||||
@ -247,7 +246,7 @@ describe('AssetProxyDispatcher', () => {
|
||||
await assetProxyDispatcher.registerAssetProxy(erc20Proxy.address).awaitTransactionSuccessAsync({
|
||||
from: owner,
|
||||
});
|
||||
const encodedAssetData = (await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync()).slice(0, 8);
|
||||
const encodedAssetData = encodeERC20AssetData(erc20TokenA.address).slice(0, 8);
|
||||
const amount = new BigNumber(1);
|
||||
const expectedError = new ExchangeRevertErrors.AssetProxyDispatchError(
|
||||
ExchangeRevertErrors.AssetProxyDispatchErrorCode.InvalidAssetDataLength,
|
||||
@ -265,10 +264,7 @@ describe('AssetProxyDispatcher', () => {
|
||||
from: owner,
|
||||
});
|
||||
// Shave off the last byte
|
||||
const encodedAssetData = (await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync()).slice(
|
||||
0,
|
||||
72,
|
||||
);
|
||||
const encodedAssetData = encodeERC20AssetData(erc20TokenA.address).slice(0, 72);
|
||||
const amount = new BigNumber(1);
|
||||
const expectedError = new ExchangeRevertErrors.AssetProxyDispatchError(
|
||||
ExchangeRevertErrors.AssetProxyDispatchErrorCode.InvalidAssetDataLength,
|
||||
@ -288,7 +284,7 @@ describe('AssetProxyDispatcher', () => {
|
||||
await erc20TokenA.approve(erc20Proxy.address, constants.ZERO_AMOUNT).awaitTransactionSuccessAsync({
|
||||
from: makerAddress,
|
||||
});
|
||||
const encodedAssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const encodedAssetData = encodeERC20AssetData(erc20TokenA.address);
|
||||
const amount = new BigNumber(1);
|
||||
const nestedError = new StringRevertError(RevertReason.TransferFailed).encode();
|
||||
const expectedError = new ExchangeRevertErrors.AssetProxyTransferError(
|
||||
@ -307,8 +303,8 @@ describe('AssetProxyDispatcher', () => {
|
||||
await assetProxyDispatcher.registerAssetProxy(erc20Proxy.address).awaitTransactionSuccessAsync({
|
||||
from: owner,
|
||||
});
|
||||
const assetDataA = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const assetDataB = await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync();
|
||||
const assetDataA = encodeERC20AssetData(erc20TokenA.address);
|
||||
const assetDataB = encodeERC20AssetData(erc20TokenB.address);
|
||||
await erc20TokenB.approve(erc20Proxy.address, constants.ZERO_AMOUNT).awaitTransactionSuccessAsync({
|
||||
from: makerAddress,
|
||||
});
|
||||
@ -330,8 +326,8 @@ describe('AssetProxyDispatcher', () => {
|
||||
return expect(tx).to.revertWith(expectedError);
|
||||
});
|
||||
it('should forward the revert reason from the underlying failed transfer', async () => {
|
||||
const assetDataA = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const assetDataB = await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync();
|
||||
const assetDataA = encodeERC20AssetData(erc20TokenA.address);
|
||||
const assetDataB = encodeERC20AssetData(erc20TokenB.address);
|
||||
const transferIndexAsBytes32 = '0x0000000000000000000000000000000000000000000000000000000000000000';
|
||||
const expectedError = new ExchangeRevertErrors.AssetProxyDispatchError(
|
||||
ExchangeRevertErrors.AssetProxyDispatchErrorCode.UnknownAssetProxy,
|
||||
@ -352,8 +348,8 @@ describe('AssetProxyDispatcher', () => {
|
||||
await assetProxyDispatcher.registerAssetProxy(erc20Proxy.address).awaitTransactionSuccessAsync({
|
||||
from: owner,
|
||||
});
|
||||
const assetDataA = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const assetDataB = await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync();
|
||||
const assetDataA = encodeERC20AssetData(erc20TokenA.address);
|
||||
const assetDataB = encodeERC20AssetData(erc20TokenB.address);
|
||||
const tx = assetProxyDispatcher
|
||||
.simulateDispatchTransferFromCalls(
|
||||
[assetDataA, assetDataB],
|
||||
@ -368,8 +364,8 @@ describe('AssetProxyDispatcher', () => {
|
||||
await assetProxyDispatcher.registerAssetProxy(erc20Proxy.address).awaitTransactionSuccessAsync({
|
||||
from: owner,
|
||||
});
|
||||
const assetDataA = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const assetDataB = await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync();
|
||||
const assetDataA = encodeERC20AssetData(erc20TokenA.address);
|
||||
const assetDataB = encodeERC20AssetData(erc20TokenB.address);
|
||||
const balances = await erc20Wrapper.getBalancesAsync();
|
||||
try {
|
||||
await assetProxyDispatcher
|
||||
|
@ -1,22 +1,17 @@
|
||||
import { artifacts as assetProxyArtifacts, ERC20ProxyContract } from '@0x/contracts-asset-proxy';
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { artifacts as assetProxyArtifacts, encodeERC20AssetData, ERC20ProxyContract } from '@0x/contracts-asset-proxy';
|
||||
import { artifacts as erc20Artifacts, DummyERC20TokenContract, ERC20TokenContract } from '@0x/contracts-erc20';
|
||||
import { blockchainTests, chaiSetup, constants } from '@0x/contracts-test-utils';
|
||||
import { blockchainTests, constants, expect } from '@0x/contracts-test-utils';
|
||||
import { ExchangeContractErrs } from '@0x/types';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
import * as chai from 'chai';
|
||||
|
||||
import { ExchangeTransferSimulator } from './utils/exchange_transfer_simulator';
|
||||
import { SimpleERC20BalanceAndProxyAllowanceFetcher } from './utils/simple_erc20_balance_and_proxy_allowance_fetcher';
|
||||
import { BalanceAndProxyAllowanceLazyStore } from './utils/store/balance_and_proxy_allowance_lazy_store';
|
||||
import { TradeSide, TransferType } from './utils/types';
|
||||
|
||||
chaiSetup.configure();
|
||||
const expect = chai.expect;
|
||||
|
||||
const GAS_LIMIT = 9e6;
|
||||
|
||||
blockchainTests('ExchangeTransferSimulator', env => {
|
||||
blockchainTests.resets('ExchangeTransferSimulator', env => {
|
||||
const transferAmount = new BigNumber(5);
|
||||
let userAddresses: string[];
|
||||
let dummyERC20Token: DummyERC20TokenContract;
|
||||
@ -26,7 +21,6 @@ blockchainTests('ExchangeTransferSimulator', env => {
|
||||
let exampleAssetData: string;
|
||||
let exchangeTransferSimulator: ExchangeTransferSimulator;
|
||||
let erc20ProxyAddress: string;
|
||||
const devUtils = new DevUtilsContract(constants.NULL_ADDRESS, env.provider);
|
||||
before(async function(): Promise<void> {
|
||||
const mochaTestTimeoutMs = 20000;
|
||||
this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
|
||||
@ -39,7 +33,6 @@ blockchainTests('ExchangeTransferSimulator', env => {
|
||||
from: userAddresses[0],
|
||||
};
|
||||
|
||||
await env.blockchainLifecycle.startAsync();
|
||||
const erc20Proxy = await ERC20ProxyContract.deployFrom0xArtifactAsync(
|
||||
assetProxyArtifacts.ERC20Proxy,
|
||||
env.provider,
|
||||
@ -64,16 +57,7 @@ blockchainTests('ExchangeTransferSimulator', env => {
|
||||
totalSupply,
|
||||
);
|
||||
|
||||
exampleAssetData = await devUtils.encodeERC20AssetData(dummyERC20Token.address).callAsync();
|
||||
});
|
||||
beforeEach(async () => {
|
||||
await env.blockchainLifecycle.startAsync();
|
||||
});
|
||||
afterEach(async () => {
|
||||
await env.blockchainLifecycle.revertAsync();
|
||||
});
|
||||
after(async () => {
|
||||
await env.blockchainLifecycle.revertAsync();
|
||||
exampleAssetData = encodeERC20AssetData(dummyERC20Token.address);
|
||||
});
|
||||
describe('#transferFromAsync', function(): void {
|
||||
// HACK: For some reason these tests need a slightly longer timeout
|
||||
@ -87,7 +71,7 @@ blockchainTests('ExchangeTransferSimulator', env => {
|
||||
const balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(
|
||||
simpleERC20BalanceAndProxyAllowanceFetcher,
|
||||
);
|
||||
exchangeTransferSimulator = new ExchangeTransferSimulator(balanceAndProxyAllowanceLazyStore, devUtils);
|
||||
exchangeTransferSimulator = new ExchangeTransferSimulator(balanceAndProxyAllowanceLazyStore);
|
||||
});
|
||||
it("throws if the user doesn't have enough allowance", async () => {
|
||||
return expect(
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { blockchainTests, constants, describe, provider } from '@0x/contracts-test-utils';
|
||||
import { blockchainTests, describe } from '@0x/contracts-test-utils';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
import {
|
||||
@ -49,10 +48,8 @@ const defaultFillScenario = {
|
||||
|
||||
blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
let fillOrderCombinatorialUtils: FillOrderCombinatorialUtils;
|
||||
let devUtils: DevUtilsContract;
|
||||
|
||||
before(async () => {
|
||||
devUtils = new DevUtilsContract(constants.NULL_ADDRESS, provider);
|
||||
fillOrderCombinatorialUtils = await fillOrderCombinatorialUtilsFactoryAsync(web3Wrapper, txDefaults);
|
||||
});
|
||||
|
||||
@ -65,7 +62,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
takerAssetAmountScenario: OrderAssetAmountScenario.Small,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should transfer the correct amounts when makerAssetAmount < takerAssetAmount', async () => {
|
||||
@ -76,7 +73,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
makerAssetAmountScenario: OrderAssetAmountScenario.Small,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should transfer the correct amounts when makerAssetAmount < takerAssetAmount with zero decimals', async () => {
|
||||
@ -88,7 +85,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
makerAssetDataScenario: AssetDataScenario.ERC20ZeroDecimals,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should transfer the correct amounts when taker is specified and order is claimed by taker', async () => {
|
||||
@ -99,7 +96,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
takerScenario: TakerScenario.CorrectlySpecified,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should transfer the correct amounts maker == feeRecipient', async () => {
|
||||
@ -110,7 +107,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeRecipientScenario: FeeRecipientAddressScenario.MakerAddress,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should transfer the correct amounts maker == feeRecipient and makerFeeAsset == takerAsset', async () => {
|
||||
@ -122,7 +119,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
makerFeeAssetDataScenario: FeeAssetDataScenario.TakerToken,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should transfer the correct amounts taker == feeRecipient', async () => {
|
||||
@ -133,7 +130,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeRecipientScenario: FeeRecipientAddressScenario.TakerAddress,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should transfer the correct amounts taker == feeRecipient and takerFeeAsset == makerAsset', async () => {
|
||||
@ -145,7 +142,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
takerFeeAssetDataScenario: FeeAssetDataScenario.MakerToken,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should fill remaining value if takerAssetFillAmount > remaining takerAssetAmount', async () => {
|
||||
@ -153,7 +150,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
...defaultFillScenario,
|
||||
takerAssetFillAmountScenario: TakerAssetFillAmountScenario.GreaterThanTakerAssetAmount,
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert when taker is specified and order is claimed by other', async () => {
|
||||
@ -164,7 +161,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
takerScenario: TakerScenario.IncorrectlySpecified,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if makerAssetAmount is 0', async () => {
|
||||
@ -176,7 +173,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
},
|
||||
takerAssetFillAmountScenario: TakerAssetFillAmountScenario.GreaterThanTakerAssetAmount,
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if takerAssetAmount is 0', async () => {
|
||||
@ -188,7 +185,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
},
|
||||
takerAssetFillAmountScenario: TakerAssetFillAmountScenario.GreaterThanTakerAssetAmount,
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if an order is expired', async () => {
|
||||
@ -199,7 +196,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
expirationTimeSecondsScenario: ExpirationTimeSecondsScenario.InPast,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
});
|
||||
|
||||
@ -219,7 +216,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
takerAssetDataScenario: takerAsset,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
}
|
||||
it('should be able to pay maker fee with taker asset', async () => {
|
||||
@ -235,7 +232,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should be able to pay taker fee with maker asset', async () => {
|
||||
@ -251,7 +248,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should not be able to pay maker fee with maker asset if none is left over (double-spend)', async () => {
|
||||
@ -268,7 +265,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should not be able to pay taker fee with taker asset if none is left over (double-spend)', async () => {
|
||||
@ -285,7 +282,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should be able to pay taker fee with maker asset', async () => {
|
||||
@ -301,7 +298,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if maker balance is too low to fill order', async () => {
|
||||
@ -312,7 +309,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
traderAssetBalance: BalanceAmountScenario.TooLow,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if taker balance is too low to fill order', async () => {
|
||||
@ -323,7 +320,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
traderAssetBalance: BalanceAmountScenario.TooLow,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if maker allowances are too low to fill order', async () => {
|
||||
@ -334,7 +331,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
traderAssetAllowance: AllowanceAmountScenario.TooLow,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if taker allowances are too low to fill order', async () => {
|
||||
@ -345,7 +342,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
traderAssetAllowance: AllowanceAmountScenario.TooLow,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if maker fee balance is too low to fill order', async () => {
|
||||
@ -356,7 +353,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.TooLow,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if taker fee balance is too low to fill order', async () => {
|
||||
@ -367,7 +364,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.TooLow,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if maker fee allowances are too low to fill order', async () => {
|
||||
@ -378,7 +375,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeAllowance: AllowanceAmountScenario.TooLow,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should revert if taker fee allowances are too low to fill order', async () => {
|
||||
@ -389,7 +386,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeAllowance: AllowanceAmountScenario.TooLow,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
});
|
||||
|
||||
@ -408,7 +405,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should be able to pay taker fee with maker ERC721', async () => {
|
||||
@ -425,7 +422,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should not be able to pay maker fee with maker ERC721 (double-spend)', async () => {
|
||||
@ -442,7 +439,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should be able to pay taker fee with taker ERC721 (double-spend)', async () => {
|
||||
@ -459,7 +456,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
});
|
||||
|
||||
@ -481,7 +478,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should be able to pay taker fee with maker asset', async () => {
|
||||
@ -498,7 +495,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should not be able to pay maker fee with maker asset if not enough left (double-spend)', async () => {
|
||||
@ -516,7 +513,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should be able to pay taker fee with taker asset if not enough left (double-spend)', async () => {
|
||||
@ -534,7 +531,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -555,7 +552,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should be able to pay taker fee with maker MAP', async () => {
|
||||
@ -572,7 +569,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should not be able to pay maker fee with maker MAP (double-spend)', async () => {
|
||||
@ -589,7 +586,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
|
||||
it('should be able to pay taker fee with taker MAP (double-spend)', async () => {
|
||||
@ -606,7 +603,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
feeBalance: BalanceAmountScenario.Zero,
|
||||
},
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioFailureAsync(fillScenario);
|
||||
});
|
||||
});
|
||||
|
||||
@ -629,7 +626,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
},
|
||||
takerAssetFillAmountScenario: TakerAssetFillAmountScenario.ExactlyTakerAssetAmount,
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -653,7 +650,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
},
|
||||
takerAssetFillAmountScenario: TakerAssetFillAmountScenario.ExactlyTakerAssetAmount,
|
||||
};
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioSuccessAsync(fillScenario);
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -663,7 +660,7 @@ blockchainTests.resets('FillOrder Tests', ({ web3Wrapper, txDefaults }) => {
|
||||
for (const fillScenario of allFillScenarios) {
|
||||
const description = `Combinatorial OrderFill: ${JSON.stringify(fillScenario)}`;
|
||||
it(description, async () => {
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(fillScenario, devUtils);
|
||||
await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(fillScenario);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { ERC20ProxyContract, ERC20Wrapper } from '@0x/contracts-asset-proxy';
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { encodeERC20AssetData, ERC20ProxyContract, ERC20Wrapper } from '@0x/contracts-asset-proxy';
|
||||
import { DummyERC20TokenContract } from '@0x/contracts-erc20';
|
||||
import {
|
||||
blockchainTests,
|
||||
@ -52,7 +51,6 @@ blockchainTests.resets('MixinSignatureValidator', env => {
|
||||
let takerAddress: string;
|
||||
let feeRecipientAddress: string;
|
||||
|
||||
const devUtils = new DevUtilsContract(constants.NULL_ADDRESS, env.provider, env.txDefaults);
|
||||
const eip1271Data = new IEIP1271DataContract(constants.NULL_ADDRESS, env.provider, env.txDefaults);
|
||||
before(async () => {
|
||||
chainId = await env.getChainIdAsync();
|
||||
@ -428,10 +426,10 @@ blockchainTests.resets('MixinSignatureValidator', env => {
|
||||
...constants.STATIC_ORDER_PARAMS,
|
||||
makerAddress: signerAddress,
|
||||
feeRecipientAddress: randomAddress(),
|
||||
makerAssetData: await devUtils.encodeERC20AssetData(randomAddress()).callAsync(),
|
||||
takerAssetData: await devUtils.encodeERC20AssetData(randomAddress()).callAsync(),
|
||||
makerFeeAssetData: await devUtils.encodeERC20AssetData(randomAddress()).callAsync(),
|
||||
takerFeeAssetData: await devUtils.encodeERC20AssetData(randomAddress()).callAsync(),
|
||||
makerAssetData: encodeERC20AssetData(randomAddress()),
|
||||
takerAssetData: encodeERC20AssetData(randomAddress()),
|
||||
makerFeeAssetData: encodeERC20AssetData(randomAddress()),
|
||||
takerFeeAssetData: encodeERC20AssetData(randomAddress()),
|
||||
makerFee: constants.ZERO_AMOUNT,
|
||||
takerFee: constants.ZERO_AMOUNT,
|
||||
exchangeAddress: exchange.address,
|
||||
@ -1175,10 +1173,10 @@ blockchainTests.resets('MixinSignatureValidator', env => {
|
||||
...constants.STATIC_ORDER_PARAMS,
|
||||
makerAddress,
|
||||
feeRecipientAddress,
|
||||
makerAssetData: await devUtils.encodeERC20AssetData(defaultMakerAssetAddress).callAsync(),
|
||||
takerAssetData: await devUtils.encodeERC20AssetData(defaultTakerAssetAddress).callAsync(),
|
||||
makerFeeAssetData: await devUtils.encodeERC20AssetData(defaultFeeAssetAddress).callAsync(),
|
||||
takerFeeAssetData: await devUtils.encodeERC20AssetData(defaultFeeAssetAddress).callAsync(),
|
||||
makerAssetData: encodeERC20AssetData(defaultMakerAssetAddress),
|
||||
takerAssetData: encodeERC20AssetData(defaultTakerAssetAddress),
|
||||
makerFeeAssetData: encodeERC20AssetData(defaultFeeAssetAddress),
|
||||
takerFeeAssetData: encodeERC20AssetData(defaultFeeAssetAddress),
|
||||
exchangeAddress: exchange.address,
|
||||
chainId,
|
||||
};
|
||||
|
@ -1,11 +1,17 @@
|
||||
import {
|
||||
decodeERC1155AssetData,
|
||||
decodeERC721AssetData,
|
||||
decodeMultiAssetData,
|
||||
ERC1155ProxyWrapper,
|
||||
ERC20Wrapper,
|
||||
ERC721Wrapper,
|
||||
getAssetDataProxyId,
|
||||
} from '@0x/contracts-asset-proxy';
|
||||
import { AbstractAssetWrapper, constants } from '@0x/contracts-test-utils';
|
||||
import { AssetProxyId } from '@0x/types';
|
||||
import { BigNumber, errorUtils } from '@0x/utils';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
import { ERC1155ProxyWrapper, ERC20Wrapper, ERC721Wrapper } from '@0x/contracts-asset-proxy';
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
|
||||
interface ProxyIdToAssetWrappers {
|
||||
[proxyId: string]: AbstractAssetWrapper;
|
||||
}
|
||||
@ -20,11 +26,7 @@ const ZERO_NFT_UNIT = new BigNumber(0);
|
||||
export class AssetWrapper {
|
||||
private readonly _proxyIdToAssetWrappers: ProxyIdToAssetWrappers;
|
||||
|
||||
constructor(
|
||||
assetWrappers: AbstractAssetWrapper[],
|
||||
private readonly _burnerAddress: string,
|
||||
private readonly _devUtils: DevUtilsContract,
|
||||
) {
|
||||
constructor(assetWrappers: AbstractAssetWrapper[], private readonly _burnerAddress: string) {
|
||||
this._proxyIdToAssetWrappers = {};
|
||||
_.each(assetWrappers, assetWrapper => {
|
||||
const proxyId = assetWrapper.getProxyId();
|
||||
@ -32,7 +34,7 @@ export class AssetWrapper {
|
||||
});
|
||||
}
|
||||
public async getBalanceAsync(userAddress: string, assetData: string): Promise<BigNumber> {
|
||||
const proxyId = await this._devUtils.decodeAssetProxyId(assetData).callAsync();
|
||||
const proxyId = getAssetDataProxyId(assetData);
|
||||
switch (proxyId) {
|
||||
case AssetProxyId.ERC20: {
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
@ -44,9 +46,7 @@ export class AssetWrapper {
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
const assetWrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
const [assetProxyId, tokenAddress, tokenId] = await this._devUtils
|
||||
.decodeERC721AssetData(assetData)
|
||||
.callAsync();
|
||||
const [tokenAddress, tokenId] = decodeERC721AssetData(assetData);
|
||||
const isOwner = await assetWrapper.isOwnerAsync(userAddress, tokenAddress, tokenId);
|
||||
const balance = isOwner ? ONE_NFT_UNIT : ZERO_NFT_UNIT;
|
||||
return balance;
|
||||
@ -56,10 +56,9 @@ export class AssetWrapper {
|
||||
const assetProxyWrapper = this._proxyIdToAssetWrappers[proxyId] as ERC1155ProxyWrapper;
|
||||
const [
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
assetProxyAddress,
|
||||
tokenAddress,
|
||||
tokenIds,
|
||||
] = await this._devUtils.decodeERC1155AssetData(assetData).callAsync();
|
||||
] = decodeERC1155AssetData(assetData);
|
||||
const assetWrapper = assetProxyWrapper.getContractWrapper(tokenAddress);
|
||||
const balances = await Promise.all(
|
||||
_.map(tokenIds).map(tokenId => assetWrapper.getBalanceAsync(userAddress, tokenId)),
|
||||
@ -68,9 +67,7 @@ export class AssetWrapper {
|
||||
}
|
||||
case AssetProxyId.MultiAsset: {
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
const [assetProxyId, amounts, nestedAssetData] = await this._devUtils
|
||||
.decodeMultiAssetData(assetData)
|
||||
.callAsync();
|
||||
const [amounts, nestedAssetData] = decodeMultiAssetData(assetData);
|
||||
const nestedBalances = await Promise.all(
|
||||
nestedAssetData.map(async _nestedAssetData => this.getBalanceAsync(userAddress, _nestedAssetData)),
|
||||
);
|
||||
@ -84,7 +81,7 @@ export class AssetWrapper {
|
||||
}
|
||||
}
|
||||
public async setBalanceAsync(userAddress: string, assetData: string, desiredBalance: BigNumber): Promise<void> {
|
||||
const proxyId = await this._devUtils.decodeAssetProxyId(assetData).callAsync();
|
||||
const proxyId = getAssetDataProxyId(assetData);
|
||||
switch (proxyId) {
|
||||
case AssetProxyId.ERC20: {
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
@ -100,9 +97,7 @@ export class AssetWrapper {
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
const erc721Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
const [assetProxyId, tokenAddress, tokenId] = await this._devUtils
|
||||
.decodeERC721AssetData(assetData)
|
||||
.callAsync();
|
||||
const [tokenAddress, tokenId] = decodeERC721AssetData(assetData);
|
||||
const doesTokenExist = erc721Wrapper.doesTokenExistAsync(tokenAddress, tokenId);
|
||||
if (!doesTokenExist && desiredBalance.gte(1)) {
|
||||
await erc721Wrapper.mintAsync(tokenAddress, tokenId, userAddress);
|
||||
@ -130,11 +125,10 @@ export class AssetWrapper {
|
||||
const assetProxyWrapper = this._proxyIdToAssetWrappers[proxyId] as ERC1155ProxyWrapper;
|
||||
const [
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
assetProxyAddress,
|
||||
tokenAddress,
|
||||
tokenIds,
|
||||
tokenValues,
|
||||
] = await this._devUtils.decodeERC1155AssetData(assetData).callAsync();
|
||||
] = decodeERC1155AssetData(assetData);
|
||||
const assetWrapper = assetProxyWrapper.getContractWrapper(tokenAddress);
|
||||
const tokenValuesSum = BigNumber.sum(...tokenValues);
|
||||
let tokenValueRatios = tokenValues;
|
||||
@ -197,9 +191,7 @@ export class AssetWrapper {
|
||||
}
|
||||
case AssetProxyId.MultiAsset: {
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
const [assetProxyId, amounts, nestedAssetData] = await this._devUtils
|
||||
.decodeMultiAssetData(assetData)
|
||||
.callAsync();
|
||||
const [amounts, nestedAssetData] = decodeMultiAssetData(assetData);
|
||||
const amountsSum = BigNumber.sum(...amounts);
|
||||
let assetAmountRatios = amounts;
|
||||
if (!amountsSum.eq(0)) {
|
||||
@ -220,7 +212,7 @@ export class AssetWrapper {
|
||||
assetData: string,
|
||||
desiredBalance: BigNumber,
|
||||
): Promise<void> {
|
||||
const proxyId = await this._devUtils.decodeAssetProxyId(assetData).callAsync();
|
||||
const proxyId = getAssetDataProxyId(assetData);
|
||||
switch (proxyId) {
|
||||
case AssetProxyId.ERC20:
|
||||
case AssetProxyId.ERC721:
|
||||
@ -235,7 +227,7 @@ export class AssetWrapper {
|
||||
}
|
||||
}
|
||||
public async getProxyAllowanceAsync(userAddress: string, assetData: string): Promise<BigNumber> {
|
||||
const proxyId = await this._devUtils.decodeAssetProxyId(assetData).callAsync();
|
||||
const proxyId = getAssetDataProxyId(assetData);
|
||||
switch (proxyId) {
|
||||
case AssetProxyId.ERC20: {
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
@ -247,9 +239,7 @@ export class AssetWrapper {
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
const assetWrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
const [assetProxyId, tokenAddress, tokenId] = await this._devUtils
|
||||
.decodeERC721AssetData(assetData)
|
||||
.callAsync();
|
||||
const [tokenAddress, tokenId] = decodeERC721AssetData(assetData);
|
||||
const isProxyApprovedForAll = await assetWrapper.isProxyApprovedForAllAsync(userAddress, tokenAddress);
|
||||
if (isProxyApprovedForAll) {
|
||||
return constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
|
||||
@ -263,9 +253,7 @@ export class AssetWrapper {
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
const assetProxyWrapper = this._proxyIdToAssetWrappers[proxyId] as ERC1155ProxyWrapper;
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
const [assetProxyAddress, tokenAddress] = await this._devUtils
|
||||
.decodeERC1155AssetData(assetData)
|
||||
.callAsync();
|
||||
const [tokenAddress] = decodeERC1155AssetData(assetData);
|
||||
const isApprovedForAll = await assetProxyWrapper.isProxyApprovedForAllAsync(userAddress, tokenAddress);
|
||||
if (!isApprovedForAll) {
|
||||
// ERC1155 is all or nothing.
|
||||
@ -275,9 +263,7 @@ export class AssetWrapper {
|
||||
}
|
||||
case AssetProxyId.MultiAsset: {
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
const [assetProxyId, amounts, nestedAssetData] = await this._devUtils
|
||||
.decodeMultiAssetData(assetData)
|
||||
.callAsync();
|
||||
const [amounts, nestedAssetData] = decodeMultiAssetData(assetData);
|
||||
const allowances = await Promise.all(
|
||||
nestedAssetData.map(async _nestedAssetData =>
|
||||
this.getProxyAllowanceAsync(userAddress, _nestedAssetData),
|
||||
@ -294,7 +280,7 @@ export class AssetWrapper {
|
||||
assetData: string,
|
||||
desiredAllowance: BigNumber,
|
||||
): Promise<void> {
|
||||
const proxyId = await this._devUtils.decodeAssetProxyId(assetData).callAsync();
|
||||
const proxyId = getAssetDataProxyId(assetData);
|
||||
switch (proxyId) {
|
||||
case AssetProxyId.ERC20: {
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
@ -315,9 +301,7 @@ export class AssetWrapper {
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
const erc721Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
const [assetProxyId, tokenAddress, tokenId] = await this._devUtils
|
||||
.decodeERC721AssetData(assetData)
|
||||
.callAsync();
|
||||
const [tokenAddress, tokenId] = decodeERC721AssetData(assetData);
|
||||
|
||||
const doesTokenExist = await erc721Wrapper.doesTokenExistAsync(tokenAddress, tokenId);
|
||||
if (!doesTokenExist) {
|
||||
@ -352,9 +336,7 @@ export class AssetWrapper {
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
const assetProxyWrapper = this._proxyIdToAssetWrappers[proxyId] as ERC1155ProxyWrapper;
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
const [assetProxyAddress, tokenAddress] = await this._devUtils
|
||||
.decodeERC1155AssetData(assetData)
|
||||
.callAsync();
|
||||
const [tokenAddress] = decodeERC1155AssetData(assetData);
|
||||
// ERC1155 allowances are all or nothing.
|
||||
const shouldApprovedForAll = desiredAllowance.gt(0);
|
||||
const currentAllowance = await this.getProxyAllowanceAsync(userAddress, assetData);
|
||||
@ -369,9 +351,7 @@ export class AssetWrapper {
|
||||
}
|
||||
case AssetProxyId.MultiAsset: {
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
const [assetProxyId, amounts, nestedAssetData] = await this._devUtils
|
||||
.decodeMultiAssetData(assetData)
|
||||
.callAsync();
|
||||
const [amounts, nestedAssetData] = decodeMultiAssetData(assetData);
|
||||
await Promise.all(
|
||||
nestedAssetData.map(async _nestedAssetData =>
|
||||
this.setProxyAllowanceAsync(userAddress, _nestedAssetData, desiredAllowance),
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { decodeMultiAssetData, getAssetDataProxyId } from '@0x/contracts-asset-proxy';
|
||||
import { constants } from '@0x/contracts-test-utils';
|
||||
import { AssetProxyId, ExchangeContractErrs } from '@0x/types';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
@ -40,7 +40,6 @@ const ERR_MSG_MAPPING = {
|
||||
*/
|
||||
export class ExchangeTransferSimulator {
|
||||
private readonly _store: AbstractBalanceAndProxyAllowanceLazyStore;
|
||||
private readonly _devUtils: DevUtilsContract;
|
||||
private static _throwValidationError(
|
||||
failureReason: FailureReason,
|
||||
tradeSide: TradeSide,
|
||||
@ -54,9 +53,8 @@ export class ExchangeTransferSimulator {
|
||||
* @param store A class that implements AbstractBalanceAndProxyAllowanceLazyStore
|
||||
* @return an instance of ExchangeTransferSimulator
|
||||
*/
|
||||
constructor(store: AbstractBalanceAndProxyAllowanceLazyStore, devUtilsContract: DevUtilsContract) {
|
||||
constructor(store: AbstractBalanceAndProxyAllowanceLazyStore) {
|
||||
this._store = store;
|
||||
this._devUtils = devUtilsContract;
|
||||
}
|
||||
/**
|
||||
* Simulates transferFrom call performed by a proxy
|
||||
@ -77,7 +75,7 @@ export class ExchangeTransferSimulator {
|
||||
tradeSide: TradeSide,
|
||||
transferType: TransferType,
|
||||
): Promise<void> {
|
||||
const assetProxyId = await this._devUtils.decodeAssetProxyId(assetData).callAsync();
|
||||
const assetProxyId = getAssetDataProxyId(assetData);
|
||||
switch (assetProxyId) {
|
||||
case AssetProxyId.ERC1155:
|
||||
case AssetProxyId.ERC20:
|
||||
@ -110,11 +108,11 @@ export class ExchangeTransferSimulator {
|
||||
break;
|
||||
}
|
||||
case AssetProxyId.MultiAsset: {
|
||||
const decodedAssetData = await this._devUtils.decodeMultiAssetData(assetData).callAsync();
|
||||
const decodedAssetData = decodeMultiAssetData(assetData);
|
||||
await this._decreaseBalanceAsync(assetData, from, amountInBaseUnits);
|
||||
await this._increaseBalanceAsync(assetData, to, amountInBaseUnits);
|
||||
for (const [index, nestedAssetDataElement] of decodedAssetData[2].entries()) {
|
||||
const amountsElement = decodedAssetData[1][index];
|
||||
for (const [index, nestedAssetDataElement] of decodedAssetData[1].entries()) {
|
||||
const amountsElement = decodedAssetData[0][index];
|
||||
const totalAmount = amountInBaseUnits.times(amountsElement);
|
||||
await this.transferFromAsync(
|
||||
nestedAssetDataElement,
|
||||
|
@ -5,7 +5,6 @@ import {
|
||||
ERC721Wrapper,
|
||||
MultiAssetProxyContract,
|
||||
} from '@0x/contracts-asset-proxy';
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { constants, expect, LogDecoder, orderHashUtils, orderUtils, signingUtils } from '@0x/contracts-test-utils';
|
||||
import { FillResults, Order, SignatureType, SignedOrder } from '@0x/types';
|
||||
import { BigNumber, errorUtils, ExchangeRevertErrors, providerUtils, RevertError, StringRevertError } from '@0x/utils';
|
||||
@ -109,8 +108,7 @@ export async function fillOrderCombinatorialUtilsFactoryAsync(
|
||||
{},
|
||||
);
|
||||
|
||||
const devUtils = new DevUtilsContract(constants.NULL_ADDRESS, provider);
|
||||
const assetWrapper = new AssetWrapper([erc20Wrapper, erc721Wrapper, erc1155Wrapper], burnerAddress, devUtils);
|
||||
const assetWrapper = new AssetWrapper([erc20Wrapper, erc721Wrapper, erc1155Wrapper], burnerAddress);
|
||||
|
||||
const exchangeContract = await ExchangeContract.deployFrom0xArtifactAsync(
|
||||
artifacts.Exchange,
|
||||
@ -160,7 +158,6 @@ export async function fillOrderCombinatorialUtilsFactoryAsync(
|
||||
await multiAssetProxy.registerAssetProxy(erc1155Proxy.address).awaitTransactionSuccessAsync({ from: ownerAddress });
|
||||
|
||||
const orderFactory = new OrderFactoryFromScenario(
|
||||
devUtils,
|
||||
userAddresses,
|
||||
erc20EighteenDecimalTokens.map(token => token.address),
|
||||
erc20FiveDecimalTokens.map(token => token.address),
|
||||
@ -441,29 +438,24 @@ export class FillOrderCombinatorialUtils {
|
||||
this.balanceAndProxyAllowanceFetcher = new SimpleAssetBalanceAndProxyAllowanceFetcher(assetWrapper);
|
||||
}
|
||||
|
||||
public async testFillOrderScenarioAsync(fillScenario: FillScenario, devUtils: DevUtilsContract): Promise<void> {
|
||||
return this._testFillOrderScenarioAsync(fillScenario, TestOutlook.Any, devUtils);
|
||||
public async testFillOrderScenarioAsync(fillScenario: FillScenario): Promise<void> {
|
||||
return this._testFillOrderScenarioAsync(fillScenario, TestOutlook.Any);
|
||||
}
|
||||
|
||||
public async testFillOrderScenarioSuccessAsync(
|
||||
fillScenario: FillScenario,
|
||||
devUtils: DevUtilsContract,
|
||||
): Promise<void> {
|
||||
return this._testFillOrderScenarioAsync(fillScenario, TestOutlook.Success, devUtils);
|
||||
public async testFillOrderScenarioSuccessAsync(fillScenario: FillScenario): Promise<void> {
|
||||
return this._testFillOrderScenarioAsync(fillScenario, TestOutlook.Success);
|
||||
}
|
||||
|
||||
public async testFillOrderScenarioFailureAsync(
|
||||
fillScenario: FillScenario,
|
||||
devUtils: DevUtilsContract,
|
||||
fillErrorIfExists?: FillOrderError,
|
||||
): Promise<void> {
|
||||
return this._testFillOrderScenarioAsync(fillScenario, TestOutlook.Failure, devUtils, fillErrorIfExists);
|
||||
return this._testFillOrderScenarioAsync(fillScenario, TestOutlook.Failure, fillErrorIfExists);
|
||||
}
|
||||
|
||||
private async _testFillOrderScenarioAsync(
|
||||
fillScenario: FillScenario,
|
||||
expectedTestResult: TestOutlook = TestOutlook.Any,
|
||||
devUtils: DevUtilsContract,
|
||||
fillErrorIfExists?: FillOrderError,
|
||||
): Promise<void> {
|
||||
const lazyStore = new BalanceAndProxyAllowanceLazyStore(this.balanceAndProxyAllowanceFetcher);
|
||||
@ -476,12 +468,7 @@ export class FillOrderCombinatorialUtils {
|
||||
let _fillErrorIfExists = fillErrorIfExists;
|
||||
if (expectedTestResult !== TestOutlook.Failure || fillErrorIfExists === undefined) {
|
||||
try {
|
||||
expectedFillResults = await this._simulateFillOrderAsync(
|
||||
signedOrder,
|
||||
takerAssetFillAmount,
|
||||
lazyStore,
|
||||
devUtils,
|
||||
);
|
||||
expectedFillResults = await this._simulateFillOrderAsync(signedOrder, takerAssetFillAmount, lazyStore);
|
||||
} catch (err) {
|
||||
_fillErrorIfExists = err.message;
|
||||
if (expectedTestResult === TestOutlook.Success) {
|
||||
@ -514,9 +501,8 @@ export class FillOrderCombinatorialUtils {
|
||||
signedOrder: SignedOrder,
|
||||
takerAssetFillAmount: BigNumber,
|
||||
lazyStore: BalanceAndProxyAllowanceLazyStore,
|
||||
devUtils: DevUtilsContract,
|
||||
): Promise<FillResults> {
|
||||
const simulator = new FillOrderSimulator(lazyStore, devUtils);
|
||||
const simulator = new FillOrderSimulator(lazyStore);
|
||||
return simulator.simulateFillOrderAsync(signedOrder, this.takerAddress, takerAssetFillAmount);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { constants, orderUtils } from '@0x/contracts-test-utils';
|
||||
import { Order } from '@0x/order-utils';
|
||||
import { FillResults } from '@0x/types';
|
||||
@ -26,9 +25,9 @@ export class FillOrderSimulator {
|
||||
public readonly lazyStore: LazyStore;
|
||||
private readonly _transferSimulator: ExchangeTransferSimulator;
|
||||
|
||||
constructor(lazyStore: LazyStore, devUtilsContract: DevUtilsContract) {
|
||||
constructor(lazyStore: LazyStore) {
|
||||
this.lazyStore = lazyStore;
|
||||
this._transferSimulator = new ExchangeTransferSimulator(lazyStore, devUtilsContract);
|
||||
this._transferSimulator = new ExchangeTransferSimulator(lazyStore);
|
||||
}
|
||||
|
||||
public async simulateFillOrderAsync(
|
||||
|
@ -1,4 +1,9 @@
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import {
|
||||
encodeERC1155AssetData,
|
||||
encodeERC20AssetData,
|
||||
encodeERC721AssetData,
|
||||
encodeMultiAssetData,
|
||||
} from '@0x/contracts-asset-proxy';
|
||||
import { constants, ERC1155HoldingsByOwner, ERC721TokenIdsByOwner } from '@0x/contracts-test-utils';
|
||||
import { generatePseudoRandomSalt } from '@0x/order-utils';
|
||||
import { Order } from '@0x/types';
|
||||
@ -34,7 +39,6 @@ const ZERO_UNITS = new BigNumber(0);
|
||||
|
||||
export class OrderFactoryFromScenario {
|
||||
constructor(
|
||||
private readonly _devUtils: DevUtilsContract,
|
||||
private readonly _userAddresses: string[],
|
||||
private readonly _erc20EighteenDecimalTokenAddresses: string[],
|
||||
private readonly _erc20FiveDecimalTokenAddresses: string[],
|
||||
@ -96,59 +100,41 @@ export class OrderFactoryFromScenario {
|
||||
|
||||
switch (orderScenario.makerAssetDataScenario) {
|
||||
case AssetDataScenario.ERC20EighteenDecimals:
|
||||
makerAssetData = await this._devUtils
|
||||
.encodeERC20AssetData(this._erc20EighteenDecimalTokenAddresses[0])
|
||||
.callAsync();
|
||||
makerAssetData = encodeERC20AssetData(this._erc20EighteenDecimalTokenAddresses[0]);
|
||||
break;
|
||||
case AssetDataScenario.ERC20FiveDecimals:
|
||||
makerAssetData = await this._devUtils
|
||||
.encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[0])
|
||||
.callAsync();
|
||||
makerAssetData = encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[0]);
|
||||
break;
|
||||
case AssetDataScenario.ERC721:
|
||||
makerAssetData = await this._devUtils
|
||||
.encodeERC721AssetData(this._erc721TokenAddress, erc721MakerAssetIds[0])
|
||||
.callAsync();
|
||||
makerAssetData = encodeERC721AssetData(this._erc721TokenAddress, erc721MakerAssetIds[0]);
|
||||
break;
|
||||
case AssetDataScenario.ERC20ZeroDecimals:
|
||||
makerAssetData = await this._devUtils
|
||||
.encodeERC20AssetData(this._erc20ZeroDecimalTokenAddresses[0])
|
||||
.callAsync();
|
||||
makerAssetData = encodeERC20AssetData(this._erc20ZeroDecimalTokenAddresses[0]);
|
||||
break;
|
||||
case AssetDataScenario.ERC1155Fungible:
|
||||
makerAssetData = await this._devUtils
|
||||
.encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155FungibleMakerTokenIds[0]],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
makerAssetData = encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155FungibleMakerTokenIds[0]],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
);
|
||||
break;
|
||||
case AssetDataScenario.ERC1155NonFungible:
|
||||
makerAssetData = await this._devUtils
|
||||
.encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155NonFungibleMakerTokenIds[0]],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
makerAssetData = encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155NonFungibleMakerTokenIds[0]],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
);
|
||||
break;
|
||||
case AssetDataScenario.MultiAssetERC20:
|
||||
makerAssetData = await this._devUtils
|
||||
.encodeMultiAssetData(
|
||||
[ONE_UNITS_EIGHTEEN_DECIMALS, ONE_UNITS_FIVE_DECIMALS],
|
||||
[
|
||||
await this._devUtils
|
||||
.encodeERC20AssetData(this._erc20EighteenDecimalTokenAddresses[0])
|
||||
.callAsync(),
|
||||
await this._devUtils
|
||||
.encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[0])
|
||||
.callAsync(),
|
||||
],
|
||||
)
|
||||
.callAsync();
|
||||
makerAssetData = encodeMultiAssetData(
|
||||
[ONE_UNITS_EIGHTEEN_DECIMALS, ONE_UNITS_FIVE_DECIMALS],
|
||||
[
|
||||
encodeERC20AssetData(this._erc20EighteenDecimalTokenAddresses[0]),
|
||||
encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[0]),
|
||||
],
|
||||
);
|
||||
break;
|
||||
default:
|
||||
throw errorUtils.spawnSwitchErr('AssetDataScenario', orderScenario.makerAssetDataScenario);
|
||||
@ -156,59 +142,41 @@ export class OrderFactoryFromScenario {
|
||||
|
||||
switch (orderScenario.takerAssetDataScenario) {
|
||||
case AssetDataScenario.ERC20EighteenDecimals:
|
||||
takerAssetData = await this._devUtils
|
||||
.encodeERC20AssetData(this._erc20EighteenDecimalTokenAddresses[1])
|
||||
.callAsync();
|
||||
takerAssetData = encodeERC20AssetData(this._erc20EighteenDecimalTokenAddresses[1]);
|
||||
break;
|
||||
case AssetDataScenario.ERC20FiveDecimals:
|
||||
takerAssetData = await this._devUtils
|
||||
.encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[1])
|
||||
.callAsync();
|
||||
takerAssetData = encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[1]);
|
||||
break;
|
||||
case AssetDataScenario.ERC721:
|
||||
takerAssetData = await this._devUtils
|
||||
.encodeERC721AssetData(this._erc721TokenAddress, erc721TakerAssetIds[0])
|
||||
.callAsync();
|
||||
takerAssetData = encodeERC721AssetData(this._erc721TokenAddress, erc721TakerAssetIds[0]);
|
||||
break;
|
||||
case AssetDataScenario.ERC20ZeroDecimals:
|
||||
takerAssetData = await this._devUtils
|
||||
.encodeERC20AssetData(this._erc20ZeroDecimalTokenAddresses[1])
|
||||
.callAsync();
|
||||
takerAssetData = encodeERC20AssetData(this._erc20ZeroDecimalTokenAddresses[1]);
|
||||
break;
|
||||
case AssetDataScenario.ERC1155Fungible:
|
||||
takerAssetData = await this._devUtils
|
||||
.encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155FungibleTakerTokenIds[1]],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
takerAssetData = encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155FungibleTakerTokenIds[1]],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
);
|
||||
break;
|
||||
case AssetDataScenario.ERC1155NonFungible:
|
||||
takerAssetData = await this._devUtils
|
||||
.encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155NonFungibleTakerTokenIds[0]],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
takerAssetData = encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155NonFungibleTakerTokenIds[0]],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
);
|
||||
break;
|
||||
case AssetDataScenario.MultiAssetERC20:
|
||||
takerAssetData = await this._devUtils
|
||||
.encodeMultiAssetData(
|
||||
[ONE_UNITS_EIGHTEEN_DECIMALS, ONE_UNITS_FIVE_DECIMALS],
|
||||
[
|
||||
await this._devUtils
|
||||
.encodeERC20AssetData(this._erc20EighteenDecimalTokenAddresses[1])
|
||||
.callAsync(),
|
||||
await this._devUtils
|
||||
.encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[1])
|
||||
.callAsync(),
|
||||
],
|
||||
)
|
||||
.callAsync();
|
||||
takerAssetData = encodeMultiAssetData(
|
||||
[ONE_UNITS_EIGHTEEN_DECIMALS, ONE_UNITS_FIVE_DECIMALS],
|
||||
[
|
||||
encodeERC20AssetData(this._erc20EighteenDecimalTokenAddresses[1]),
|
||||
encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[1]),
|
||||
],
|
||||
);
|
||||
break;
|
||||
default:
|
||||
throw errorUtils.spawnSwitchErr('AssetDataScenario', orderScenario.takerAssetDataScenario);
|
||||
@ -339,63 +307,43 @@ export class OrderFactoryFromScenario {
|
||||
case FeeAssetDataScenario.TakerToken:
|
||||
return [feeAmount, takerAssetData];
|
||||
case FeeAssetDataScenario.ERC20EighteenDecimals:
|
||||
return [
|
||||
feeAmount,
|
||||
await this._devUtils.encodeERC20AssetData(erc20EighteenDecimalTokenAddress).callAsync(),
|
||||
];
|
||||
return [feeAmount, encodeERC20AssetData(erc20EighteenDecimalTokenAddress)];
|
||||
case FeeAssetDataScenario.ERC20FiveDecimals:
|
||||
return [
|
||||
feeAmount,
|
||||
await this._devUtils.encodeERC20AssetData(erc20FiveDecimalTokenAddress).callAsync(),
|
||||
];
|
||||
return [feeAmount, encodeERC20AssetData(erc20FiveDecimalTokenAddress)];
|
||||
case FeeAssetDataScenario.ERC20ZeroDecimals:
|
||||
return [
|
||||
feeAmount,
|
||||
await this._devUtils.encodeERC20AssetData(erc20ZeroDecimalTokenAddress).callAsync(),
|
||||
];
|
||||
return [feeAmount, encodeERC20AssetData(erc20ZeroDecimalTokenAddress)];
|
||||
case FeeAssetDataScenario.ERC721:
|
||||
return [
|
||||
feeAmount,
|
||||
await this._devUtils.encodeERC721AssetData(this._erc721TokenAddress, erc721AssetId).callAsync(),
|
||||
];
|
||||
return [feeAmount, encodeERC721AssetData(this._erc721TokenAddress, erc721AssetId)];
|
||||
case FeeAssetDataScenario.ERC1155Fungible:
|
||||
return [
|
||||
feeAmount,
|
||||
await this._devUtils
|
||||
.encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155FungibleTokenId],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
)
|
||||
.callAsync(),
|
||||
encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155FungibleTokenId],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
),
|
||||
];
|
||||
case FeeAssetDataScenario.ERC1155NonFungible:
|
||||
return [
|
||||
feeAmount,
|
||||
await this._devUtils
|
||||
.encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155NonFungibleAssetId],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
)
|
||||
.callAsync(),
|
||||
encodeERC1155AssetData(
|
||||
this._erc1155TokenAddress,
|
||||
[erc1155NonFungibleAssetId],
|
||||
[ONE_UNITS_ZERO_DECIMALS],
|
||||
erc1155CallbackData,
|
||||
),
|
||||
];
|
||||
case FeeAssetDataScenario.MultiAssetERC20:
|
||||
return [
|
||||
feeAmount,
|
||||
await this._devUtils
|
||||
.encodeMultiAssetData(
|
||||
[POINT_ZERO_FIVE_UNITS_EIGHTEEN_DECIMALS, POINT_ZERO_FIVE_UNITS_FIVE_DECIMALS],
|
||||
[
|
||||
await this._devUtils
|
||||
.encodeERC20AssetData(erc20EighteenDecimalTokenAddress)
|
||||
.callAsync(),
|
||||
await this._devUtils.encodeERC20AssetData(erc20FiveDecimalTokenAddress).callAsync(),
|
||||
],
|
||||
)
|
||||
.callAsync(),
|
||||
encodeMultiAssetData(
|
||||
[POINT_ZERO_FIVE_UNITS_EIGHTEEN_DECIMALS, POINT_ZERO_FIVE_UNITS_FIVE_DECIMALS],
|
||||
[
|
||||
encodeERC20AssetData(erc20EighteenDecimalTokenAddress),
|
||||
encodeERC20AssetData(erc20FiveDecimalTokenAddress),
|
||||
],
|
||||
),
|
||||
];
|
||||
default:
|
||||
throw errorUtils.spawnSwitchErr('FeeAssetDataScenario', feeAssetDataScenario);
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "6.1.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Export `EvmBytecodeOutputLinkReferences` type.",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"version": "6.0.0",
|
||||
"changes": [
|
||||
|
@ -15,6 +15,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "2.3.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Remove dependency on `DevUtils` for asset data encoding/decoding",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "2.2.3",
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { ContractAddresses, getContractAddressesForChainOrThrow } from '@0x/contract-addresses';
|
||||
import { IAssetDataContract } from '@0x/contracts-asset-proxy';
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { ExchangeContract } from '@0x/contracts-exchange';
|
||||
import { blockchainTests, constants, expect, OrderFactory } from '@0x/contracts-test-utils';
|
||||
import { defaultOrmConfig, getAppAsync } from '@0x/coordinator-server';
|
||||
@ -22,7 +22,6 @@ const DEFAULT_PROTOCOL_FEE_MULTIPLIER = new BigNumber(150000);
|
||||
blockchainTests.skip('Coordinator Client', env => {
|
||||
const takerTokenFillAmount = new BigNumber(0);
|
||||
const chainId = 1337;
|
||||
const assetDataEncoder = new IAssetDataContract(constants.NULL_ADDRESS, env.provider);
|
||||
|
||||
let contractAddresses: ContractAddresses;
|
||||
let coordinatorRegistry: CoordinatorRegistryContract;
|
||||
@ -80,9 +79,9 @@ blockchainTests.skip('Coordinator Client', env => {
|
||||
const [makerTokenAddress, takerTokenAddress] = tokenUtils.getDummyERC20TokenAddresses();
|
||||
const feeTokenAddress = contractAddresses.zrxToken;
|
||||
[makerAssetData, takerAssetData, feeAssetData] = [
|
||||
assetDataEncoder.ERC20Token(makerTokenAddress).getABIEncodedTransactionData(),
|
||||
assetDataEncoder.ERC20Token(takerTokenAddress).getABIEncodedTransactionData(),
|
||||
assetDataEncoder.ERC20Token(feeTokenAddress).getABIEncodedTransactionData(),
|
||||
encodeERC20AssetData(makerTokenAddress),
|
||||
encodeERC20AssetData(takerTokenAddress),
|
||||
encodeERC20AssetData(feeTokenAddress),
|
||||
];
|
||||
|
||||
// set initial balances
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { CoordinatorContract, CoordinatorRevertErrors, SignedCoordinatorApproval } from '@0x/contracts-coordinator';
|
||||
import {
|
||||
ExchangeCancelEventArgs,
|
||||
@ -60,18 +61,10 @@ blockchainTests.resets('Coordinator integration tests', env => {
|
||||
orderConfig: {
|
||||
senderAddress: coordinator.address,
|
||||
feeRecipientAddress: feeRecipient.address,
|
||||
makerAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(makerToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
takerAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(takerToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerFeeAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(makerFeeToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
takerFeeAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(takerFeeToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC20AssetData(makerToken.address),
|
||||
takerAssetData: encodeERC20AssetData(takerToken.address),
|
||||
makerFeeAssetData: encodeERC20AssetData(makerFeeToken.address),
|
||||
takerFeeAssetData: encodeERC20AssetData(takerFeeToken.address),
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { encodeERC1155AssetData, encodeERC20AssetData, encodeERC721AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { DummyERC20TokenContract } from '@0x/contracts-erc20';
|
||||
import { ExchangeRevertErrors } from '@0x/contracts-exchange';
|
||||
import { blockchainTests, constants, expect, toBaseUnitAmount } from '@0x/contracts-test-utils';
|
||||
@ -61,13 +62,9 @@ blockchainTests.resets('matchOrders integration tests', env => {
|
||||
});
|
||||
|
||||
// Encode the asset data.
|
||||
makerAssetDataLeft = deployment.assetDataEncoder
|
||||
.ERC20Token(makerAssetLeft.address)
|
||||
.getABIEncodedTransactionData();
|
||||
makerAssetDataRight = deployment.assetDataEncoder
|
||||
.ERC20Token(makerAssetRight.address)
|
||||
.getABIEncodedTransactionData();
|
||||
feeAssetData = deployment.assetDataEncoder.ERC20Token(feeAsset.address).getABIEncodedTransactionData();
|
||||
makerAssetDataLeft = encodeERC20AssetData(makerAssetLeft.address);
|
||||
makerAssetDataRight = encodeERC20AssetData(makerAssetRight.address);
|
||||
feeAssetData = encodeERC20AssetData(feeAsset.address);
|
||||
|
||||
// Create two market makers with compatible orders for matching.
|
||||
makerLeft = new Maker({
|
||||
@ -812,12 +809,13 @@ blockchainTests.resets('matchOrders integration tests', env => {
|
||||
|
||||
describe('token sanity checks', () => {
|
||||
it('should be able to match ERC721 tokens with ERC1155 tokens', async () => {
|
||||
const leftMakerAssetData = deployment.assetDataEncoder
|
||||
.ERC1155Assets(deployment.tokens.erc1155[0].address, [leftId], [new BigNumber(1)], '0x')
|
||||
.getABIEncodedTransactionData();
|
||||
const rightMakerAssetData = deployment.assetDataEncoder
|
||||
.ERC721Token(deployment.tokens.erc721[0].address, rightId)
|
||||
.getABIEncodedTransactionData();
|
||||
const leftMakerAssetData = encodeERC1155AssetData(
|
||||
deployment.tokens.erc1155[0].address,
|
||||
[leftId],
|
||||
[new BigNumber(1)],
|
||||
'0x',
|
||||
);
|
||||
const rightMakerAssetData = encodeERC721AssetData(deployment.tokens.erc721[0].address, rightId);
|
||||
|
||||
const signedOrderLeft = await makerLeft.signOrderAsync({
|
||||
makerAssetAmount: new BigNumber(4),
|
||||
|
@ -1,5 +1,10 @@
|
||||
import {
|
||||
artifacts as proxyArtifacts,
|
||||
encodeERC1155AssetData,
|
||||
encodeERC20AssetData,
|
||||
encodeERC721AssetData,
|
||||
encodeMultiAssetData,
|
||||
encodeStaticCallAssetData,
|
||||
ERC1155ProxyContract,
|
||||
ERC1155ProxyWrapper,
|
||||
ERC20ProxyContract,
|
||||
@ -10,7 +15,6 @@ import {
|
||||
StaticCallProxyContract,
|
||||
TestStaticCallTargetContract,
|
||||
} from '@0x/contracts-asset-proxy';
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import { ERC1155MintableContract, Erc1155Wrapper } from '@0x/contracts-erc1155';
|
||||
import {
|
||||
artifacts as erc20Artifacts,
|
||||
@ -51,7 +55,6 @@ blockchainTests.resets('Exchange core', () => {
|
||||
let takerAddress: string;
|
||||
let feeRecipientAddress: string;
|
||||
|
||||
let devUtils: DevUtilsContract;
|
||||
let erc20TokenA: DummyERC20TokenContract;
|
||||
let erc20TokenB: DummyERC20TokenContract;
|
||||
let feeToken: DummyERC20TokenContract;
|
||||
@ -91,7 +94,6 @@ blockchainTests.resets('Exchange core', () => {
|
||||
const accounts = await web3Wrapper.getAvailableAddressesAsync();
|
||||
const usedAddresses = ([owner, makerAddress, takerAddress, feeRecipientAddress] = _.slice(accounts, 0, 4));
|
||||
|
||||
devUtils = new DevUtilsContract(constants.NULL_ADDRESS, provider);
|
||||
erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
|
||||
erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner);
|
||||
erc1155ProxyWrapper = new ERC1155ProxyWrapper(provider, usedAddresses, owner);
|
||||
@ -195,10 +197,10 @@ blockchainTests.resets('Exchange core', () => {
|
||||
...constants.STATIC_ORDER_PARAMS,
|
||||
makerAddress,
|
||||
feeRecipientAddress,
|
||||
makerAssetData: await devUtils.encodeERC20AssetData(defaultMakerAssetAddress).callAsync(),
|
||||
takerAssetData: await devUtils.encodeERC20AssetData(defaultTakerAssetAddress).callAsync(),
|
||||
makerFeeAssetData: await devUtils.encodeERC20AssetData(defaultFeeAssetAddress).callAsync(),
|
||||
takerFeeAssetData: await devUtils.encodeERC20AssetData(defaultFeeAssetAddress).callAsync(),
|
||||
makerAssetData: encodeERC20AssetData(defaultMakerAssetAddress),
|
||||
takerAssetData: encodeERC20AssetData(defaultTakerAssetAddress),
|
||||
makerFeeAssetData: encodeERC20AssetData(defaultFeeAssetAddress),
|
||||
takerFeeAssetData: encodeERC20AssetData(defaultFeeAssetAddress),
|
||||
exchangeAddress: exchange.address,
|
||||
chainId,
|
||||
};
|
||||
@ -289,11 +291,9 @@ blockchainTests.resets('Exchange core', () => {
|
||||
describe('Fill transfer ordering', () => {
|
||||
it('should allow the maker to exchange assets received by the taker', async () => {
|
||||
// Set maker/taker assetData to the same asset
|
||||
const takerAssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const takerAssetData = encodeERC20AssetData(erc20TokenA.address);
|
||||
const takerAssetAmount = new BigNumber(1);
|
||||
const makerAssetData = await devUtils
|
||||
.encodeMultiAssetData([takerAssetAmount], [takerAssetData])
|
||||
.callAsync();
|
||||
const makerAssetData = encodeMultiAssetData([takerAssetAmount], [takerAssetData]);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData,
|
||||
takerAssetData,
|
||||
@ -309,7 +309,7 @@ blockchainTests.resets('Exchange core', () => {
|
||||
await fillOrderWrapper.fillOrderAndAssertEffectsAsync(signedOrder, takerAddress);
|
||||
});
|
||||
it('should allow the taker to pay fees with an asset that received by the maker', async () => {
|
||||
const makerAssetData = await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync();
|
||||
const makerAssetData = encodeERC20AssetData(erc20TokenA.address);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
takerFeeAssetData: makerAssetData,
|
||||
makerFee: constants.ZERO_AMOUNT,
|
||||
@ -322,7 +322,7 @@ blockchainTests.resets('Exchange core', () => {
|
||||
await fillOrderWrapper.fillOrderAndAssertEffectsAsync(signedOrder, takerAddress);
|
||||
});
|
||||
it('should allow the maker to pay fees with an asset that received by the taker', async () => {
|
||||
const takerAssetData = await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync();
|
||||
const takerAssetData = encodeERC20AssetData(erc20TokenB.address);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerFeeAssetData: takerAssetData,
|
||||
makerFee: new BigNumber(1),
|
||||
@ -346,7 +346,7 @@ blockchainTests.resets('Exchange core', () => {
|
||||
});
|
||||
it('should transfer the correct amounts when makerAssetAmount === takerAssetAmount', async () => {
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData: await devUtils.encodeERC20AssetData(noReturnErc20Token.address).callAsync(),
|
||||
makerAssetData: encodeERC20AssetData(noReturnErc20Token.address),
|
||||
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
|
||||
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
|
||||
});
|
||||
@ -354,7 +354,7 @@ blockchainTests.resets('Exchange core', () => {
|
||||
});
|
||||
it('should transfer the correct amounts when makerAssetAmount > takerAssetAmount', async () => {
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData: await devUtils.encodeERC20AssetData(noReturnErc20Token.address).callAsync(),
|
||||
makerAssetData: encodeERC20AssetData(noReturnErc20Token.address),
|
||||
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), 18),
|
||||
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
|
||||
});
|
||||
@ -362,7 +362,7 @@ blockchainTests.resets('Exchange core', () => {
|
||||
});
|
||||
it('should transfer the correct amounts when makerAssetAmount < takerAssetAmount', async () => {
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData: await devUtils.encodeERC20AssetData(noReturnErc20Token.address).callAsync(),
|
||||
makerAssetData: encodeERC20AssetData(noReturnErc20Token.address),
|
||||
makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
|
||||
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), 18),
|
||||
});
|
||||
@ -544,8 +544,8 @@ blockchainTests.resets('Exchange core', () => {
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetAmount: new BigNumber(1),
|
||||
takerAssetAmount: new BigNumber(1),
|
||||
makerAssetData: await devUtils.encodeERC721AssetData(erc721Token.address, makerAssetId).callAsync(),
|
||||
takerAssetData: await devUtils.encodeERC721AssetData(erc721Token.address, takerAssetId).callAsync(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, makerAssetId),
|
||||
takerAssetData: encodeERC721AssetData(erc721Token.address, takerAssetId),
|
||||
});
|
||||
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
// Verify pre-conditions
|
||||
@ -573,8 +573,8 @@ blockchainTests.resets('Exchange core', () => {
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetAmount: new BigNumber(1),
|
||||
takerAssetAmount: new BigNumber(1),
|
||||
makerAssetData: await devUtils.encodeERC721AssetData(erc721Token.address, makerAssetId).callAsync(),
|
||||
takerAssetData: await devUtils.encodeERC721AssetData(erc721Token.address, takerAssetId).callAsync(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, makerAssetId),
|
||||
takerAssetData: encodeERC721AssetData(erc721Token.address, takerAssetId),
|
||||
});
|
||||
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
// Verify pre-conditions
|
||||
@ -602,8 +602,8 @@ blockchainTests.resets('Exchange core', () => {
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetAmount: new BigNumber(2),
|
||||
takerAssetAmount: new BigNumber(1),
|
||||
makerAssetData: await devUtils.encodeERC721AssetData(erc721Token.address, makerAssetId).callAsync(),
|
||||
takerAssetData: await devUtils.encodeERC721AssetData(erc721Token.address, takerAssetId).callAsync(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, makerAssetId),
|
||||
takerAssetData: encodeERC721AssetData(erc721Token.address, takerAssetId),
|
||||
});
|
||||
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
// Verify pre-conditions
|
||||
@ -631,8 +631,8 @@ blockchainTests.resets('Exchange core', () => {
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetAmount: new BigNumber(1),
|
||||
takerAssetAmount: new BigNumber(500),
|
||||
makerAssetData: await devUtils.encodeERC721AssetData(erc721Token.address, makerAssetId).callAsync(),
|
||||
takerAssetData: await devUtils.encodeERC721AssetData(erc721Token.address, takerAssetId).callAsync(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, makerAssetId),
|
||||
takerAssetData: encodeERC721AssetData(erc721Token.address, takerAssetId),
|
||||
});
|
||||
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
// Verify pre-conditions
|
||||
@ -659,8 +659,8 @@ blockchainTests.resets('Exchange core', () => {
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetAmount: new BigNumber(1),
|
||||
takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
|
||||
makerAssetData: await devUtils.encodeERC721AssetData(erc721Token.address, makerAssetId).callAsync(),
|
||||
takerAssetData: await devUtils.encodeERC20AssetData(defaultTakerAssetAddress).callAsync(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, makerAssetId),
|
||||
takerAssetData: encodeERC20AssetData(defaultTakerAssetAddress),
|
||||
});
|
||||
// Call Exchange
|
||||
const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
|
||||
@ -680,12 +680,12 @@ blockchainTests.resets('Exchange core', () => {
|
||||
it('should allow multiple assets to be exchanged for a single asset', async () => {
|
||||
const makerAmounts = [new BigNumber(10), new BigNumber(20)];
|
||||
const makerNestedAssetData = [
|
||||
await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync(),
|
||||
await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync(),
|
||||
encodeERC20AssetData(erc20TokenA.address),
|
||||
encodeERC20AssetData(erc20TokenB.address),
|
||||
];
|
||||
const makerAssetData = await devUtils.encodeMultiAssetData(makerAmounts, makerNestedAssetData).callAsync();
|
||||
const makerAssetData = encodeMultiAssetData(makerAmounts, makerNestedAssetData);
|
||||
const makerAssetAmount = new BigNumber(1);
|
||||
const takerAssetData = await devUtils.encodeERC20AssetData(feeToken.address).callAsync();
|
||||
const takerAssetData = encodeERC20AssetData(feeToken.address);
|
||||
const takerAssetAmount = new BigNumber(10);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData,
|
||||
@ -700,18 +700,18 @@ blockchainTests.resets('Exchange core', () => {
|
||||
it('should allow multiple assets to be exchanged for multiple assets', async () => {
|
||||
const makerAmounts = [new BigNumber(10), new BigNumber(20)];
|
||||
const makerNestedAssetData = [
|
||||
await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync(),
|
||||
await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync(),
|
||||
encodeERC20AssetData(erc20TokenA.address),
|
||||
encodeERC20AssetData(erc20TokenB.address),
|
||||
];
|
||||
const makerAssetData = await devUtils.encodeMultiAssetData(makerAmounts, makerNestedAssetData).callAsync();
|
||||
const makerAssetData = encodeMultiAssetData(makerAmounts, makerNestedAssetData);
|
||||
const makerAssetAmount = new BigNumber(1);
|
||||
const takerAmounts = [new BigNumber(10), new BigNumber(1)];
|
||||
const takerAssetId = erc721TakerAssetIds[0];
|
||||
const takerNestedAssetData = [
|
||||
await devUtils.encodeERC20AssetData(feeToken.address).callAsync(),
|
||||
await devUtils.encodeERC721AssetData(erc721Token.address, takerAssetId).callAsync(),
|
||||
encodeERC20AssetData(feeToken.address),
|
||||
encodeERC721AssetData(erc721Token.address, takerAssetId),
|
||||
];
|
||||
const takerAssetData = await devUtils.encodeMultiAssetData(takerAmounts, takerNestedAssetData).callAsync();
|
||||
const takerAssetData = encodeMultiAssetData(takerAmounts, takerNestedAssetData);
|
||||
const takerAssetAmount = new BigNumber(1);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData,
|
||||
@ -726,12 +726,12 @@ blockchainTests.resets('Exchange core', () => {
|
||||
it('should allow an order selling multiple assets to be partially filled', async () => {
|
||||
const makerAmounts = [new BigNumber(10), new BigNumber(20)];
|
||||
const makerNestedAssetData = [
|
||||
await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync(),
|
||||
await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync(),
|
||||
encodeERC20AssetData(erc20TokenA.address),
|
||||
encodeERC20AssetData(erc20TokenB.address),
|
||||
];
|
||||
const makerAssetData = await devUtils.encodeMultiAssetData(makerAmounts, makerNestedAssetData).callAsync();
|
||||
const makerAssetData = encodeMultiAssetData(makerAmounts, makerNestedAssetData);
|
||||
const makerAssetAmount = new BigNumber(30);
|
||||
const takerAssetData = await devUtils.encodeERC20AssetData(feeToken.address).callAsync();
|
||||
const takerAssetData = encodeERC20AssetData(feeToken.address);
|
||||
const takerAssetAmount = new BigNumber(10);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData,
|
||||
@ -748,12 +748,12 @@ blockchainTests.resets('Exchange core', () => {
|
||||
it('should allow an order buying multiple assets to be partially filled', async () => {
|
||||
const takerAmounts = [new BigNumber(10), new BigNumber(20)];
|
||||
const takerNestedAssetData = [
|
||||
await devUtils.encodeERC20AssetData(erc20TokenA.address).callAsync(),
|
||||
await devUtils.encodeERC20AssetData(erc20TokenB.address).callAsync(),
|
||||
encodeERC20AssetData(erc20TokenA.address),
|
||||
encodeERC20AssetData(erc20TokenB.address),
|
||||
];
|
||||
const takerAssetData = await devUtils.encodeMultiAssetData(takerAmounts, takerNestedAssetData).callAsync();
|
||||
const takerAssetData = encodeMultiAssetData(takerAmounts, takerNestedAssetData);
|
||||
const takerAssetAmount = new BigNumber(30);
|
||||
const makerAssetData = await devUtils.encodeERC20AssetData(feeToken.address).callAsync();
|
||||
const makerAssetData = encodeERC20AssetData(feeToken.address);
|
||||
const makerAssetAmount = new BigNumber(10);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData,
|
||||
@ -779,22 +779,18 @@ blockchainTests.resets('Exchange core', () => {
|
||||
const makerAssetAmount = new BigNumber(1);
|
||||
const takerAssetAmount = new BigNumber(1);
|
||||
const receiverCallbackData = '0x';
|
||||
const makerAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
makerAssetsToTransfer,
|
||||
makerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const takerAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
takerAssetsToTransfer,
|
||||
takerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const makerAssetData = encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
makerAssetsToTransfer,
|
||||
makerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
);
|
||||
const takerAssetData = encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
takerAssetsToTransfer,
|
||||
takerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData,
|
||||
takerAssetData,
|
||||
@ -818,22 +814,18 @@ blockchainTests.resets('Exchange core', () => {
|
||||
const makerAssetAmount = new BigNumber(1);
|
||||
const takerAssetAmount = new BigNumber(1);
|
||||
const receiverCallbackData = '0x';
|
||||
const makerAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
makerAssetsToTransfer,
|
||||
makerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const takerAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
takerAssetsToTransfer,
|
||||
takerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const makerAssetData = encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
makerAssetsToTransfer,
|
||||
makerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
);
|
||||
const takerAssetData = encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
takerAssetsToTransfer,
|
||||
takerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData,
|
||||
takerAssetData,
|
||||
@ -856,22 +848,18 @@ blockchainTests.resets('Exchange core', () => {
|
||||
const makerAssetAmount = new BigNumber(1);
|
||||
const takerAssetAmount = new BigNumber(1);
|
||||
const receiverCallbackData = '0x';
|
||||
const makerAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
makerAssetsToTransfer,
|
||||
makerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const takerAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
takerAssetsToTransfer,
|
||||
takerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const makerAssetData = encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
makerAssetsToTransfer,
|
||||
makerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
);
|
||||
const takerAssetData = encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
takerAssetsToTransfer,
|
||||
takerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData,
|
||||
takerAssetData,
|
||||
@ -900,22 +888,18 @@ blockchainTests.resets('Exchange core', () => {
|
||||
const makerAssetAmount = new BigNumber(1);
|
||||
const takerAssetAmount = new BigNumber(1);
|
||||
const receiverCallbackData = '0x';
|
||||
const makerAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
makerAssetsToTransfer,
|
||||
makerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const takerAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
takerAssetsToTransfer,
|
||||
takerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const makerAssetData = encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
makerAssetsToTransfer,
|
||||
makerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
);
|
||||
const takerAssetData = encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
takerAssetsToTransfer,
|
||||
takerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData,
|
||||
takerAssetData,
|
||||
@ -949,22 +933,18 @@ blockchainTests.resets('Exchange core', () => {
|
||||
const makerAssetAmount = new BigNumber(10);
|
||||
const takerAssetAmount = new BigNumber(20);
|
||||
const receiverCallbackData = '0x';
|
||||
const makerAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
makerAssetsToTransfer,
|
||||
makerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const takerAssetData = await devUtils
|
||||
.encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
takerAssetsToTransfer,
|
||||
takerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
)
|
||||
.callAsync();
|
||||
const makerAssetData = encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
makerAssetsToTransfer,
|
||||
makerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
);
|
||||
const takerAssetData = encodeERC1155AssetData(
|
||||
erc1155Contract.address,
|
||||
takerAssetsToTransfer,
|
||||
takerValuesToTransfer,
|
||||
receiverCallbackData,
|
||||
);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerAssetData,
|
||||
takerAssetData,
|
||||
@ -990,9 +970,11 @@ blockchainTests.resets('Exchange core', () => {
|
||||
});
|
||||
it('should revert if the staticcall is unsuccessful', async () => {
|
||||
const staticCallData = staticCallTarget.assertEvenNumber(new BigNumber(1)).getABIEncodedTransactionData();
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, constants.KECCAK256_NULL)
|
||||
.callAsync();
|
||||
const assetData = encodeStaticCallAssetData(
|
||||
staticCallTarget.address,
|
||||
staticCallData,
|
||||
constants.KECCAK256_NULL,
|
||||
);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({ makerAssetData: assetData });
|
||||
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
const expectedError = new ExchangeRevertErrors.AssetProxyTransferError(
|
||||
@ -1009,23 +991,25 @@ blockchainTests.resets('Exchange core', () => {
|
||||
const staticCallData = staticCallTarget
|
||||
.assertEvenNumber(constants.ZERO_AMOUNT)
|
||||
.getABIEncodedTransactionData();
|
||||
const assetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, constants.KECCAK256_NULL)
|
||||
.callAsync();
|
||||
const assetData = encodeStaticCallAssetData(
|
||||
staticCallTarget.address,
|
||||
staticCallData,
|
||||
constants.KECCAK256_NULL,
|
||||
);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({ makerAssetData: assetData });
|
||||
await fillOrderWrapper.fillOrderAndAssertEffectsAsync(signedOrder, takerAddress);
|
||||
});
|
||||
it('should revert if the staticcall is unsuccessful using the MultiAssetProxy', async () => {
|
||||
const staticCallData = staticCallTarget.assertEvenNumber(new BigNumber(1)).getABIEncodedTransactionData();
|
||||
const staticCallAssetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, constants.KECCAK256_NULL)
|
||||
.callAsync();
|
||||
const assetData = await devUtils
|
||||
.encodeMultiAssetData(
|
||||
[new BigNumber(1), new BigNumber(1)],
|
||||
[await devUtils.encodeERC20AssetData(defaultMakerAssetAddress).callAsync(), staticCallAssetData],
|
||||
)
|
||||
.callAsync();
|
||||
const staticCallAssetData = encodeStaticCallAssetData(
|
||||
staticCallTarget.address,
|
||||
staticCallData,
|
||||
constants.KECCAK256_NULL,
|
||||
);
|
||||
const assetData = encodeMultiAssetData(
|
||||
[new BigNumber(1), new BigNumber(1)],
|
||||
[encodeERC20AssetData(defaultMakerAssetAddress), staticCallAssetData],
|
||||
);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({ makerAssetData: assetData });
|
||||
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
|
||||
const expectedError = new ExchangeRevertErrors.AssetProxyTransferError(
|
||||
@ -1042,15 +1026,15 @@ blockchainTests.resets('Exchange core', () => {
|
||||
const staticCallData = staticCallTarget
|
||||
.assertEvenNumber(constants.ZERO_AMOUNT)
|
||||
.getABIEncodedTransactionData();
|
||||
const staticCallAssetData = await devUtils
|
||||
.encodeStaticCallAssetData(staticCallTarget.address, staticCallData, constants.KECCAK256_NULL)
|
||||
.callAsync();
|
||||
const assetData = await devUtils
|
||||
.encodeMultiAssetData(
|
||||
[new BigNumber(1), new BigNumber(1)],
|
||||
[await devUtils.encodeERC20AssetData(defaultMakerAssetAddress).callAsync(), staticCallAssetData],
|
||||
)
|
||||
.callAsync();
|
||||
const staticCallAssetData = encodeStaticCallAssetData(
|
||||
staticCallTarget.address,
|
||||
staticCallData,
|
||||
constants.KECCAK256_NULL,
|
||||
);
|
||||
const assetData = encodeMultiAssetData(
|
||||
[new BigNumber(1), new BigNumber(1)],
|
||||
[encodeERC20AssetData(defaultMakerAssetAddress), staticCallAssetData],
|
||||
);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({ makerAssetData: assetData });
|
||||
await fillOrderWrapper.fillOrderAndAssertEffectsAsync(signedOrder, takerAddress);
|
||||
});
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { DummyERC20TokenContract, ERC20TokenEvents, ERC20TokenTransferEventArgs } from '@0x/contracts-erc20';
|
||||
import { ExchangeRevertErrors, IExchangeEvents, IExchangeFillEventArgs } from '@0x/contracts-exchange';
|
||||
import { ReferenceFunctions } from '@0x/contracts-exchange-libs';
|
||||
@ -65,18 +66,10 @@ blockchainTests.resets('Exchange wrappers', env => {
|
||||
name: 'market maker',
|
||||
deployment,
|
||||
orderConfig: {
|
||||
makerAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(makerToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
takerAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(takerToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerFeeAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(feeToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
takerFeeAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(feeToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC20AssetData(makerToken.address),
|
||||
takerAssetData: encodeERC20AssetData(takerToken.address),
|
||||
makerFeeAssetData: encodeERC20AssetData(feeToken.address),
|
||||
takerFeeAssetData: encodeERC20AssetData(feeToken.address),
|
||||
feeRecipientAddress: feeRecipient,
|
||||
},
|
||||
});
|
||||
@ -114,9 +107,7 @@ blockchainTests.resets('Exchange wrappers', env => {
|
||||
|
||||
initialLocalBalances = LocalBalanceStore.create(blockchainBalances);
|
||||
|
||||
wethAssetData = deployment.assetDataEncoder
|
||||
.ERC20Token(deployment.tokens.weth.address)
|
||||
.getABIEncodedTransactionData();
|
||||
wethAssetData = encodeERC20AssetData(deployment.tokens.weth.address);
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
@ -788,9 +779,7 @@ blockchainTests.resets('Exchange wrappers', env => {
|
||||
});
|
||||
|
||||
it('should fill a signedOrder that does not use the same takerAssetAddress (eth protocol fee)', async () => {
|
||||
const differentTakerAssetData = deployment.assetDataEncoder
|
||||
.ERC20Token(feeToken.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const differentTakerAssetData = encodeERC20AssetData(feeToken.address);
|
||||
|
||||
signedOrders = [
|
||||
await maker.signOrderAsync(),
|
||||
@ -811,9 +800,7 @@ blockchainTests.resets('Exchange wrappers', env => {
|
||||
});
|
||||
|
||||
it('should fill a signedOrder that does not use the same takerAssetAddress (weth protocol fee)', async () => {
|
||||
const differentTakerAssetData = deployment.assetDataEncoder
|
||||
.ERC20Token(feeToken.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const differentTakerAssetData = encodeERC20AssetData(feeToken.address);
|
||||
|
||||
signedOrders = [
|
||||
await maker.signOrderAsync(),
|
||||
@ -986,9 +973,7 @@ blockchainTests.resets('Exchange wrappers', env => {
|
||||
});
|
||||
|
||||
it('should fill a signedOrder that does not use the same makerAssetAddress (eth protocol fee)', async () => {
|
||||
const differentMakerAssetData = deployment.assetDataEncoder
|
||||
.ERC20Token(feeToken.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const differentMakerAssetData = encodeERC20AssetData(feeToken.address);
|
||||
|
||||
signedOrders = [
|
||||
await maker.signOrderAsync(),
|
||||
@ -1010,9 +995,7 @@ blockchainTests.resets('Exchange wrappers', env => {
|
||||
});
|
||||
|
||||
it('should fill a signedOrder that does not use the same makerAssetAddress (weth protocol fee)', async () => {
|
||||
const differentMakerAssetData = deployment.assetDataEncoder
|
||||
.ERC20Token(feeToken.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const differentMakerAssetData = encodeERC20AssetData(feeToken.address);
|
||||
|
||||
signedOrders = [
|
||||
await maker.signOrderAsync(),
|
||||
|
@ -1,4 +1,10 @@
|
||||
import { DydxBridgeActionType, dydxBridgeDataEncoder, TestDydxBridgeContract } from '@0x/contracts-asset-proxy';
|
||||
import {
|
||||
DydxBridgeActionType,
|
||||
dydxBridgeDataEncoder,
|
||||
encodeERC20AssetData,
|
||||
encodeERC20BridgeAssetData,
|
||||
TestDydxBridgeContract,
|
||||
} from '@0x/contracts-asset-proxy';
|
||||
import { DummyERC20TokenContract } from '@0x/contracts-erc20';
|
||||
import { LibMathRevertErrors } from '@0x/contracts-exchange-libs';
|
||||
import { blockchainTests, constants, describe, expect, toBaseUnitAmount } from '@0x/contracts-test-utils';
|
||||
@ -53,25 +59,23 @@ blockchainTests.resets('Exchange fills dydx orders', env => {
|
||||
testContract = await deployDydxBridgeAsync(deployment, env);
|
||||
const encodedBridgeData = dydxBridgeDataEncoder.encode({ bridgeData });
|
||||
testTokenAddress = await testContract.getTestToken().callAsync();
|
||||
dydxBridgeProxyAssetData = deployment.assetDataEncoder
|
||||
.ERC20Bridge(testTokenAddress, testContract.address, encodedBridgeData)
|
||||
.getABIEncodedTransactionData();
|
||||
dydxBridgeProxyAssetData = encodeERC20BridgeAssetData(
|
||||
testTokenAddress,
|
||||
testContract.address,
|
||||
encodedBridgeData,
|
||||
);
|
||||
[makerToken, takerToken] = deployment.tokens.erc20;
|
||||
|
||||
// Configure default order parameters.
|
||||
orderConfig = {
|
||||
makerAssetAmount: toBaseUnitAmount(1),
|
||||
takerAssetAmount: toBaseUnitAmount(1),
|
||||
makerAssetData: deployment.assetDataEncoder.ERC20Token(makerToken.address).getABIEncodedTransactionData(),
|
||||
takerAssetData: deployment.assetDataEncoder.ERC20Token(takerToken.address).getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC20AssetData(makerToken.address),
|
||||
takerAssetData: encodeERC20AssetData(takerToken.address),
|
||||
// Not important for this test.
|
||||
feeRecipientAddress: constants.NULL_ADDRESS,
|
||||
makerFeeAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(makerToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
takerFeeAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(takerToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerFeeAssetData: encodeERC20AssetData(makerToken.address),
|
||||
takerFeeAssetData: encodeERC20AssetData(takerToken.address),
|
||||
makerFee: toBaseUnitAmount(1),
|
||||
takerFee: toBaseUnitAmount(1),
|
||||
};
|
||||
@ -244,9 +248,11 @@ blockchainTests.resets('Exchange fills dydx orders', env => {
|
||||
actions: [badDepositAction],
|
||||
};
|
||||
const encodedBridgeData = dydxBridgeDataEncoder.encode({ bridgeData: badBridgeData });
|
||||
const badDydxBridgeProxyAssetData = deployment.assetDataEncoder
|
||||
.ERC20Bridge(testTokenAddress, testContract.address, encodedBridgeData)
|
||||
.getABIEncodedTransactionData();
|
||||
const badDydxBridgeProxyAssetData = encodeERC20BridgeAssetData(
|
||||
testTokenAddress,
|
||||
testContract.address,
|
||||
encodedBridgeData,
|
||||
);
|
||||
const signedOrder = await maker.signOrderAsync({
|
||||
makerAssetData: badDydxBridgeProxyAssetData,
|
||||
makerAssetAmount: badDepositAction.conversionRateDenominator,
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { ERC20TokenEvents, ERC20TokenTransferEventArgs } from '@0x/contracts-erc20';
|
||||
import { ExchangeEvents, ExchangeFillEventArgs } from '@0x/contracts-exchange';
|
||||
import { ReferenceFunctions } from '@0x/contracts-exchange-libs';
|
||||
@ -58,14 +59,10 @@ blockchainTests.resets('fillOrder integration tests', env => {
|
||||
});
|
||||
const orderConfig = {
|
||||
feeRecipientAddress: feeRecipient.address,
|
||||
makerAssetData: deployment.assetDataEncoder.ERC20Token(makerToken.address).getABIEncodedTransactionData(),
|
||||
takerAssetData: deployment.assetDataEncoder.ERC20Token(takerToken.address).getABIEncodedTransactionData(),
|
||||
makerFeeAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(makerToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
takerFeeAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(takerToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC20AssetData(makerToken.address),
|
||||
takerAssetData: encodeERC20AssetData(takerToken.address),
|
||||
makerFeeAssetData: encodeERC20AssetData(makerToken.address),
|
||||
takerFeeAssetData: encodeERC20AssetData(takerToken.address),
|
||||
makerFee: constants.ZERO_AMOUNT,
|
||||
takerFee: constants.ZERO_AMOUNT,
|
||||
};
|
||||
@ -271,7 +268,7 @@ blockchainTests.resets('fillOrder integration tests', env => {
|
||||
deployment.staking.stakingProxy.address,
|
||||
operator.address,
|
||||
operatorReward,
|
||||
deployment.assetDataEncoder.ERC20Token(deployment.tokens.weth.address).getABIEncodedTransactionData(),
|
||||
encodeERC20AssetData(deployment.tokens.weth.address),
|
||||
);
|
||||
expectedBalances.burnGas(delegator.address, DeploymentManager.gasPrice.times(finalizePoolReceipt.gasUsed));
|
||||
await balanceStore.updateBalancesAsync();
|
||||
@ -354,7 +351,7 @@ blockchainTests.resets('fillOrder integration tests', env => {
|
||||
deployment.staking.stakingProxy.address,
|
||||
operator.address,
|
||||
operatorReward,
|
||||
deployment.assetDataEncoder.ERC20Token(deployment.tokens.weth.address).getABIEncodedTransactionData(),
|
||||
encodeERC20AssetData(deployment.tokens.weth.address),
|
||||
);
|
||||
expectedBalances.burnGas(delegator.address, DeploymentManager.gasPrice.times(finalizePoolReceipt.gasUsed));
|
||||
await balanceStore.updateBalancesAsync();
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { BlockchainTestsEnvironment, constants, expect, orderHashUtils, OrderStatus } from '@0x/contracts-test-utils';
|
||||
import { BatchMatchedFillResults, FillResults, MatchedFillResults, Order, SignedOrder } from '@0x/types';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
@ -411,9 +412,7 @@ export class MatchOrderTester {
|
||||
);
|
||||
|
||||
// Protocol Fee
|
||||
const wethAssetData = this._deployment.assetDataEncoder
|
||||
.ERC20Token(this._deployment.tokens.weth.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const wethAssetData = encodeERC20AssetData(this._deployment.tokens.weth.address);
|
||||
localBalanceStore.sendEth(
|
||||
takerAddress,
|
||||
this._deployment.staking.stakingProxy.address,
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { DummyERC20TokenContract } from '@0x/contracts-erc20';
|
||||
import { ExchangeRevertErrors } from '@0x/contracts-exchange';
|
||||
import { ReferenceFunctions as LibReferenceFunctions } from '@0x/contracts-exchange-libs';
|
||||
@ -66,13 +67,9 @@ blockchainTests.resets('matchOrdersWithMaximalFill integration tests', env => {
|
||||
});
|
||||
|
||||
// Encode the asset data.
|
||||
makerAssetDataLeft = deployment.assetDataEncoder
|
||||
.ERC20Token(makerAssetLeft.address)
|
||||
.getABIEncodedTransactionData();
|
||||
makerAssetDataRight = deployment.assetDataEncoder
|
||||
.ERC20Token(makerAssetRight.address)
|
||||
.getABIEncodedTransactionData();
|
||||
feeAssetData = deployment.assetDataEncoder.ERC20Token(feeAsset.address).getABIEncodedTransactionData();
|
||||
makerAssetDataLeft = encodeERC20AssetData(makerAssetLeft.address);
|
||||
makerAssetDataRight = encodeERC20AssetData(makerAssetRight.address);
|
||||
feeAssetData = encodeERC20AssetData(feeAsset.address);
|
||||
|
||||
// Create two market makers with compatible orders for matching.
|
||||
makerLeft = new Maker({
|
||||
@ -1010,9 +1007,7 @@ blockchainTests.resets('matchOrdersWithMaximalFill integration tests', env => {
|
||||
takerAssetAmount: toBaseUnitAmount(10, 18),
|
||||
});
|
||||
const signedOrderRight = await makerRight.signOrderAsync({
|
||||
takerAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(makerAssetRight.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
takerAssetData: encodeERC20AssetData(makerAssetRight.address),
|
||||
makerAssetAmount: toBaseUnitAmount(10, 18),
|
||||
takerAssetAmount: toBaseUnitAmount(2, 18),
|
||||
});
|
||||
@ -1046,9 +1041,7 @@ blockchainTests.resets('matchOrdersWithMaximalFill integration tests', env => {
|
||||
it('should revert if the right maker asset is not equal to the left taker asset', async () => {
|
||||
// Create orders to match
|
||||
const signedOrderLeft = await makerLeft.signOrderAsync({
|
||||
takerAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(makerAssetLeft.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
takerAssetData: encodeERC20AssetData(makerAssetLeft.address),
|
||||
makerAssetAmount: toBaseUnitAmount(5, 18),
|
||||
takerAssetAmount: toBaseUnitAmount(10, 18),
|
||||
});
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { DummyERC20TokenContract } from '@0x/contracts-erc20';
|
||||
import { ExchangeRevertErrors } from '@0x/contracts-exchange';
|
||||
import { ReferenceFunctions as LibReferenceFunctions } from '@0x/contracts-exchange-libs';
|
||||
@ -66,13 +67,9 @@ blockchainTests.resets('matchOrders integration tests', env => {
|
||||
});
|
||||
|
||||
// Encode the asset data.
|
||||
makerAssetDataLeft = deployment.assetDataEncoder
|
||||
.ERC20Token(makerAssetLeft.address)
|
||||
.getABIEncodedTransactionData();
|
||||
makerAssetDataRight = deployment.assetDataEncoder
|
||||
.ERC20Token(makerAssetRight.address)
|
||||
.getABIEncodedTransactionData();
|
||||
feeAssetData = deployment.assetDataEncoder.ERC20Token(feeAsset.address).getABIEncodedTransactionData();
|
||||
makerAssetDataLeft = encodeERC20AssetData(makerAssetLeft.address);
|
||||
makerAssetDataRight = encodeERC20AssetData(makerAssetRight.address);
|
||||
feeAssetData = encodeERC20AssetData(feeAsset.address);
|
||||
|
||||
// Create two market makers with compatible orders for matching.
|
||||
makerLeft = new Maker({
|
||||
@ -1025,9 +1022,7 @@ blockchainTests.resets('matchOrders integration tests', env => {
|
||||
takerAssetAmount: toBaseUnitAmount(10, 18),
|
||||
});
|
||||
const signedOrderRight = await makerRight.signOrderAsync({
|
||||
takerAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(makerAssetRight.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
takerAssetData: encodeERC20AssetData(makerAssetRight.address),
|
||||
makerAssetAmount: toBaseUnitAmount(10, 18),
|
||||
takerAssetAmount: toBaseUnitAmount(2, 18),
|
||||
});
|
||||
@ -1058,9 +1053,7 @@ blockchainTests.resets('matchOrders integration tests', env => {
|
||||
it('should revert if the right maker asset is not equal to the left taker asset', async () => {
|
||||
// Create orders to match
|
||||
const signedOrderLeft = await makerLeft.signOrderAsync({
|
||||
takerAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(makerAssetLeft.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
takerAssetData: encodeERC20AssetData(makerAssetLeft.address),
|
||||
makerAssetAmount: toBaseUnitAmount(5, 18),
|
||||
takerAssetAmount: toBaseUnitAmount(10, 18),
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
// tslint:disable: max-file-line-count
|
||||
import { IAssetDataContract } from '@0x/contracts-asset-proxy';
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { exchangeDataEncoder, ExchangeRevertErrors } from '@0x/contracts-exchange';
|
||||
import {
|
||||
blockchainTests,
|
||||
@ -45,7 +45,6 @@ blockchainTests.resets('Transaction <> protocol fee integration tests', env => {
|
||||
numErc721TokensToDeploy: 0,
|
||||
numErc1155TokensToDeploy: 0,
|
||||
});
|
||||
const assetDataEncoder = new IAssetDataContract(constants.NULL_ADDRESS, env.provider);
|
||||
const [makerToken, takerToken, makerFeeToken, takerFeeToken] = deployment.tokens.erc20;
|
||||
|
||||
alice = new Taker({ name: 'Alice', deployment });
|
||||
@ -61,10 +60,10 @@ blockchainTests.resets('Transaction <> protocol fee integration tests', env => {
|
||||
deployment,
|
||||
orderConfig: {
|
||||
feeRecipientAddress: feeRecipient.address,
|
||||
makerAssetData: assetDataEncoder.ERC20Token(makerToken.address).getABIEncodedTransactionData(),
|
||||
takerAssetData: assetDataEncoder.ERC20Token(takerToken.address).getABIEncodedTransactionData(),
|
||||
makerFeeAssetData: assetDataEncoder.ERC20Token(makerFeeToken.address).getABIEncodedTransactionData(),
|
||||
takerFeeAssetData: assetDataEncoder.ERC20Token(takerFeeToken.address).getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC20AssetData(makerToken.address),
|
||||
takerAssetData: encodeERC20AssetData(takerToken.address),
|
||||
makerFeeAssetData: encodeERC20AssetData(makerFeeToken.address),
|
||||
takerFeeAssetData: encodeERC20AssetData(takerFeeToken.address),
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
// tslint:disable: max-file-line-count
|
||||
import { IAssetDataContract } from '@0x/contracts-asset-proxy';
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import {
|
||||
ExchangeCancelEventArgs,
|
||||
ExchangeCancelUpToEventArgs,
|
||||
@ -48,7 +48,6 @@ blockchainTests.resets('Transaction integration tests', env => {
|
||||
numErc721TokensToDeploy: 0,
|
||||
numErc1155TokensToDeploy: 0,
|
||||
});
|
||||
const assetDataEncoder = new IAssetDataContract(constants.NULL_ADDRESS, env.provider);
|
||||
const [makerToken, takerToken, makerFeeToken, takerFeeToken] = deployment.tokens.erc20;
|
||||
|
||||
takers = [new Taker({ name: 'Taker 1', deployment }), new Taker({ name: 'Taker 2', deployment })];
|
||||
@ -61,10 +60,10 @@ blockchainTests.resets('Transaction integration tests', env => {
|
||||
deployment,
|
||||
orderConfig: {
|
||||
feeRecipientAddress: feeRecipient.address,
|
||||
makerAssetData: assetDataEncoder.ERC20Token(makerToken.address).getABIEncodedTransactionData(),
|
||||
takerAssetData: assetDataEncoder.ERC20Token(takerToken.address).getABIEncodedTransactionData(),
|
||||
makerFeeAssetData: assetDataEncoder.ERC20Token(makerFeeToken.address).getABIEncodedTransactionData(),
|
||||
takerFeeAssetData: assetDataEncoder.ERC20Token(takerFeeToken.address).getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC20AssetData(makerToken.address),
|
||||
takerAssetData: encodeERC20AssetData(takerToken.address),
|
||||
makerFeeAssetData: encodeERC20AssetData(makerFeeToken.address),
|
||||
takerFeeAssetData: encodeERC20AssetData(takerFeeToken.address),
|
||||
},
|
||||
});
|
||||
sender = new Actor({ name: 'Transaction sender', deployment });
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { IAssetDataContract } from '@0x/contracts-asset-proxy';
|
||||
import { encodeERC20AssetData, encodeERC20BridgeAssetData, encodeERC721AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { DummyERC721TokenContract } from '@0x/contracts-erc721';
|
||||
import { ForwarderContract } from '@0x/contracts-exchange-forwarder';
|
||||
import { blockchainTests, constants, getLatestBlockTimestampAsync, toBaseUnitAmount } from '@0x/contracts-test-utils';
|
||||
@ -26,7 +26,6 @@ blockchainTests.resets('Forwarder <> ERC20Bridge integration tests', env => {
|
||||
let testFactory: ForwarderTestFactory;
|
||||
|
||||
let forwarder: ForwarderContract;
|
||||
let assetDataEncoder: IAssetDataContract;
|
||||
let eth2Dai: TestEth2DaiContract;
|
||||
let uniswapExchange: TestUniswapExchangeContract;
|
||||
|
||||
@ -46,7 +45,6 @@ blockchainTests.resets('Forwarder <> ERC20Bridge integration tests', env => {
|
||||
let uniswapBridgeOrder: SignedOrder;
|
||||
|
||||
before(async () => {
|
||||
assetDataEncoder = new IAssetDataContract(constants.NULL_ADDRESS, env.provider);
|
||||
deployment = await DeploymentManager.deployAsync(env, {
|
||||
numErc20TokensToDeploy: 2,
|
||||
numErc721TokensToDeploy: 1,
|
||||
@ -63,20 +61,14 @@ blockchainTests.resets('Forwarder <> ERC20Bridge integration tests', env => {
|
||||
const [uniswapBridge] = uniswapContracts;
|
||||
[, [uniswapExchange]] = uniswapContracts;
|
||||
|
||||
makerTokenAssetData = assetDataEncoder.ERC20Token(makerToken.address).getABIEncodedTransactionData();
|
||||
makerFeeTokenAssetData = assetDataEncoder.ERC20Token(makerFeeToken.address).getABIEncodedTransactionData();
|
||||
const wethAssetData = assetDataEncoder
|
||||
.ERC20Token(deployment.tokens.weth.address)
|
||||
.getABIEncodedTransactionData();
|
||||
makerTokenAssetData = encodeERC20AssetData(makerToken.address);
|
||||
makerFeeTokenAssetData = encodeERC20AssetData(makerFeeToken.address);
|
||||
const wethAssetData = encodeERC20AssetData(deployment.tokens.weth.address);
|
||||
|
||||
const bridgeDataEncoder = AbiEncoder.create([{ name: 'fromTokenAddress', type: 'address' }]);
|
||||
const bridgeData = bridgeDataEncoder.encode([deployment.tokens.weth.address]);
|
||||
eth2DaiBridgeAssetData = assetDataEncoder
|
||||
.ERC20Bridge(makerToken.address, eth2DaiBridge.address, bridgeData)
|
||||
.getABIEncodedTransactionData();
|
||||
uniswapBridgeAssetData = assetDataEncoder
|
||||
.ERC20Bridge(makerToken.address, uniswapBridge.address, bridgeData)
|
||||
.getABIEncodedTransactionData();
|
||||
eth2DaiBridgeAssetData = encodeERC20BridgeAssetData(makerToken.address, eth2DaiBridge.address, bridgeData);
|
||||
uniswapBridgeAssetData = encodeERC20BridgeAssetData(makerToken.address, uniswapBridge.address, bridgeData);
|
||||
|
||||
taker = new Taker({ name: 'Taker', deployment });
|
||||
orderFeeRecipient = new FeeRecipient({
|
||||
@ -185,9 +177,7 @@ blockchainTests.resets('Forwarder <> ERC20Bridge integration tests', env => {
|
||||
// ERC721 order
|
||||
await maker.signOrderAsync({
|
||||
makerAssetAmount: new BigNumber(1),
|
||||
makerAssetData: assetDataEncoder
|
||||
.ERC721Token(erc721Token.address, nftId)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, nftId),
|
||||
takerFee: toBaseUnitAmount(0.01),
|
||||
}),
|
||||
eth2DaiBridgeOrder,
|
||||
@ -229,9 +219,7 @@ blockchainTests.resets('Forwarder <> ERC20Bridge integration tests', env => {
|
||||
// ERC721 order
|
||||
await maker.signOrderAsync({
|
||||
makerAssetAmount: new BigNumber(1),
|
||||
makerAssetData: assetDataEncoder
|
||||
.ERC721Token(erc721Token.address, nftId)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, nftId),
|
||||
takerFee: toBaseUnitAmount(0.01),
|
||||
}),
|
||||
uniswapBridgeOrder,
|
||||
@ -287,9 +275,7 @@ blockchainTests.resets('Forwarder <> ERC20Bridge integration tests', env => {
|
||||
// ERC721 order
|
||||
await maker.signOrderAsync({
|
||||
makerAssetAmount: new BigNumber(1),
|
||||
makerAssetData: assetDataEncoder
|
||||
.ERC721Token(erc721Token.address, nftId)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, nftId),
|
||||
takerFee: toBaseUnitAmount(0.01),
|
||||
}),
|
||||
eth2DaiBridgeOrder,
|
||||
@ -341,9 +327,7 @@ blockchainTests.resets('Forwarder <> ERC20Bridge integration tests', env => {
|
||||
// ERC721 order
|
||||
await maker.signOrderAsync({
|
||||
makerAssetAmount: new BigNumber(1),
|
||||
makerAssetData: assetDataEncoder
|
||||
.ERC721Token(erc721Token.address, nftId)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, nftId),
|
||||
takerFee: toBaseUnitAmount(0.01),
|
||||
}),
|
||||
uniswapBridgeOrder,
|
||||
|
@ -1,4 +1,11 @@
|
||||
import { artifacts as assetProxyArtifacts, TestStaticCallTargetContract } from '@0x/contracts-asset-proxy';
|
||||
import {
|
||||
artifacts as assetProxyArtifacts,
|
||||
encodeERC20AssetData,
|
||||
encodeERC721AssetData,
|
||||
encodeMultiAssetData,
|
||||
encodeStaticCallAssetData,
|
||||
TestStaticCallTargetContract,
|
||||
} from '@0x/contracts-asset-proxy';
|
||||
import { DummyERC20TokenContract } from '@0x/contracts-erc20';
|
||||
import { DummyERC721TokenContract } from '@0x/contracts-erc721';
|
||||
import { artifacts as exchangeArtifacts, ExchangeContract } from '@0x/contracts-exchange';
|
||||
@ -64,24 +71,18 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
|
||||
[makerToken, makerFeeToken, anotherErc20Token] = deployment.tokens.erc20;
|
||||
[erc721Token] = deployment.tokens.erc721;
|
||||
wethAssetData = deployment.assetDataEncoder
|
||||
.ERC20Token(deployment.tokens.weth.address)
|
||||
.getABIEncodedTransactionData();
|
||||
makerAssetData = deployment.assetDataEncoder.ERC20Token(makerToken.address).getABIEncodedTransactionData();
|
||||
staticCallSuccessAssetData = deployment.assetDataEncoder
|
||||
.StaticCall(
|
||||
staticCallTarget.address,
|
||||
staticCallTarget.assertEvenNumber(new BigNumber(2)).getABIEncodedTransactionData(),
|
||||
constants.KECCAK256_NULL,
|
||||
)
|
||||
.getABIEncodedTransactionData();
|
||||
staticCallFailureAssetData = deployment.assetDataEncoder
|
||||
.StaticCall(
|
||||
staticCallTarget.address,
|
||||
staticCallTarget.assertEvenNumber(new BigNumber(1)).getABIEncodedTransactionData(),
|
||||
constants.KECCAK256_NULL,
|
||||
)
|
||||
.getABIEncodedTransactionData();
|
||||
wethAssetData = encodeERC20AssetData(deployment.tokens.weth.address);
|
||||
makerAssetData = encodeERC20AssetData(makerToken.address);
|
||||
staticCallSuccessAssetData = encodeStaticCallAssetData(
|
||||
staticCallTarget.address,
|
||||
staticCallTarget.assertEvenNumber(new BigNumber(2)).getABIEncodedTransactionData(),
|
||||
constants.KECCAK256_NULL,
|
||||
);
|
||||
staticCallFailureAssetData = encodeStaticCallAssetData(
|
||||
staticCallTarget.address,
|
||||
staticCallTarget.assertEvenNumber(new BigNumber(1)).getABIEncodedTransactionData(),
|
||||
constants.KECCAK256_NULL,
|
||||
);
|
||||
|
||||
taker = new Taker({ name: 'Taker', deployment });
|
||||
orderFeeRecipient = new FeeRecipient({
|
||||
@ -102,9 +103,7 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
makerAssetData,
|
||||
takerAssetData: wethAssetData,
|
||||
takerFee: constants.ZERO_AMOUNT,
|
||||
makerFeeAssetData: deployment.assetDataEncoder
|
||||
.ERC20Token(makerFeeToken.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerFeeAssetData: encodeERC20AssetData(makerFeeToken.address),
|
||||
takerFeeAssetData: wethAssetData,
|
||||
},
|
||||
});
|
||||
@ -194,9 +193,7 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
await testFactory.marketSellTestAsync(orders, 1.34);
|
||||
});
|
||||
it('should fail to fill an order with a percentage fee if the asset proxy is not yet approved', async () => {
|
||||
const unapprovedAsset = deployment.assetDataEncoder
|
||||
.ERC20Token(anotherErc20Token.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const unapprovedAsset = encodeERC20AssetData(anotherErc20Token.address);
|
||||
const order = await maker.signOrderAsync({
|
||||
makerAssetData: unapprovedAsset,
|
||||
takerFee: toBaseUnitAmount(2),
|
||||
@ -258,9 +255,7 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
});
|
||||
it('should fill orders with different makerAssetData', async () => {
|
||||
const firstOrder = await maker.signOrderAsync();
|
||||
const secondOrderMakerAssetData = deployment.assetDataEncoder
|
||||
.ERC20Token(anotherErc20Token.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const secondOrderMakerAssetData = encodeERC20AssetData(anotherErc20Token.address);
|
||||
const secondOrder = await maker.signOrderAsync({
|
||||
makerAssetData: secondOrderMakerAssetData,
|
||||
});
|
||||
@ -269,9 +264,7 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
await testFactory.marketSellTestAsync(orders, 1.5);
|
||||
});
|
||||
it('should fail to fill an order with a fee denominated in an asset other than makerAsset or WETH', async () => {
|
||||
const takerFeeAssetData = deployment.assetDataEncoder
|
||||
.ERC20Token(anotherErc20Token.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const takerFeeAssetData = encodeERC20AssetData(anotherErc20Token.address);
|
||||
const order = await maker.signOrderAsync({
|
||||
takerFeeAssetData,
|
||||
takerFee: toBaseUnitAmount(1),
|
||||
@ -337,9 +330,7 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
});
|
||||
}
|
||||
it('should fill an order with multiAsset makerAssetData', async () => {
|
||||
const multiAssetData = deployment.assetDataEncoder
|
||||
.MultiAsset([new BigNumber(2)], [makerAssetData])
|
||||
.getABIEncodedTransactionData();
|
||||
const multiAssetData = encodeMultiAssetData([new BigNumber(2)], [makerAssetData]);
|
||||
const multiAssetOrder = await maker.signOrderAsync({
|
||||
makerAssetData: multiAssetData,
|
||||
});
|
||||
@ -347,9 +338,10 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
await testFactory.marketSellTestAsync([multiAssetOrder, nonMultiAssetOrder], 1.3);
|
||||
});
|
||||
it('should fill an order with multiAsset makerAssetData (nested StaticCall succeeds)', async () => {
|
||||
const multiAssetData = deployment.assetDataEncoder
|
||||
.MultiAsset([new BigNumber(2), new BigNumber(3)], [makerAssetData, staticCallSuccessAssetData])
|
||||
.getABIEncodedTransactionData();
|
||||
const multiAssetData = encodeMultiAssetData(
|
||||
[new BigNumber(2), new BigNumber(3)],
|
||||
[makerAssetData, staticCallSuccessAssetData],
|
||||
);
|
||||
const multiAssetOrder = await maker.signOrderAsync({
|
||||
makerAssetData: multiAssetData,
|
||||
});
|
||||
@ -357,9 +349,10 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
await testFactory.marketSellTestAsync([multiAssetOrder, nonMultiAssetOrder], 1.3);
|
||||
});
|
||||
it('should skip over an order with multiAsset makerAssetData where the nested StaticCall fails', async () => {
|
||||
const multiAssetData = deployment.assetDataEncoder
|
||||
.MultiAsset([new BigNumber(2), new BigNumber(3)], [makerAssetData, staticCallFailureAssetData])
|
||||
.getABIEncodedTransactionData();
|
||||
const multiAssetData = encodeMultiAssetData(
|
||||
[new BigNumber(2), new BigNumber(3)],
|
||||
[makerAssetData, staticCallFailureAssetData],
|
||||
);
|
||||
const multiAssetOrder = await maker.signOrderAsync({
|
||||
makerAssetData: multiAssetData,
|
||||
});
|
||||
@ -474,9 +467,7 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
});
|
||||
it('should buy exactly makerAssetBuyAmount in orders with different makerAssetData', async () => {
|
||||
const firstOrder = await maker.signOrderAsync();
|
||||
const secondOrderMakerAssetData = deployment.assetDataEncoder
|
||||
.ERC20Token(anotherErc20Token.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const secondOrderMakerAssetData = encodeERC20AssetData(anotherErc20Token.address);
|
||||
const secondOrder = await maker.signOrderAsync({
|
||||
makerAssetData: secondOrderMakerAssetData,
|
||||
});
|
||||
@ -525,9 +516,7 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
it('should buy an ERC721 asset from a single order', async () => {
|
||||
const erc721Order = await maker.signOrderAsync({
|
||||
makerAssetAmount: new BigNumber(1),
|
||||
makerAssetData: deployment.assetDataEncoder
|
||||
.ERC721Token(erc721Token.address, nftId)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, nftId),
|
||||
takerFeeAssetData: wethAssetData,
|
||||
});
|
||||
await testFactory.marketBuyTestAsync([erc721Order], 1);
|
||||
@ -535,18 +524,14 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
it('should buy an ERC721 asset and pay a WETH fee', async () => {
|
||||
const erc721orderWithWethFee = await maker.signOrderAsync({
|
||||
makerAssetAmount: new BigNumber(1),
|
||||
makerAssetData: deployment.assetDataEncoder
|
||||
.ERC721Token(erc721Token.address, nftId)
|
||||
.getABIEncodedTransactionData(),
|
||||
makerAssetData: encodeERC721AssetData(erc721Token.address, nftId),
|
||||
takerFee: toBaseUnitAmount(1),
|
||||
takerFeeAssetData: wethAssetData,
|
||||
});
|
||||
await testFactory.marketBuyTestAsync([erc721orderWithWethFee], 1);
|
||||
});
|
||||
it('should fail to fill an order with a fee denominated in an asset other than makerAsset or WETH', async () => {
|
||||
const takerFeeAssetData = deployment.assetDataEncoder
|
||||
.ERC20Token(anotherErc20Token.address)
|
||||
.getABIEncodedTransactionData();
|
||||
const takerFeeAssetData = encodeERC20AssetData(anotherErc20Token.address);
|
||||
const order = await maker.signOrderAsync({
|
||||
takerFeeAssetData,
|
||||
takerFee: toBaseUnitAmount(1),
|
||||
@ -710,9 +695,7 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
});
|
||||
}
|
||||
it('should fill an order with multiAsset makerAssetData', async () => {
|
||||
const multiAssetData = deployment.assetDataEncoder
|
||||
.MultiAsset([new BigNumber(2)], [makerAssetData])
|
||||
.getABIEncodedTransactionData();
|
||||
const multiAssetData = encodeMultiAssetData([new BigNumber(2)], [makerAssetData]);
|
||||
const multiAssetOrder = await maker.signOrderAsync({
|
||||
makerAssetData: multiAssetData,
|
||||
});
|
||||
@ -720,9 +703,10 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
await testFactory.marketBuyTestAsync([multiAssetOrder, nonMultiAssetOrder], 1.3);
|
||||
});
|
||||
it('should fill an order with multiAsset makerAssetData (nested StaticCall succeeds)', async () => {
|
||||
const multiAssetData = deployment.assetDataEncoder
|
||||
.MultiAsset([new BigNumber(2), new BigNumber(3)], [makerAssetData, staticCallSuccessAssetData])
|
||||
.getABIEncodedTransactionData();
|
||||
const multiAssetData = encodeMultiAssetData(
|
||||
[new BigNumber(2), new BigNumber(3)],
|
||||
[makerAssetData, staticCallSuccessAssetData],
|
||||
);
|
||||
const multiAssetOrder = await maker.signOrderAsync({
|
||||
makerAssetData: multiAssetData,
|
||||
});
|
||||
@ -730,9 +714,10 @@ blockchainTests('Forwarder integration tests', env => {
|
||||
await testFactory.marketBuyTestAsync([multiAssetOrder, nonMultiAssetOrder], 1.3);
|
||||
});
|
||||
it('should skip over an order with multiAsset makerAssetData where the nested StaticCall fails', async () => {
|
||||
const multiAssetData = deployment.assetDataEncoder
|
||||
.MultiAsset([new BigNumber(2), new BigNumber(3)], [makerAssetData, staticCallFailureAssetData])
|
||||
.getABIEncodedTransactionData();
|
||||
const multiAssetData = encodeMultiAssetData(
|
||||
[new BigNumber(2), new BigNumber(3)],
|
||||
[makerAssetData, staticCallFailureAssetData],
|
||||
);
|
||||
const multiAssetOrder = await maker.signOrderAsync({
|
||||
makerAssetData: multiAssetData,
|
||||
});
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { IAssetDataContract } from '@0x/contracts-asset-proxy';
|
||||
import { decodeERC20AssetData, decodeERC20BridgeAssetData } from '@0x/contracts-asset-proxy';
|
||||
import { ForwarderContract } from '@0x/contracts-exchange-forwarder';
|
||||
import { constants, expect, OrderStatus, provider } from '@0x/contracts-test-utils';
|
||||
import { constants, expect, OrderStatus } from '@0x/contracts-test-utils';
|
||||
import { AssetProxyId, OrderInfo, SignedOrder } from '@0x/types';
|
||||
import { BigNumber, hexUtils, RevertError } from '@0x/utils';
|
||||
import { TransactionReceiptWithDecodedLogs } from 'ethereum-types';
|
||||
@ -36,15 +36,14 @@ function areUnderlyingAssetsEqual(assetData1: string, assetData2: string): boole
|
||||
(assetProxyId1 === AssetProxyId.ERC20 || assetProxyId1 === AssetProxyId.ERC20Bridge) &&
|
||||
(assetProxyId2 === AssetProxyId.ERC20 || assetProxyId2 === AssetProxyId.ERC20Bridge)
|
||||
) {
|
||||
const assetDataDecoder = new IAssetDataContract(constants.NULL_ADDRESS, provider);
|
||||
const tokenAddress1 =
|
||||
assetProxyId1 === AssetProxyId.ERC20
|
||||
? assetDataDecoder.getABIDecodedTransactionData<string>('ERC20Token', assetData1)
|
||||
: assetDataDecoder.getABIDecodedTransactionData<[string]>('ERC20Bridge', assetData1)[0];
|
||||
? decodeERC20AssetData(assetData1)
|
||||
: decodeERC20BridgeAssetData(assetData1)[0];
|
||||
const tokenAddress2 =
|
||||
assetProxyId2 === AssetProxyId.ERC20
|
||||
? assetDataDecoder.getABIDecodedTransactionData<string>('ERC20Token', assetData2)
|
||||
: assetDataDecoder.getABIDecodedTransactionData<[string]>('ERC20Bridge', assetData2)[0];
|
||||
? decodeERC20AssetData(assetData2)
|
||||
: decodeERC20BridgeAssetData(assetData2)[0];
|
||||
return tokenAddress2 === tokenAddress1;
|
||||
} else {
|
||||
return false;
|
||||
|
@ -54,7 +54,7 @@ export function FeeRecipientMixin<TBase extends Constructor>(Base: TBase): TBase
|
||||
if (this.approvalFactory === undefined) {
|
||||
throw new Error('No verifying contract provided in FeeRecipient constructor');
|
||||
}
|
||||
return this.approvalFactory.newSignedApprovalAsync(transaction, txOrigin, signatureType);
|
||||
return this.approvalFactory.newSignedApproval(transaction, txOrigin, signatureType);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { DummyERC20TokenContract } from '@0x/contracts-erc20';
|
||||
import { constants, OrderFactory } from '@0x/contracts-test-utils';
|
||||
import { Order, SignedOrder } from '@0x/types';
|
||||
@ -121,9 +122,7 @@ export function MakerMixin<TBase extends Constructor>(Base: TBase): TBase & Cons
|
||||
makerFeeToken,
|
||||
takerToken,
|
||||
takerFeeToken,
|
||||
].map(token =>
|
||||
this.actor.deployment.assetDataEncoder.ERC20Token(token.address).getABIEncodedTransactionData(),
|
||||
);
|
||||
].map(token => encodeERC20AssetData(token.address));
|
||||
|
||||
// Maker signs the order
|
||||
return this.signOrderAsync({
|
||||
@ -192,8 +191,7 @@ export function MakerMixin<TBase extends Constructor>(Base: TBase): TBase & Cons
|
||||
makerFeeAssetData,
|
||||
takerFeeAssetData,
|
||||
] = [leftMakerToken, leftTakerToken, rightMakerToken, rightTakerToken, makerFeeToken, takerFeeToken].map(
|
||||
token =>
|
||||
this.actor.deployment.assetDataEncoder.ERC20Token(token.address).getABIEncodedTransactionData(),
|
||||
token => encodeERC20AssetData(token.address),
|
||||
);
|
||||
|
||||
// Construct and sign the left order
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import { increaseCurrentAndNextBalance, OwnerStakeByStatus, StakeStatus } from '@0x/contracts-staking';
|
||||
import { expect } from '@0x/contracts-test-utils';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
@ -33,7 +34,7 @@ export function validStakeAssertion(
|
||||
txData.from as string,
|
||||
zrxVault.address,
|
||||
amount,
|
||||
deployment.assetDataEncoder.ERC20Token(deployment.tokens.zrx.address).getABIEncodedTransactionData(),
|
||||
encodeERC20AssetData(deployment.tokens.zrx.address),
|
||||
);
|
||||
return expectedBalances;
|
||||
},
|
||||
|
@ -1,3 +1,4 @@
|
||||
import { encodeERC20AssetData } from '@0x/contracts-asset-proxy';
|
||||
import {
|
||||
decreaseCurrentAndNextBalance,
|
||||
OwnerStakeByStatus,
|
||||
@ -38,7 +39,7 @@ export function validUnstakeAssertion(
|
||||
zrxVault.address,
|
||||
txData.from as string,
|
||||
amount,
|
||||
deployment.assetDataEncoder.ERC20Token(deployment.tokens.zrx.address).getABIEncodedTransactionData(),
|
||||
encodeERC20AssetData(deployment.tokens.zrx.address),
|
||||
);
|
||||
return expectedBalances;
|
||||
},
|
||||
|
@ -1,6 +1,13 @@
|
||||
import { IAssetDataContract } from '@0x/contracts-asset-proxy';
|
||||
import {
|
||||
decodeERC1155AssetData,
|
||||
decodeERC20AssetData,
|
||||
decodeERC20BridgeAssetData,
|
||||
decodeERC721AssetData,
|
||||
decodeMultiAssetData,
|
||||
encodeERC20AssetData,
|
||||
} from '@0x/contracts-asset-proxy';
|
||||
import { ReferenceFunctions } from '@0x/contracts-exchange-libs';
|
||||
import { constants, Numberish, provider } from '@0x/contracts-test-utils';
|
||||
import { constants, Numberish } from '@0x/contracts-test-utils';
|
||||
import { AssetProxyId, SignedOrder } from '@0x/types';
|
||||
import { BigNumber, hexUtils } from '@0x/utils';
|
||||
import { TransactionReceiptWithDecodedLogs } from 'ethereum-types';
|
||||
@ -12,8 +19,6 @@ import { BalanceStore } from './balance_store';
|
||||
import { TokenContractsByName, TokenOwnersByName } from './types';
|
||||
|
||||
export class LocalBalanceStore extends BalanceStore {
|
||||
private readonly _assetDataDecoder: IAssetDataContract;
|
||||
|
||||
/**
|
||||
* Creates a new balance store based on an existing one.
|
||||
* @param sourceBalanceStore Existing balance store whose values should be copied.
|
||||
@ -36,7 +41,6 @@ export class LocalBalanceStore extends BalanceStore {
|
||||
tokenContractsByName: Partial<TokenContractsByName> = {},
|
||||
) {
|
||||
super(tokenOwnersByName, tokenContractsByName);
|
||||
this._assetDataDecoder = new IAssetDataContract(constants.NULL_ADDRESS, provider);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -96,10 +100,7 @@ export class LocalBalanceStore extends BalanceStore {
|
||||
const assetProxyId = hexUtils.slice(assetData, 0, 4);
|
||||
switch (assetProxyId) {
|
||||
case AssetProxyId.ERC20: {
|
||||
const tokenAddress = this._assetDataDecoder.getABIDecodedTransactionData<string>(
|
||||
'ERC20Token',
|
||||
assetData,
|
||||
);
|
||||
const tokenAddress = decodeERC20AssetData(assetData);
|
||||
_.update(this.balances.erc20, [fromAddress, tokenAddress], balance => balance.minus(amount));
|
||||
_.update(this.balances.erc20, [toAddress, tokenAddress], balance =>
|
||||
(balance || constants.ZERO_AMOUNT).plus(amount),
|
||||
@ -107,10 +108,7 @@ export class LocalBalanceStore extends BalanceStore {
|
||||
break;
|
||||
}
|
||||
case AssetProxyId.ERC20Bridge: {
|
||||
const [tokenAddress] = this._assetDataDecoder.getABIDecodedTransactionData<[string]>(
|
||||
'ERC20Bridge',
|
||||
assetData,
|
||||
);
|
||||
const [tokenAddress] = decodeERC20BridgeAssetData(assetData);
|
||||
// The test bridge contract (TestEth2DaiBridge or TestUniswapBridge) will be the
|
||||
// fromAddress in this case, and it simply mints the amount of token it needs to transfer.
|
||||
_.update(this.balances.erc20, [fromAddress, tokenAddress], balance =>
|
||||
@ -122,9 +120,7 @@ export class LocalBalanceStore extends BalanceStore {
|
||||
break;
|
||||
}
|
||||
case AssetProxyId.ERC721: {
|
||||
const [tokenAddress, tokenId] = this._assetDataDecoder.getABIDecodedTransactionData<
|
||||
[string, BigNumber]
|
||||
>('ERC721Token', assetData);
|
||||
const [tokenAddress, tokenId] = decodeERC721AssetData(assetData);
|
||||
const fromTokens = _.get(this.balances.erc721, [fromAddress, tokenAddress], []);
|
||||
const toTokens = _.get(this.balances.erc721, [toAddress, tokenAddress], []);
|
||||
if (amount.gte(1)) {
|
||||
@ -140,9 +136,7 @@ export class LocalBalanceStore extends BalanceStore {
|
||||
break;
|
||||
}
|
||||
case AssetProxyId.ERC1155: {
|
||||
const [tokenAddress, tokenIds, tokenValues] = this._assetDataDecoder.getABIDecodedTransactionData<
|
||||
[string, BigNumber[], BigNumber[]]
|
||||
>('ERC1155Assets', assetData);
|
||||
const [tokenAddress, tokenIds, tokenValues] = decodeERC1155AssetData(assetData);
|
||||
const fromBalances = {
|
||||
// tslint:disable-next-line:no-inferred-empty-object-type
|
||||
fungible: _.get(this.balances.erc1155, [fromAddress, tokenAddress, 'fungible'], {}),
|
||||
@ -179,9 +173,7 @@ export class LocalBalanceStore extends BalanceStore {
|
||||
break;
|
||||
}
|
||||
case AssetProxyId.MultiAsset: {
|
||||
const [amounts, nestedAssetData] = this._assetDataDecoder.getABIDecodedTransactionData<
|
||||
[BigNumber[], string[]]
|
||||
>('MultiAsset', assetData);
|
||||
const [amounts, nestedAssetData] = decodeMultiAssetData(assetData);
|
||||
for (const [i, amt] of amounts.entries()) {
|
||||
const nestedAmount = amount.times(amt);
|
||||
this.transferAsset(fromAddress, toAddress, nestedAmount, nestedAssetData[i]);
|
||||
@ -255,9 +247,7 @@ export class LocalBalanceStore extends BalanceStore {
|
||||
takerAddress,
|
||||
deployment.staking.stakingProxy.address,
|
||||
fillResults.protocolFeePaid,
|
||||
deployment.assetDataEncoder
|
||||
.ERC20Token(deployment.tokens.weth.address)
|
||||
.getABIEncodedTransactionData(),
|
||||
encodeERC20AssetData(deployment.tokens.weth.address),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,6 @@ import {
|
||||
ERC20BridgeProxyContract,
|
||||
ERC20ProxyContract,
|
||||
ERC721ProxyContract,
|
||||
IAssetDataContract,
|
||||
MultiAssetProxyContract,
|
||||
StaticCallProxyContract,
|
||||
} from '@0x/contracts-asset-proxy';
|
||||
@ -204,7 +203,6 @@ export class DeploymentManager {
|
||||
exchange.address,
|
||||
constants.NULL_ADDRESS,
|
||||
);
|
||||
const assetDataEncoder = new IAssetDataContract(constants.NULL_ADDRESS, environment.provider);
|
||||
|
||||
// Construct the new instance and return it.
|
||||
return new DeploymentManager(
|
||||
@ -218,7 +216,6 @@ export class DeploymentManager {
|
||||
accounts,
|
||||
txDefaults,
|
||||
devUtils,
|
||||
assetDataEncoder,
|
||||
);
|
||||
}
|
||||
|
||||
@ -534,7 +531,6 @@ export class DeploymentManager {
|
||||
public accounts: string[],
|
||||
public txDefaults: Partial<TxData>,
|
||||
public devUtils: DevUtilsContract,
|
||||
public assetDataEncoder: IAssetDataContract,
|
||||
) {}
|
||||
}
|
||||
// tslint:disable:max-file-line-count
|
||||
|
@ -1,6 +1,12 @@
|
||||
import { ExchangeContract } from '@0x/contracts-exchange';
|
||||
import { blockchainTests, constants, expect, signingUtils, transactionHashUtils } from '@0x/contracts-test-utils';
|
||||
import { orderHashUtils } from '@0x/order-utils';
|
||||
import {
|
||||
blockchainTests,
|
||||
constants,
|
||||
expect,
|
||||
orderHashUtils,
|
||||
signingUtils,
|
||||
transactionHashUtils,
|
||||
} from '@0x/contracts-test-utils';
|
||||
import { Order, SignatureType, ZeroExTransaction } from '@0x/types';
|
||||
import { hexUtils, logUtils } from '@0x/utils';
|
||||
import * as ethUtil from 'ethereumjs-util';
|
||||
@ -194,7 +200,7 @@ tests('Exchange signature validation fuzz tests', env => {
|
||||
exchangeAddress: mangled.order!.exchangeAddress,
|
||||
chainId: mangled.order!.chainId,
|
||||
});
|
||||
mangled.hash = await orderHashUtils.getOrderHashAsync(mangled.order);
|
||||
mangled.hash = await orderHashUtils.getOrderHashHex(mangled.order);
|
||||
break;
|
||||
case 'RANDOM_TRANSACTION':
|
||||
mangled.transaction = randomTransaction({
|
||||
@ -392,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.getOrderHashAsync(order));
|
||||
const hash = fields.hash || (await orderHashUtils.getOrderHashHex(order));
|
||||
const payload =
|
||||
fields.payload ||
|
||||
(STRICT_LENGTH_SIGNATURE_TYPES.includes(signatureType) ? constants.NULL_BYTES : randomPayload());
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "4.1.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Fix broken tests",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "4.0.6",
|
||||
|
@ -1,17 +1,6 @@
|
||||
import {
|
||||
chaiSetup,
|
||||
constants,
|
||||
expectTransactionFailedAsync,
|
||||
expectTransactionFailedWithoutReasonAsync,
|
||||
increaseTimeAndMineBlockAsync,
|
||||
provider,
|
||||
txDefaults,
|
||||
web3Wrapper,
|
||||
} from '@0x/contracts-test-utils';
|
||||
import { BlockchainLifecycle } from '@0x/dev-utils';
|
||||
import { blockchainTests, constants, expect, increaseTimeAndMineBlockAsync } from '@0x/contracts-test-utils';
|
||||
import { RevertReason } from '@0x/types';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
import * as chai from 'chai';
|
||||
import { LogWithDecodedArgs } from 'ethereum-types';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
@ -28,24 +17,15 @@ import {
|
||||
|
||||
import { MultiSigWrapper } from './utils/multi_sig_wrapper';
|
||||
|
||||
chaiSetup.configure();
|
||||
const expect = chai.expect;
|
||||
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||
// tslint:disable:no-unnecessary-type-assertion
|
||||
describe('MultiSigWalletWithTimeLock', () => {
|
||||
blockchainTests.resets('MultiSigWalletWithTimeLock', env => {
|
||||
let owners: string[];
|
||||
let notOwner: string;
|
||||
const REQUIRED_APPROVALS = new BigNumber(2);
|
||||
const SECONDS_TIME_LOCKED = new BigNumber(1000000);
|
||||
|
||||
before(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
});
|
||||
after(async () => {
|
||||
await blockchainLifecycle.revertAsync();
|
||||
});
|
||||
before(async () => {
|
||||
const accounts = await web3Wrapper.getAvailableAddressesAsync();
|
||||
const accounts = await env.getAccountAddressesAsync();
|
||||
owners = [accounts[0], accounts[1], accounts[2]];
|
||||
notOwner = accounts[3];
|
||||
});
|
||||
@ -53,20 +33,13 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
let multiSig: MultiSigWalletWithTimeLockContract;
|
||||
let multiSigWrapper: MultiSigWrapper;
|
||||
|
||||
beforeEach(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
});
|
||||
afterEach(async () => {
|
||||
await blockchainLifecycle.revertAsync();
|
||||
});
|
||||
|
||||
describe('external_call', () => {
|
||||
it('should be internal', async () => {
|
||||
const secondsTimeLocked = new BigNumber(0);
|
||||
multiSig = await MultiSigWalletWithTimeLockContract.deployFrom0xArtifactAsync(
|
||||
artifacts.MultiSigWalletWithTimeLock,
|
||||
provider,
|
||||
txDefaults,
|
||||
env.provider,
|
||||
env.txDefaults,
|
||||
artifacts,
|
||||
owners,
|
||||
REQUIRED_APPROVALS,
|
||||
@ -81,14 +54,14 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
const secondsTimeLocked = new BigNumber(0);
|
||||
multiSig = await MultiSigWalletWithTimeLockContract.deployFrom0xArtifactAsync(
|
||||
artifacts.MultiSigWalletWithTimeLock,
|
||||
provider,
|
||||
txDefaults,
|
||||
env.provider,
|
||||
env.txDefaults,
|
||||
artifacts,
|
||||
owners,
|
||||
REQUIRED_APPROVALS,
|
||||
secondsTimeLocked,
|
||||
);
|
||||
multiSigWrapper = new MultiSigWrapper(multiSig, provider);
|
||||
multiSigWrapper = new MultiSigWrapper(multiSig, env.provider);
|
||||
const destination = notOwner;
|
||||
const data = constants.NULL_BYTES;
|
||||
const txReceipt = await multiSigWrapper.submitTransactionAsync(destination, data, owners[0]);
|
||||
@ -96,16 +69,18 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
.transactionId;
|
||||
});
|
||||
it('should revert if called by a non-owner', async () => {
|
||||
await expectTransactionFailedWithoutReasonAsync(multiSigWrapper.confirmTransactionAsync(txId, notOwner));
|
||||
return expect(multiSigWrapper.confirmTransactionAsync(txId, notOwner)).to.revertWith('OWNER_DOESNT_EXIST');
|
||||
});
|
||||
it('should revert if transaction does not exist', async () => {
|
||||
const nonexistentTxId = new BigNumber(123456789);
|
||||
await expectTransactionFailedWithoutReasonAsync(
|
||||
multiSigWrapper.confirmTransactionAsync(nonexistentTxId, owners[1]),
|
||||
return expect(multiSigWrapper.confirmTransactionAsync(nonexistentTxId, owners[1])).to.revertWith(
|
||||
'TX_DOESNT_EXIST',
|
||||
);
|
||||
});
|
||||
it('should revert if transaction is already confirmed by caller', async () => {
|
||||
await expectTransactionFailedWithoutReasonAsync(multiSigWrapper.confirmTransactionAsync(txId, owners[0]));
|
||||
return expect(multiSigWrapper.confirmTransactionAsync(txId, owners[0])).to.revertWith(
|
||||
'TX_ALREADY_CONFIRMED',
|
||||
);
|
||||
});
|
||||
it('should confirm transaction for caller and log a Confirmation event', async () => {
|
||||
const txReceipt = await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
@ -118,8 +93,8 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
it('should set the confirmation time of the transaction if it becomes fully confirmed', async () => {
|
||||
const txReceipt = await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
expect(txReceipt.logs.length).to.equal(2);
|
||||
const blockNum = await web3Wrapper.getBlockNumberAsync();
|
||||
const timestamp = new BigNumber(await web3Wrapper.getBlockTimestampAsync(blockNum));
|
||||
const blockNum = await env.web3Wrapper.getBlockNumberAsync();
|
||||
const timestamp = new BigNumber(await env.web3Wrapper.getBlockTimestampAsync(blockNum));
|
||||
const log = txReceipt.logs[1] as LogWithDecodedArgs<MultiSigWalletWithTimeLockConfirmationTimeSetEventArgs>;
|
||||
expect(log.args.confirmationTime).to.be.bignumber.equal(timestamp);
|
||||
expect(log.args.transactionId).to.be.bignumber.equal(txId);
|
||||
@ -143,14 +118,14 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
beforeEach(async () => {
|
||||
multiSig = await MultiSigWalletWithTimeLockContract.deployFrom0xArtifactAsync(
|
||||
artifacts.MultiSigWalletWithTimeLock,
|
||||
provider,
|
||||
txDefaults,
|
||||
env.provider,
|
||||
env.txDefaults,
|
||||
artifacts,
|
||||
owners,
|
||||
REQUIRED_APPROVALS,
|
||||
secondsTimeLocked,
|
||||
);
|
||||
multiSigWrapper = new MultiSigWrapper(multiSig, provider);
|
||||
multiSigWrapper = new MultiSigWrapper(multiSig, env.provider);
|
||||
const destination = notOwner;
|
||||
const data = constants.NULL_BYTES;
|
||||
const txReceipt = await multiSigWrapper.submitTransactionAsync(destination, data, owners[0]);
|
||||
@ -159,15 +134,13 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
});
|
||||
it('should revert if transaction has not been fully confirmed', async () => {
|
||||
await increaseTimeAndMineBlockAsync(secondsTimeLocked.toNumber());
|
||||
await expectTransactionFailedAsync(
|
||||
multiSigWrapper.executeTransactionAsync(txId, owners[1]),
|
||||
return expect(multiSigWrapper.executeTransactionAsync(txId, owners[1])).to.revertWith(
|
||||
RevertReason.TxNotFullyConfirmed,
|
||||
);
|
||||
});
|
||||
it('should revert if time lock has not passed', async () => {
|
||||
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
await expectTransactionFailedAsync(
|
||||
multiSigWrapper.executeTransactionAsync(txId, owners[1]),
|
||||
expect(multiSigWrapper.executeTransactionAsync(txId, owners[1])).to.revertWith(
|
||||
RevertReason.TimeLockIncomplete,
|
||||
);
|
||||
});
|
||||
@ -191,8 +164,7 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
await increaseTimeAndMineBlockAsync(secondsTimeLocked.toNumber());
|
||||
await multiSigWrapper.revokeConfirmationAsync(txId, owners[0]);
|
||||
await expectTransactionFailedAsync(
|
||||
multiSigWrapper.executeTransactionAsync(txId, owners[1]),
|
||||
return expect(multiSigWrapper.executeTransactionAsync(txId, owners[1])).to.revertWith(
|
||||
RevertReason.TxNotFullyConfirmed,
|
||||
);
|
||||
});
|
||||
@ -202,13 +174,15 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
const txReceipt = await multiSigWrapper.executeTransactionAsync(txId, owners[1]);
|
||||
const log = txReceipt.logs[0] as LogWithDecodedArgs<MultiSigWalletWithTimeLockExecutionEventArgs>;
|
||||
expect(log.args.transactionId).to.be.bignumber.equal(txId);
|
||||
await expectTransactionFailedWithoutReasonAsync(multiSigWrapper.executeTransactionAsync(txId, owners[1]));
|
||||
return expect(multiSigWrapper.executeTransactionAsync(txId, owners[1])).to.revertWith(
|
||||
'TX_ALREADY_EXECUTED',
|
||||
);
|
||||
});
|
||||
it("should log an ExecutionFailure event and not update the transaction's execution state if unsuccessful", async () => {
|
||||
const contractWithoutFallback = await TestRejectEtherContract.deployFrom0xArtifactAsync(
|
||||
artifacts.TestRejectEther,
|
||||
provider,
|
||||
txDefaults,
|
||||
env.provider,
|
||||
env.txDefaults,
|
||||
artifacts,
|
||||
);
|
||||
const data = constants.NULL_BYTES;
|
||||
@ -234,30 +208,24 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
});
|
||||
describe('changeTimeLock', () => {
|
||||
describe('initially non-time-locked', async () => {
|
||||
before(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
});
|
||||
after(async () => {
|
||||
await blockchainLifecycle.revertAsync();
|
||||
});
|
||||
before('deploy a wallet', async () => {
|
||||
const secondsTimeLocked = new BigNumber(0);
|
||||
multiSig = await MultiSigWalletWithTimeLockContract.deployFrom0xArtifactAsync(
|
||||
artifacts.MultiSigWalletWithTimeLock,
|
||||
provider,
|
||||
txDefaults,
|
||||
env.provider,
|
||||
env.txDefaults,
|
||||
artifacts,
|
||||
owners,
|
||||
REQUIRED_APPROVALS,
|
||||
secondsTimeLocked,
|
||||
);
|
||||
multiSigWrapper = new MultiSigWrapper(multiSig, provider);
|
||||
multiSigWrapper = new MultiSigWrapper(multiSig, env.provider);
|
||||
});
|
||||
|
||||
it('should revert when not called by wallet', async () => {
|
||||
return expectTransactionFailedWithoutReasonAsync(
|
||||
return expect(
|
||||
multiSig.changeTimeLock(SECONDS_TIME_LOCKED).sendTransactionAsync({ from: owners[0] }),
|
||||
);
|
||||
).to.revertWith('ONLY_CALLABLE_BY_WALLET');
|
||||
});
|
||||
|
||||
it('should revert without enough confirmations', async () => {
|
||||
@ -266,10 +234,9 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
const res = await multiSigWrapper.submitTransactionAsync(destination, changeTimeLockData, owners[0]);
|
||||
const log = res.logs[0] as LogWithDecodedArgs<MultiSigWalletWithTimeLockSubmissionEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
return expectTransactionFailedAsync(
|
||||
return expect(
|
||||
multiSig.executeTransaction(txId).sendTransactionAsync({ from: owners[0] }),
|
||||
RevertReason.TxNotFullyConfirmed,
|
||||
);
|
||||
).to.revertWith(RevertReason.TxNotFullyConfirmed);
|
||||
});
|
||||
|
||||
it('should set confirmation time with enough confirmations', async () => {
|
||||
@ -282,8 +249,8 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
const confirmRes = await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
expect(confirmRes.logs).to.have.length(2);
|
||||
|
||||
const blockNum = await web3Wrapper.getBlockNumberAsync();
|
||||
const blockInfo = await web3Wrapper.getBlockIfExistsAsync(blockNum);
|
||||
const blockNum = await env.web3Wrapper.getBlockNumberAsync();
|
||||
const blockInfo = await env.web3Wrapper.getBlockIfExistsAsync(blockNum);
|
||||
if (blockInfo === undefined) {
|
||||
throw new Error(`Unexpectedly failed to fetch block at #${blockNum}`);
|
||||
}
|
||||
@ -308,25 +275,19 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
});
|
||||
});
|
||||
describe('initially time-locked', async () => {
|
||||
before(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
});
|
||||
after(async () => {
|
||||
await blockchainLifecycle.revertAsync();
|
||||
});
|
||||
let txId: BigNumber;
|
||||
const newSecondsTimeLocked = new BigNumber(0);
|
||||
before('deploy a wallet, submit transaction to change timelock, and confirm the transaction', async () => {
|
||||
multiSig = await MultiSigWalletWithTimeLockContract.deployFrom0xArtifactAsync(
|
||||
artifacts.MultiSigWalletWithTimeLock,
|
||||
provider,
|
||||
txDefaults,
|
||||
env.provider,
|
||||
env.txDefaults,
|
||||
artifacts,
|
||||
owners,
|
||||
REQUIRED_APPROVALS,
|
||||
SECONDS_TIME_LOCKED,
|
||||
);
|
||||
multiSigWrapper = new MultiSigWrapper(multiSig, provider);
|
||||
multiSigWrapper = new MultiSigWrapper(multiSig, env.provider);
|
||||
|
||||
const changeTimeLockData = multiSig.changeTimeLock(newSecondsTimeLocked).getABIEncodedTransactionData();
|
||||
const res = await multiSigWrapper.submitTransactionAsync(
|
||||
@ -340,10 +301,9 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
});
|
||||
|
||||
it('should revert if it has enough confirmations but is not past the time lock', async () => {
|
||||
return expectTransactionFailedAsync(
|
||||
return expect(
|
||||
multiSig.executeTransaction(txId).sendTransactionAsync({ from: owners[0] }),
|
||||
RevertReason.TimeLockIncomplete,
|
||||
);
|
||||
).to.revertWith(RevertReason.TimeLockIncomplete);
|
||||
});
|
||||
|
||||
it('should execute if it has enough confirmations and is past the time lock', async () => {
|
||||
|
@ -1,4 +1,17 @@
|
||||
[
|
||||
{
|
||||
"version": "2.0.7",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Fix revert for `LibFixedMath.mul(x, 0)`.",
|
||||
"pr": 2462
|
||||
},
|
||||
{
|
||||
"note": "Fix broken tests.",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "2.0.6",
|
||||
|
@ -345,7 +345,7 @@ library LibFixedMath {
|
||||
|
||||
/// @dev Returns the multiplication two numbers, reverting on overflow.
|
||||
function _mul(int256 a, int256 b) private pure returns (int256 c) {
|
||||
if (a == 0) {
|
||||
if (a == 0 || b == 0) {
|
||||
return 0;
|
||||
}
|
||||
c = a * b;
|
||||
|
@ -75,6 +75,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
AbiDefinition,
|
||||
FunctionAbi,
|
||||
EventAbi,
|
||||
|
@ -206,7 +206,7 @@ blockchainTests.resets('MixinStakingPool unit tests', env => {
|
||||
{
|
||||
poolId: nextPoolId,
|
||||
operator,
|
||||
operatorShare,
|
||||
operatorShare: new BigNumber(operatorShare),
|
||||
},
|
||||
],
|
||||
TestMixinStakingPoolEvents.StakingPoolCreated,
|
||||
@ -306,8 +306,8 @@ blockchainTests.resets('MixinStakingPool unit tests', env => {
|
||||
[
|
||||
{
|
||||
poolId,
|
||||
oldOperatorShare: operatorShare,
|
||||
newOperatorShare: operatorShare - 1,
|
||||
oldOperatorShare: new BigNumber(operatorShare),
|
||||
newOperatorShare: new BigNumber(operatorShare - 1),
|
||||
},
|
||||
],
|
||||
TestMixinStakingPoolEvents.OperatorShareDecreased,
|
||||
|
@ -1,13 +1,6 @@
|
||||
import { ERC20Wrapper } from '@0x/contracts-asset-proxy';
|
||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
|
||||
import {
|
||||
blockchainTests,
|
||||
constants,
|
||||
expect,
|
||||
expectTransactionFailedAsync,
|
||||
filterLogsToArguments,
|
||||
provider,
|
||||
} from '@0x/contracts-test-utils';
|
||||
import { blockchainTests, constants, expect, filterLogsToArguments } from '@0x/contracts-test-utils';
|
||||
import { assetDataUtils } from '@0x/order-utils';
|
||||
import { RevertReason } from '@0x/types';
|
||||
import { AuthorizableRevertErrors, BigNumber, SafeMathRevertErrors, StakingRevertErrors } from '@0x/utils';
|
||||
import { TransactionReceiptWithDecodedLogs } from 'ethereum-types';
|
||||
@ -33,8 +26,6 @@ blockchainTests.resets('ZrxVault unit tests', env => {
|
||||
let zrxAssetData: string;
|
||||
let zrxProxyAddress: string;
|
||||
|
||||
const devUtils = new DevUtilsContract(constants.NULL_ADDRESS, provider);
|
||||
|
||||
before(async () => {
|
||||
// create accounts
|
||||
accounts = await env.getAccountAddressesAsync();
|
||||
@ -47,7 +38,7 @@ blockchainTests.resets('ZrxVault unit tests', env => {
|
||||
zrxProxyAddress = erc20ProxyContract.address;
|
||||
// deploy zrx token
|
||||
const [zrxTokenContract] = await erc20Wrapper.deployDummyTokensAsync(1, constants.DUMMY_TOKEN_DECIMALS);
|
||||
zrxAssetData = await devUtils.encodeERC20AssetData(zrxTokenContract.address).callAsync();
|
||||
zrxAssetData = assetDataUtils.encodeERC20AssetData(zrxTokenContract.address);
|
||||
|
||||
await erc20Wrapper.setBalancesAndAllowancesAsync();
|
||||
|
||||
@ -233,7 +224,7 @@ blockchainTests.resets('ZrxVault unit tests', env => {
|
||||
const tx = zrxVault.depositFrom(staker, initialTokenBalance.plus(1)).sendTransactionAsync({
|
||||
from: stakingProxy,
|
||||
});
|
||||
expectTransactionFailedAsync(tx, RevertReason.TransferFailed);
|
||||
return expect(tx).to.revertWith(RevertReason.TransferFailed);
|
||||
});
|
||||
});
|
||||
describe('Withdrawal', () => {
|
||||
|
@ -23,6 +23,10 @@
|
||||
{
|
||||
"note": "Update kovan addresses in `DeploymentConstants`",
|
||||
"pr": 2459
|
||||
},
|
||||
{
|
||||
"note": "Export `EvmBytecodeOutputLinkReferences` type.",
|
||||
"pr": 2462
|
||||
}
|
||||
],
|
||||
"timestamp": 1580811564
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "9.1.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Export `EvmBytecodeOutputLinkReferences`",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "9.0.7",
|
||||
|
@ -130,6 +130,7 @@ export {
|
||||
OutputField,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
RevertErrorAbi,
|
||||
DecodedLogArgs,
|
||||
LogWithDecodedArgs,
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "13.5.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "export `evmbytecodeoutputlinkreferences` type.",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "13.4.2",
|
||||
|
@ -2,7 +2,7 @@ export { ContractAddresses } from '@0x/contract-addresses';
|
||||
|
||||
export { ContractWrappers } from './contract_wrappers';
|
||||
export { DevUtilsContract } from './generated-wrappers/dev_utils';
|
||||
export { LibTransactionDecoderContract } from './generated-wrappers/lib_transaction_decoder';
|
||||
export { IERC20BridgeSamplerContract } from './generated-wrappers/i_erc20_bridge_sampler';
|
||||
export { IAssetDataContract } from './generated-wrappers/i_asset_data'; // used for synchronously encoding and decoding asset data
|
||||
export {
|
||||
ERC20TokenEventArgs,
|
||||
@ -81,7 +81,7 @@ export {
|
||||
StakingProxyStakingContractAttachedToProxyEventArgs,
|
||||
StakingProxyStakingContractDetachedFromProxyEventArgs,
|
||||
} from './generated-wrappers/staking_proxy';
|
||||
export { IERC20BridgeSamplerContract } from './generated-wrappers/i_erc20_bridge_sampler';
|
||||
export { LibTransactionDecoderContract } from './generated-wrappers/lib_transaction_decoder';
|
||||
export {
|
||||
BlockRange,
|
||||
SupportedProvider,
|
||||
@ -128,6 +128,7 @@ export {
|
||||
DecodedLogEntryEvent,
|
||||
ParamDescription,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
JSONRPCResponsePayload,
|
||||
MethodAbi,
|
||||
ConstructorAbi,
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "3.1.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Add `linkReferences` to `EvmBytecodeOutput` and `EvmBytecodeOutputLinkReferences` type",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"version": "3.0.0",
|
||||
"changes": [
|
||||
|
@ -620,10 +620,17 @@ export interface EvmOutput {
|
||||
}
|
||||
|
||||
export interface EvmBytecodeOutput {
|
||||
linkReferences: EvmBytecodeOutputLinkReferences;
|
||||
object: string;
|
||||
sourceMap: string;
|
||||
}
|
||||
|
||||
export interface EvmBytecodeOutputLinkReferences {
|
||||
[sourceFile: string]: {
|
||||
[libraryName: string]: Array<{ start: number; length: number }>;
|
||||
};
|
||||
}
|
||||
|
||||
export interface DevdocOutput {
|
||||
title?: string;
|
||||
author?: string;
|
||||
|
@ -1,4 +1,21 @@
|
||||
[
|
||||
{
|
||||
"version": "10.2.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Remove use of ambient `DevUtils` instances.",
|
||||
"pr": 2462
|
||||
},
|
||||
{
|
||||
"note": "Make hash computing tooling non-async again.",
|
||||
"pr": 2462
|
||||
},
|
||||
{
|
||||
"note": "Add `transactionHashUtils`.",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "10.1.3",
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { assert } from '@0x/assert';
|
||||
import { DevUtilsContract } from '@0x/contract-wrappers';
|
||||
import { schemas } from '@0x/json-schemas';
|
||||
import {
|
||||
EIP712DomainWithDefaultSchema,
|
||||
@ -10,7 +9,7 @@ import {
|
||||
SignedZeroExTransaction,
|
||||
ZeroExTransaction,
|
||||
} from '@0x/types';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
import { hexUtils, signTypedDataUtils } from '@0x/utils';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
import { constants } from './constants';
|
||||
@ -101,24 +100,22 @@ export const eip712Utils = {
|
||||
* @param txOrigin The desired `tx.origin` that should be able to submit an Ethereum txn involving this 0x transaction
|
||||
* @return A typed data object
|
||||
*/
|
||||
async createCoordinatorApprovalTypedDataAsync(
|
||||
createCoordinatorApprovalTypedData(
|
||||
transaction: SignedZeroExTransaction,
|
||||
verifyingContract: string,
|
||||
txOrigin: string,
|
||||
): Promise<EIP712TypedData> {
|
||||
): EIP712TypedData {
|
||||
const domain = {
|
||||
...transaction.domain,
|
||||
name: constants.COORDINATOR_DOMAIN_NAME,
|
||||
version: constants.COORDINATOR_DOMAIN_VERSION,
|
||||
verifyingContract,
|
||||
};
|
||||
const transactionHash = await new DevUtilsContract(constants.NULL_ADDRESS, constants.FAKED_PROVIDER as any)
|
||||
.getTransactionHash(
|
||||
transaction,
|
||||
new BigNumber(transaction.domain.chainId),
|
||||
transaction.domain.verifyingContract,
|
||||
)
|
||||
.callAsync();
|
||||
// TODO(dorothy-zbornak): Refactor these hash files so we can reuse
|
||||
// `transactionHashUtils` here without a circular dep.
|
||||
const transactionHash = hexUtils.toHex(
|
||||
signTypedDataUtils.generateTypedDataHash(eip712Utils.createZeroExTransactionTypedData(transaction)),
|
||||
);
|
||||
const approval = {
|
||||
txOrigin,
|
||||
transactionHash,
|
||||
|
@ -5,6 +5,7 @@ export { rateUtils } from './rate_utils';
|
||||
export { sortingUtils } from './sorting_utils';
|
||||
export { orderCalculationUtils } from './order_calculation_utils';
|
||||
export { orderHashUtils } from './order_hash_utils';
|
||||
export { transactionHashUtils } from './transaction_hash_utils';
|
||||
export { assetDataUtils } from './asset_data_utils';
|
||||
|
||||
export { eip712Utils } from './eip712_utils';
|
||||
|
@ -77,7 +77,7 @@ export const orderFactory = {
|
||||
await providerUtils.getChainIdAsync(supportedProvider),
|
||||
createOrderOpts,
|
||||
);
|
||||
const orderHash = await orderHashUtils.getOrderHashAsync(order);
|
||||
const orderHash = orderHashUtils.getOrderHash(order);
|
||||
const signature = await signatureUtils.ecSignHashAsync(supportedProvider, orderHash, makerAddress);
|
||||
const signedOrder: SignedOrder = { ...order, signature };
|
||||
return signedOrder;
|
||||
|
@ -1,16 +1,10 @@
|
||||
import { DevUtilsContract } from '@0x/contract-wrappers';
|
||||
import { Order } from '@0x/types';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
import { hexUtils, signTypedDataUtils } from '@0x/utils';
|
||||
|
||||
import { constants } from './constants';
|
||||
|
||||
const devUtilsContract = new DevUtilsContract(constants.NULL_ADDRESS, constants.FAKED_PROVIDER as any);
|
||||
import { eip712Utils } from './eip712_utils';
|
||||
|
||||
export const orderHashUtils = {
|
||||
getOrderHashAsync: async (order: Order): Promise<string> => {
|
||||
const orderHash = await devUtilsContract
|
||||
.getOrderHash(order, new BigNumber(order.chainId), order.exchangeAddress)
|
||||
.callAsync();
|
||||
return orderHash;
|
||||
getOrderHash: (order: Order): string => {
|
||||
return hexUtils.toHex(signTypedDataUtils.generateTypedDataHash(eip712Utils.createOrderTypedData(order)));
|
||||
},
|
||||
};
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { DevUtilsContract } from '@0x/contract-wrappers';
|
||||
import { schemas } from '@0x/json-schemas';
|
||||
import {
|
||||
ECSignature,
|
||||
@ -9,20 +8,18 @@ import {
|
||||
ValidatorSignature,
|
||||
ZeroExTransaction,
|
||||
} from '@0x/types';
|
||||
import { BigNumber, providerUtils } from '@0x/utils';
|
||||
import { providerUtils } from '@0x/utils';
|
||||
import { Web3Wrapper } from '@0x/web3-wrapper';
|
||||
import { SupportedProvider } from 'ethereum-types';
|
||||
import * as ethUtil from 'ethereumjs-util';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
import { assert } from './assert';
|
||||
import { constants } from './constants';
|
||||
import { eip712Utils } from './eip712_utils';
|
||||
import { orderHashUtils } from './order_hash_utils';
|
||||
import { transactionHashUtils } from './transaction_hash_utils';
|
||||
import { TypedDataError } from './types';
|
||||
|
||||
const devUtilsContract = new DevUtilsContract(constants.NULL_ADDRESS, constants.FAKED_PROVIDER as any);
|
||||
|
||||
export const signatureUtils = {
|
||||
/**
|
||||
* Signs an order and returns a SignedOrder. First `eth_signTypedData` is requested
|
||||
@ -51,7 +48,7 @@ export const signatureUtils = {
|
||||
if (err.message.includes('User denied message signature')) {
|
||||
throw err;
|
||||
}
|
||||
const orderHash = await orderHashUtils.getOrderHashAsync(order);
|
||||
const orderHash = orderHashUtils.getOrderHash(order);
|
||||
const signatureHex = await signatureUtils.ecSignHashAsync(supportedProvider, orderHash, signerAddress);
|
||||
const signedOrder = {
|
||||
...order,
|
||||
@ -134,13 +131,7 @@ export const signatureUtils = {
|
||||
if (err.message.includes('User denied message signature')) {
|
||||
throw err;
|
||||
}
|
||||
const transactionHash = await devUtilsContract
|
||||
.getTransactionHash(
|
||||
transaction,
|
||||
new BigNumber(transaction.domain.chainId),
|
||||
transaction.domain.verifyingContract,
|
||||
)
|
||||
.callAsync();
|
||||
const transactionHash = transactionHashUtils.getTransactionHash(transaction);
|
||||
const signatureHex = await signatureUtils.ecSignHashAsync(
|
||||
supportedProvider,
|
||||
transactionHash,
|
||||
|
12
packages/order-utils/src/transaction_hash_utils.ts
Normal file
12
packages/order-utils/src/transaction_hash_utils.ts
Normal file
@ -0,0 +1,12 @@
|
||||
import { ZeroExTransaction } from '@0x/types';
|
||||
import { hexUtils, signTypedDataUtils } from '@0x/utils';
|
||||
|
||||
import { eip712Utils } from './eip712_utils';
|
||||
|
||||
export const transactionHashUtils = {
|
||||
getTransactionHash: (tx: ZeroExTransaction): string => {
|
||||
return hexUtils.toHex(
|
||||
signTypedDataUtils.generateTypedDataHash(eip712Utils.createZeroExTransactionTypedData(tx)),
|
||||
);
|
||||
},
|
||||
};
|
@ -1,5 +1,4 @@
|
||||
import { assert } from '@0x/assert';
|
||||
import { DevUtilsContract } from '@0x/contract-wrappers';
|
||||
import { Order, SignatureType, ZeroExTransaction } from '@0x/types';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
import * as chai from 'chai';
|
||||
@ -12,6 +11,7 @@ import { generatePseudoRandomSalt } from '../src';
|
||||
import { constants } from '../src/constants';
|
||||
import { orderHashUtils } from '../src/order_hash_utils';
|
||||
import { isValidECSignature, signatureUtils } from '../src/signature_utils';
|
||||
import { transactionHashUtils } from '../src/transaction_hash_utils';
|
||||
|
||||
import { chaiSetup } from './utils/chai_setup';
|
||||
import { provider, web3Wrapper } from './utils/web3_wrapper';
|
||||
@ -19,8 +19,6 @@ import { provider, web3Wrapper } from './utils/web3_wrapper';
|
||||
chaiSetup.configure();
|
||||
const expect = chai.expect;
|
||||
|
||||
const devUtilsContract = new DevUtilsContract(constants.NULL_ADDRESS, constants.FAKED_PROVIDER as any);
|
||||
|
||||
describe('Signature utils', () => {
|
||||
let makerAddress: string;
|
||||
const fakeExchangeContractAddress = '0x1dc4c1cefef38a777b15aa20260a54e584b16c48';
|
||||
@ -286,7 +284,7 @@ describe('Signature utils', () => {
|
||||
it('should result in the same signature as signing the order hash without an ethereum message prefix', async () => {
|
||||
// Note: Since order hash is an EIP712 hash the result of a valid EIP712 signature
|
||||
// of order hash is the same as signing the order without the Ethereum Message prefix.
|
||||
const orderHashHex = await orderHashUtils.getOrderHashAsync(order);
|
||||
const orderHashHex = orderHashUtils.getOrderHash(order);
|
||||
const sig = ethUtil.ecsign(
|
||||
ethUtil.toBuffer(orderHashHex),
|
||||
Buffer.from('F2F48EE19680706196E2E339E5DA3491186E0C4C5030670656B0E0164837257D', 'hex'),
|
||||
@ -327,13 +325,7 @@ describe('Signature utils', () => {
|
||||
it('should result in the same signature as signing the order hash without an ethereum message prefix', async () => {
|
||||
// Note: Since order hash is an EIP712 hash the result of a valid EIP712 signature
|
||||
// of order hash is the same as signing the order without the Ethereum Message prefix.
|
||||
const transactionHashHex = await devUtilsContract
|
||||
.getTransactionHash(
|
||||
transaction,
|
||||
new BigNumber(transaction.domain.chainId),
|
||||
transaction.domain.verifyingContract,
|
||||
)
|
||||
.callAsync();
|
||||
const transactionHashHex = transactionHashUtils.getTransactionHash(transaction);
|
||||
const sig = ethUtil.ecsign(
|
||||
ethUtil.toBuffer(transactionHashHex),
|
||||
Buffer.from('F2F48EE19680706196E2E339E5DA3491186E0C4C5030670656B0E0164837257D', 'hex'),
|
||||
|
@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"version": "2.2.0",
|
||||
"changes": [
|
||||
{
|
||||
"note": "Use updated `order-utils` with non-async hash functions.",
|
||||
"pr": 2462
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"timestamp": 1580988106,
|
||||
"version": "2.1.2",
|
||||
|
@ -47,7 +47,7 @@ export class CustomOrderProvider extends BaseOrderProvider {
|
||||
order,
|
||||
metaData: {
|
||||
remainingFillableTakerAssetAmount: order.takerAssetAmount,
|
||||
orderHash: await utils.getOrderHashAsync(order),
|
||||
orderHash: utils.getOrderHash(order),
|
||||
},
|
||||
},
|
||||
],
|
||||
|
@ -14,7 +14,7 @@ export class OrderSet {
|
||||
}
|
||||
|
||||
public async addAsync(item: APIOrder): Promise<void> {
|
||||
const orderHash = await utils.getOrderHashAsync(item);
|
||||
const orderHash = utils.getOrderHash(item);
|
||||
(item.metaData as any).orderHash = orderHash;
|
||||
this._map.set(orderHash, item);
|
||||
}
|
||||
@ -26,20 +26,20 @@ export class OrderSet {
|
||||
}
|
||||
|
||||
public async hasAsync(order: APIOrder): Promise<boolean> {
|
||||
return this._map.has(await utils.getOrderHashAsync(order));
|
||||
return this._map.has(utils.getOrderHash(order));
|
||||
}
|
||||
|
||||
public async diffAsync(other: OrderSet): Promise<{ added: APIOrder[]; removed: APIOrder[] }> {
|
||||
const added: APIOrder[] = [];
|
||||
const removed: APIOrder[] = [];
|
||||
for (const otherItem of other.values()) {
|
||||
const doesContainItem = this._map.has(await utils.getOrderHashAsync(otherItem));
|
||||
const doesContainItem = this._map.has(utils.getOrderHash(otherItem));
|
||||
if (!doesContainItem) {
|
||||
added.push(otherItem);
|
||||
}
|
||||
}
|
||||
for (const item of this.values()) {
|
||||
const doesContainItem = other._map.has(await utils.getOrderHashAsync(item));
|
||||
const doesContainItem = other._map.has(utils.getOrderHash(item));
|
||||
if (!doesContainItem) {
|
||||
removed.push(item);
|
||||
}
|
||||
@ -52,7 +52,7 @@ export class OrderSet {
|
||||
}
|
||||
|
||||
public async deleteAsync(item: APIOrder): Promise<boolean> {
|
||||
return this._map.delete(await utils.getOrderHashAsync(item));
|
||||
return this._map.delete(utils.getOrderHash(item));
|
||||
}
|
||||
|
||||
public async deleteManyAsync(items: APIOrder[]): Promise<void> {
|
||||
|
@ -2,15 +2,14 @@ import { APIOrder, SignedOrder } from '@0x/connect';
|
||||
import { orderHashUtils } from '@0x/order-utils';
|
||||
|
||||
export const utils = {
|
||||
async getOrderHashAsync(order: APIOrder | SignedOrder): Promise<string> {
|
||||
getOrderHash(order: APIOrder | SignedOrder): string {
|
||||
if ((order as APIOrder).metaData) {
|
||||
const apiOrder = order as APIOrder;
|
||||
const orderHash =
|
||||
(apiOrder.metaData as any).orderHash || (await orderHashUtils.getOrderHashAsync(apiOrder.order));
|
||||
const orderHash = (apiOrder.metaData as any).orderHash || orderHashUtils.getOrderHash(apiOrder.order);
|
||||
return orderHash;
|
||||
} else {
|
||||
const signedOrder = order as SignedOrder;
|
||||
const orderHash = await orderHashUtils.getOrderHashAsync(signedOrder);
|
||||
const orderHash = orderHashUtils.getOrderHash(signedOrder);
|
||||
return orderHash;
|
||||
}
|
||||
},
|
||||
|
@ -23,8 +23,8 @@ describe('Utils', () => {
|
||||
'0x1cf16c2f3a210965b5e17f51b57b869ba4ddda33df92b0017b4d8da9dacd3152b122a73844eaf50ccde29a42950239ba36a525ed7f1698a8a5e1896cf7d651aed203',
|
||||
};
|
||||
test('calculates the orderhash if it does not exist', async () => {
|
||||
const orderHash = await utils.getOrderHashAsync(order as any);
|
||||
const calculatedOrderHash = await utils.getOrderHashAsync({ order: order as any, metaData: {} });
|
||||
const orderHash = utils.getOrderHash(order as any);
|
||||
const calculatedOrderHash = utils.getOrderHash({ order: order as any, metaData: {} });
|
||||
expect(orderHash).toBe(calculatedOrderHash);
|
||||
expect(orderHash).toBe('0x5a0f346c671a39b832a487d2d7eb63ca19301554cf1f8a98a19d478a3a8be32c');
|
||||
});
|
||||
|
@ -11,6 +11,7 @@ export {
|
||||
EventAbi,
|
||||
EventParameter,
|
||||
EvmBytecodeOutput,
|
||||
EvmBytecodeOutputLinkReferences,
|
||||
EvmOutput,
|
||||
FallbackAbi,
|
||||
FunctionAbi,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user