Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
916 changes: 916 additions & 0 deletions spot-contracts/.openzeppelin/mainnet.json

Large diffs are not rendered by default.

228 changes: 228 additions & 0 deletions spot-contracts/.openzeppelin/sepolia.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,21 @@
"address": "0xd90FcB328D90B778D1f6719d781045bbbac8F251",
"txHash": "0x8b29769272d41c1032345366209cdcddb8abda7b8c66bfba001162c14671855e",
"kind": "transparent"
},
{
"address": "0x7f75A61c4475d32a50829710AA8d8aCDEbD2c0d4",
"txHash": "0x366889a82d52a5e9496b0c2f7d8becee5ab4d4611c0ddbe11b99124f983be136",
"kind": "transparent"
},
{
"address": "0xc6b4b85FB97695052CA2e6C6401C20a7Ba30605D",
"txHash": "0xb64e64b39d3296e9d6dc0d2098ddb6a97f8582dbfad0543d8ed364f6d8107abb",
"kind": "transparent"
},
{
"address": "0x6D6cBba605F4AF825F4997F1db74AF54e4F01c04",
"txHash": "0x6d23bda7a369524a4918846231c2c6646c092f39c23c823bcde50ee9e1a3d66b",
"kind": "transparent"
}
],
"impls": {
Expand Down Expand Up @@ -2715,6 +2730,219 @@
},
"namespaces": {}
}
},
"907dd399d33e68e0a7c77c54e1886a30e59ec356c35a0f9c27e96d39644c64d6": {
"address": "0x058C0F40427A5bBb7eF7169FfF0A12d265317B15",
"txHash": "0x8909e28358b1ff3b70564f6e6e8d6708e21b718cb04056638b9ef9f3ec5dda78",
"layout": {
"solcVersion": "0.8.20",
"storage": [
{
"label": "_initialized",
"offset": 0,
"slot": "0",
"type": "t_uint8",
"contract": "Initializable",
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
"retypedFrom": "bool"
},
{
"label": "_initializing",
"offset": 1,
"slot": "0",
"type": "t_bool",
"contract": "Initializable",
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
},
{
"label": "__gap",
"offset": 0,
"slot": "1",
"type": "t_array(t_uint256)50_storage",
"contract": "ContextUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
},
{
"label": "_owner",
"offset": 0,
"slot": "51",
"type": "t_address",
"contract": "OwnableUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22"
},
{
"label": "__gap",
"offset": 0,
"slot": "52",
"type": "t_array(t_uint256)49_storage",
"contract": "OwnableUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94"
},
{
"label": "targetSystemRatio",
"offset": 0,
"slot": "101",
"type": "t_uint256",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:69"
},
{
"label": "equilibriumDR",
"offset": 0,
"slot": "102",
"type": "t_struct(Range)11656_storage",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:74"
},
{
"label": "feeFnDRDown",
"offset": 0,
"slot": "104",
"type": "t_struct(Line)11666_storage",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:80"
},
{
"label": "feeFnDRUp",
"offset": 0,
"slot": "108",
"type": "t_struct(Line)11666_storage",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:83"
},
{
"label": "perpDebasementLag",
"offset": 0,
"slot": "112",
"type": "t_uint256",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:89"
},
{
"label": "perpEnrichmentLag",
"offset": 0,
"slot": "113",
"type": "t_uint256",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:92"
},
{
"label": "perpDebasementPercLimits",
"offset": 0,
"slot": "114",
"type": "t_struct(Range)11656_storage",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:95"
},
{
"label": "perpEnrichmentPercLimits",
"offset": 0,
"slot": "116",
"type": "t_struct(Range)11656_storage",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:98"
},
{
"label": "rebalanceFreqSec",
"offset": 0,
"slot": "118",
"type": "t_uint256",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:101"
},
{
"label": "protocolSharePerc",
"offset": 0,
"slot": "119",
"type": "t_uint256",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:104"
},
{
"label": "protocolFeeCollector",
"offset": 0,
"slot": "120",
"type": "t_address",
"contract": "FeePolicy",
"src": "contracts/FeePolicy.sol:107"
}
],
"types": {
"t_address": {
"label": "address",
"numberOfBytes": "20"
},
"t_array(t_uint256)49_storage": {
"label": "uint256[49]",
"numberOfBytes": "1568"
},
"t_array(t_uint256)50_storage": {
"label": "uint256[50]",
"numberOfBytes": "1600"
},
"t_bool": {
"label": "bool",
"numberOfBytes": "1"
},
"t_struct(Line)11666_storage": {
"label": "struct Line",
"members": [
{
"label": "x1",
"type": "t_uint256",
"offset": 0,
"slot": "0"
},
{
"label": "y1",
"type": "t_uint256",
"offset": 0,
"slot": "1"
},
{
"label": "x2",
"type": "t_uint256",
"offset": 0,
"slot": "2"
},
{
"label": "y2",
"type": "t_uint256",
"offset": 0,
"slot": "3"
}
],
"numberOfBytes": "128"
},
"t_struct(Range)11656_storage": {
"label": "struct Range",
"members": [
{
"label": "lower",
"type": "t_uint256",
"offset": 0,
"slot": "0"
},
{
"label": "upper",
"type": "t_uint256",
"offset": 0,
"slot": "1"
}
],
"numberOfBytes": "64"
},
"t_uint256": {
"label": "uint256",
"numberOfBytes": "32"
},
"t_uint8": {
"label": "uint8",
"numberOfBytes": "1"
}
},
"namespaces": {}
}
}
}
}
2 changes: 1 addition & 1 deletion spot-contracts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ The official mainnet addresses are:
- Bond issuer: [0x5613Fc36A431c9c2746763B80C1DD89e03593871](https://etherscan.io/address/0x5613Fc36A431c9c2746763B80C1DD89e03593871)
- Router: [0xCe2878d1f2901EFaF48cd456E586B470C145d1BC](https://etherscan.io/address/0xCe2878d1f2901EFaF48cd456E586B470C145d1BC)
- RolloverVault: [0x82A91a0D599A45d8E9Af781D67f695d7C72869Bd](https://etherscan.io//address/0x82A91a0D599A45d8E9Af781D67f695d7C72869Bd)
- FeePolicy: [0xE22977381506bF094CB3ed50CB8834E358F7ef6c](https://etherscan.io//address/0xE22977381506bF094CB3ed50CB8834E358F7ef6c)
- FeePolicy: [0x8689Fa9991834Bcf0387b31b7986ac311bAb6ab5](https://etherscan.io//address/0x8689Fa9991834Bcf0387b31b7986ac311bAb6ab5)

## Install

Expand Down
2 changes: 1 addition & 1 deletion spot-contracts/deployments/mainnet.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"rolloverVault": "0x82A91a0D599A45d8E9Af781D67f695d7C72869Bd",
"proxyAdmin": "0x2978B4103985A6668CE345555b0febdE64Fb092F",
"router": "0xCe2878d1f2901EFaF48cd456E586B470C145d1BC",
"feePolicy": "0xE22977381506bF094CB3ed50CB8834E358F7ef6c",
"feePolicy": "0x8689Fa9991834Bcf0387b31b7986ac311bAb6ab5",
"previousIssuers": [
[0, "0x9443b779d4AedF97d2B93D7CDa5fA0BB6312DfF2"],
[1, "0xD64FA63dc5E8fcB743457E47E4d522E11Ff1AD66"],
Expand Down
5 changes: 3 additions & 2 deletions spot-contracts/hardhat.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ export default {
},
},
mainnet: {
// url: `https://mainnet.infura.io/v3/${process.env.INFURA_SECRET}`,
url: `https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_SECRET}`,
url: `https://mainnet.infura.io/v3/${process.env.INFURA_SECRET}`,
// url: `https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_SECRET}`,
// url: `https://virtual.mainnet.rpc.tenderly.co/f468fb75-ada0-4833-9f64-f71d51b71190`,
accounts: {
mnemonic: process.env.PROD_MNEMONIC || Wallet.createRandom().mnemonic.phrase,
},
Expand Down
2 changes: 1 addition & 1 deletion spot-contracts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"eslint-plugin-promise": "^6.0.0",
"eslint-plugin-unused-imports": "^3.0.0",
"ethereum-waffle": "latest",
"ethers": "^6.6.0",
"ethers": "^6.14.4",
"ethers-v5": "npm:ethers@^5.7.0",
"ganache-cli": "latest",
"hardhat": "^2.23.0",
Expand Down
34 changes: 34 additions & 0 deletions spot-contracts/tasks/scripts/mainnet_v5.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# deploy new contracts
yarn hardhat --network mainnet deploy:FeePolicy
# fee policy 0x8689Fa9991834Bcf0387b31b7986ac311bAb6ab5
yarn hardhat --network mainnet transferOwnership "0x8689Fa9991834Bcf0387b31b7986ac311bAb6ab5" \
--new-owner-address "0x57981B1EaFe4b18EC97f8B10859B40207b364662"

# deploy new implementations
yarn hardhat --network mainnet prepare_upgrade PerpetualTranche 0xC1f33e0cf7e40a67375007104B929E49a581bafE
yarn hardhat --network mainnet prepare_upgrade:RolloverVault 0x82A91a0D599A45d8E9Af781D67f695d7C72869Bd
# linked library 0xe0028c40C8A09449852ea4D2e9aa4d25895F285f

# spot v2 check storage layout
yarn hardhat --network mainnet validate_upgrade PerpetualTranche 0xC1f33e0cf7e40a67375007104B929E49a581bafE
yarn hardhat --network mainnet validate_upgrade:RolloverVault 0x82A91a0D599A45d8E9Af781D67f695d7C72869Bd \
--tranche-manager-address 0xe0028c40C8A09449852ea4D2e9aa4d25895F285f

# execute via multisig
# proxyAdmin: 0x2978B4103985A6668CE345555b0febdE64Fb092F
# proxyAdmin.upgrade(0xC1f33e0cf7e40a67375007104B929E49a581bafE, 0x62cbE9F24413485f04FA62F9548C7855ec4a5425)
# proxyAdmin.upgrade(0x82A91a0D599A45d8E9Af781D67f695d7C72869Bd, 0x09e8adfa8D829DaC1c305544A86b53Ed0dDD536a)

yarn hardhat --network mainnet ops:perp:info 0xC1f33e0cf7e40a67375007104B929E49a581bafE
yarn hardhat --network mainnet ops:vault:info 0x82A91a0D599A45d8E9Af781D67f695d7C72869Bd

# emergency rollback
# proxyAdmin.upgrade(0xC1f33e0cf7e40a67375007104B929E49a581bafE, 0x5dc5488b35c34a43fe19ba9de38b63806fab4b23)
# proxyAdmin.upgrade(0x82A91a0D599A45d8E9Af781D67f695d7C72869Bd, 0xa85be82083e032edf32a19028df558484b399196)

# Deployment runbook
# 1) Setup new fee policy, with chosen parameters (sanity check return values)
# 2) Pause everything, SPOT, stAMPL and BillBroker
# 3) Execute upgrade (spot and stampl)
# 4) Set fee policy reference and double check all other parameters on SPOT and STAMPL
# 5) Ops, execute first rebalance
69 changes: 69 additions & 0 deletions spot-contracts/tasks/upgrade/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,31 @@ task("validate_upgrade")
console.log("Success");
});

task("validate_upgrade:RolloverVault")
.addPositionalParam("address", "the address of the deployed proxy contract", undefined, types.string, false)
.addParam("trancheManagerAddress", "the address of the linked tranche manager", "0x", types.string)
.setAction(async function (args: TaskArguments, hre) {
const { address, trancheManagerAddress } = args;
const Factory = await hre.ethers.getContractFactory("RolloverVault", {
libraries: {
TrancheManager: trancheManagerAddress,
},
});

console.log("Trying strict validation");
try {
await hre.upgrades.validateUpgrade(address, Factory);
} catch (e) {
console.log("Strict validation failed. ", e);
console.log("Retrying but allowing variable renames.");
await hre.upgrades.validateUpgrade(address, Factory, {
unsafeAllowRenames: true,
unsafeAllowLinkedLibraries: true,
});
}
console.log("Success");
});

task("prepare_upgrade")
.addPositionalParam("factory", "the name of the factory", undefined, types.string, false)
.addPositionalParam("address", "the address of the deployed proxy contract", undefined, types.string, false)
Expand Down Expand Up @@ -122,3 +147,47 @@ task("upgrade:testnet:RolloverVault")
address: newImpl,
});
});

