good morning!!!!

Skip to content
Snippets Groups Projects
Commit 4aa835cf authored by Jake Barber's avatar Jake Barber
Browse files

.

parent 43f0ae69
No related branches found
No related tags found
No related merge requests found
import { BN } from "../../../util/number"
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"
import {
UniswapV3TokenOracleRelay__factory, AnchoredViewRelay__factory, ChainlinkOracleRelay__factory, IOracleRelay,
CappedGovToken,
CappedGovToken__factory
} from "../../../typechain-types"
import { toNumber } from "../../../util/math"
import { DeployNewProxyContract } from "../../../util/deploy"
import { a, c, d } from "../../../util/addresser"
import { network } from "hardhat"
import hre from 'hardhat'
import { currentBlock, resetCurrent } from "../../../util/block"
const { ethers } = require("hardhat")
const uniPriceFeed = "0x632E675672F2657F227da8D9bB3fE9177838e726"
const clFeed = "0x4e155ed98afe9034b7a5962f6c84c86d869daa9d"
let CappedRPL: CappedGovToken
const rplCap = BN("21000e18")
let uniswapOracle: IOracleRelay
let chainlinkOracle: IOracleRelay
let anchorViewRelay: IOracleRelay
const deployCapTokens = async (deployer: SignerWithAddress) => {
CappedRPL = await DeployNewProxyContract(
new CappedGovToken__factory(deployer),
deployer,
d.ProxyAdmin,
c.CappedGovTokenImplementation,
"Capped RPL",
"cRPL",
a.rplAddress,
d.VaultController,
d.VotingVaultController
)
await CappedRPL.deployed()
console.log("Capped RPL deployed: ", CappedRPL.address)
}
const deployOracles = async (deployer: SignerWithAddress) => {
const UniV3Factory = new UniswapV3TokenOracleRelay__factory(deployer)
const chainlinkFactory = new ChainlinkOracleRelay__factory(deployer)
const anchorViewFactory = new AnchoredViewRelay__factory(deployer)
uniswapOracle = await UniV3Factory.deploy(
14400,
uniPriceFeed,
false,
BN("1"),
BN("1")
)
await uniswapOracle.deployed()
console.log("Uniswap oracle address:", uniswapOracle.address)
console.log("Uni Price: ", await toNumber(await uniswapOracle.currentValue()))
/**
chainlinkOracle = await chainlinkFactory.deploy(
clFeed,
BN("1e10"),
BN("1")
)
await chainlinkOracle.deployed()
console.log("ChainLink oracle address:", chainlinkOracle.address)
console.log("CL Price: ", await toNumber(await chainlinkOracle.currentValue()))
*/
const clOracle = "0x1474303c04f72D47E0896a7FF8a585b14875C63d"
anchorViewRelay = await anchorViewFactory.deploy(
uniswapOracle.address,
clOracle,
BN("10"),
BN("100")
)
await anchorViewRelay.deployed()
console.log("Anchor View Relay address:", anchorViewRelay.address)
console.log("RPL anchor view price: ", await toNumber(await anchorViewRelay.currentValue()))
}
const deploy = async (deployer: SignerWithAddress) => {
await deployCapTokens(deployer)
console.log("All Cap Tokens deployed")
await deployOracles(deployer)
console.log("All oracles have been deployed successfully")
await CappedRPL.setCap(rplCap)
console.log("Set RPL cap to: ", await toNumber(rplCap))
}
async function main() {
//check for test network
const networkName = hre.network.name
if (networkName == "hardhat" || networkName == "localhost") {
await network.provider.send("evm_setAutomine", [true])
await resetCurrent()
console.log("TEST DEPLOYMENT AT BLOCK: ", await (await currentBlock()).number)
} else {
console.log("DEPLOYING TO: ", networkName)
}
const accounts = await ethers.getSigners()
const deployer = accounts[0]
await deploy(deployer)
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})
/**
DEPLOYING TO MAINNET
Capped RPL deployed: 0x6b68C5708DAffD0393aCC6A8cc92f8C2146346Ae
All Cap Tokens deployed
Uniswap oracle address: 0xA490CE00E4032A12BEFa2D3B35DeE7333BECfE54
Uni Price: 24.636389117663093
ChainLink oracle address: 0x1474303c04f72D47E0896a7FF8a585b14875C63d
CL Price: 24.48525767
Anchor View Relay address: 0xd3CEd54E5f5D950B1B8711A178e4Eab2de5DB3EC
RPL anchor view price: 24.01491007
All oracles have been deployed successfully
Set RPL cap to: 21000
*/
\ No newline at end of file
import { BN } from "../../../util/number"
import {
GovernorCharlieDelegate,
GovernorCharlieDelegate__factory,
OracleMaster__factory,
VaultController__factory,
MKRVotingVaultController__factory,
CappedMkrToken__factory,
ProxyAdmin__factory,
VotingVaultController__factory
} from "../../../typechain-types"
import { ProposalContext } from "../suite/proposal"
import { a, c, d } from "../../../util/addresser"
import { currentBlock, fastForward, hardhat_mine, resetCurrent } from "../../../util/block"
import * as fs from 'fs'
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"
import { network } from "hardhat"
import hre from 'hardhat'
import { showBodyCyan } from "../../../util/format"
import { ceaseImpersonation } from "../../../util/impersonator"
import { impersonateAccount } from "@nomicfoundation/hardhat-network-helpers"
const { ethers } = require("hardhat")
const govAddress = "0x266d1020A84B9E8B0ed320831838152075F8C4cA"
const proposerAddr = "0x3Df70ccb5B5AA9c300100D98258fE7F39f5F9908" //account with proposal power
//if true:
//proposerAddr must have proposal power
//if true && running on a live network:
//PRIVATE KEY MUST BE IN .env as PERSONAL_PRIVATE_KEY=42bb...
const proposeFromScript = true
const RPL_LTV = BN("6e17")
const RPL_LIQINC = BN("1e17")
const mkrCap = BN("1000e18")
const propose = async (proposer: SignerWithAddress) => {
const proposal = new ProposalContext("MKR Listing and Contracts")
const addOracle = await new OracleMaster__factory().
attach(d.Oracle).
populateTransaction.setRelay(
c.CappedRPL,
c.RplAnchorView
)
const list = await new VaultController__factory().
attach(d.VaultController).
populateTransaction.registerErc20(
c.CappedRPL,
RPL_LTV,
c.CappedRPL,
RPL_LIQINC
)
const register = await new VotingVaultController__factory().
attach(d.VotingVaultController).
populateTransaction.registerUnderlying(
a.rplAddress,
c.CappedRPL
)
const updateCap = await new CappedMkrToken__factory(proposer).attach(c.CappedMKR).
populateTransaction.setCap(mkrCap)
const upgrade = await new ProxyAdmin__factory(proposer).attach(d.ProxyAdmin).
populateTransaction.upgrade(d.MKRVotingVaultController, d.MKRVotingVaultControllerImplementation)
proposal.addStep(addOracle, "setRelay(address,address)")
proposal.addStep(list, "registerErc20(address,uint256,address,uint256)")
proposal.addStep(register, "registerUnderlying(address,address)")
proposal.addStep(updateCap, "setCap(uint256)")
proposal.addStep(upgrade, "upgrade(address,address)")
let out = proposal.populateProposal()
console.log(out)
const proposalText = fs.readFileSync('./scripts/proposals/RPL/txt.md', 'utf8')
let gov: GovernorCharlieDelegate
gov = new GovernorCharlieDelegate__factory(proposer).attach(
govAddress
)
const data = await gov.connect(proposer).populateTransaction.propose(
out.targets,
out.values,
out.signatures,
out.calldatas,
proposalText,
false
)
const networkName = hre.network.name
if (proposeFromScript || networkName == "hardhat" || networkName == "localhost") {
console.log("Sending proposal")
const result = await gov.connect(proposer).propose(
out.targets,
out.values,
out.signatures,
out.calldatas,
proposalText,
false
)
const receipt = await result.wait()
console.log("Proposal sent: ", receipt.transactionHash)
if (networkName == "hardhat" || networkName == "localhost") {
//test execution if on test network
console.log("Testing execution")
await quickTest(proposer)
console.log("TRANSACTION DATA: \n", data.data)
}
} else {
console.log("TRANSACTION DATA: \n", data.data)
//fs.writeFileSync('./scripts/proposals/MKR/proposalHexData.txt', JSON.stringify(data))
}
}
const quickTest = async (proposer: SignerWithAddress) => {
const gov = new GovernorCharlieDelegate__factory(proposer).attach(
govAddress
)
const votingPeriod = await gov.votingPeriod()
const votingDelay = await gov.votingDelay()
const timelock = await gov.proposalTimelockDelay()
const block = await currentBlock()
const proposal = Number(await gov.proposalCount())
showBodyCyan("Advancing a lot of blocks...")
await hardhat_mine(votingDelay.toNumber())
await gov.connect(proposer).castVote(proposal, 1)
await ceaseImpersonation(proposerAddr)
const whale = "0x958892b4a0512b28AaAC890FC938868BBD42f064"//0xa6e8772af29b29b9202a073f8e36f447689beef6 ";
const prop = ethers.provider.getSigner(whale)
await impersonateAccount(whale)
await gov.connect(prop).castVote(proposal, 1)
showBodyCyan("Advancing a lot of blocks again...")
await hardhat_mine(votingPeriod.toNumber())
await gov.connect(prop).queue(proposal)
await fastForward(timelock.toNumber())
const result = await gov.connect(prop).execute(proposal)
await result.wait()
showBodyCyan("EXECUTION COMPLETE")
await ceaseImpersonation(whale)
}
async function main() {
let proposer: SignerWithAddress
const networkName = hre.network.name
if (networkName == "hardhat" || networkName == "localhost") {
await network.provider.send("evm_setAutomine", [true])
await resetCurrent()
await impersonateAccount(proposerAddr)
proposer = ethers.provider.getSigner(proposerAddr)
console.log("TEST PROPOSAL AT BLOCK: ", await (await currentBlock()).number)
} else {
const accounts = await ethers.getSigners()
proposer = accounts[1]
console.log("PROPOSING ON MAINNET AS: ", proposer.address)
}
await propose(proposer)
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})
/**
{
targets: [
'0xf4818813045E954f5Dc55a40c9B60Def0ba3D477',
'0x4aaE9823Fb4C70490F1d802fC697F3ffF8D5CbE3',
'0xaE49ddCA05Fe891c6a5492ED52d739eC1328CBE2',
'0xbb5578c08bC08c15AcE5cd09c6683CcCcB2A9148',
'0x3D9d8c08dC16Aa104b5B24aBDd1aD857e2c0D8C5'
],
values: [ 0, 0, 0, 0, 0 ],
signatures: [
'setRelay(address,address)',
'registerErc20(address,uint256,address,uint256)',
'registerUnderlying(address,address)',
'setCap(uint256)',
'upgrade(address,address)'
],
calldatas: [
'0x0000000000000000000000006b68c5708daffd0393acc6a8cc92f8c2146346ae000000000000000000000000d3ced54e5f5d950b1b8711a178e4eab2de5db3ec',
'0x0000000000000000000000006b68c5708daffd0393acc6a8cc92f8c2146346ae0000000000000000000000000000000000000000000000000853a0d2313c00000000000000000000000000006b68c5708daffd0393acc6a8cc92f8c2146346ae000000000000000000000000000000000000000000000000016345785d8a0000',
'0x000000000000000000000000d33526068d116ce69f19a9ee46f0bd304f21a51f0000000000000000000000006b68c5708daffd0393acc6a8cc92f8c2146346ae',
'0x00000000000000000000000000000000000000000000003635c9adc5dea00000',
'0x000000000000000000000000491397f7eb6f5d9b82b15cecabff835ba31f217f0000000000000000000000007b6160a0c3963903c2a050c6637009e2c1c60137'
]
}
*/
\ No newline at end of file
# Proposal to add RPL; Housekeeping
Proposal to add RPL as a capped collateral to Interest Protocol and adjust paramaters on MKR collateral.
## Overview
RPL is an ERC20 token issued by Rocket Pool. It acts as the governance token of the protocol, as well as collateral that must be staked by node operators. Rocket Pool is notable for its dual DAO model, with both a Protocol DAO and an Oracle DAO.
This proposal also includes some housekeeping to fix an incorrect maximum cap on MKR collateral.
## Parameters
Token Address: 0xD33526068D116cE69F19A9ee46F0bd304F21A51f
Capped Token address:0x73CCB09737eDA66b66158f140834D68150c4c04B
LTV: 60%
Liquidation incentive: 10%
Maximum Cap: 21,000 RPL (~$1,000,000 market value at time of writing)
Oracle Address: 0x8D63E151E3b6B0828Bebd212400aB9AaAFdeF312
Primary oracle: 0x1474303c04f72D47E0896a7FF8a585b14875C63d
Secondary oracle: 0x78FCf430D81DD51b367B059Ea2b9FF69FFA8bD74
Price deviation: 10%
## Liquidity
Market Cap: $917,000,000
Liquidity: $13,200,000 (Uniswap V3 0xe42318eA3b998e8355a3Da364EB9D48eC725Eb45)
[Coingecko](https://www.coingecko.com/en/coins/ethereum-name-service) 7-day avg 24hr volume: $348,000
Notable exchanges: Uniswap, Binance, Coinbase
## Technical risks
1. Type of contract: ERC20
2. Underlying asset: Governance Token
3. Time: 614 Days Ago (Sept 30, 2021)
4. Value:
5. Privileges:
6. Upgradability: Yes
## Supplemental Information
RPL has an annual inflation schedule of 5%. There is also an older version of the RPL token that predates 2021 that can be migrated 1:1 for the V2 RPL token.
## Relevant References
[Rocket Pool Guides For Staking & Node Operation](https://docs.rocketpool.net/guides/)
[Rocket Pool Tokenomics](https://medium.com/rocket-pool/rocket-pool-staking-protocol-part-3-3029afb57d4c)
[DeFi Llama Token Liquidity](https://defillama.com/liquidity)
[Matcha](https://matcha.xyz/tokens/ethereum/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48)
\ No newline at end of file
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"
import {
IL2CrossDomainMessenger,
IL2CrossDomainMessenger__factory,
VaultController__factory
} from "../../../typechain-types"
import { impersonateAccount, ceaseImpersonation } from "../../../util/impersonator"
import { currentBlock, resetCurrentOP } from "../../../util/block"
import hre from 'hardhat'
import { OptimisimAddresses, OptimisimDeploys, MainnetAddresses, od } from "../../../util/addresser"
import { PopulatedTransaction } from "ethers"
import { smock } from "@defi-wonderland/smock";
const a = new OptimisimAddresses()
const d = new OptimisimDeploys()
const m = new MainnetAddresses()
const { ethers, network } = require("hardhat")
const govAddress = "0x266d1020A84B9E8B0ed320831838152075F8C4cA"
const proposerAddr = "0x3Df70ccb5B5AA9c300100D98258fE7F39f5F9908"
const listSNXdata: PopulatedTransaction = {
data: '0x7158092600000000000000000000000045b265c7919d7fd8a0d673d7acaa8f5a7abb430d00000000000000000000000000000000000000000000000009b6e64a8ec6000000000000000000000000000045b265c7919d7fd8a0d673d7acaa8f5a7abb430d000000000000000000000000000000000000000000000000010a741a46278000',
to: '0x05498574BD0Fa99eeCB01e1241661E7eE58F8a85'
}
const listSNXForward: PopulatedTransaction = {
data: '0x6fadcf7200000000000000000000000005498574bd0fa99eecb01e1241661e7ee58f8a85000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000847158092600000000000000000000000045b265c7919d7fd8a0d673d7acaa8f5a7abb430d00000000000000000000000000000000000000000000000009b6e64a8ec6000000000000000000000000000045b265c7919d7fd8a0d673d7acaa8f5a7abb430d000000000000000000000000000000000000000000000000010a741a4627800000000000000000000000000000000000000000000000000000000000',
to: '0x48fa7528bFD6164DdF09dF0Ed22451cF59c84130'
}
//0x48fa7528bFD6164DdF09dF0Ed22451cF59c84130
const test = async (data: PopulatedTransaction) => {
//mock the bridge contract 0x4200000000000000000000000000000000000007
const mockFactory = await smock.mock('IL2CrossDomainMessenger')
//const mock = mockFactory.deploy()
//console.log(mock)
//impersonate the bridge
//call forward on the cca
/**
//impersonate crossChainAccount
const cca = ethers.provider.getSigner(od.optimismMessenger)
await impersonateAccount(cca._address)
//console.log(data)
//pass data to contract
const vc = VaultController__factory.connect(od.VaultController, cca)
console.log(vc.address)
const owner = await vc.owner()
console.log(owner)
const args = {
gasLimit: 0,
gasPrice: 0,
to: data.to,
from: cca._address,
value: 0,
data: data.data
}
await cca.sendTransaction(args)
//await cca.sendTransaction()
//verify
await ceaseImpersonation(cca._address)
*/
}
async function main() {
let proposer: SignerWithAddress
const networkName = hre.network.name
if (networkName == "hardhat" || networkName == "localhost") {
console.log("TEST PROPOSAL")
await network.provider.send("evm_setAutomine", [true])
await resetCurrentOP()
const block = await currentBlock()
console.log("Testing on OP @ block:", block.number)
await impersonateAccount(proposerAddr)
console.log("Impersonated ", proposerAddr)
proposer = ethers.provider.getSigner(proposerAddr)
} else {
const accounts = await ethers.getSigners()
proposer = accounts[1]
console.log("PROPOSING ON MAINNET AS: ", proposer.address)
}
await test(listSNXdata)
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment