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
1 change: 1 addition & 0 deletions deployments/dev/534352/deployments.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"RoleRegistry": "0xa322a04d1e2Cb44672473740F9F35B057FA29CFB",
"SettlementDispatcherReap": "0xea6e574886797A65eD22CcF2307e48a83C355771",
"SettlementDispatcherRain": "0x26d90676C6aeF2a09Cf383af499cc67E9D6ad7CA",
"SettlementDispatcherPix": "0xBA0d6d689A0A2459C705D6210B42E45dB059D72f",
"TopUpDest": "0x06fe42Cf3C63412f1955758ce2798709476a38fd",
"TopUpDestNativeGateway": "0x023aA54c7bcC6257733Db28bc5b9C11b886a4578",
"OpenOceanSwapModule": "0x976e56Bb016A39480dD9c5044F52f3766212A376",
Expand Down
1 change: 1 addition & 0 deletions deployments/mainnet/534352/deployments.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"RoleRegistry": "0x5C1E3D653fcbC54Ae25c2AD9d59548D2082C687B",
"SettlementDispatcherReap": "0x9623e86Df854FF3b48F7B4079a516a4F64861Db2",
"SettlementDispatcherRain": "0x50A233C4a0Bb1d7124b0224880037d35767a501C",
"SettlementDispatcherPix": "0xc5F2764383f93259Fba1D820b894B1DE0d47937e",
"TopUpDest": "0x3a6A724595184dda4be69dB1Ce726F2Ac3D66B87",
"TopUpDestNativeGateway": "0x83393192c7e8B3b9250312387f7C6B26495736aA",
"OpenOceanSwapModule": "0x4dEAa5f2e1CD1A792304d1649EdfA35D565F9346",
Expand Down
8 changes: 3 additions & 5 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,9 @@ scroll = "${SCROLL_RPC}"
base = "${BASE_RPC}"

[etherscan]
mainnet = { key = "${MAINNET_ETHERSCAN_KEY}" }
scroll = { key = "${SCROLLSCAN_KEY}" }
base = { key = "${BASESCAN_KEY}" }


mainnet = { key = "${ETHERSCAN_KEY}" }
scroll = { key = "${ETHERSCAN_KEY}" }
base = { key = "${ETHERSCAN_KEY}" }

[fmt]
line_length = 500
Expand Down
42 changes: 42 additions & 0 deletions output/UpgradePix.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"chainId": "534352",
"safeAddress": "0xa6cf33124cb342d1c604cac87986b965f428aac4",
"meta": { "txBuilderVersion": "1.16.5" },
"transactions": [
{
"to": "0x0078c5a459132e279056b2371fe8a8ec973a9553",
"value": "0",
"data": "0x4f1ef286000000000000000000000000d840dac5a5cee82dc1a898a184a1fa7e9df97bf700000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000"
},
{
"to": "0x0078c5a459132e279056b2371fe8a8ec973a9553",
"value": "0",
"data": "0xfc0cfeee0000000000000000000000000c37dfd6b0649a9560bca0cd8a9b300b5fd11089"
},
{
"to": "0x7ca0b75e67e33c0014325b739a8d019c4fe445f0",
"value": "0",
"data": "0x4f1ef286000000000000000000000000e9ee6923d41cf5f964f11065436bd90d4577b5e400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000"
},
{
"to": "0x7ca0b75e67e33c0014325b739a8d019c4fe445f0",
"value": "0",
"data": "0xd69fd6050000000000000000000000000052f731a6bea541843385ffba408f52b74cb624"
},
{
"to": "0x380b2e96799405be6e3d965f4044099891881acb",
"value": "0",
"data": "0x4f1ef2860000000000000000000000008c370794f54f00f12580913e4456d377ea11698400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000"
},
{
"to": "0x7ca0b75e67e33c0014325b739a8d019c4fe445f0",
"value": "0",
"data": "0x076b7a440000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c5f2764383f93259fba1d820b894b1de0d47937e"
},
{
"to": "0xc5F2764383f93259Fba1D820b894B1DE0d47937e",
"value": "0",
"data": "0x2b03a50c00000000000000000000000008c6f91e2b681faf5e17227f2a44c307b3c1364c00000000000000000000000038fc1ba73b7ed289955a07d9f11a85b6e388064a"
}
]
}
115 changes: 115 additions & 0 deletions scripts/UpgradePix.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import { stdJson } from "forge-std/StdJson.sol";
import { Test } from "forge-std/Test.sol";