task("prepare_upgrade:RolloverVault")
.addPositionalParam("address", "the address of the deployed proxy contract", undefined, types.string, false)
.addParam("trancheManagerAddress", "the address of the linked tranche manager", "0x", types.string)
.addParam("fromIdx", "the index of sender", 0, types.int)
.setAction(async function (args: TaskArguments, hre) {
const signer = (await hre.ethers.getSigners())[args.fromIdx];
const signerAddress = await signer.getAddress();
console.log("Signer", signerAddress);

let trancheManagerAddress = args.trancheManagerAddress;
if (trancheManagerAddress === "0x") {
const TrancheManager = await hre.ethers.getContractFactory("TrancheManager");
const trancheManager = await TrancheManager.deploy();
trancheManagerAddress = trancheManager.target;
console.log("Deploying linked library TrancheManager", trancheManagerAddress);
}
const Factory = await hre.ethers.getContractFactory("RolloverVault", {
libraries: {
TrancheManager: trancheManagerAddress,
},
});

const { address } = args;
console.log("Proxy", address);
console.log("Current implementation", await getImplementationAddress(hre.ethers.provider, address));

await hre.upgrades.prepareUpgrade(address, Factory, {
unsafeAllowRenames: true,
unsafeAllowLinkedLibraries: true,
});
await sleep(30);
const newImpl = await getImplementationAddress(hre.ethers.provider, address);
console.log("Updated implementation", newImpl);

await sleep(30);
await hre.run("verify:contract", {
address: trancheManagerAddress,
});
await sleep(30);
await hre.run("verify:contract", {
address: newImpl,
});
});
Loading