Add initial implementation of fillOrderAsync
This commit is contained in:
parent
7dddf2010e
commit
96092de5cb
@ -1,10 +1,18 @@
|
|||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import {Web3Wrapper} from '../web3_wrapper';
|
import {Web3Wrapper} from '../web3_wrapper';
|
||||||
import {ECSignature, ZeroExError, ExchangeContract} from '../types';
|
import {
|
||||||
|
ECSignature,
|
||||||
|
ExchangeContract,
|
||||||
|
ExchangeContractErrs,
|
||||||
|
OrderValues,
|
||||||
|
OrderAddresses,
|
||||||
|
} from '../types';
|
||||||
import {assert} from '../utils/assert';
|
import {assert} from '../utils/assert';
|
||||||
import {ContractWrapper} from './contract_wrapper';
|
import {ContractWrapper} from './contract_wrapper';
|
||||||
import * as ExchangeArtifacts from '../artifacts/Exchange.json';
|
import * as ExchangeArtifacts from '../artifacts/Exchange.json';
|
||||||
import {ecSignatureSchema} from '../schemas/ec_signature_schema';
|
import {ecSignatureSchema} from '../schemas/ec_signature_schema';
|
||||||
|
import {ContractResponse} from '../types';
|
||||||
|
import {constants} from '../utils/constants';
|
||||||
|
|
||||||
export class ExchangeWrapper extends ContractWrapper {
|
export class ExchangeWrapper extends ContractWrapper {
|
||||||
constructor(web3Wrapper: Web3Wrapper) {
|
constructor(web3Wrapper: Web3Wrapper) {
|
||||||
@ -31,6 +39,60 @@ export class ExchangeWrapper extends ContractWrapper {
|
|||||||
);
|
);
|
||||||
return isValidSignature;
|
return isValidSignature;
|
||||||
}
|
}
|
||||||
|
public async fillOrderAsync(maker: string, taker: string, makerTokenAddress: string,
|
||||||
|
takerTokenAddress: string, makerTokenAmount: BigNumber.BigNumber,
|
||||||
|
takerTokenAmount: BigNumber.BigNumber, makerFee: BigNumber.BigNumber,
|
||||||
|
takerFee: BigNumber.BigNumber, expirationUnixTimestampSec: BigNumber.BigNumber,
|
||||||
|
feeRecipient: string, fillAmount: BigNumber.BigNumber,
|
||||||
|
signatureData: ECSignature, salt: BigNumber.BigNumber) {
|
||||||
|
const senderAddress = await this.web3Wrapper.getSenderAddressOrThrowAsync();
|
||||||
|
const exchangeInstance = await this.getExchangeInstanceOrThrowAsync();
|
||||||
|
|
||||||
|
taker = taker === '' ? constants.NULL_ADDRESS : taker;
|
||||||
|
const shouldCheckTransfer = true;
|
||||||
|
const orderAddresses: OrderAddresses = [
|
||||||
|
maker,
|
||||||
|
taker,
|
||||||
|
makerTokenAddress,
|
||||||
|
takerTokenAddress,
|
||||||
|
feeRecipient,
|
||||||
|
];
|
||||||
|
const orderValues: OrderValues = [
|
||||||
|
makerTokenAmount,
|
||||||
|
takerTokenAmount,
|
||||||
|
makerFee,
|
||||||
|
takerFee,
|
||||||
|
expirationUnixTimestampSec,
|
||||||
|
salt,
|
||||||
|
];
|
||||||
|
const response: ContractResponse = await exchangeInstance.fill(
|
||||||
|
orderAddresses,
|
||||||
|
orderValues,
|
||||||
|
fillAmount,
|
||||||
|
shouldCheckTransfer,
|
||||||
|
signatureData.v,
|
||||||
|
signatureData.r,
|
||||||
|
signatureData.s,
|
||||||
|
{
|
||||||
|
from: senderAddress,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
const errEvent = _.find(response.logs, {event: 'LogError'});
|
||||||
|
if (!_.isUndefined(errEvent)) {
|
||||||
|
const errCode = errEvent.args.errorId.toNumber();
|
||||||
|
const humanReadableErrMessage = this.exchangeContractErrToMsg[errCode];
|
||||||
|
throw new Error(humanReadableErrMessage);
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
private exchangeContractErrToMsg = {
|
||||||
|
[ExchangeContractErrs.ERROR_FILL_EXPIRED]: 'The order you attempted to fill is expired',
|
||||||
|
[ExchangeContractErrs.ERROR_CANCEL_EXPIRED]: 'The order you attempted to cancel is expired',
|
||||||
|
[ExchangeContractErrs.ERROR_FILL_NO_VALUE]: 'This order has already been filled or cancelled',
|
||||||
|
[ExchangeContractErrs.ERROR_CANCEL_NO_VALUE]: 'This order has already been filled or cancelled',
|
||||||
|
[ExchangeContractErrs.ERROR_FILL_TRUNCATION]: 'The rounding error was too large when filling this order',
|
||||||
|
[ExchangeContractErrs.ERROR_FILL_BALANCE_ALLOWANCE]: 'Maker or taker has insufficient balance or allowance',
|
||||||
|
};
|
||||||
private async getExchangeInstanceOrThrowAsync(): Promise<ExchangeContract> {
|
private async getExchangeInstanceOrThrowAsync(): Promise<ExchangeContract> {
|
||||||
const contractInstance = await this.instantiateContractIfExistsAsync((ExchangeArtifacts as any));
|
const contractInstance = await this.instantiateContractIfExistsAsync((ExchangeArtifacts as any));
|
||||||
return contractInstance as ExchangeContract;
|
return contractInstance as ExchangeContract;
|
||||||
|
33
src/types.ts
33
src/types.ts
@ -26,8 +26,23 @@ export interface ECSignature {
|
|||||||
s: string;
|
s: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type OrderAddresses = [string, string, string, string, string];
|
||||||
|
|
||||||
|
export type OrderValues = [
|
||||||
|
BigNumber.BigNumber, BigNumber.BigNumber, BigNumber.BigNumber,
|
||||||
|
BigNumber.BigNumber, BigNumber.BigNumber, BigNumber.BigNumber
|
||||||
|
];
|
||||||
|
|
||||||
|
export interface TxData {
|
||||||
|
from: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface ExchangeContract {
|
export interface ExchangeContract {
|
||||||
isValidSignature: any;
|
isValidSignature: any;
|
||||||
|
fill: (
|
||||||
|
orderAddresses: OrderAddresses, orderValues: OrderValues, fillAmount: BigNumber.BigNumber,
|
||||||
|
shouldCheckTransfer: boolean, v: number, r: string, s: string, txData: TxData,
|
||||||
|
) => ContractResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const SolidityTypes = strEnum([
|
export const SolidityTypes = strEnum([
|
||||||
@ -35,3 +50,21 @@ export const SolidityTypes = strEnum([
|
|||||||
'uint256',
|
'uint256',
|
||||||
]);
|
]);
|
||||||
export type SolidityTypes = keyof typeof SolidityTypes;
|
export type SolidityTypes = keyof typeof SolidityTypes;
|
||||||
|
|
||||||
|
export enum ExchangeContractErrs {
|
||||||
|
ERROR_FILL_EXPIRED, // Order has already expired
|
||||||
|
ERROR_FILL_NO_VALUE, // Order has already been fully filled or cancelled
|
||||||
|
ERROR_FILL_TRUNCATION, // Rounding error too large
|
||||||
|
ERROR_FILL_BALANCE_ALLOWANCE, // Insufficient balance or allowance for token transfer
|
||||||
|
ERROR_CANCEL_EXPIRED, // Order has already expired
|
||||||
|
ERROR_CANCEL_NO_VALUE, // Order has already been fully filled or cancelled
|
||||||
|
};
|
||||||
|
|
||||||
|
export interface ContractResponse {
|
||||||
|
logs: ContractEvent[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ContractEvent {
|
||||||
|
event: string;
|
||||||
|
args: any;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user