Skip to content

Commit 0468a73

Browse files
Merge pull request #220 from fei-protocol/feat/feirari-ard-rda-deploy
Added Deployment and Validation Scripts for RDA and ARD
2 parents cd4bc3c + bfda3c1 commit 0468a73

File tree

10 files changed

+102
-14
lines changed

10 files changed

+102
-14
lines changed

contracts/mock/MockRewardsDistributor.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ pragma solidity ^0.8.0;
22

33
import "./../staking/TribalChief.sol";
44
import "../refs/CoreRef.sol";
5-
import "../feirari/IRewardsDistributorAdmin.sol";
5+
import "../staking/feirari/IRewardsDistributorAdmin.sol";
66
import "@openzeppelin/contracts/access/Ownable.sol";
77

88
contract MockRewardsDistributor is IRewardsDistributorAdmin, Ownable {

contracts/feirari/AutoRewardsDistributor.sol renamed to contracts/staking/feirari/AutoRewardsDistributor.sol

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
pragma solidity ^0.8.0;
22

3-
import "./../staking/ITribalChief.sol";
4-
import "../refs/CoreRef.sol";
3+
import "./../ITribalChief.sol";
4+
import "../../refs/CoreRef.sol";
55
import "./IRewardsDistributorAdmin.sol";
66

77
/// @notice Controller Contract to set tribe per block in Rewards Distributor Admin on Rari
@@ -40,6 +40,8 @@ contract AutoRewardsDistributor is CoreRef {
4040
tribalChiefRewardIndex = _tribalChiefRewardIndex;
4141
rewardsDistributorAdmin = _rewardsDistributorAdmin;
4242
tribalChief = _tribalChief;
43+
44+
_setContractAdminRole(keccak256("TRIBAL_CHIEF_ADMIN_ROLE"));
4345
}
4446

4547
/// @notice helper function that gets all needed state from the TribalChief contract
File renamed without changes.

contracts/feirari/RewardsDistributorAdmin.sol renamed to contracts/staking/feirari/RewardsDistributorAdmin.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
pragma solidity ^0.8.0;
22

3-
import "../refs/CoreRef.sol";
3+
import "../../refs/CoreRef.sol";
44
import "./IRewardsDistributorAdmin.sol";
55
import "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
66

proposals/dao/feiRari.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { expect } from 'chai';
2+
import { RunUpgradeFunc, SetupUpgradeFunc, TeardownUpgradeFunc, ValidateUpgradeFunc } from '../../types/types';
3+
import { ethers } from 'hardhat';
4+
5+
const toBN = ethers.BigNumber.from;
6+
const e18 = ethers.constants.WeiPerEther;
7+
8+
const setup: SetupUpgradeFunc = async (addresses, oldContracts, contracts, logging) => {};
9+
const run: RunUpgradeFunc = async (addresses, oldContracts, contracts, logging = false) => {};
10+
const teardown: TeardownUpgradeFunc = async (addresses, oldContracts, contracts, logging) => {};
11+
12+
const validate: ValidateUpgradeFunc = async (addresses, oldContracts, contracts) => {
13+
const poolAllocPoints = 1000;
14+
const totalAllocPoint = 3100;
15+
const seventyFiveTribe = toBN('75').mul(toBN(e18));
16+
17+
const { autoRewardsDistributor, rewardsDistributorAdmin } = contracts;
18+
const { rariRewardsDistributorDelegator } = addresses;
19+
20+
const AUTO_REWARDS_DISTRIBUTOR_ROLE = await rewardsDistributorAdmin.AUTO_REWARDS_DISTRIBUTOR_ROLE();
21+
22+
/// check that the contracts were wired together properly
23+
expect(await rewardsDistributorAdmin.hasRole(AUTO_REWARDS_DISTRIBUTOR_ROLE, autoRewardsDistributor.address)).to.be
24+
.true;
25+
expect(await autoRewardsDistributor.rewardsDistributorAdmin()).to.be.equal(rewardsDistributorAdmin.address);
26+
expect(await rewardsDistributorAdmin.isContractAdmin(contracts.optimisticTimelock.address)).to.be.true;
27+
expect(await rewardsDistributorAdmin.rewardsDistributorContract()).to.be.equal(rariRewardsDistributorDelegator);
28+
29+
const expectedTribePerBlock = seventyFiveTribe.mul(toBN(poolAllocPoints)).div(toBN(totalAllocPoint));
30+
const [actualTribePerBlock, updateNeeded] = await autoRewardsDistributor.getNewRewardSpeed();
31+
/// ensure the newly calculated tribe per block is correct
32+
expect(updateNeeded).to.be.true;
33+
expect(actualTribePerBlock).to.be.equal(expectedTribePerBlock);
34+
};
35+
36+
export { validate, setup, run, teardown };

scripts/deploy/feiRari.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import hre, { ethers } from 'hardhat';
2+
3+
async function deploy(deployAddress, addresses, logging = false) {
4+
const { core, rariPool8Tribe, rariRewardsDistributorDelegator, tribalChief } = addresses;
5+
6+
const tribalChiefIndex = 3;
7+
/// do not incentivize borrowing, instead incentivize supplying
8+
const isBorrowIncentivized = false;
9+
10+
/// calculate the address of the RDA that has not been deployed, then pass that
11+
/// into the autorewards distributor constructor so no admin actions are needed to wire the contracts together
12+
const signer = await ethers.getSigner(deployAddress);
13+
const currentNonce = Number(
14+
await hre.network.provider.request({
15+
method: 'eth_getTransactionCount',
16+
params: [signer.address]
17+
})
18+
);
19+
const futureRDAAddress = ethers.utils.getContractAddress({ from: signer.address, nonce: currentNonce + 1 });
20+
21+
const autoRewardsDistributorFactory = await ethers.getContractFactory('AutoRewardsDistributor');
22+
const autoRewardsDistributor = await autoRewardsDistributorFactory
23+
.connect(signer)
24+
.deploy(core, futureRDAAddress, tribalChief, tribalChiefIndex, rariPool8Tribe, isBorrowIncentivized);
25+
26+
logging && console.log('AutoRewardsDistributor deployed to: ', autoRewardsDistributor.address);
27+
28+
const rewardsDistributorAdminFactory = await ethers.getContractFactory('RewardsDistributorAdmin');
29+
const rewardsDistributorAdmin = await rewardsDistributorAdminFactory
30+
.connect(signer)
31+
.deploy(core, rariRewardsDistributorDelegator, [autoRewardsDistributor.address]);
32+
33+
logging && console.log('RewardsDistributorAdmin deployed to: ', rewardsDistributorAdmin.address);
34+
35+
return {
36+
autoRewardsDistributor,
37+
rewardsDistributorAdmin
38+
};
39+
}
40+
41+
module.exports = { deploy };

test/integration/proposals_config.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,10 @@
1313
"deploy" : true,
1414
"exec" : false,
1515
"proposerAddress" : "0xb81cf4981Ef648aaA73F07a18B03970f04d5D8bF"
16+
},
17+
"feiRari": {
18+
"deploy" : true,
19+
"exec" : false,
20+
"proposerAddress" : "0xb81cf4981Ef648aaA73F07a18B03970f04d5D8bF"
1621
}
1722
}

