Added dutch auction utils to contract-wrappers
This commit is contained in:
parent
cb1bfa0f97
commit
06139cbfe5
144
packages/contract-wrappers/test/utils/dutch_auction_utils.ts
Normal file
144
packages/contract-wrappers/test/utils/dutch_auction_utils.ts
Normal file
@ -0,0 +1,144 @@
|
||||
import { DummyERC20TokenContract, DummyERC721TokenContract, ExchangeContract } from '@0x/abi-gen-wrappers';
|
||||
import { SignedOrder } from '@0x/types';
|
||||
import * as artifacts from '@0x/contract-artifacts';
|
||||
import { BigNumber } from '@0x/utils';
|
||||
import { Web3Wrapper } from '@0x/web3-wrapper';
|
||||
import { orderFactory } from '@0x/order-utils/lib/src/order_factory';
|
||||
|
||||
import { DutchAuctionWrapper } from '../../src/contract_wrappers/dutch_auction_wrapper';
|
||||
import { constants } from './constants';
|
||||
import { assetDataUtils } from '@0x/order-utils';
|
||||
|
||||
export class DutchAuctionUtils {
|
||||
private _web3Wrapper: Web3Wrapper;
|
||||
private _coinbase: string;
|
||||
private _exchangeAddress: string;
|
||||
private _erc20ProxyAddress: string;
|
||||
|
||||
constructor(web3Wrapper: Web3Wrapper, coinbase: string, exchangeAddress: string, erc20ProxyAddress: string) {
|
||||
this._web3Wrapper = web3Wrapper;
|
||||
this._coinbase = coinbase;
|
||||
this._exchangeAddress = exchangeAddress;
|
||||
this._erc20ProxyAddress = erc20ProxyAddress;
|
||||
}
|
||||
public async createSignedSellOrderAsync(
|
||||
auctionBeginTimeSections: BigNumber,
|
||||
auctionBeginAmount: BigNumber,
|
||||
auctionEndAmount: BigNumber,
|
||||
acutionEndTime: BigNumber,
|
||||
makerAssetData: string,
|
||||
takerAssetData: string,
|
||||
makerAddress: string,
|
||||
takerAddress: string,
|
||||
takerFillableAmount: BigNumber,
|
||||
senderAddress?: string,
|
||||
makerFee?: BigNumber,
|
||||
takerFee?: BigNumber,
|
||||
feeRecipientAddress?: string,
|
||||
): Promise<SignedOrder> {
|
||||
console.log(`asdasd`);
|
||||
const makerAssetAmount = auctionEndAmount;
|
||||
const makerAssetDataWithAuctionDetails = DutchAuctionWrapper.encodeDutchAuctionAssetData(
|
||||
makerAssetData,
|
||||
auctionBeginTimeSections,
|
||||
auctionBeginAmount,
|
||||
);
|
||||
const signedOrder = await orderFactory.createSignedOrderAsync(
|
||||
this._web3Wrapper.getProvider(),
|
||||
makerAddress,
|
||||
makerAssetAmount,
|
||||
makerAssetDataWithAuctionDetails,
|
||||
takerFillableAmount,
|
||||
takerAssetData,
|
||||
this._exchangeAddress,
|
||||
{
|
||||
takerAddress,
|
||||
senderAddress,
|
||||
makerFee,
|
||||
takerFee,
|
||||
feeRecipientAddress,
|
||||
expirationTimeSeconds: acutionEndTime,
|
||||
},
|
||||
);
|
||||
const erc20AssetData = assetDataUtils.decodeERC20AssetData(makerAssetData);
|
||||
await this._increaseERC20BalanceAndAllowanceAsync(erc20AssetData.tokenAddress, makerAddress, makerAssetAmount);
|
||||
return signedOrder;
|
||||
}
|
||||
public async createSignedBuyOrderAsync(
|
||||
sellOrder: SignedOrder,
|
||||
buyerAddress: string,
|
||||
senderAddress?: string,
|
||||
makerFee?: BigNumber,
|
||||
takerFee?: BigNumber,
|
||||
feeRecipientAddress?: string,
|
||||
): Promise<SignedOrder> {
|
||||
const dutchAuctionData = DutchAuctionWrapper.decodeDutchAuctionData(sellOrder.makerAssetData);
|
||||
const signedOrder = await orderFactory.createSignedOrderAsync(
|
||||
this._web3Wrapper.getProvider(),
|
||||
buyerAddress,
|
||||
dutchAuctionData.beginAmount,
|
||||
sellOrder.takerAssetData,
|
||||
sellOrder.makerAssetAmount,
|
||||
sellOrder.makerAssetData,
|
||||
sellOrder.exchangeAddress,
|
||||
{
|
||||
senderAddress,
|
||||
makerFee,
|
||||
takerFee,
|
||||
feeRecipientAddress,
|
||||
expirationTimeSeconds: sellOrder.expirationTimeSeconds,
|
||||
},
|
||||
);
|
||||
const buyerERC20AssetData = assetDataUtils.decodeERC20AssetData(sellOrder.takerAssetData);
|
||||
await this._increaseERC20BalanceAndAllowanceAsync(
|
||||
buyerERC20AssetData.tokenAddress,
|
||||
buyerAddress,
|
||||
dutchAuctionData.beginAmount,
|
||||
);
|
||||
return signedOrder;
|
||||
}
|
||||
private async _increaseERC20BalanceAndAllowanceAsync(
|
||||
tokenAddress: string,
|
||||
address: string,
|
||||
amount: BigNumber,
|
||||
): Promise<void> {
|
||||
if (amount.isZero() || address === constants.NULL_ADDRESS) {
|
||||
return; // noop
|
||||
}
|
||||
await Promise.all([
|
||||
this._increaseERC20BalanceAsync(tokenAddress, address, amount),
|
||||
this._increaseERC20AllowanceAsync(tokenAddress, address, amount),
|
||||
]);
|
||||
}
|
||||
private async _increaseERC20BalanceAsync(tokenAddress: string, address: string, amount: BigNumber): Promise<void> {
|
||||
const erc20Token = new DummyERC20TokenContract(
|
||||
artifacts.DummyERC20Token.compilerOutput.abi,
|
||||
tokenAddress,
|
||||
this._web3Wrapper.getProvider(),
|
||||
this._web3Wrapper.getContractDefaults(),
|
||||
);
|
||||
const txHash = await erc20Token.transfer.sendTransactionAsync(address, amount, {
|
||||
from: this._coinbase,
|
||||
});
|
||||
await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
|
||||
}
|
||||
private async _increaseERC20AllowanceAsync(
|
||||
tokenAddress: string,
|
||||
address: string,
|
||||
amount: BigNumber,
|
||||
): Promise<void> {
|
||||
const erc20Token = new DummyERC20TokenContract(
|
||||
artifacts.DummyERC20Token.compilerOutput.abi,
|
||||
tokenAddress,
|
||||
this._web3Wrapper.getProvider(),
|
||||
this._web3Wrapper.getContractDefaults(),
|
||||
);
|
||||
const oldMakerAllowance = await erc20Token.allowance.callAsync(address, this._erc20ProxyAddress);
|
||||
const newMakerAllowance = oldMakerAllowance.plus(amount);
|
||||
|
||||
const txHash = await erc20Token.approve.sendTransactionAsync(this._erc20ProxyAddress, newMakerAllowance, {
|
||||
from: address,
|
||||
});
|
||||
await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user