Skip to content

Commit 702dfd2

Browse files
authored
Merge pull request #265 from stabilitydao/sonic
MetaVault and related, FeeTreasury 1.1.0
2 parents 9f1a111 + 20cfd55 commit 702dfd2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+3080
-170
lines changed

chains/sonic/SonicConstantsLib.sol

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,24 @@ pragma solidity ^0.8.28;
55
library SonicConstantsLib {
66
// initial addresses
77
address public constant MULTISIG = 0xF564EBaC1182578398E94868bea1AbA6ba339652;
8+
address public constant PLATFORM = 0x4Aca671A420eEB58ecafE83700686a2AD06b20D8;
9+
address public constant METAVAULT_FACTORY = 0xa190302880acF9deCC4447363640f589000EF601;
10+
11+
// MetaVaults
12+
address public constant METAVAULT_metaUSD = 0x1111111199558661Bf7Ff27b4F1623dC6b91Aa3e;
13+
address public constant WRAPPED_METAVAULT_metaUSD = 0xAaAaaAAac311D0572Bffb4772fe985A750E88805;
14+
address public constant METAVAULT_metaUSDC = 0x22222222780038f8817b3dE825a070225e6d9874;
15+
address public constant WRAPPED_METAVAULT_metaUSDC = 0xEEEEEEE6d95E55A468D32FeB5d6648754d10A967;
16+
17+
// Vaults
18+
address public constant VAULT_C_USDC_SiF = 0xa51e7204054464e656B3658e7dBb63d9b0f150f1;
19+
address public constant VAULT_C_USDC_S_8 = 0x96a8055090E87bfE18BdF3794E9D676F196EFd80;
20+
address public constant VAULT_C_USDC_S_27 = 0x2ebB3c7808B86f94dF9731AE830aB6ea8cB431d8;
21+
address public constant VAULT_C_USDC_S_34 = 0xd248c4b6Ec709FEeD32851A9F883AfeaC294aD30;
22+
address public constant VAULT_C_USDC_S_36 = 0x38274302e0Dd5779b4E0A3E401023cFB48fF5c23;
23+
address public constant VAULT_C_USDC_S_49 = 0xc33568559c8338581BB6914d6F2d024a063886E8;
24+
address public constant VAULT_C_USDC_scUSD_ISF_scUSD = 0x8C64D2a1960C7B4b22Dbb367D2D212A21E75b942;
25+
address public constant VAULT_C_USDC_scUSD_ISF_USDC = 0xb773B791F3baDB3b28BC7A2da18E2a012b9116c2;
826

927
// ERC20
1028
address public constant TOKEN_wS = 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38;
@@ -302,6 +320,7 @@ library SonicConstantsLib {
302320
address public constant SILO_VAULT_49_USDC = 0xa18a8f100f2c976044f2f84fae1eE9f807Ae7893;
303321
address public constant SILO_VAULT_34_USDC = 0x6030aD53d90ec2fB67F3805794dBB3Fa5FD6Eb64;
304322
address public constant SILO_VAULT_36_USDC = 0x11Ba70c0EBAB7946Ac84F0E6d79162b0cBb2693f;
323+
address public constant SILO_MANAGED_VAULT_USDC = 0xF75AE954D30217B4EE70DbFB33f04162aa3Cf260;
305324

306325
// Gamma
307326
address public constant GAMMA_UNISWAPV3_UNIPROXY = 0xcD5A60eb030300661cAf97244aE98e1D5A70f2c8;

guides/AllDeployments.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66

77
* **Platform** `0x4Aca671A420eEB58ecafE83700686a2AD06b20D8` [sonicscan](https://sonicscan.org/address/0x4aca671a420eeb58ecafe83700686a2ad06b20d8)
88
* **Factory** `0xc184a3ecca684f2621c903a7943d85fa42f56671` [sonicscan](https://sonicscan.org/address/0xc184a3ecca684f2621c903a7943d85fa42f56671)
9+
* **MetaVaultFactory** `0xa190302880acF9deCC4447363640f589000EF601` [sonicscan](https://sonicscan.org/address/0xa190302880acF9deCC4447363640f589000EF601)
910
* **PriceReader** `0x422025182dd83a610bfa8b20550dcccdf94dc549` [sonicscan](https://sonicscan.org/address/0x422025182dd83a610bfa8b20550dcccdf94dc549)
10-
* **Wwapper** `0xe52fcf607a8328106723804de1ef65da512771be` [sonicscan](https://sonicscan.org/address/0xe52fcf607a8328106723804de1ef65da512771be)
11+
* **Swapper** `0xe52fcf607a8328106723804de1ef65da512771be` [sonicscan](https://sonicscan.org/address/0xe52fcf607a8328106723804de1ef65da512771be)
1112
* **HardWorker** `0x635b1f7dd7d0172533ba9fe5cfe2d83d9848f701` [sonicscan](https://sonicscan.org/address/0x635b1f7dd7d0172533ba9fe5cfe2d83d9848f701)
12-
* **CaultManager** `0x589a504f2ee9d054b483c700fa814863d639381e` [sonicscan](https://sonicscan.org/address/0x589a504f2ee9d054b483c700fa814863d639381e)
13+
* **VaultManager** `0x589a504f2ee9d054b483c700fa814863d639381e` [sonicscan](https://sonicscan.org/address/0x589a504f2ee9d054b483c700fa814863d639381e)
1314
* **StrategyLogic** `0xe0e71b484bb20e37d18ab51fb60c32dec778478a` [sonicscan](https://sonicscan.org/address/0xe0e71b484bb20e37d18ab51fb60c32dec778478a)
1415
* **Zap** `0x029dfd1a79e0ad9305d773fb8f3c01d8ef9b913d` [sonicscan](https://sonicscan.org/address/0x029dfd1a79e0ad9305d773fb8f3c01d8ef9b913d)
1516

16-
1717
### Periphery
1818

1919
* **Frontend** `0x15487495cce9210795f9C2E0e1A7238E336dFc32` [sonicscan](https://sonicscan.org/address/0x15487495cce9210795f9C2E0e1A7238E336dFc32)

script/base/DeployCore.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ abstract contract DeployCore {
9494
vars.proxy = new Proxy();
9595
vars.proxy.initProxy(address(new FeeTreasury()));
9696
vars.feeTreasury = FeeTreasury(address(vars.proxy));
97-
vars.feeTreasury.initialize(address(vars.platform));
97+
vars.feeTreasury.initialize(address(vars.platform), vars.platform.multisig());
9898
vars.proxy = new Proxy();
9999
vars.proxy.initProxy(address(new RevenueRouter()));
100100
vars.revenueRouter = RevenueRouter(address(vars.proxy));
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.28;
3+
4+
import {Script} from "forge-std/Script.sol";
5+
import {Proxy} from "../../src/core/proxy/Proxy.sol";
6+
import {FeeTreasury} from "../../src/tokenomics/FeeTreasury.sol";
7+
8+
contract DeployFeeTreasuryLendingSonic is Script {
9+
address public constant PLATFORM = 0x4Aca671A420eEB58ecafE83700686a2AD06b20D8;
10+
address public constant MANAGER = 0xad1bB693975C16eC2cEEF65edD540BC735F8608B;
11+
12+
function run() external {
13+
uint deployerPrivateKey = vm.envUint("PRIVATE_KEY");
14+
vm.startBroadcast(deployerPrivateKey);
15+
Proxy proxy = new Proxy();
16+
proxy.initProxy(address(new FeeTreasury()));
17+
FeeTreasury(address(proxy)).initialize(PLATFORM, MANAGER);
18+
vm.stopBroadcast();
19+
}
20+
21+
function testDeployScript() external {}
22+
}

script/deploy-tokenomics/XSTBL.Sonic.s.sol

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {XStaking} from "../../src/tokenomics/XStaking.sol";
77
import {XSTBL} from "../../src/tokenomics/XSTBL.sol";
88
import {RevenueRouter} from "../../src/tokenomics/RevenueRouter.sol";
99
import {FeeTreasury} from "../../src/tokenomics/FeeTreasury.sol";
10+
import {IPlatform} from "../../src/interfaces/IPlatform.sol";
1011

1112
contract DeployXSTBLSystem is Script {
1213
address public constant PLATFORM = 0x4Aca671A420eEB58ecafE83700686a2AD06b20D8;
@@ -23,7 +24,7 @@ contract DeployXSTBLSystem is Script {
2324
revenueRouterProxy.initProxy(address(new RevenueRouter()));
2425
Proxy feeTreasuryProxy = new Proxy();
2526
feeTreasuryProxy.initProxy(address(new FeeTreasury()));
26-
FeeTreasury(address(feeTreasuryProxy)).initialize(PLATFORM);
27+
FeeTreasury(address(feeTreasuryProxy)).initialize(PLATFORM, IPlatform(PLATFORM).multisig());
2728
XStaking(address(xStakingProxy)).initialize(PLATFORM, address(xSTBLProxy));
2829
XSTBL(address(xSTBLProxy)).initialize(PLATFORM, STBL, address(xStakingProxy), address(revenueRouterProxy));
2930
RevenueRouter(address(revenueRouterProxy)).initialize(PLATFORM, address(xSTBLProxy), address(feeTreasuryProxy));

script/deploy-vault/CVault.s.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pragma solidity ^0.8.28;
44
import {Script} from "forge-std/Script.sol";
55
import {CVault} from "../../src/core/vaults/CVault.sol";
66

7-
contract DeployCVaultSonic is Script {
7+
contract DeployCVault is Script {
88
function run() external {
99
uint deployerPrivateKey = vm.envUint("PRIVATE_KEY");
1010
vm.startBroadcast(deployerPrivateKey);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.28;
3+
4+
import {Script} from "forge-std/Script.sol";
5+
import {MetaVault} from "../../src/core/vaults/MetaVault.sol";
6+
7+
contract DeployMetaVault is Script {
8+
function run() external {
9+
uint deployerPrivateKey = vm.envUint("PRIVATE_KEY");
10+
vm.startBroadcast(deployerPrivateKey);
11+
new MetaVault();
12+
vm.stopBroadcast();
13+
}
14+
15+
function testDeployScript() external {}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.28;
3+
4+
import {Script} from "forge-std/Script.sol";
5+
import {WrappedMetaVault} from "../../src/core/vaults/WrappedMetaVault.sol";
6+
7+
contract WrappedDeployMetaVault is Script {
8+
function run() external {
9+
uint deployerPrivateKey = vm.envUint("PRIVATE_KEY");
10+
vm.startBroadcast(deployerPrivateKey);
11+
new WrappedMetaVault();
12+
vm.stopBroadcast();
13+
}
14+
15+
function testDeployScript() external {}
16+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.28;
3+
4+
import {Script} from "forge-std/Script.sol";
5+
import {Platform} from "../../src/core/Platform.sol";
6+
import {PriceReader} from "../../src/core/PriceReader.sol";
7+
import {CVault} from "../../src/core/vaults/CVault.sol";
8+
import {MetaVaultFactory} from "../../src/core/MetaVaultFactory.sol";
9+
import {FeeTreasury} from "../../src/tokenomics/FeeTreasury.sol";
10+
import {Proxy} from "../../src/core/proxy/Proxy.sol";
11+
12+
contract PrepareUpgrade11 is Script {
13+
address public constant PLATFORM = 0x4Aca671A420eEB58ecafE83700686a2AD06b20D8;
14+
15+
function run() external {
16+
uint deployerPrivateKey = vm.envUint("PRIVATE_KEY");
17+
vm.startBroadcast(deployerPrivateKey);
18+
19+
// CVault 1.6.0: IStabilityVault
20+
new CVault();
21+
22+
// Platform 1.4.0: IPlatform.metaVaultFactory()
23+
new Platform();
24+
25+
// PriceReader 1.1.0: IPriceReader.getVaultPrice; IPriceReader.vaultsWithSafeSharePrice
26+
new PriceReader();
27+
28+
// FeeTreasury 1.1.0: assets, harvest, fixes
29+
new FeeTreasury();
30+
31+
// MetaVaultFactory 1.0.0
32+
Proxy proxy = new Proxy();
33+
proxy.initProxy(address(new MetaVaultFactory()));
34+
MetaVaultFactory(address(proxy)).initialize(PLATFORM);
35+
vm.stopBroadcast();
36+
}
37+
38+
function testPrepareUpgrade() external {}
39+
}

src/core/MetaVaultFactory.sol

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.28;
3+
4+
import {Controllable, IControllable} from "./base/Controllable.sol";
5+
import {IMetaVaultFactory} from "../interfaces/IMetaVaultFactory.sol";
6+
import {IMetaProxy} from "../interfaces/IMetaProxy.sol";
7+
import {MetaVaultProxy} from "./proxy/MetaVaultProxy.sol";
8+
import {IMetaVault, EnumerableSet} from "../interfaces/IMetaVault.sol";
9+
import {WrappedMetaVaultProxy} from "./proxy/WrappedMetaVaultProxy.sol";
10+
import {IWrappedMetaVault} from "../interfaces/IWrappedMetaVault.sol";
11+
12+
/// @title Factory of MetaVaults and WrappedMetaVaults
13+
/// @author Alien Deployer (https://github.com/a17)
14+
contract MetaVaultFactory is Controllable, IMetaVaultFactory {
15+
using EnumerableSet for EnumerableSet.AddressSet;
16+
17+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
18+
/* CONSTANTS */
19+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
20+
21+
/// @inheritdoc IControllable
22+
string public constant VERSION = "1.0.0";
23+
24+
// keccak256(abi.encode(uint256(keccak256("erc7201:stability.MetaVaultFactory")) - 1)) & ~bytes32(uint256(0xff));
25+
bytes32 private constant METAVAULTFACTORY_STORAGE_LOCATION =
26+
0x58b476403d8ac8a4d0530fd874c3ac691dfe1c48aec83d57fe82186c80386c00;
27+
28+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
29+
/* INITIALIZATION */
30+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
31+
32+
/// @inheritdoc IMetaVaultFactory
33+
function initialize(address platform_) public initializer {
34+
__Controllable_init(platform_);
35+
}
36+
37+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
38+
/* RESTRICTED ACTIONS */
39+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
40+
41+
/// @inheritdoc IMetaVaultFactory
42+
function setMetaVaultImplementation(address newImplementation) external onlyGovernanceOrMultisig {
43+
MetaVaultFactoryStorage storage $ = _getStorage();
44+
$.metaVaultImplementation = newImplementation;
45+
emit NewMetaVaultImplementation(newImplementation);
46+
}
47+
48+
/// @inheritdoc IMetaVaultFactory
49+
function setWrappedMetaVaultImplementation(address newImplementation) external onlyGovernanceOrMultisig {
50+
MetaVaultFactoryStorage storage $ = _getStorage();
51+
$.wrappedMetaVaultImplementation = newImplementation;
52+
emit NewWrappedMetaVaultImplementation(newImplementation);
53+
}
54+
55+
/// @inheritdoc IMetaVaultFactory
56+
function deployMetaVault(
57+
bytes32 salt,
58+
string memory type_,
59+
address pegAsset_,
60+
string memory name_,
61+
string memory symbol_,
62+
address[] memory vaults_,
63+
uint[] memory proportions_
64+
) external onlyOperator returns (address proxy) {
65+
proxy = address(new MetaVaultProxy{salt: salt}());
66+
IMetaProxy(proxy).initProxy();
67+
IMetaVault(proxy).initialize(platform(), type_, pegAsset_, name_, symbol_, vaults_, proportions_);
68+
69+
MetaVaultFactoryStorage storage $ = _getStorage();
70+
$.metaVaults.add(proxy);
71+
72+
emit NewMetaVault(proxy, type_, pegAsset_, name_, symbol_, vaults_, proportions_);
73+
}
74+
75+
/// @inheritdoc IMetaVaultFactory
76+
function deployWrapper(bytes32 salt, address metaVault) external onlyOperator returns (address proxy) {
77+
proxy = address(new WrappedMetaVaultProxy{salt: salt}());
78+
IMetaProxy(proxy).initProxy();
79+
IWrappedMetaVault(proxy).initialize(platform(), metaVault);
80+
81+
MetaVaultFactoryStorage storage $ = _getStorage();
82+
require($.wrapper[metaVault] == address(0), AlreadyExist());
83+
$.wrapper[metaVault] = proxy;
84+
85+
emit NewWrappedMetaVault(proxy, metaVault);
86+
}
87+
88+
/// @inheritdoc IMetaVaultFactory
89+
function upgradeMetaProxies(address[] memory metaProxies) external onlyOperator {
90+
uint len = metaProxies.length;
91+
for (uint i; i < len; ++i) {
92+
IMetaProxy(metaProxies[i]).upgrade();
93+
}
94+
}
95+
96+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
97+
/* VIEW FUNCTIONS */
98+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
99+
100+
/// @inheritdoc IMetaVaultFactory
101+
function metaVaultImplementation() external view returns (address) {
102+
return _getStorage().metaVaultImplementation;
103+
}
104+
105+
/// @inheritdoc IMetaVaultFactory
106+
function wrappedMetaVaultImplementation() external view returns (address) {
107+
return _getStorage().wrappedMetaVaultImplementation;
108+
}
109+
110+
/// @inheritdoc IMetaVaultFactory
111+
function getMetaVaultProxyInitCodeHash() external pure returns (bytes32) {
112+
return keccak256(abi.encodePacked(type(MetaVaultProxy).creationCode));
113+
}
114+
115+
/// @inheritdoc IMetaVaultFactory
116+
function getWrappedMetaVaultProxyInitCodeHash() external pure returns (bytes32) {
117+
return keccak256(abi.encodePacked(type(WrappedMetaVaultProxy).creationCode));
118+
}
119+
120+
/// @inheritdoc IMetaVaultFactory
121+
function getCreate2Address(
122+
bytes32 salt,
123+
bytes32 initCodeHash,
124+
address thisAddress
125+
) external pure returns (address) {
126+
return address(uint160(uint(keccak256(abi.encodePacked(bytes1(0xff), thisAddress, salt, initCodeHash)))));
127+
}
128+
129+
/// @inheritdoc IMetaVaultFactory
130+
function metaVaults() external view returns (address[] memory) {
131+
return _getStorage().metaVaults.values();
132+
}
133+
134+
/// @inheritdoc IMetaVaultFactory
135+
function wrapper(address metaVault) external view returns (address) {
136+
return _getStorage().wrapper[metaVault];
137+
}
138+
139+
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
140+
/* INTERNAL LOGIC */
141+
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
142+
143+
function _getStorage() private pure returns (MetaVaultFactoryStorage storage $) {
144+
//slither-disable-next-line assembly
145+
assembly {
146+
$.slot := METAVAULTFACTORY_STORAGE_LOCATION
147+
}
148+
}
149+
}

0 commit comments

Comments
 (0)