import { UUPSProxy } from "../src/UUPSProxy.sol";
import { BinSponsor, SettlementDispatcher } from "../src/settlement-dispatcher/SettlementDispatcher.sol";
import { CashModuleCore } from "../src/modules/cash/CashModuleCore.sol";
import { CashModuleSetters } from "../src/modules/cash/CashModuleSetters.sol";
import { CashEventEmitter } from "../src/modules/cash/CashEventEmitter.sol";
import { DebtManagerCore } from "../src/debt-manager/DebtManagerCore.sol";
import { DebtManagerAdmin } from "../src/debt-manager/DebtManagerAdmin.sol";
import { GnosisHelpers } from "./utils/GnosisHelpers.sol";
import { Utils } from "./utils/Utils.sol";

contract UpgradePix is GnosisHelpers, Utils, Test {
address cashControllerSafe = 0xA6cf33124cb342D1c604cAC87986B965F428AAC4;

SettlementDispatcher pixSettlementDispatcherImpl;
UUPSProxy pixSettlementDispatcherProxy;

address cashModule;
address cashEventEmitter;
address debtManager;
address dataProvider;
address roleRegistry;

address cashModuleCoreImpl;
address cashModuleSettersImpl;
address cashEventEmitterImpl;
address debtManagerCoreImpl;
address debtManagerAdminImpl;

address[] withdrawTokens;
bool[] shouldWhitelist;

address public usdc = 0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4;
address public usdt = 0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df;
address public liquidUsd = 0x08c6F91e2B681FaF5e17227F2a44C307b3C1364C;
address public liquidUsdBoringQueue = 0x38FC1BA73b7ED289955a07d9F11A85b6E388064A;

function run() public {
string memory deployments = readDeploymentFile();
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");

vm.startBroadcast(deployerPrivateKey);

roleRegistry = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "RoleRegistry")
);
cashModule = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "CashModule")
);
debtManager = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "DebtManager")
);
cashEventEmitter = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "CashEventEmitter")
);
dataProvider = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "EtherFiDataProvider")
);

pixSettlementDispatcherImpl = new SettlementDispatcher(BinSponsor.PIX, dataProvider);

address[] memory tokens = new address[](2);
tokens[0] = usdc;
tokens[1] = usdt;

SettlementDispatcher.DestinationData[] memory destDatas = new SettlementDispatcher.DestinationData[](2);

destDatas[0] = SettlementDispatcher.DestinationData({
destEid: 0,
destRecipient: 0x6f7F522075AA5483d049dF0Ef81FcdD3b0ace7f4,
stargate: address(0),
useCanonicalBridge: true,
minGasLimit: 0
});
destDatas[1] = SettlementDispatcher.DestinationData({
destEid: 0,
destRecipient: 0x6f7F522075AA5483d049dF0Ef81FcdD3b0ace7f4,
stargate: address(0),
useCanonicalBridge: true,
minGasLimit: 0
});

pixSettlementDispatcherProxy = new UUPSProxy(
address(pixSettlementDispatcherImpl),
abi.encodeWithSelector(SettlementDispatcher.initialize.selector, roleRegistry, tokens, destDatas)
);

cashModuleCoreImpl = address(new CashModuleCore(dataProvider));
cashModuleSettersImpl = address(new CashModuleSetters(dataProvider));
debtManagerCoreImpl = address(new DebtManagerCore(dataProvider));
cashEventEmitterImpl = address(new CashEventEmitter(cashModule));
debtManagerAdminImpl = address(new DebtManagerAdmin(dataProvider));

UUPSUpgradeable(debtManager).upgradeToAndCall(debtManagerCoreImpl, "");
DebtManagerCore(debtManager).setAdminImpl(debtManagerAdminImpl);
UUPSUpgradeable(cashModule).upgradeToAndCall(cashModuleCoreImpl, "");
CashModuleCore(cashModule).setCashModuleSettersAddress(cashModuleSettersImpl);
UUPSUpgradeable(cashEventEmitter).upgradeToAndCall(cashEventEmitterImpl, "");
CashModuleSetters(cashModule).setSettlementDispatcher(BinSponsor.PIX, address(pixSettlementDispatcherProxy));
SettlementDispatcher(address(pixSettlementDispatcherProxy)).setLiquidAssetWithdrawQueue(liquidUsd, liquidUsdBoringQueue);

vm.stopBroadcast();
}
}
145 changes: 145 additions & 0 deletions scripts/gnosis-txs/UpgradePix.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import { IERC20 } from "@openzeppelin/contracts/interfaces/IERC20.sol";
import {stdJson} from "forge-std/StdJson.sol";

