* Patch staking and recover state in constructor * Add ganache mainnet fork test * Add ganache mainnet fork test * update changelog * hardcode last pool ID * Separate patch contract to unbreak tests
67 lines
3.3 KiB
TypeScript
67 lines
3.3 KiB
TypeScript
import { blockchainTests, constants, expect, filterLogsToArguments } from '@0x/contracts-test-utils';
|
|
import { BigNumber, logUtils } from '@0x/utils';
|
|
import * as _ from 'lodash';
|
|
|
|
import { artifacts } from './artifacts';
|
|
import { StakingEvents, StakingPatchContract, StakingProxyContract, StakingProxyEvents } from './wrappers';
|
|
|
|
const abis = _.mapValues(artifacts, v => v.compilerOutput.abi);
|
|
const STAKING_PROXY = '0xa26e80e7dea86279c6d778d702cc413e6cffa777';
|
|
const STAKING_OWNER = '0x7d3455421bbc5ed534a83c88fd80387dc8271392';
|
|
const EXCHANGE_PROXY = '0xdef1c0ded9bec7f1a1670819833240f027b25eff';
|
|
blockchainTests.configure({
|
|
fork: {
|
|
unlockedAccounts: [STAKING_OWNER, EXCHANGE_PROXY],
|
|
},
|
|
});
|
|
|
|
blockchainTests.fork('Staking patch mainnet fork tests', env => {
|
|
let stakingProxyContract: StakingProxyContract;
|
|
let patchedStakingPatchContract: StakingPatchContract;
|
|
|
|
before(async () => {
|
|
stakingProxyContract = new StakingProxyContract(STAKING_PROXY, env.provider, undefined, abis);
|
|
patchedStakingPatchContract = await StakingPatchContract.deployFrom0xArtifactAsync(
|
|
artifacts.Staking,
|
|
env.provider,
|
|
env.txDefaults,
|
|
artifacts,
|
|
);
|
|
});
|
|
|
|
it('Staking proxy successfully attaches to patched logic', async () => {
|
|
const tx = await stakingProxyContract
|
|
.attachStakingContract(patchedStakingPatchContract.address)
|
|
.awaitTransactionSuccessAsync({ from: STAKING_OWNER, gasPrice: 0 }, { shouldValidate: false });
|
|
expect(filterLogsToArguments(tx.logs, StakingProxyEvents.StakingContractAttachedToProxy)).to.deep.equal([
|
|
{
|
|
newStakingPatchContractAddress: patchedStakingPatchContract.address,
|
|
},
|
|
]);
|
|
expect(filterLogsToArguments(tx.logs, StakingEvents.EpochEnded).length).to.equal(1);
|
|
expect(filterLogsToArguments(tx.logs, StakingEvents.EpochFinalized).length).to.equal(1);
|
|
logUtils.log(`${tx.gasUsed} gas used`);
|
|
});
|
|
|
|
it('Patched staking handles 0 gas protocol fees', async () => {
|
|
const staking = new StakingPatchContract(STAKING_PROXY, env.provider, undefined, abis);
|
|
const maker = '0x7b1886e49ab5433bb46f7258548092dc8cdca28b';
|
|
const zeroFeeTx = await staking
|
|
.payProtocolFee(maker, constants.NULL_ADDRESS, constants.ZERO_AMOUNT)
|
|
.awaitTransactionSuccessAsync({ from: EXCHANGE_PROXY, gasPrice: 0 }, { shouldValidate: false });
|
|
// StakingPoolEarnedRewardsInEpoch should _not_ be emitted for a zero protocol fee.
|
|
// tslint:disable-next-line:no-unused-expression
|
|
expect(filterLogsToArguments(zeroFeeTx.logs, StakingEvents.StakingPoolEarnedRewardsInEpoch)).to.be.empty;
|
|
|
|
// Coincidentally there's some ETH in the ExchangeProxy
|
|
const nonZeroFeeTx = await staking
|
|
.payProtocolFee(maker, constants.NULL_ADDRESS, new BigNumber(1))
|
|
.awaitTransactionSuccessAsync({ from: EXCHANGE_PROXY, gasPrice: 0, value: 1 }, { shouldValidate: false });
|
|
// StakingPoolEarnedRewardsInEpoch _should_ be emitted for a non-zero protocol fee.
|
|
expect(
|
|
filterLogsToArguments(nonZeroFeeTx.logs, StakingEvents.StakingPoolEarnedRewardsInEpoch),
|
|
).to.have.lengthOf(1);
|
|
});
|
|
});
|
|
// tslint:enable:no-unnecessary-type-assertion
|