6340 lines
265 KiB
TypeScript
6340 lines
265 KiB
TypeScript
// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma enum-naming
|
|
// tslint:disable:whitespace no-unbound-method no-trailing-whitespace
|
|
// tslint:disable:no-unused-variable
|
|
import {
|
|
AwaitTransactionSuccessOpts,
|
|
EncoderOverrides,
|
|
ContractFunctionObj,
|
|
ContractTxFunctionObj,
|
|
SendTransactionOpts,
|
|
BaseContract,
|
|
SubscriptionManager,
|
|
PromiseWithTransactionHash,
|
|
methodAbiToFunctionSignature,
|
|
linkLibrariesInBytecode,
|
|
} from '@0x/base-contract';
|
|
import { schemas } from '@0x/json-schemas';
|
|
import {
|
|
BlockParam,
|
|
BlockParamLiteral,
|
|
BlockRange,
|
|
CallData,
|
|
ContractAbi,
|
|
ContractArtifact,
|
|
DecodedLogArgs,
|
|
LogWithDecodedArgs,
|
|
MethodAbi,
|
|
TransactionReceiptWithDecodedLogs,
|
|
TxData,
|
|
TxDataPayable,
|
|
TxAccessListWithGas,
|
|
SupportedProvider,
|
|
} from 'ethereum-types';
|
|
import { AbiEncoder, BigNumber, classUtils, EncodingRules, hexUtils, logUtils, providerUtils } from '@0x/utils';
|
|
import { EventCallback, IndexedFilterValues, SimpleContractArtifact } from '@0x/types';
|
|
import { Web3Wrapper } from '@0x/web3-wrapper';
|
|
import { assert } from '@0x/assert';
|
|
import * as ethers from 'ethers';
|
|
// tslint:enable:no-unused-variable
|
|
|
|
export type ExchangeEventArgs =
|
|
| ExchangeAssetProxyRegisteredEventArgs
|
|
| ExchangeCancelEventArgs
|
|
| ExchangeCancelUpToEventArgs
|
|
| ExchangeFillEventArgs
|
|
| ExchangeOwnershipTransferredEventArgs
|
|
| ExchangeProtocolFeeCollectorAddressEventArgs
|
|
| ExchangeProtocolFeeMultiplierEventArgs
|
|
| ExchangeSignatureValidatorApprovalEventArgs
|
|
| ExchangeTransactionExecutionEventArgs;
|
|
|
|
export enum ExchangeEvents {
|
|
AssetProxyRegistered = 'AssetProxyRegistered',
|
|
Cancel = 'Cancel',
|
|
CancelUpTo = 'CancelUpTo',
|
|
Fill = 'Fill',
|
|
OwnershipTransferred = 'OwnershipTransferred',
|
|
ProtocolFeeCollectorAddress = 'ProtocolFeeCollectorAddress',
|
|
ProtocolFeeMultiplier = 'ProtocolFeeMultiplier',
|
|
SignatureValidatorApproval = 'SignatureValidatorApproval',
|
|
TransactionExecution = 'TransactionExecution',
|
|
}
|
|
|
|
export interface ExchangeAssetProxyRegisteredEventArgs extends DecodedLogArgs {
|
|
id: string;
|
|
assetProxy: string;
|
|
}
|
|
|
|
export interface ExchangeCancelEventArgs extends DecodedLogArgs {
|
|
makerAddress: string;
|
|
feeRecipientAddress: string;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
senderAddress: string;
|
|
orderHash: string;
|
|
}
|
|
|
|
export interface ExchangeCancelUpToEventArgs extends DecodedLogArgs {
|
|
makerAddress: string;
|
|
orderSenderAddress: string;
|
|
orderEpoch: BigNumber;
|
|
}
|
|
|
|
export interface ExchangeFillEventArgs extends DecodedLogArgs {
|
|
makerAddress: string;
|
|
feeRecipientAddress: string;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
orderHash: string;
|
|
takerAddress: string;
|
|
senderAddress: string;
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}
|
|
|
|
export interface ExchangeOwnershipTransferredEventArgs extends DecodedLogArgs {
|
|
previousOwner: string;
|
|
newOwner: string;
|
|
}
|
|
|
|
export interface ExchangeProtocolFeeCollectorAddressEventArgs extends DecodedLogArgs {
|
|
oldProtocolFeeCollector: string;
|
|
updatedProtocolFeeCollector: string;
|
|
}
|
|
|
|
export interface ExchangeProtocolFeeMultiplierEventArgs extends DecodedLogArgs {
|
|
oldProtocolFeeMultiplier: BigNumber;
|
|
updatedProtocolFeeMultiplier: BigNumber;
|
|
}
|
|
|
|
export interface ExchangeSignatureValidatorApprovalEventArgs extends DecodedLogArgs {
|
|
signerAddress: string;
|
|
validatorAddress: string;
|
|
isApproved: boolean;
|
|
}
|
|
|
|
export interface ExchangeTransactionExecutionEventArgs extends DecodedLogArgs {
|
|
transactionHash: string;
|
|
}
|
|
|
|
/* istanbul ignore next */
|
|
// tslint:disable:array-type
|
|
// tslint:disable:no-parameter-reassignment
|
|
// tslint:disable-next-line:class-name
|
|
export class ExchangeContract extends BaseContract {
|
|
/**
|
|
* @ignore
|
|
*/
|
|
public static deployedBytecode: string | undefined;
|
|
public static contractName = 'Exchange';
|
|
private readonly _methodABIIndex: { [name: string]: number } = {};
|
|
private readonly _subscriptionManager: SubscriptionManager<ExchangeEventArgs, ExchangeEvents>;
|
|
public static async deployFrom0xArtifactAsync(
|
|
artifact: ContractArtifact | SimpleContractArtifact,
|
|
supportedProvider: SupportedProvider,
|
|
txDefaults: Partial<TxData>,
|
|
logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact },
|
|
chainId: BigNumber,
|
|
): Promise<ExchangeContract> {
|
|
assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema);
|
|
if (artifact.compilerOutput === undefined) {
|
|
throw new Error('Compiler output not found in the artifact file');
|
|
}
|
|
const provider = providerUtils.standardizeOrThrow(supportedProvider);
|
|
const bytecode = artifact.compilerOutput.evm.bytecode.object;
|
|
const abi = artifact.compilerOutput.abi;
|
|
const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {};
|
|
if (Object.keys(logDecodeDependencies) !== undefined) {
|
|
for (const key of Object.keys(logDecodeDependencies)) {
|
|
logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi;
|
|
}
|
|
}
|
|
return ExchangeContract.deployAsync(bytecode, abi, provider, txDefaults, logDecodeDependenciesAbiOnly, chainId);
|
|
}
|
|
|
|
public static async deployWithLibrariesFrom0xArtifactAsync(
|
|
artifact: ContractArtifact,
|
|
libraryArtifacts: { [libraryName: string]: ContractArtifact },
|
|
supportedProvider: SupportedProvider,
|
|
txDefaults: Partial<TxData>,
|
|
logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact },
|
|
chainId: BigNumber,
|
|
): Promise<ExchangeContract> {
|
|
assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema);
|
|
if (artifact.compilerOutput === undefined) {
|
|
throw new Error('Compiler output not found in the artifact file');
|
|
}
|
|
const provider = providerUtils.standardizeOrThrow(supportedProvider);
|
|
const abi = artifact.compilerOutput.abi;
|
|
const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {};
|
|
if (Object.keys(logDecodeDependencies) !== undefined) {
|
|
for (const key of Object.keys(logDecodeDependencies)) {
|
|
logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi;
|
|
}
|
|
}
|
|
const libraryAddresses = await ExchangeContract._deployLibrariesAsync(
|
|
artifact,
|
|
libraryArtifacts,
|
|
new Web3Wrapper(provider),
|
|
txDefaults,
|
|
);
|
|
const bytecode = linkLibrariesInBytecode(artifact, libraryAddresses);
|
|
return ExchangeContract.deployAsync(bytecode, abi, provider, txDefaults, logDecodeDependenciesAbiOnly, chainId);
|
|
}
|
|
|
|
public static async deployAsync(
|
|
bytecode: string,
|
|
abi: ContractAbi,
|
|
supportedProvider: SupportedProvider,
|
|
txDefaults: Partial<TxData>,
|
|
logDecodeDependencies: { [contractName: string]: ContractAbi },
|
|
chainId: BigNumber,
|
|
): Promise<ExchangeContract> {
|
|
assert.isHexString('bytecode', bytecode);
|
|
assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema);
|
|
const provider = providerUtils.standardizeOrThrow(supportedProvider);
|
|
const constructorAbi = BaseContract._lookupConstructorAbi(abi);
|
|
[chainId] = BaseContract._formatABIDataItemList(
|
|
constructorAbi.inputs,
|
|
[chainId],
|
|
BaseContract._bigNumberToString,
|
|
);
|
|
const iface = new ethers.utils.Interface(abi);
|
|
const deployInfo = iface.deployFunction;
|
|
const txData = deployInfo.encode(bytecode, [chainId]);
|
|
const web3Wrapper = new Web3Wrapper(provider);
|
|
const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync(
|
|
{
|
|
data: txData,
|
|
...txDefaults,
|
|
},
|
|
web3Wrapper.estimateGasAsync.bind(web3Wrapper),
|
|
);
|
|
const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
logUtils.log(`transactionHash: ${txHash}`);
|
|
const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash);
|
|
logUtils.log(`Exchange successfully deployed at ${txReceipt.contractAddress}`);
|
|
const contractInstance = new ExchangeContract(
|
|
txReceipt.contractAddress as string,
|
|
provider,
|
|
txDefaults,
|
|
logDecodeDependencies,
|
|
);
|
|
contractInstance.constructorArgs = [chainId];
|
|
return contractInstance;
|
|
}
|
|
|
|
/**
|
|
* @returns The contract ABI
|
|
*/
|
|
public static ABI(): ContractAbi {
|
|
const abi = [
|
|
{
|
|
inputs: [
|
|
{
|
|
name: 'chainId',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
outputs: [],
|
|
payable: false,
|
|
stateMutability: 'nonpayable',
|
|
type: 'constructor',
|
|
},
|
|
{
|
|
anonymous: false,
|
|
inputs: [
|
|
{
|
|
name: 'id',
|
|
type: 'bytes4',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'assetProxy',
|
|
type: 'address',
|
|
indexed: false,
|
|
},
|
|
],
|
|
name: 'AssetProxyRegistered',
|
|
outputs: [],
|
|
type: 'event',
|
|
},
|
|
{
|
|
anonymous: false,
|
|
inputs: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
indexed: true,
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
indexed: true,
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'orderHash',
|
|
type: 'bytes32',
|
|
indexed: true,
|
|
},
|
|
],
|
|
name: 'Cancel',
|
|
outputs: [],
|
|
type: 'event',
|
|
},
|
|
{
|
|
anonymous: false,
|
|
inputs: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
indexed: true,
|
|
},
|
|
{
|
|
name: 'orderSenderAddress',
|
|
type: 'address',
|
|
indexed: true,
|
|
},
|
|
{
|
|
name: 'orderEpoch',
|
|
type: 'uint256',
|
|
indexed: false,
|
|
},
|
|
],
|
|
name: 'CancelUpTo',
|
|
outputs: [],
|
|
type: 'event',
|
|
},
|
|
{
|
|
anonymous: false,
|
|
inputs: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
indexed: true,
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
indexed: true,
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'orderHash',
|
|
type: 'bytes32',
|
|
indexed: true,
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
indexed: false,
|
|
},
|
|
],
|
|
name: 'Fill',
|
|
outputs: [],
|
|
type: 'event',
|
|
},
|
|
{
|
|
anonymous: false,
|
|
inputs: [
|
|
{
|
|
name: 'previousOwner',
|
|
type: 'address',
|
|
indexed: true,
|
|
},
|
|
{
|
|
name: 'newOwner',
|
|
type: 'address',
|
|
indexed: true,
|
|
},
|
|
],
|
|
name: 'OwnershipTransferred',
|
|
outputs: [],
|
|
type: 'event',
|
|
},
|
|
{
|
|
anonymous: false,
|
|
inputs: [
|
|
{
|
|
name: 'oldProtocolFeeCollector',
|
|
type: 'address',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'updatedProtocolFeeCollector',
|
|
type: 'address',
|
|
indexed: false,
|
|
},
|
|
],
|
|
name: 'ProtocolFeeCollectorAddress',
|
|
outputs: [],
|
|
type: 'event',
|
|
},
|
|
{
|
|
anonymous: false,
|
|
inputs: [
|
|
{
|
|
name: 'oldProtocolFeeMultiplier',
|
|
type: 'uint256',
|
|
indexed: false,
|
|
},
|
|
{
|
|
name: 'updatedProtocolFeeMultiplier',
|
|
type: 'uint256',
|
|
indexed: false,
|
|
},
|
|
],
|
|
name: 'ProtocolFeeMultiplier',
|
|
outputs: [],
|
|
type: 'event',
|
|
},
|
|
{
|
|
anonymous: false,
|
|
inputs: [
|
|
{
|
|
name: 'signerAddress',
|
|
type: 'address',
|
|
indexed: true,
|
|
},
|
|
{
|
|
name: 'validatorAddress',
|
|
type: 'address',
|
|
indexed: true,
|
|
},
|
|
{
|
|
name: 'isApproved',
|
|
type: 'bool',
|
|
indexed: false,
|
|
},
|
|
],
|
|
name: 'SignatureValidatorApproval',
|
|
outputs: [],
|
|
type: 'event',
|
|
},
|
|
{
|
|
anonymous: false,
|
|
inputs: [
|
|
{
|
|
name: 'transactionHash',
|
|
type: 'bytes32',
|
|
indexed: true,
|
|
},
|
|
],
|
|
name: 'TransactionExecution',
|
|
outputs: [],
|
|
type: 'event',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [],
|
|
name: 'EIP1271_MAGIC_VALUE',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'bytes4',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [],
|
|
name: 'EIP712_EXCHANGE_DOMAIN_HASH',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'bytes32',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'index_0',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'index_1',
|
|
type: 'address',
|
|
},
|
|
],
|
|
name: 'allowedValidators',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'bool',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'orders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
name: 'batchCancelOrders',
|
|
outputs: [],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'transactions',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'gasPrice',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'signerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'data',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'signatures',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
name: 'batchExecuteTransactions',
|
|
outputs: [
|
|
{
|
|
name: 'returnData',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'orders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'takerAssetFillAmounts',
|
|
type: 'uint256[]',
|
|
},
|
|
{
|
|
name: 'signatures',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
name: 'batchFillOrKillOrders',
|
|
outputs: [
|
|
{
|
|
name: 'fillResults',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'orders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'takerAssetFillAmounts',
|
|
type: 'uint256[]',
|
|
},
|
|
{
|
|
name: 'signatures',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
name: 'batchFillOrders',
|
|
outputs: [
|
|
{
|
|
name: 'fillResults',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'orders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'takerAssetFillAmounts',
|
|
type: 'uint256[]',
|
|
},
|
|
{
|
|
name: 'signatures',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
name: 'batchFillOrdersNoThrow',
|
|
outputs: [
|
|
{
|
|
name: 'fillResults',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'leftOrders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'rightOrders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'leftSignatures',
|
|
type: 'bytes[]',
|
|
},
|
|
{
|
|
name: 'rightSignatures',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
name: 'batchMatchOrders',
|
|
outputs: [
|
|
{
|
|
name: 'batchMatchedFillResults',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'left',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'right',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'profitInLeftMakerAsset',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'profitInRightMakerAsset',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'leftOrders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'rightOrders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'leftSignatures',
|
|
type: 'bytes[]',
|
|
},
|
|
{
|
|
name: 'rightSignatures',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
name: 'batchMatchOrdersWithMaximalFill',
|
|
outputs: [
|
|
{
|
|
name: 'batchMatchedFillResults',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'left',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'right',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'profitInLeftMakerAsset',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'profitInRightMakerAsset',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'order',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
name: 'cancelOrder',
|
|
outputs: [],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'targetOrderEpoch',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
name: 'cancelOrdersUpTo',
|
|
outputs: [],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'index_0',
|
|
type: 'bytes32',
|
|
},
|
|
],
|
|
name: 'cancelled',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'bool',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [],
|
|
name: 'currentContextAddress',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'address',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [],
|
|
name: 'detachProtocolFeeCollector',
|
|
outputs: [],
|
|
payable: false,
|
|
stateMutability: 'nonpayable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'transaction',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'gasPrice',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'signerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'data',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'signature',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
name: 'executeTransaction',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'order',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'takerAssetFillAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'signature',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
name: 'fillOrKillOrder',
|
|
outputs: [
|
|
{
|
|
name: 'fillResults',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'order',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'takerAssetFillAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'signature',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
name: 'fillOrder',
|
|
outputs: [
|
|
{
|
|
name: 'fillResults',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'index_0',
|
|
type: 'bytes32',
|
|
},
|
|
],
|
|
name: 'filled',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'assetProxyId',
|
|
type: 'bytes4',
|
|
},
|
|
],
|
|
name: 'getAssetProxy',
|
|
outputs: [
|
|
{
|
|
name: 'assetProxy',
|
|
type: 'address',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'order',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
name: 'getOrderInfo',
|
|
outputs: [
|
|
{
|
|
name: 'orderInfo',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'orderStatus',
|
|
type: 'uint8',
|
|
},
|
|
{
|
|
name: 'orderHash',
|
|
type: 'bytes32',
|
|
},
|
|
{
|
|
name: 'orderTakerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'hash',
|
|
type: 'bytes32',
|
|
},
|
|
{
|
|
name: 'signerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'signature',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
name: 'isValidHashSignature',
|
|
outputs: [
|
|
{
|
|
name: 'isValid',
|
|
type: 'bool',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'order',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'signature',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
name: 'isValidOrderSignature',
|
|
outputs: [
|
|
{
|
|
name: 'isValid',
|
|
type: 'bool',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'transaction',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'gasPrice',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'signerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'data',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'signature',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
name: 'isValidTransactionSignature',
|
|
outputs: [
|
|
{
|
|
name: 'isValid',
|
|
type: 'bool',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'orders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'makerAssetFillAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'signatures',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
name: 'marketBuyOrdersFillOrKill',
|
|
outputs: [
|
|
{
|
|
name: 'fillResults',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'orders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'makerAssetFillAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'signatures',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
name: 'marketBuyOrdersNoThrow',
|
|
outputs: [
|
|
{
|
|
name: 'fillResults',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'orders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'takerAssetFillAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'signatures',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
name: 'marketSellOrdersFillOrKill',
|
|
outputs: [
|
|
{
|
|
name: 'fillResults',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'orders',
|
|
type: 'tuple[]',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'takerAssetFillAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'signatures',
|
|
type: 'bytes[]',
|
|
},
|
|
],
|
|
name: 'marketSellOrdersNoThrow',
|
|
outputs: [
|
|
{
|
|
name: 'fillResults',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'leftOrder',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'rightOrder',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'leftSignature',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'rightSignature',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
name: 'matchOrders',
|
|
outputs: [
|
|
{
|
|
name: 'matchedFillResults',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'left',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'right',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'profitInLeftMakerAsset',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'profitInRightMakerAsset',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'leftOrder',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'rightOrder',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'takerAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'feeRecipientAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'senderAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'makerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFee',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'expirationTimeSeconds',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'salt',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'makerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'takerFeeAssetData',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'leftSignature',
|
|
type: 'bytes',
|
|
},
|
|
{
|
|
name: 'rightSignature',
|
|
type: 'bytes',
|
|
},
|
|
],
|
|
name: 'matchOrdersWithMaximalFill',
|
|
outputs: [
|
|
{
|
|
name: 'matchedFillResults',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'left',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'right',
|
|
type: 'tuple',
|
|
components: [
|
|
{
|
|
name: 'makerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerAssetFilledAmount',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'makerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'takerFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'protocolFeePaid',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'profitInLeftMakerAsset',
|
|
type: 'uint256',
|
|
},
|
|
{
|
|
name: 'profitInRightMakerAsset',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'index_0',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'index_1',
|
|
type: 'address',
|
|
},
|
|
],
|
|
name: 'orderEpoch',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [],
|
|
name: 'owner',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'address',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'hash',
|
|
type: 'bytes32',
|
|
},
|
|
],
|
|
name: 'preSign',
|
|
outputs: [],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'index_0',
|
|
type: 'bytes32',
|
|
},
|
|
{
|
|
name: 'index_1',
|
|
type: 'address',
|
|
},
|
|
],
|
|
name: 'preSigned',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'bool',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [],
|
|
name: 'protocolFeeCollector',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'address',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [],
|
|
name: 'protocolFeeMultiplier',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'assetProxy',
|
|
type: 'address',
|
|
},
|
|
],
|
|
name: 'registerAssetProxy',
|
|
outputs: [],
|
|
payable: false,
|
|
stateMutability: 'nonpayable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'updatedProtocolFeeCollector',
|
|
type: 'address',
|
|
},
|
|
],
|
|
name: 'setProtocolFeeCollectorAddress',
|
|
outputs: [],
|
|
payable: false,
|
|
stateMutability: 'nonpayable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'updatedProtocolFeeMultiplier',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
name: 'setProtocolFeeMultiplier',
|
|
outputs: [],
|
|
payable: false,
|
|
stateMutability: 'nonpayable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'validatorAddress',
|
|
type: 'address',
|
|
},
|
|
{
|
|
name: 'approval',
|
|
type: 'bool',
|
|
},
|
|
],
|
|
name: 'setSignatureValidatorApproval',
|
|
outputs: [],
|
|
payable: true,
|
|
stateMutability: 'payable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'assetData',
|
|
type: 'bytes[]',
|
|
},
|
|
{
|
|
name: 'fromAddresses',
|
|
type: 'address[]',
|
|
},
|
|
{
|
|
name: 'toAddresses',
|
|
type: 'address[]',
|
|
},
|
|
{
|
|
name: 'amounts',
|
|
type: 'uint256[]',
|
|
},
|
|
],
|
|
name: 'simulateDispatchTransferFromCalls',
|
|
outputs: [],
|
|
payable: false,
|
|
stateMutability: 'nonpayable',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: 'index_0',
|
|
type: 'bytes32',
|
|
},
|
|
],
|
|
name: 'transactionsExecuted',
|
|
outputs: [
|
|
{
|
|
name: '',
|
|
type: 'bool',
|
|
},
|
|
],
|
|
payable: false,
|
|
stateMutability: 'view',
|
|
type: 'function',
|
|
},
|
|
{
|
|
constant: false,
|
|
inputs: [
|
|
{
|
|
name: 'newOwner',
|
|
type: 'address',
|
|
},
|
|
],
|
|
name: 'transferOwnership',
|
|
outputs: [],
|
|
payable: false,
|
|
stateMutability: 'nonpayable',
|
|
type: 'function',
|
|
},
|
|
] as ContractAbi;
|
|
return abi;
|
|
}
|
|
|
|
protected static async _deployLibrariesAsync(
|
|
artifact: ContractArtifact,
|
|
libraryArtifacts: { [libraryName: string]: ContractArtifact },
|
|
web3Wrapper: Web3Wrapper,
|
|
txDefaults: Partial<TxData>,
|
|
libraryAddresses: { [libraryName: string]: string } = {},
|
|
): Promise<{ [libraryName: string]: string }> {
|
|
const links = artifact.compilerOutput.evm.bytecode.linkReferences || {};
|
|
// Go through all linked libraries, recursively deploying them if necessary.
|
|
for (const link of Object.values(links)) {
|
|
for (const libraryName of Object.keys(link)) {
|
|
if (!libraryAddresses[libraryName]) {
|
|
// Library not yet deployed.
|
|
const libraryArtifact = libraryArtifacts[libraryName];
|
|
if (!libraryArtifact) {
|
|
throw new Error(`Missing artifact for linked library "${libraryName}"`);
|
|
}
|
|
// Deploy any dependent libraries used by this library.
|
|
await ExchangeContract._deployLibrariesAsync(
|
|
libraryArtifact,
|
|
libraryArtifacts,
|
|
web3Wrapper,
|
|
txDefaults,
|
|
libraryAddresses,
|
|
);
|
|
// Deploy this library.
|
|
const linkedLibraryBytecode = linkLibrariesInBytecode(libraryArtifact, libraryAddresses);
|
|
const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync(
|
|
{
|
|
data: linkedLibraryBytecode,
|
|
...txDefaults,
|
|
},
|
|
web3Wrapper.estimateGasAsync.bind(web3Wrapper),
|
|
);
|
|
const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
logUtils.log(`transactionHash: ${txHash}`);
|
|
const { contractAddress } = await web3Wrapper.awaitTransactionSuccessAsync(txHash);
|
|
logUtils.log(`${libraryArtifact.contractName} successfully deployed at ${contractAddress}`);
|
|
libraryAddresses[libraryArtifact.contractName] = contractAddress as string;
|
|
}
|
|
}
|
|
}
|
|
return libraryAddresses;
|
|
}
|
|
|
|
public getFunctionSignature(methodName: string): string {
|
|
const index = this._methodABIIndex[methodName];
|
|
const methodAbi = ExchangeContract.ABI()[index] as MethodAbi; // tslint:disable-line:no-unnecessary-type-assertion
|
|
const functionSignature = methodAbiToFunctionSignature(methodAbi);
|
|
return functionSignature;
|
|
}
|
|
|
|
public getABIDecodedTransactionData<T>(methodName: string, callData: string): T {
|
|
const functionSignature = this.getFunctionSignature(methodName);
|
|
const self = (this as any) as ExchangeContract;
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
const abiDecodedCallData = abiEncoder.strictDecode<T>(callData);
|
|
return abiDecodedCallData;
|
|
}
|
|
|
|
public getABIDecodedReturnData<T>(methodName: string, callData: string): T {
|
|
if (this._encoderOverrides.decodeOutput) {
|
|
return this._encoderOverrides.decodeOutput(methodName, callData);
|
|
}
|
|
const functionSignature = this.getFunctionSignature(methodName);
|
|
const self = (this as any) as ExchangeContract;
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
const abiDecodedCallData = abiEncoder.strictDecodeReturnValue<T>(callData);
|
|
return abiDecodedCallData;
|
|
}
|
|
|
|
public getSelector(methodName: string): string {
|
|
const functionSignature = this.getFunctionSignature(methodName);
|
|
const self = (this as any) as ExchangeContract;
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
return abiEncoder.getSelector();
|
|
}
|
|
|
|
public EIP1271_MAGIC_VALUE(): ContractFunctionObj<string> {
|
|
const self = (this as any) as ExchangeContract;
|
|
const functionSignature = 'EIP1271_MAGIC_VALUE()';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<string> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<string>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, []);
|
|
},
|
|
};
|
|
}
|
|
public EIP712_EXCHANGE_DOMAIN_HASH(): ContractFunctionObj<string> {
|
|
const self = (this as any) as ExchangeContract;
|
|
const functionSignature = 'EIP712_EXCHANGE_DOMAIN_HASH()';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<string> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<string>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, []);
|
|
},
|
|
};
|
|
}
|
|
public allowedValidators(index_0: string, index_1: string): ContractFunctionObj<boolean> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('index_0', index_0);
|
|
assert.isString('index_1', index_1);
|
|
const functionSignature = 'allowedValidators(address,address)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<boolean> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<boolean>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [index_0.toLowerCase(), index_1.toLowerCase()]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Executes multiple calls of cancelOrder.
|
|
* @param orders Array of order specifications.
|
|
*/
|
|
public batchCancelOrders(
|
|
orders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('orders', orders);
|
|
const functionSignature =
|
|
'batchCancelOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [orders]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Executes a batch of Exchange method calls in the context of signer(s).
|
|
* @param transactions Array of 0x transaction structures.
|
|
* @param signatures Array of proofs that transactions have been signed by
|
|
* signer(s).
|
|
* @returns returnData Array containing ABI encoded return data for each of the underlying Exchange function calls.
|
|
*/
|
|
public batchExecuteTransactions(
|
|
transactions: Array<{
|
|
salt: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
gasPrice: BigNumber;
|
|
signerAddress: string;
|
|
data: string;
|
|
}>,
|
|
signatures: string[],
|
|
): ContractTxFunctionObj<string[]> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('transactions', transactions);
|
|
assert.isArray('signatures', signatures);
|
|
const functionSignature = 'batchExecuteTransactions((uint256,uint256,uint256,address,bytes)[],bytes[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<string[]> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<string[]>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [transactions, signatures]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Executes multiple calls of fillOrKillOrder.
|
|
* @param orders Array of order specifications.
|
|
* @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell
|
|
* in orders.
|
|
* @param signatures Proofs that orders have been created by makers.
|
|
* @returns fillResults Array of amounts filled and fees paid by makers and taker.
|
|
*/
|
|
public batchFillOrKillOrders(
|
|
orders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
takerAssetFillAmounts: BigNumber[],
|
|
signatures: string[],
|
|
): ContractTxFunctionObj<
|
|
Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>
|
|
> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('orders', orders);
|
|
assert.isArray('takerAssetFillAmounts', takerAssetFillAmounts);
|
|
assert.isArray('signatures', signatures);
|
|
const functionSignature =
|
|
'batchFillOrKillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<
|
|
Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>
|
|
> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<
|
|
Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>
|
|
>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [orders, takerAssetFillAmounts, signatures]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Executes multiple calls of fillOrder.
|
|
* @param orders Array of order specifications.
|
|
* @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell
|
|
* in orders.
|
|
* @param signatures Proofs that orders have been created by makers.
|
|
* @returns fillResults Array of amounts filled and fees paid by makers and taker.
|
|
*/
|
|
public batchFillOrders(
|
|
orders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
takerAssetFillAmounts: BigNumber[],
|
|
signatures: string[],
|
|
): ContractTxFunctionObj<
|
|
Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>
|
|
> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('orders', orders);
|
|
assert.isArray('takerAssetFillAmounts', takerAssetFillAmounts);
|
|
assert.isArray('signatures', signatures);
|
|
const functionSignature =
|
|
'batchFillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<
|
|
Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>
|
|
> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<
|
|
Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>
|
|
>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [orders, takerAssetFillAmounts, signatures]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Executes multiple calls of fillOrder. If any fill reverts, the error is caught and ignored.
|
|
* @param orders Array of order specifications.
|
|
* @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell
|
|
* in orders.
|
|
* @param signatures Proofs that orders have been created by makers.
|
|
* @returns fillResults Array of amounts filled and fees paid by makers and taker.
|
|
*/
|
|
public batchFillOrdersNoThrow(
|
|
orders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
takerAssetFillAmounts: BigNumber[],
|
|
signatures: string[],
|
|
): ContractTxFunctionObj<
|
|
Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>
|
|
> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('orders', orders);
|
|
assert.isArray('takerAssetFillAmounts', takerAssetFillAmounts);
|
|
assert.isArray('signatures', signatures);
|
|
const functionSignature =
|
|
'batchFillOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<
|
|
Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>
|
|
> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<
|
|
Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>
|
|
>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [orders, takerAssetFillAmounts, signatures]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Match complementary orders that have a profitable spread.
|
|
* Each order is filled at their respective price point, and
|
|
* the matcher receives a profit denominated in the left maker asset.
|
|
* @param leftOrders Set of orders with the same maker / taker asset.
|
|
* @param rightOrders Set of orders to match against `leftOrders`
|
|
* @param leftSignatures Proof that left orders were created by the left
|
|
* makers.
|
|
* @param rightSignatures Proof that right orders were created by the right
|
|
* makers.
|
|
* @returns batchMatchedFillResults Amounts filled and profit generated.
|
|
*/
|
|
public batchMatchOrders(
|
|
leftOrders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
rightOrders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
leftSignatures: string[],
|
|
rightSignatures: string[],
|
|
): ContractTxFunctionObj<{
|
|
left: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
right: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('leftOrders', leftOrders);
|
|
assert.isArray('rightOrders', rightOrders);
|
|
assert.isArray('leftSignatures', leftSignatures);
|
|
assert.isArray('rightSignatures', rightSignatures);
|
|
const functionSignature =
|
|
'batchMatchOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],bytes[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{
|
|
left: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
right: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
left: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
right: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [
|
|
leftOrders,
|
|
rightOrders,
|
|
leftSignatures,
|
|
rightSignatures,
|
|
]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Match complementary orders that have a profitable spread.
|
|
* Each order is maximally filled at their respective price point, and
|
|
* the matcher receives a profit denominated in either the left maker asset,
|
|
* right maker asset, or a combination of both.
|
|
* @param leftOrders Set of orders with the same maker / taker asset.
|
|
* @param rightOrders Set of orders to match against `leftOrders`
|
|
* @param leftSignatures Proof that left orders were created by the left
|
|
* makers.
|
|
* @param rightSignatures Proof that right orders were created by the right
|
|
* makers.
|
|
* @returns batchMatchedFillResults Amounts filled and profit generated.
|
|
*/
|
|
public batchMatchOrdersWithMaximalFill(
|
|
leftOrders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
rightOrders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
leftSignatures: string[],
|
|
rightSignatures: string[],
|
|
): ContractTxFunctionObj<{
|
|
left: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
right: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('leftOrders', leftOrders);
|
|
assert.isArray('rightOrders', rightOrders);
|
|
assert.isArray('leftSignatures', leftSignatures);
|
|
assert.isArray('rightSignatures', rightSignatures);
|
|
const functionSignature =
|
|
'batchMatchOrdersWithMaximalFill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],bytes[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{
|
|
left: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
right: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
left: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
right: Array<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>;
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [
|
|
leftOrders,
|
|
rightOrders,
|
|
leftSignatures,
|
|
rightSignatures,
|
|
]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* After calling, the order can not be filled anymore.
|
|
* @param order Order struct containing order specifications.
|
|
*/
|
|
public cancelOrder(order: {
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
|
|
const functionSignature =
|
|
'cancelOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes))';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [order]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch
|
|
* and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).
|
|
* @param targetOrderEpoch Orders created with a salt less or equal to this
|
|
* value will be cancelled.
|
|
*/
|
|
public cancelOrdersUpTo(targetOrderEpoch: BigNumber): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isBigNumber('targetOrderEpoch', targetOrderEpoch);
|
|
const functionSignature = 'cancelOrdersUpTo(uint256)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [targetOrderEpoch]);
|
|
},
|
|
};
|
|
}
|
|
public cancelled(index_0: string): ContractFunctionObj<boolean> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('index_0', index_0);
|
|
const functionSignature = 'cancelled(bytes32)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<boolean> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<boolean>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [index_0]);
|
|
},
|
|
};
|
|
}
|
|
public currentContextAddress(): ContractFunctionObj<string> {
|
|
const self = (this as any) as ExchangeContract;
|
|
const functionSignature = 'currentContextAddress()';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<string> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<string>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, []);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Sets the protocolFeeCollector contract address to 0.
|
|
* Only callable by owner.
|
|
*/
|
|
public detachProtocolFeeCollector(): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
const functionSignature = 'detachProtocolFeeCollector()';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, []);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Executes an Exchange method call in the context of signer.
|
|
* @param transaction 0x transaction structure.
|
|
* @param signature Proof that transaction has been signed by signer.
|
|
* @returns ABI encoded return data of the underlying Exchange function call.
|
|
*/
|
|
public executeTransaction(
|
|
transaction: {
|
|
salt: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
gasPrice: BigNumber;
|
|
signerAddress: string;
|
|
data: string;
|
|
},
|
|
signature: string,
|
|
): ContractTxFunctionObj<string> {
|
|
const self = (this as any) as ExchangeContract;
|
|
|
|
assert.isString('signature', signature);
|
|
const functionSignature = 'executeTransaction((uint256,uint256,uint256,address,bytes),bytes)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<string> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<string>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [transaction, signature]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Fills the input order. Reverts if exact `takerAssetFillAmount` not filled.
|
|
* @param order Order struct containing order specifications.
|
|
* @param takerAssetFillAmount Desired amount of takerAsset to sell.
|
|
* @param signature Proof that order has been created by maker.
|
|
* @returns fillResults Amounts filled and fees paid.
|
|
*/
|
|
public fillOrKillOrder(
|
|
order: {
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
},
|
|
takerAssetFillAmount: BigNumber,
|
|
signature: string,
|
|
): ContractTxFunctionObj<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
const self = (this as any) as ExchangeContract;
|
|
|
|
assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount);
|
|
assert.isString('signature', signature);
|
|
const functionSignature =
|
|
'fillOrKillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),uint256,bytes)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [order, takerAssetFillAmount, signature]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Fills the input order.
|
|
* @param order Order struct containing order specifications.
|
|
* @param takerAssetFillAmount Desired amount of takerAsset to sell.
|
|
* @param signature Proof that order has been created by maker.
|
|
* @returns fillResults Amounts filled and fees paid by maker and taker.
|
|
*/
|
|
public fillOrder(
|
|
order: {
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
},
|
|
takerAssetFillAmount: BigNumber,
|
|
signature: string,
|
|
): ContractTxFunctionObj<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
const self = (this as any) as ExchangeContract;
|
|
|
|
assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount);
|
|
assert.isString('signature', signature);
|
|
const functionSignature =
|
|
'fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),uint256,bytes)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [order, takerAssetFillAmount, signature]);
|
|
},
|
|
};
|
|
}
|
|
public filled(index_0: string): ContractFunctionObj<BigNumber> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('index_0', index_0);
|
|
const functionSignature = 'filled(bytes32)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<BigNumber> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<BigNumber>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [index_0]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Gets an asset proxy.
|
|
* @param assetProxyId Id of the asset proxy.
|
|
* @returns assetProxy The asset proxy address registered to assetProxyId. Returns 0x0 if no proxy is registered.
|
|
*/
|
|
public getAssetProxy(assetProxyId: string): ContractFunctionObj<string> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('assetProxyId', assetProxyId);
|
|
const functionSignature = 'getAssetProxy(bytes4)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<string> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<string>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [assetProxyId]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Gets information about an order: status, hash, and amount filled.
|
|
* @param order Order to gather information on.
|
|
* @returns orderInfo Information about the order and its state. See LibOrder.OrderInfo for a complete description.
|
|
*/
|
|
public getOrderInfo(order: {
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}): ContractFunctionObj<{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }> {
|
|
const self = (this as any) as ExchangeContract;
|
|
|
|
const functionSignature =
|
|
'getOrderInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes))';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
orderStatus: number;
|
|
orderHash: string;
|
|
orderTakerAssetFilledAmount: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [order]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Verifies that a hash has been signed by the given signer.
|
|
* @param hash Any 32-byte hash.
|
|
* @param signerAddress Address that should have signed the given hash.
|
|
* @param signature Proof that the hash has been signed by signer.
|
|
* @returns isValid `true` if the signature is valid for the given hash and signer.
|
|
*/
|
|
public isValidHashSignature(hash: string, signerAddress: string, signature: string): ContractFunctionObj<boolean> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('hash', hash);
|
|
assert.isString('signerAddress', signerAddress);
|
|
assert.isString('signature', signature);
|
|
const functionSignature = 'isValidHashSignature(bytes32,address,bytes)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<boolean> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<boolean>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [hash, signerAddress.toLowerCase(), signature]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Verifies that a signature for an order is valid.
|
|
* @param order The order.
|
|
* @param signature Proof that the order has been signed by signer.
|
|
* @returns isValid `true` if the signature is valid for the given order and signer.
|
|
*/
|
|
public isValidOrderSignature(
|
|
order: {
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
},
|
|
signature: string,
|
|
): ContractFunctionObj<boolean> {
|
|
const self = (this as any) as ExchangeContract;
|
|
|
|
assert.isString('signature', signature);
|
|
const functionSignature =
|
|
'isValidOrderSignature((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<boolean> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<boolean>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [order, signature]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Verifies that a signature for a transaction is valid.
|
|
* @param transaction The transaction.
|
|
* @param signature Proof that the order has been signed by signer.
|
|
* @returns isValid `true` if the signature is valid for the given transaction and signer.
|
|
*/
|
|
public isValidTransactionSignature(
|
|
transaction: {
|
|
salt: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
gasPrice: BigNumber;
|
|
signerAddress: string;
|
|
data: string;
|
|
},
|
|
signature: string,
|
|
): ContractFunctionObj<boolean> {
|
|
const self = (this as any) as ExchangeContract;
|
|
|
|
assert.isString('signature', signature);
|
|
const functionSignature = 'isValidTransactionSignature((uint256,uint256,uint256,address,bytes),bytes)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<boolean> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<boolean>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [transaction, signature]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Calls marketBuyOrdersNoThrow then reverts if < makerAssetFillAmount has been bought.
|
|
* NOTE: This function does not enforce that the makerAsset is the same for each order.
|
|
* @param orders Array of order specifications.
|
|
* @param makerAssetFillAmount Minimum amount of makerAsset to buy.
|
|
* @param signatures Proofs that orders have been signed by makers.
|
|
* @returns fillResults Amounts filled and fees paid by makers and taker.
|
|
*/
|
|
public marketBuyOrdersFillOrKill(
|
|
orders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
makerAssetFillAmount: BigNumber,
|
|
signatures: string[],
|
|
): ContractTxFunctionObj<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('orders', orders);
|
|
assert.isBigNumber('makerAssetFillAmount', makerAssetFillAmount);
|
|
assert.isArray('signatures', signatures);
|
|
const functionSignature =
|
|
'marketBuyOrdersFillOrKill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [orders, makerAssetFillAmount, signatures]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.
|
|
* If any fill reverts, the error is caught and ignored.
|
|
* NOTE: This function does not enforce that the makerAsset is the same for each order.
|
|
* @param orders Array of order specifications.
|
|
* @param makerAssetFillAmount Desired amount of makerAsset to buy.
|
|
* @param signatures Proofs that orders have been signed by makers.
|
|
* @returns fillResults Amounts filled and fees paid by makers and taker.
|
|
*/
|
|
public marketBuyOrdersNoThrow(
|
|
orders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
makerAssetFillAmount: BigNumber,
|
|
signatures: string[],
|
|
): ContractTxFunctionObj<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('orders', orders);
|
|
assert.isBigNumber('makerAssetFillAmount', makerAssetFillAmount);
|
|
assert.isArray('signatures', signatures);
|
|
const functionSignature =
|
|
'marketBuyOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [orders, makerAssetFillAmount, signatures]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Calls marketSellOrdersNoThrow then reverts if < takerAssetFillAmount has been sold.
|
|
* NOTE: This function does not enforce that the takerAsset is the same for each order.
|
|
* @param orders Array of order specifications.
|
|
* @param takerAssetFillAmount Minimum amount of takerAsset to sell.
|
|
* @param signatures Proofs that orders have been signed by makers.
|
|
* @returns fillResults Amounts filled and fees paid by makers and taker.
|
|
*/
|
|
public marketSellOrdersFillOrKill(
|
|
orders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
takerAssetFillAmount: BigNumber,
|
|
signatures: string[],
|
|
): ContractTxFunctionObj<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('orders', orders);
|
|
assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount);
|
|
assert.isArray('signatures', signatures);
|
|
const functionSignature =
|
|
'marketSellOrdersFillOrKill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [orders, takerAssetFillAmount, signatures]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.
|
|
* If any fill reverts, the error is caught and ignored.
|
|
* NOTE: This function does not enforce that the takerAsset is the same for each order.
|
|
* @param orders Array of order specifications.
|
|
* @param takerAssetFillAmount Desired amount of takerAsset to sell.
|
|
* @param signatures Proofs that orders have been signed by makers.
|
|
* @returns fillResults Amounts filled and fees paid by makers and taker.
|
|
*/
|
|
public marketSellOrdersNoThrow(
|
|
orders: Array<{
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
}>,
|
|
takerAssetFillAmount: BigNumber,
|
|
signatures: string[],
|
|
): ContractTxFunctionObj<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('orders', orders);
|
|
assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount);
|
|
assert.isArray('signatures', signatures);
|
|
const functionSignature =
|
|
'marketSellOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [orders, takerAssetFillAmount, signatures]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Match two complementary orders that have a profitable spread.
|
|
* Each order is filled at their respective price point. However, the calculations are
|
|
* carried out as though the orders are both being filled at the right order's price point.
|
|
* The profit made by the left order goes to the taker (who matched the two orders).
|
|
* @param leftOrder First order to match.
|
|
* @param rightOrder Second order to match.
|
|
* @param leftSignature Proof that order was created by the left maker.
|
|
* @param rightSignature Proof that order was created by the right maker.
|
|
* @returns matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.
|
|
*/
|
|
public matchOrders(
|
|
leftOrder: {
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
},
|
|
rightOrder: {
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
},
|
|
leftSignature: string,
|
|
rightSignature: string,
|
|
): ContractTxFunctionObj<{
|
|
left: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
right: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}> {
|
|
const self = (this as any) as ExchangeContract;
|
|
|
|
assert.isString('leftSignature', leftSignature);
|
|
assert.isString('rightSignature', rightSignature);
|
|
const functionSignature =
|
|
'matchOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes,bytes)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{
|
|
left: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
right: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
left: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
right: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [
|
|
leftOrder,
|
|
rightOrder,
|
|
leftSignature,
|
|
rightSignature,
|
|
]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Match two complementary orders that have a profitable spread.
|
|
* Each order is maximally filled at their respective price point, and
|
|
* the matcher receives a profit denominated in either the left maker asset,
|
|
* right maker asset, or a combination of both.
|
|
* @param leftOrder First order to match.
|
|
* @param rightOrder Second order to match.
|
|
* @param leftSignature Proof that order was created by the left maker.
|
|
* @param rightSignature Proof that order was created by the right maker.
|
|
* @returns matchedFillResults Amounts filled by maker and taker of matched orders.
|
|
*/
|
|
public matchOrdersWithMaximalFill(
|
|
leftOrder: {
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
},
|
|
rightOrder: {
|
|
makerAddress: string;
|
|
takerAddress: string;
|
|
feeRecipientAddress: string;
|
|
senderAddress: string;
|
|
makerAssetAmount: BigNumber;
|
|
takerAssetAmount: BigNumber;
|
|
makerFee: BigNumber;
|
|
takerFee: BigNumber;
|
|
expirationTimeSeconds: BigNumber;
|
|
salt: BigNumber;
|
|
makerAssetData: string;
|
|
takerAssetData: string;
|
|
makerFeeAssetData: string;
|
|
takerFeeAssetData: string;
|
|
},
|
|
leftSignature: string,
|
|
rightSignature: string,
|
|
): ContractTxFunctionObj<{
|
|
left: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
right: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}> {
|
|
const self = (this as any) as ExchangeContract;
|
|
|
|
assert.isString('leftSignature', leftSignature);
|
|
assert.isString('rightSignature', rightSignature);
|
|
const functionSignature =
|
|
'matchOrdersWithMaximalFill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes,bytes)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(
|
|
callData: Partial<CallData> = {},
|
|
defaultBlock?: BlockParam,
|
|
): Promise<{
|
|
left: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
right: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<{
|
|
left: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
right: {
|
|
makerAssetFilledAmount: BigNumber;
|
|
takerAssetFilledAmount: BigNumber;
|
|
makerFeePaid: BigNumber;
|
|
takerFeePaid: BigNumber;
|
|
protocolFeePaid: BigNumber;
|
|
};
|
|
profitInLeftMakerAsset: BigNumber;
|
|
profitInRightMakerAsset: BigNumber;
|
|
}>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [
|
|
leftOrder,
|
|
rightOrder,
|
|
leftSignature,
|
|
rightSignature,
|
|
]);
|
|
},
|
|
};
|
|
}
|
|
public orderEpoch(index_0: string, index_1: string): ContractFunctionObj<BigNumber> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('index_0', index_0);
|
|
assert.isString('index_1', index_1);
|
|
const functionSignature = 'orderEpoch(address,address)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<BigNumber> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<BigNumber>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [index_0.toLowerCase(), index_1.toLowerCase()]);
|
|
},
|
|
};
|
|
}
|
|
public owner(): ContractFunctionObj<string> {
|
|
const self = (this as any) as ExchangeContract;
|
|
const functionSignature = 'owner()';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<string> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<string>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, []);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Approves a hash on-chain.
|
|
* After presigning a hash, the preSign signature type will become valid for that hash and signer.
|
|
* @param hash Any 32-byte hash.
|
|
*/
|
|
public preSign(hash: string): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('hash', hash);
|
|
const functionSignature = 'preSign(bytes32)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [hash]);
|
|
},
|
|
};
|
|
}
|
|
public preSigned(index_0: string, index_1: string): ContractFunctionObj<boolean> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('index_0', index_0);
|
|
assert.isString('index_1', index_1);
|
|
const functionSignature = 'preSigned(bytes32,address)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<boolean> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<boolean>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [index_0, index_1.toLowerCase()]);
|
|
},
|
|
};
|
|
}
|
|
public protocolFeeCollector(): ContractFunctionObj<string> {
|
|
const self = (this as any) as ExchangeContract;
|
|
const functionSignature = 'protocolFeeCollector()';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<string> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<string>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, []);
|
|
},
|
|
};
|
|
}
|
|
public protocolFeeMultiplier(): ContractFunctionObj<BigNumber> {
|
|
const self = (this as any) as ExchangeContract;
|
|
const functionSignature = 'protocolFeeMultiplier()';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<BigNumber> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<BigNumber>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, []);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Registers an asset proxy to its asset proxy id.
|
|
* Once an asset proxy is registered, it cannot be unregistered.
|
|
* @param assetProxy Address of new asset proxy to register.
|
|
*/
|
|
public registerAssetProxy(assetProxy: string): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('assetProxy', assetProxy);
|
|
const functionSignature = 'registerAssetProxy(address)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [assetProxy.toLowerCase()]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Allows the owner to update the protocolFeeCollector address.
|
|
* @param updatedProtocolFeeCollector The updated protocolFeeCollector contract
|
|
* address.
|
|
*/
|
|
public setProtocolFeeCollectorAddress(updatedProtocolFeeCollector: string): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('updatedProtocolFeeCollector', updatedProtocolFeeCollector);
|
|
const functionSignature = 'setProtocolFeeCollectorAddress(address)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [updatedProtocolFeeCollector.toLowerCase()]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Allows the owner to update the protocol fee multiplier.
|
|
* @param updatedProtocolFeeMultiplier The updated protocol fee multiplier.
|
|
*/
|
|
public setProtocolFeeMultiplier(updatedProtocolFeeMultiplier: BigNumber): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isBigNumber('updatedProtocolFeeMultiplier', updatedProtocolFeeMultiplier);
|
|
const functionSignature = 'setProtocolFeeMultiplier(uint256)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [updatedProtocolFeeMultiplier]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Approves/unnapproves a Validator contract to verify signatures on signer's behalf
|
|
* using the `Validator` signature type.
|
|
* @param validatorAddress Address of Validator contract.
|
|
* @param approval Approval or disapproval of Validator contract.
|
|
*/
|
|
public setSignatureValidatorApproval(validatorAddress: string, approval: boolean): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('validatorAddress', validatorAddress);
|
|
assert.isBoolean('approval', approval);
|
|
const functionSignature = 'setSignatureValidatorApproval(address,bool)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [validatorAddress.toLowerCase(), approval]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* This function may be used to simulate any amount of transfers As they would occur through the Exchange contract. Note that this function will always revert, even if all transfers are successful. However, it may be used with eth_call or with a try/catch pattern in order to simulate the results of the transfers.
|
|
* @param assetData Array of asset details, each encoded per the AssetProxy
|
|
* contract specification.
|
|
* @param fromAddresses Array containing the `from` addresses that correspond
|
|
* with each transfer.
|
|
* @param toAddresses Array containing the `to` addresses that correspond with
|
|
* each transfer.
|
|
* @param amounts Array containing the amounts that correspond to each
|
|
* transfer.
|
|
* @returns This function does not return a value. However, it will always revert with `Error("TRANSFERS_SUCCESSFUL")` if all of the transfers were successful.
|
|
*/
|
|
public simulateDispatchTransferFromCalls(
|
|
assetData: string[],
|
|
fromAddresses: string[],
|
|
toAddresses: string[],
|
|
amounts: BigNumber[],
|
|
): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isArray('assetData', assetData);
|
|
assert.isArray('fromAddresses', fromAddresses);
|
|
assert.isArray('toAddresses', toAddresses);
|
|
assert.isArray('amounts', amounts);
|
|
const functionSignature = 'simulateDispatchTransferFromCalls(bytes[],address[],address[],uint256[])';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [assetData, fromAddresses, toAddresses, amounts]);
|
|
},
|
|
};
|
|
}
|
|
public transactionsExecuted(index_0: string): ContractFunctionObj<boolean> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('index_0', index_0);
|
|
const functionSignature = 'transactionsExecuted(bytes32)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<boolean> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<boolean>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [index_0]);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Change the owner of this contract.
|
|
* @param newOwner New owner address.
|
|
*/
|
|
public transferOwnership(newOwner: string): ContractTxFunctionObj<void> {
|
|
const self = (this as any) as ExchangeContract;
|
|
assert.isString('newOwner', newOwner);
|
|
const functionSignature = 'transferOwnership(address)';
|
|
|
|
return {
|
|
selector: self._lookupAbiEncoder(functionSignature).getSelector(),
|
|
async sendTransactionAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
opts: SendTransactionOpts = { shouldValidate: true },
|
|
): Promise<string> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...txData },
|
|
this.estimateGasAsync.bind(this),
|
|
);
|
|
if (opts.shouldValidate !== false) {
|
|
await this.callAsync(txDataWithDefaults);
|
|
}
|
|
return self._web3Wrapper.sendTransactionAsync(txDataWithDefaults);
|
|
},
|
|
awaitTransactionSuccessAsync(
|
|
txData?: Partial<TxData>,
|
|
opts: AwaitTransactionSuccessOpts = { shouldValidate: true },
|
|
): PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs> {
|
|
return self._promiseWithTransactionHash(this.sendTransactionAsync(txData, opts), opts);
|
|
},
|
|
async estimateGasAsync(txData?: Partial<TxData> | undefined): Promise<number> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
|
},
|
|
async createAccessListAsync(
|
|
txData?: Partial<TxData> | undefined,
|
|
defaultBlock?: BlockParam,
|
|
): Promise<TxAccessListWithGas> {
|
|
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync({
|
|
data: this.getABIEncodedTransactionData(),
|
|
...txData,
|
|
});
|
|
return self._web3Wrapper.createAccessListAsync(txDataWithDefaults, defaultBlock);
|
|
},
|
|
async callAsync(callData: Partial<CallData> = {}, defaultBlock?: BlockParam): Promise<void> {
|
|
BaseContract._assertCallParams(callData, defaultBlock);
|
|
const rawCallResult = await self._performCallAsync(
|
|
{ data: this.getABIEncodedTransactionData(), ...callData },
|
|
defaultBlock,
|
|
);
|
|
const abiEncoder = self._lookupAbiEncoder(functionSignature);
|
|
BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder);
|
|
return abiEncoder.strictDecodeReturnValue<void>(rawCallResult);
|
|
},
|
|
getABIEncodedTransactionData(): string {
|
|
return self._strictEncodeArguments(functionSignature, [newOwner.toLowerCase()]);
|
|
},
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Subscribe to an event type emitted by the Exchange contract.
|
|
* @param eventName The Exchange contract event you would like to subscribe to.
|
|
* @param indexFilterValues An object where the keys are indexed args returned by the event and
|
|
* the value is the value you are interested in. E.g `{maker: aUserAddressHex}`
|
|
* @param callback Callback that gets called when a log is added/removed
|
|
* @param isVerbose Enable verbose subscription warnings (e.g recoverable network issues encountered)
|
|
* @return Subscription token used later to unsubscribe
|
|
*/
|
|
public subscribe<ArgsType extends ExchangeEventArgs>(
|
|
eventName: ExchangeEvents,
|
|
indexFilterValues: IndexedFilterValues,
|
|
callback: EventCallback<ArgsType>,
|
|
isVerbose: boolean = false,
|
|
blockPollingIntervalMs?: number,
|
|
): string {
|
|
assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents);
|
|
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
|
|
assert.isFunction('callback', callback);
|
|
const subscriptionToken = this._subscriptionManager.subscribe<ArgsType>(
|
|
this.address,
|
|
eventName,
|
|
indexFilterValues,
|
|
ExchangeContract.ABI(),
|
|
callback,
|
|
isVerbose,
|
|
blockPollingIntervalMs,
|
|
);
|
|
return subscriptionToken;
|
|
}
|
|
|
|
/**
|
|
* Cancel a subscription
|
|
* @param subscriptionToken Subscription token returned by `subscribe()`
|
|
*/
|
|
public unsubscribe(subscriptionToken: string): void {
|
|
this._subscriptionManager.unsubscribe(subscriptionToken);
|
|
}
|
|
|
|
/**
|
|
* Cancels all existing subscriptions
|
|
*/
|
|
public unsubscribeAll(): void {
|
|
this._subscriptionManager.unsubscribeAll();
|
|
}
|
|
|
|
/**
|
|
* Gets historical logs without creating a subscription
|
|
* @param eventName The Exchange contract event you would like to subscribe to.
|
|
* @param blockRange Block range to get logs from.
|
|
* @param indexFilterValues An object where the keys are indexed args returned by the event and
|
|
* the value is the value you are interested in. E.g `{_from: aUserAddressHex}`
|
|
* @return Array of logs that match the parameters
|
|
*/
|
|
public async getLogsAsync<ArgsType extends ExchangeEventArgs>(
|
|
eventName: ExchangeEvents,
|
|
blockRange: BlockRange,
|
|
indexFilterValues: IndexedFilterValues,
|
|
): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
|
|
assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents);
|
|
assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
|
|
assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
|
|
const logs = await this._subscriptionManager.getLogsAsync<ArgsType>(
|
|
this.address,
|
|
eventName,
|
|
blockRange,
|
|
indexFilterValues,
|
|
ExchangeContract.ABI(),
|
|
);
|
|
return logs;
|
|
}
|
|
|
|
constructor(
|
|
address: string,
|
|
supportedProvider: SupportedProvider,
|
|
txDefaults?: Partial<TxData>,
|
|
logDecodeDependencies?: { [contractName: string]: ContractAbi },
|
|
deployedBytecode: string | undefined = ExchangeContract.deployedBytecode,
|
|
encoderOverrides?: Partial<EncoderOverrides>,
|
|
) {
|
|
super(
|
|
'Exchange',
|
|
ExchangeContract.ABI(),
|
|
address,
|
|
supportedProvider,
|
|
txDefaults,
|
|
logDecodeDependencies,
|
|
deployedBytecode,
|
|
encoderOverrides,
|
|
);
|
|
classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']);
|
|
this._subscriptionManager = new SubscriptionManager<ExchangeEventArgs, ExchangeEvents>(
|
|
ExchangeContract.ABI(),
|
|
this._web3Wrapper,
|
|
);
|
|
ExchangeContract.ABI().forEach((item, index) => {
|
|
if (item.type === 'function') {
|
|
const methodAbi = item as MethodAbi;
|
|
this._methodABIIndex[methodAbi.name] = index;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// tslint:disable:max-file-line-count
|
|
// tslint:enable:no-unbound-method no-parameter-reassignment no-consecutive-blank-lines ordered-imports align
|
|
// tslint:enable:trailing-comma whitespace no-trailing-whitespace
|