86 lines
3.7 KiB
TypeScript
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));
|
|
});
|
|
});
|
|
});
|