protocol/contracts/zero-ex/test/transformers/weth_transformer_test.ts

152 lines
5.4 KiB
TypeScript

import { blockchainTests, constants, expect, getRandomInteger, randomAddress } from '@0x/contracts-test-utils';
import { BigNumber, ZeroExRevertErrors } from '@0x/utils';
import * as _ from 'lodash';
import { encodeWethTransformerData, ETH_TOKEN_ADDRESS } from '@0x/order-utils';
import { artifacts } from '../artifacts';
import { TestWethContract, TestWethTransformerHostContract, WethTransformerContract } from '../wrappers';
const { MAX_UINT256, ZERO_AMOUNT } = constants;
blockchainTests.resets('WethTransformer', env => {
let weth: TestWethContract;
let transformer: WethTransformerContract;
let host: TestWethTransformerHostContract;
before(async () => {
weth = await TestWethContract.deployFrom0xArtifactAsync(
artifacts.TestWeth,
env.provider,
env.txDefaults,
artifacts,
);
transformer = await WethTransformerContract.deployFrom0xArtifactAsync(
artifacts.WethTransformer,
env.provider,
env.txDefaults,
artifacts,
weth.address,
);
host = await TestWethTransformerHostContract.deployFrom0xArtifactAsync(
artifacts.TestWethTransformerHost,
env.provider,
env.txDefaults,
artifacts,
weth.address,
);
});
interface Balances {
ethBalance: BigNumber;
wethBalance: BigNumber;
}
async function getHostBalancesAsync(): Promise<Balances> {
return {
ethBalance: await env.web3Wrapper.getBalanceInWeiAsync(host.address),
wethBalance: await weth.balanceOf(host.address).callAsync(),
};
}
it('fails if the token is neither ETH or WETH', async () => {
const amount = getRandomInteger(1, '1e18');
const data = encodeWethTransformerData({
amount,
token: randomAddress(),
});
const tx = host
.executeTransform(amount, transformer.address, data)
.awaitTransactionSuccessAsync({ value: amount });
return expect(tx).to.revertWith(
new ZeroExRevertErrors.TransformERC20.InvalidTransformDataError(
ZeroExRevertErrors.TransformERC20.InvalidTransformDataErrorCode.InvalidTokens,
data,
),
);
});
it('can unwrap WETH', async () => {
const amount = getRandomInteger(1, '1e18');
const data = encodeWethTransformerData({
amount,
token: weth.address,
});
await host.executeTransform(amount, transformer.address, data).awaitTransactionSuccessAsync({ value: amount });
expect(await getHostBalancesAsync()).to.deep.eq({
ethBalance: amount,
wethBalance: ZERO_AMOUNT,
});
});
it('can unwrap all WETH', async () => {
const amount = getRandomInteger(1, '1e18');
const data = encodeWethTransformerData({
amount: MAX_UINT256,
token: weth.address,
});
await host.executeTransform(amount, transformer.address, data).awaitTransactionSuccessAsync({ value: amount });
expect(await getHostBalancesAsync()).to.deep.eq({
ethBalance: amount,
wethBalance: ZERO_AMOUNT,
});
});
it('can unwrap some WETH', async () => {
const amount = getRandomInteger(1, '1e18');
const data = encodeWethTransformerData({
amount: amount.dividedToIntegerBy(2),
token: weth.address,
});
await host.executeTransform(amount, transformer.address, data).awaitTransactionSuccessAsync({ value: amount });
expect(await getHostBalancesAsync()).to.deep.eq({
ethBalance: amount.dividedToIntegerBy(2),
wethBalance: amount.minus(amount.dividedToIntegerBy(2)),
});
});
it('can wrap ETH', async () => {
const amount = getRandomInteger(1, '1e18');
const data = encodeWethTransformerData({
amount,
token: ETH_TOKEN_ADDRESS,
});
await host
.executeTransform(ZERO_AMOUNT, transformer.address, data)
.awaitTransactionSuccessAsync({ value: amount });
expect(await getHostBalancesAsync()).to.deep.eq({
ethBalance: ZERO_AMOUNT,
wethBalance: amount,
});
});
it('can wrap all ETH', async () => {
const amount = getRandomInteger(1, '1e18');
const data = encodeWethTransformerData({
amount: MAX_UINT256,
token: ETH_TOKEN_ADDRESS,
});
await host
.executeTransform(ZERO_AMOUNT, transformer.address, data)
.awaitTransactionSuccessAsync({ value: amount });
expect(await getHostBalancesAsync()).to.deep.eq({
ethBalance: ZERO_AMOUNT,
wethBalance: amount,
});
});
it('can wrap some ETH', async () => {
const amount = getRandomInteger(1, '1e18');
const data = encodeWethTransformerData({
amount: amount.dividedToIntegerBy(2),
token: ETH_TOKEN_ADDRESS,
});
await host
.executeTransform(ZERO_AMOUNT, transformer.address, data)
.awaitTransactionSuccessAsync({ value: amount });
expect(await getHostBalancesAsync()).to.deep.eq({
ethBalance: amount.minus(amount.dividedToIntegerBy(2)),
wethBalance: amount.dividedToIntegerBy(2),
});
});
});