test/unit/feirari/AutoRewardsDistributor.test.ts renamed to test/unit/staking/feirari/AutoRewardsDistributor.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { expectRevert, balance, getAddresses, getCore } from '../../helpers';
1+
import { expectRevert, balance, getAddresses, getCore } from '../../../helpers';
22
import { expect } from 'chai';
33
import hre, { ethers, artifacts } from 'hardhat';
44
import { Signer, BigNumber } from 'ethers';
5-
import { AutoRewardsDistributor } from '../../../types/contracts/AutoRewardsDistributor';
6-
import { MockRewardsDistributor } from '../../../types/contracts/MockRewardsDistributor';
7-
import { MockTribalChief } from '../../../types/contracts/MockTribalChief';
8-
import { Core } from '../../../types/contracts/Core';
9-
import { Tribe } from '../../../types/contracts/Tribe';
5+
import { AutoRewardsDistributor } from '../../../../types/contracts/AutoRewardsDistributor';
6+
import { MockRewardsDistributor } from '../../../../types/contracts/MockRewardsDistributor';
7+
import { MockTribalChief } from '../../../../types/contracts/MockTribalChief';
8+
import { Core } from '../../../../types/contracts/Core';
9+
import { Tribe } from '../../../../types/contracts/Tribe';
1010

1111
const toBN = ethers.BigNumber.from;
1212

test/unit/feirari/RewardsDistributorAdmin.test.ts renamed to test/unit/staking/feirari/RewardsDistributorAdmin.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { expectRevert, getAddresses, getCore } from '../../helpers';
1+
import { expectRevert, getAddresses, getCore } from '../../../helpers';
22
import { expect } from 'chai';
33
import hre, { ethers, artifacts } from 'hardhat';
44
import { Signer, utils } from 'ethers';
55
import testHelpers from '@openzeppelin/test-helpers';
6-
import { Core } from '../../../types/contracts/Core';
7-
import { RewardsDistributorAdmin } from '../../../types/contracts/RewardsDistributorAdmin';
8-
import { MockRewardsDistributor } from '../../../types/contracts/MockRewardsDistributor';
6+
import { Core } from '../../../../types/contracts/Core';
7+
import { RewardsDistributorAdmin } from '../../../../types/contracts/RewardsDistributorAdmin';
8+
import { MockRewardsDistributor } from '../../../../types/contracts/MockRewardsDistributor';
99
import { keccak256 } from 'ethers/lib/utils';
1010

1111
const toBN = ethers.BigNumber.from;

types/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ export interface MainnetContracts {
127127
aaveTribeIncentivesController: ethers.Contract;
128128
optimisticTimelock: ethers.Contract;
129129
feiDAO: ethers.Contract;
130+
autoRewardsDistributor: ethers.Contract;
131+
rewardsDistributorAdmin: ethers.Contract;
130132
}
131133

132134
export interface MainnetContractAddresses {
@@ -159,6 +161,8 @@ export interface MainnetContractAddresses {
159161
rariPool8Tribe: string;
160162
curve3Metapool: string;
161163
tribalChiefOptimisticMultisig: string;
164+
stakingTokenWrapperRari: string;
165+
rariRewardsDistributorDelegator: string;
162166
}
163167

164168
export type ProposalConfig = {

0 commit comments

Comments
 (0)