import { UUPSProxy } from "../../src/UUPSProxy.sol";
import { BinSponsor, SettlementDispatcher } from "../../src/settlement-dispatcher/SettlementDispatcher.sol";
import { CashModuleCore } from "../../src/modules/cash/CashModuleCore.sol";
import { CashModuleSetters } from "../../src/modules/cash/CashModuleSetters.sol";
import { CashEventEmitter } from "../../src/modules/cash/CashEventEmitter.sol";
import { DebtManagerCore } from "../../src/debt-manager/DebtManagerCore.sol";
import { DebtManagerAdmin } from "../../src/debt-manager/DebtManagerAdmin.sol";
import { GnosisHelpers } from "../utils/GnosisHelpers.sol";
import { Utils } from "../utils/Utils.sol";

contract UpgradePix is GnosisHelpers, Utils {
address cashControllerSafe = 0xA6cf33124cb342D1c604cAC87986B965F428AAC4;

SettlementDispatcher pixSettlementDispatcherImpl;
UUPSProxy pixSettlementDispatcherProxy;

address cashModule;
address cashEventEmitter;
address debtManager;
address dataProvider;
address roleRegistry;

address cashModuleCoreImpl;
address cashModuleSettersImpl;
address cashEventEmitterImpl;
address debtManagerCoreImpl;
address debtManagerAdminImpl;

address public usdc = 0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4;
address public usdt = 0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df;
address public liquidUsd = 0x08c6F91e2B681FaF5e17227F2a44C307b3C1364C;
address public liquidUsdBoringQueue = 0x38FC1BA73b7ED289955a07d9F11A85b6E388064A;

function run() public {
string memory deployments = readDeploymentFile();
// uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");

vm.startBroadcast();

roleRegistry = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "RoleRegistry")
);
cashModule = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "CashModule")
);
debtManager = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "DebtManager")
);
cashEventEmitter = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "CashEventEmitter")
);
dataProvider = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "EtherFiDataProvider")
);

require(roleRegistry != address(0), "Invalid roleRegistry");
require(cashModule != address(0), "Invalid cashModule");
require(debtManager != address(0), "Invalid debtManager");
require(cashEventEmitter != address(0), "Invalid cashEventEmitter");
require(dataProvider != address(0), "Invalid dataProvider");

pixSettlementDispatcherImpl = new SettlementDispatcher(BinSponsor.PIX, dataProvider);

address[] memory tokens = new address[](2);
tokens[0] = usdc;
tokens[1] = usdt;

SettlementDispatcher.DestinationData[] memory destDatas = new SettlementDispatcher.DestinationData[](2);

destDatas[0] = SettlementDispatcher.DestinationData({
destEid: 0,
destRecipient: 0x6f7F522075AA5483d049dF0Ef81FcdD3b0ace7f4,
stargate: address(0),
useCanonicalBridge: true,
minGasLimit: 0
});
destDatas[1] = SettlementDispatcher.DestinationData({
destEid: 0,
destRecipient: 0x6f7F522075AA5483d049dF0Ef81FcdD3b0ace7f4,
stargate: address(0),
useCanonicalBridge: true,
minGasLimit: 0
});

pixSettlementDispatcherProxy = new UUPSProxy(
address(pixSettlementDispatcherImpl),
abi.encodeWithSelector(SettlementDispatcher.initialize.selector, roleRegistry, tokens, destDatas)
);

cashModuleCoreImpl = address(new CashModuleCore(dataProvider));
cashModuleSettersImpl = address(new CashModuleSetters(dataProvider));
debtManagerCoreImpl = address(new DebtManagerCore(dataProvider));
cashEventEmitterImpl = address(new CashEventEmitter(cashModule));
debtManagerAdminImpl = address(new DebtManagerAdmin(dataProvider));

string memory txs = getGnosisTransactions();

string memory path = string.concat("./output/UpgradePix.json");
vm.writeFile(path, txs);

vm.stopBroadcast();

executeGnosisTransactionBundle(path);
}

