protocol/contracts/integrations/test/zero-ex/protocol_fees_staking_test.ts
2020-11-20 09:19:59 -05:00

86 lines
3.7 KiB
TypeScript

import { blockchainTests, constants, expect } from '@0x/contracts-test-utils';
import { BigNumber, hexUtils } from '@0x/utils';
import { artifacts } from '../artifacts';
import {
TestFixinProtocolFeesIntegrationContract,
TestStakingContract,
TestWethIntegrationContract,
} from '../wrappers';
blockchainTests.resets('ProtocolFeeIntegration', env => {
const FEE_MULTIPLIER = 70e3;
let owner: string;
let taker: string;
let protocolFees: TestFixinProtocolFeesIntegrationContract;
let staking: TestStakingContract;
let weth: TestWethIntegrationContract;
let singleFeeAmount: BigNumber;
before(async () => {
[owner, taker] = await env.getAccountAddressesAsync();
weth = await TestWethIntegrationContract.deployFrom0xArtifactAsync(
artifacts.TestWethIntegration,
env.provider,
env.txDefaults,
artifacts,
);
staking = await TestStakingContract.deployFrom0xArtifactAsync(
artifacts.TestStaking,
env.provider,
env.txDefaults,
artifacts,
constants.NULL_ADDRESS, // exchange address, which we don't know yet
weth.address,
);
protocolFees = await TestFixinProtocolFeesIntegrationContract.deployFrom0xArtifactAsync(
artifacts.TestFixinProtocolFeesIntegration,
env.provider,
{ ...env.txDefaults, from: taker },
artifacts,
weth.address,
staking.address,
FEE_MULTIPLIER,
);
await staking.addAuthorizedAddress(owner).awaitTransactionSuccessAsync();
await staking.addExchangeAddress(protocolFees.address).awaitTransactionSuccessAsync({ from: owner });
await weth.mint(taker, constants.ONE_ETHER).awaitTransactionSuccessAsync();
await weth.approve(protocolFees.address, constants.ONE_ETHER).awaitTransactionSuccessAsync({ from: taker });
singleFeeAmount = await protocolFees.getSingleProtocolFee().callAsync();
});
describe('fee collection integration', () => {
const pool0 = constants.NULL_BYTES32;
const poolId = hexUtils.random();
it('should collect fees for pool 0', async () => {
await protocolFees.collectProtocolFee(pool0).awaitTransactionSuccessAsync({ value: singleFeeAmount });
await protocolFees.transferFeesForPool(pool0).awaitTransactionSuccessAsync();
// Fees in the pool bytes32(0) don't get attributed to a pool.
await expect(
(await staking.getStakingPoolStatsThisEpoch(pool0).callAsync()).feesCollected,
).to.bignumber.equal(constants.ZERO_AMOUNT);
// Expected amount is singleFeeAmount - 1 because we leave 1 wei of WETH behind for future gas savings.
return expect(await weth.balanceOf(staking.address).callAsync()).to.bignumber.equal(
singleFeeAmount.minus(1),
);
});
it('should collect fees for non-zero pool', async () => {
const eth100 = constants.ONE_ETHER.multipliedBy(100);
await staking.createTestPool(poolId, eth100, eth100).awaitTransactionSuccessAsync();
await protocolFees.collectProtocolFee(poolId).awaitTransactionSuccessAsync({ value: singleFeeAmount });
await protocolFees.transferFeesForPool(poolId).awaitTransactionSuccessAsync();
// Expected amount is singleFeeAmount - 1 because we leave 1 wei of WETH behind for future gas savings.
return expect(
(await staking.getStakingPoolStatsThisEpoch(poolId).callAsync()).feesCollected,
).to.bignumber.equal(singleFeeAmount.minus(1));
});
});
});