From 4b123eac3d9bd75ccea0d93923b3b86c4242b22b Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Tue, 29 Sep 2026 09:55:15 +1000 Subject: [PATCH 1/3] chore(deploy): add HyperEVM strategy proxy descriptor --- .../CrossChainStrategyHyperEVMProxy.json | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 contracts/deployments/mainnet/CrossChainStrategyHyperEVMProxy.json diff --git a/contracts/deployments/mainnet/CrossChainStrategyHyperEVMProxy.json b/contracts/deployments/mainnet/CrossChainStrategyHyperEVMProxy.json new file mode 100644 index 0000000000..5ce8d0710c --- /dev/null +++ b/contracts/deployments/mainnet/CrossChainStrategyHyperEVMProxy.json @@ -0,0 +1,190 @@ +{ + "address": "0xE0228DB13F8C4Eb00fD1e08e076b09eF5cD0EA1e", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousGovernor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newGovernor", + "type": "address" + } + ], + "name": "GovernorshipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousGovernor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newGovernor", + "type": "address" + } + ], + "name": "PendingGovernorshipTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimGovernance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "governor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "_initGovernor", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "isGovernor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newGovernor", + "type": "address" + } + ], + "name": "transferGovernance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "storageLayout": { + "storage": [], + "types": {} + } +} From 471ef1e7097266184b2ffa8f8460fbd085ea2b73 Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Tue, 29 Sep 2026 10:00:58 +1000 Subject: [PATCH 2/3] chore(deploy): add Base strategy proxy descriptor --- .../mainnet/CrossChainStrategyProxy.json | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 contracts/deployments/mainnet/CrossChainStrategyProxy.json diff --git a/contracts/deployments/mainnet/CrossChainStrategyProxy.json b/contracts/deployments/mainnet/CrossChainStrategyProxy.json new file mode 100644 index 0000000000..836c22fe2f --- /dev/null +++ b/contracts/deployments/mainnet/CrossChainStrategyProxy.json @@ -0,0 +1,190 @@ +{ + "address": "0xB1d624fc40824683e2bFBEfd19eB208DbBE00866", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousGovernor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newGovernor", + "type": "address" + } + ], + "name": "GovernorshipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousGovernor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newGovernor", + "type": "address" + } + ], + "name": "PendingGovernorshipTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimGovernance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "governor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "_initGovernor", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "isGovernor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newGovernor", + "type": "address" + } + ], + "name": "transferGovernance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "storageLayout": { + "storage": [], + "types": {} + } +} From f1e0178c7d703afe9be9bd61f913399fc5253213 Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Tue, 29 Sep 2026 10:07:59 +1000 Subject: [PATCH 3/3] feat(tasks): allocate before vault rebases --- contracts/docs/ACTIONS.md | 6 +++--- contracts/tasks/actions/otokenOethRebase.ts | 15 ++++++++++++++- contracts/tasks/actions/otokenOethbRebase.ts | 11 +++++++++-- contracts/tasks/actions/otokenOusdRebase.ts | 15 ++++++++++++++- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/contracts/docs/ACTIONS.md b/contracts/docs/ACTIONS.md index d015b2f80b..0e941b4d4f 100644 --- a/contracts/docs/ACTIONS.md +++ b/contracts/docs/ACTIONS.md @@ -18,11 +18,11 @@ Cron times are UTC. Enable state and operational caveats (e.g. "do not enable", | Action | Network | Cron | Description | | ---------------------- | ------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| `otokenOusdRebase` | mainnet | `45 11,23 * * *` | Rebase OUSD on mainnet | -| `otokenOethRebase` | mainnet | `45 11,23 * * *` | Rebase OETH on mainnet | +| `otokenOusdRebase` | mainnet | `45 11,23 * * *` | Allocate idle assets and rebase OUSD on mainnet | +| `otokenOethRebase` | mainnet | `45 11,23 * * *` | Allocate idle assets and rebase OETH on mainnet | | `otokenOusdOethRebase` | mainnet | `45 11,23 * * *` | Collect OETH and rebase OUSD on mainnet | | `otokenOsRebase` | sonic | `45 11,23 * * *` | Collect the OS dripper and rebase OS on Sonic | -| `otokenOethbRebase` | base | `25 9,21 * * *` | Rebase the OETHb vault on Base | +| `otokenOethbRebase` | base | `25 9,21 * * *` | Allocate idle assets and rebase the SuperOETH (OETHb) vault on Base | | `permissionedRebase` | mainnet | `15 10,22 * * *` | `permissionedRebase()` every managed vault via the Safe module (unpause → rebase → re-pause atomically) | | `permissionedRebase` | base | `15 10,22 * * *` | As above, on Base | | `permissionedRebase` | sonic | `15 10,22 * * *` | As above, on Sonic | diff --git a/contracts/tasks/actions/otokenOethRebase.ts b/contracts/tasks/actions/otokenOethRebase.ts index 6296251b04..9a0afe2c21 100644 --- a/contracts/tasks/actions/otokenOethRebase.ts +++ b/contracts/tasks/actions/otokenOethRebase.ts @@ -6,13 +6,26 @@ const GAS_MULTIPLIER = 1.1; action({ name: "otokenOethRebase", - description: "Rebase OETH on mainnet", + description: "Allocate idle OETH assets and rebase OETH on mainnet", chains: [1], run: async ({ signer, log }) => { const oethVaultProxy = await getContract("OETHVaultProxy"); const oethVault = await getContractAt("IVault", oethVaultProxy.address); const oethVaultWithSigner = oethVault.connect(signer); + log.info("Estimating gas for OETH allocation"); + const allocateGas = await oethVaultWithSigner.estimateGas.allocate(); + const allocateGasLimit = allocateGas + .mul(Math.floor(GAS_MULTIPLIER * 100)) + .div(100); + const allocateTx = await oethVaultWithSigner.allocate({ + gasLimit: allocateGasLimit, + }); + await logTxDetails( + allocateTx, + `allocate (gasLimit: ${allocateGasLimit.toString()})` + ); + log.info("Estimating gas for OETH rebase"); const gas = await oethVaultWithSigner.estimateGas.rebase(); const gasLimit = gas.mul(Math.floor(GAS_MULTIPLIER * 100)).div(100); diff --git a/contracts/tasks/actions/otokenOethbRebase.ts b/contracts/tasks/actions/otokenOethbRebase.ts index e4bed6d61f..f3d552e8fc 100644 --- a/contracts/tasks/actions/otokenOethbRebase.ts +++ b/contracts/tasks/actions/otokenOethbRebase.ts @@ -6,14 +6,21 @@ const VAULT_PROXY_DEPLOYMENT = "OETHBaseVaultProxy"; action({ name: "otokenOethbRebase", - description: "Rebase OETHb vault on Base", + description: "Allocate idle SuperOETH assets and rebase OETHb on Base", chains: [8453], run: async ({ signer, log }) => { const vaultProxy = await getContract(VAULT_PROXY_DEPLOYMENT); const vault = await getContractAt("IVault", vaultProxy.address); + const vaultWithSigner = vault.connect(signer); + + log.info( + `Calling allocate on ${VAULT_PROXY_DEPLOYMENT} at ${vault.address}` + ); + const allocateTx = await vaultWithSigner.allocate(); + await logTxDetails(allocateTx, "allocate"); log.info(`Calling rebase on ${VAULT_PROXY_DEPLOYMENT} at ${vault.address}`); - const tx = await vault.connect(signer).rebase(); + const tx = await vaultWithSigner.rebase(); await logTxDetails(tx, "rebase"); }, }); diff --git a/contracts/tasks/actions/otokenOusdRebase.ts b/contracts/tasks/actions/otokenOusdRebase.ts index be68340511..f238f9dd24 100644 --- a/contracts/tasks/actions/otokenOusdRebase.ts +++ b/contracts/tasks/actions/otokenOusdRebase.ts @@ -6,13 +6,26 @@ const GAS_MULTIPLIER = 1.1; action({ name: "otokenOusdRebase", - description: "Rebase OUSD on mainnet", + description: "Allocate idle OUSD assets and rebase OUSD on mainnet", chains: [1], run: async ({ signer, log }) => { const vaultProxy = await getContract("VaultProxy"); const ousdVault = await getContractAt("IVault", vaultProxy.address); const ousdVaultWithSigner = ousdVault.connect(signer); + log.info("Estimating gas for OUSD allocation"); + const allocateGas = await ousdVaultWithSigner.estimateGas.allocate(); + const allocateGasLimit = allocateGas + .mul(Math.floor(GAS_MULTIPLIER * 100)) + .div(100); + const allocateTx = await ousdVaultWithSigner.allocate({ + gasLimit: allocateGasLimit, + }); + await logTxDetails( + allocateTx, + `allocate (gasLimit: ${allocateGasLimit.toString()})` + ); + // OUSD rebase with gas estimation + 10% buffer log.info("Estimating gas for OUSD rebase"); const ousdGas = await ousdVaultWithSigner.estimateGas.rebase();