function getGnosisTransactions() internal view returns (string memory) {
string memory chainId = vm.toString(block.chainid);
string memory txs = _getGnosisHeader(chainId, addressToHex(cashControllerSafe));

string memory debtManagerCoreUpgrade = iToHex(abi.encodeWithSelector(UUPSUpgradeable.upgradeToAndCall.selector, debtManagerCoreImpl, ""));
txs = string(abi.encodePacked(txs, _getGnosisTransaction(addressToHex(debtManager), debtManagerCoreUpgrade, "0", false)));

string memory debtManagerAdminUpgrade = iToHex(abi.encodeWithSelector(DebtManagerCore.setAdminImpl.selector, debtManagerAdminImpl));
txs = string(abi.encodePacked(txs, _getGnosisTransaction(addressToHex(debtManager), debtManagerAdminUpgrade, "0", false)));

string memory cashModuleCoreUpgrade = iToHex(abi.encodeWithSelector(UUPSUpgradeable.upgradeToAndCall.selector, cashModuleCoreImpl, ""));
txs = string(abi.encodePacked(txs, _getGnosisTransaction(addressToHex(cashModule), cashModuleCoreUpgrade, "0", false)));

string memory cashModuleSettersUpgrade = iToHex(abi.encodeWithSelector(CashModuleCore.setCashModuleSettersAddress.selector, cashModuleSettersImpl));
txs = string(abi.encodePacked(txs, _getGnosisTransaction(addressToHex(cashModule), cashModuleSettersUpgrade, "0", false)));

string memory cashEventEmitterUpgrade = iToHex(abi.encodeWithSelector(UUPSUpgradeable.upgradeToAndCall.selector, cashEventEmitterImpl, ""));
txs = string(abi.encodePacked(txs, _getGnosisTransaction(addressToHex(cashEventEmitter), cashEventEmitterUpgrade, "0", false)));

string memory setSettlementDispatcher = iToHex(abi.encodeWithSelector(CashModuleSetters.setSettlementDispatcher.selector, BinSponsor.PIX, address(pixSettlementDispatcherProxy)));
txs = string(abi.encodePacked(txs, _getGnosisTransaction(addressToHex(cashModule), setSettlementDispatcher, "0", false)));

string memory setLiquidAssetWithdrawQueue = iToHex(abi.encodeWithSelector(SettlementDispatcher.setLiquidAssetWithdrawQueue.selector, liquidUsd, liquidUsdBoringQueue));
txs = string(abi.encodePacked(txs, _getGnosisTransaction(addressToHex(address(pixSettlementDispatcherProxy)), setLiquidAssetWithdrawQueue, "0", true)));

return txs;
}
}
3 changes: 2 additions & 1 deletion src/interfaces/ICashModule.sol
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ struct TokenDataInUsd {
*/
enum BinSponsor {
Reap,
Rain
Rain,
PIX
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/modules/cash/CashModuleCore.sol
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ contract CashModuleCore is CashModuleStorageContract {
*/
function getSettlementDispatcher(BinSponsor binSponsor) public view returns (address settlementDispatcher) {
if (binSponsor == BinSponsor.Rain) settlementDispatcher = _getCashModuleStorage().settlementDispatcherRain;
else if (binSponsor == BinSponsor.PIX) settlementDispatcher = _getCashModuleStorage().settlementDispatcherPix;
else settlementDispatcher = _getCashModuleStorage().settlementDispatcherReap;

if (settlementDispatcher == address(0)) revert SettlementDispatcherNotSetForBinSponsor();
Expand Down
6 changes: 4 additions & 2 deletions src/modules/cash/CashModuleSetters.sol
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,10 @@ contract CashModuleSetters is CashModuleStorageContract {
if (binSponsor == BinSponsor.Rain) {
$.cashEventEmitter.emitSettlementDispatcherUpdated(binSponsor, $.settlementDispatcherRain, dispatcher);
$.settlementDispatcherRain = dispatcher;
}
else {
} else if (binSponsor == BinSponsor.PIX) {
$.cashEventEmitter.emitSettlementDispatcherUpdated(binSponsor, $.settlementDispatcherPix, dispatcher);
$.settlementDispatcherPix = dispatcher;
} else {
$.cashEventEmitter.emitSettlementDispatcherUpdated(binSponsor, $.settlementDispatcherReap, dispatcher);
$.settlementDispatcherReap = dispatcher;
}
Expand Down
2 changes: 2 additions & 0 deletions src/modules/cash/CashModuleStorageContract.sol
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ contract CashModuleStorageContract is UpgradeableProxy, ModuleBase {
mapping(address account => mapping(address token => uint256 pendingCashback)) pendingCashbackForTokenInUsd;
/// @notice Addresses of modules that can request withdrawals on behalf of safes
EnumerableSetLib.AddressSet whitelistedModulesCanRequestWithdraw;
/// @notice Address of the SettlementDispatcher for PIX
address settlementDispatcherPix;
}

// keccak256(abi.encode(uint256(keccak256("etherfi.storage.CashModuleStorage")) - 1)) & ~bytes32(uint256(0xff))
Expand Down
Loading
Loading