From 7853e4c4b82f2d388a9c5f0c820943bf33f2bc68 Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Mon, 26 May 2025 20:15:16 +1000 Subject: [PATCH 1/6] Updated Sonic ARM contract diagram --- docs/plantuml/sonicContracts.png | Bin 36074 -> 36987 bytes docs/plantuml/sonicContracts.puml | 74 ++++++++++++++++++------------ 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/docs/plantuml/sonicContracts.png b/docs/plantuml/sonicContracts.png index 2865744848b97ad5da742475c509323668ba041b..72d536923528e5c6ae5d0e601bd85af951d61a09 100644 GIT binary patch literal 36987 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 literal 36074 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%0DhRO?`nYHY~q6<$^5NHpJIVA zf=Aj|Tk9luWfEgD^>U|#Ln!Erys$3wBVBs|E&1U4>q^=+TX8dq^Zgs)e0b*+j z;1%#7FKfo}tC{dl*jMh2hS99cec%q-gH-`LNP;rtM(d>0!@Aw4b-Thzg~?&!z`Ym7 zZIM55_;PpTQ-iU3o|NVa%r8R=In_4KcAughedwK&)DJj)Bq_oTkNdJ6T~=B`RQu}+ z1Uy-faz`PBJbD${=yp{K1h4HCaeFBva&rYbc|nL;!t`)S9a@)Ur6ti_)qv~-+S!JO zhex!Ia-HZf3iQCl2vssYSiV6GJ_fw8l%s2OF0fD~B_*^E-g+1NWu!z1`#t5f>!@&i zvHcRTN+`09ebc9`3!ByH4VPPlJb|= zi7Z$NzNO*+bBx@8>4}6BSBEEf&JQ-}!=UBTozaJUNlA#AS!&Q|xCa4NVl}7rdq3#_ zQ@Fmd5hkuZ3`MC5AJmzV$Ut|7{_fpJi?2gQKd6g8`w_(~aR?I0n?)<2h4}H~$EaB4 z1G;OT@pJUBr5%elKml&@@-&MaJwD6dj5kX}wfb$j-v2??qr!WHzf1L(m84{`K$tQk zJqHOQTTT!p_7#{9q0P#6JJcV_sBa^t9tYG*8mz^Pj0_>EDo554aGyw`Qf&;uk&uv( z7{$AuJ|HVXK!g&g8HkLeIxlwnm8?)Eq;ZhP42*J_{xexYigtF}U}14Fr!thLM+t%l z@mo*zDw)TUK}KpK+?ur9!diK!aA#v7BPV$R0uJ3;d|y;@P;jskgg(qOzke^o7SJkS z2I4XLw_f1Rx$dl`S$e_yGHfk1V#R!*fvGv$Bd1+Y42%1fbqcmatnA__YRpCh)^;~+ zk&`s{2^gvPPP(s6_4Q0v5ltY}$g;f)I^bH0BE8$N&(oj5Qixfs4H2ujC6KU?^tu6F++}g6@->JLDGf#RCXUSpm!OTZsjNA2t@66!i*UXyMMy{?70Q8VKL&04F1gxW zPhSeQ4F|$3_1+9^Pd@z4qI!P=yzTY}2p|6fSO^vXW)L!~|Mw3RG!M>FyXgM7uJBU` Q&U8#l3?rH?^7Qrp0+hh8y8r+H diff --git a/docs/plantuml/sonicContracts.puml b/docs/plantuml/sonicContracts.puml index 1843a1c..0ab4197 100644 --- a/docs/plantuml/sonicContracts.puml +++ b/docs/plantuml/sonicContracts.puml @@ -16,14 +16,16 @@ end legend title "Sonic Automated Redemption Manager (ARM) Contract Dependencies" -object "Zapper" as zap #$originColor { +object "Sonic Zapper" as zap #$originColor { + asset: S } object "Origin ARM" as originArm <> #$originColor { + assets: OS, wS } -object "Beets ARM" as beetsArm <> #$originColor { -} +' object "Beets ARM" as beetsArm <> #$originColor { +' } ' object "Angles ARM" as anglesArm <> #$originColor { ' } @@ -32,8 +34,8 @@ object "Beets ARM" as beetsArm <> #$originColor { ' } object "Origin\nCapManager" as osCapMan <> #$originColor { } -object "Beets\nCapManager" as stCapMan <> #$originColor { -} +' object "Beets\nCapManager" as stCapMan <> #$originColor { +' } ' object "Angles\nCapManager" as anCapMan <> #$originColor { ' } @@ -43,10 +45,19 @@ object "Beets\nCapManager" as stCapMan <> #$originColor { ' object "Strategy" as strat <> #$originColor { ' } -object "Silo\nStrategies" as siloStrategy #$originColor { +object "Silo\nStrategy" as siloStrategy #$originColor { + asset: wS } -object "Silo\nLending\nMarkets" as siloLend #$thirdPartyColor { +object "Varlamore\nVault" as siloVault <> #$thirdPartyColor { + asset: wS +} +object "Varlamore\nGauge" as siloGauge <> #$thirdPartyColor { + asset: wS +} + +object "Lending\nMarkets" as siloLend <> #$thirdPartyColor { + markets: stS, wOS, wanS, beS } ' object "Lending\nMarket\nGauge" as gauge #$thirdPartyColor { ' } @@ -54,29 +65,32 @@ object "Silo\nLending\nMarkets" as siloLend #$thirdPartyColor { ' } object "OS\nVault" as os <> #$originColor { + asset: wS } -object "Beets\nVault" as beets #$thirdPartyColor { -} +' object "Beets\nVault" as beets #$thirdPartyColor { +' } ' object "Angles\nVault" as angles #$thirdPartyColor { ' } object "Origin\nHarvester" as osHarv #$originColor { + reward: SILO } -object "Beets\nHarvester" as stHarv #$originColor { -} +' object "Beets\nHarvester" as stHarv #$originColor { +' } -object "Magpie\nRouter" as magpie #$thirdPartyColor { +object "Router" as magpie <> #$thirdPartyColor { + pair: SILO/wS } -object "Price\nProvider" as priceProvider #$originColor { - Assets: Silo -} +' object "Price\nProvider" as priceProvider #$originColor { +' Assets: Silo +' } -object "Silo\nOracle" as siloOracle #$thirdPartyColor { -} +' object "Silo\nOracle" as siloOracle #$thirdPartyColor { +' } ' arm .> strat : ERC-4626 ' strat .> lend : ERC-4626 @@ -84,38 +98,40 @@ object "Silo\nOracle" as siloOracle #$thirdPartyColor { ' arm ..> lst zap ..> originArm -zap ..> beetsArm +' zap ..> beetsArm ' zap ..> anglesArm ' originArm <..> capMan ' beetsArm <..> capMan ' anglesArm <..> capMan originArm <.> osCapMan -beetsArm <.> stCapMan +' beetsArm <.> stCapMan ' anglesArm <..> anCapMan originArm <... osHarv -beetsArm <... stHarv +' beetsArm <... stHarv osHarv .> siloStrategy -stHarv .> siloStrategy +' stHarv .> siloStrategy -originArm ...> siloStrategy -beetsArm ...> siloStrategy +originArm ..> siloStrategy +siloStrategy ..> siloVault +siloStrategy ..> siloGauge +siloVault ..> siloLend +' beetsArm ...> siloStrategy ' anglesArm ..> lend originArm ..> os -beetsArm ..> beets +' beetsArm ..> beets ' anglesArm ...> angles osHarv ..> magpie -stHarv ..> magpie +' stHarv ..> magpie -osHarv ..> priceProvider -stHarv ..> priceProvider -priceProvider ..> siloOracle +' osHarv ..> priceProvider +' stHarv ..> priceProvider +' priceProvider ..> siloOracle -siloStrategy ..> siloLend @enduml \ No newline at end of file From 71b8bc7ce3d40aef6d7cdfc0740378a6cacd29f7 Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Thu, 29 May 2025 12:32:36 +1000 Subject: [PATCH 2/6] Fixed allocate hardhat task --- src/js/tasks/admin.js | 2 +- src/js/tasks/tasks.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/tasks/admin.js b/src/js/tasks/admin.js index 6a00fa2..765f6b3 100644 --- a/src/js/tasks/admin.js +++ b/src/js/tasks/admin.js @@ -4,7 +4,7 @@ const log = require("../utils/logger")("task:admin"); async function allocate({ arm, signer }) { log(`About to allocate to/from the active lending market`); - const tx = await arm.connect(signer).collectFees(); + const tx = await arm.connect(signer).allocate(); await logTxDetails(tx, "allocate"); } diff --git a/src/js/tasks/tasks.js b/src/js/tasks/tasks.js index 2c45d83..4380ce0 100644 --- a/src/js/tasks/tasks.js +++ b/src/js/tasks/tasks.js @@ -874,7 +874,7 @@ subtask("allocate", "Allocate to/from the active lending market") .addOptionalParam( "arm", "The name of the ARM. eg Lido, OETH or Origin", - "Lido", + "Origin", types.string ) .setAction(async ({ arm }) => { From 497ad13cfc9d669cc30475c39e2f24533d168a95 Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Thu, 29 May 2025 20:15:31 +1000 Subject: [PATCH 3/6] Deployed Defender Actions --- README.md | 10 + src/abis/OriginARM.json | 1104 ++++++++++++++++++++ src/js/actions/allocateSonic.js | 35 + src/js/actions/autoRequestWithdrawSonic.js | 2 +- src/js/actions/collectFeesSonic.js | 2 +- src/js/actions/rollup.config.cjs | 8 + src/js/tasks/sonicHarvest.js | 8 +- 7 files changed, 1162 insertions(+), 7 deletions(-) create mode 100644 src/abis/OriginARM.json create mode 100644 src/js/actions/allocateSonic.js diff --git a/README.md b/README.md index 5411c22..084d9e5 100644 --- a/README.md +++ b/README.md @@ -251,6 +251,11 @@ npx hardhat setActionVars --id c010fb76-ea63-409d-9981-69322d27993a npx hardhat setActionVars --id 127171fd-7b85-497e-8335-fd7907c08386 npx hardhat setActionVars --id 84b5f134-8351-4402-8f6a-fb4376034bc4 npx hardhat setActionVars --id ffcfc580-7b0a-42ed-a4f2-3f0a3add9779 +npx hardhat setActionVars --id 32dbc67b-89f3-4856-8f3d-ad4dc5a09322 +npx hardhat setActionVars --id 7a0cb2c9-11c2-41dd-bcd0-d7c2dbda6af6 +npx hardhat setActionVars --id +npx hardhat setActionVars --id 12977d51-d107-45eb-ac20-45942009ab01 +npx hardhat setActionVars --id 6ec46510-0b8e-48b4-a4c8-de759aad0ba4 # The Defender autotask client uses generic env var names so we'll set them first from the values in the .env file export API_KEY= @@ -263,6 +268,11 @@ npx defender-autotask update-code c010fb76-ea63-409d-9981-69322d27993a ./dist/au npx defender-autotask update-code 127171fd-7b85-497e-8335-fd7907c08386 ./dist/autoClaimLidoWithdraw npx defender-autotask update-code 84b5f134-8351-4402-8f6a-fb4376034bc4 ./dist/collectLidoFees npx defender-autotask update-code ffcfc580-7b0a-42ed-a4f2-3f0a3add9779 ./dist/setPrices +npx defender-autotask update-code 32dbc67b-89f3-4856-8f3d-ad4dc5a09322 ./dist/collectFeesSonic +npx defender-autotask update-code 7a0cb2c9-11c2-41dd-bcd0-d7c2dbda6af6 ./dist/allocateSonic +npx defender-autotask update-code ./dist/collectRewardsSonic +npx defender-autotask update-code 12977d51-d107-45eb-ac20-45942009ab01 ./dist/autoRequestWithdrawSonic +npx defender-autotask update-code 6ec46510-0b8e-48b4-a4c8-de759aad0ba4 ./dist/autoClaimWithdrawSonic ``` `rollup` and `defender-autotask` can be installed globally to avoid the `npx` prefix. diff --git a/src/abis/OriginARM.json b/src/abis/OriginARM.json new file mode 100644 index 0000000..39191d4 --- /dev/null +++ b/src/abis/OriginARM.json @@ -0,0 +1,1104 @@ +[ + { + "inputs": [ + { "internalType": "address", "name": "_otoken", "type": "address" }, + { + "internalType": "address", + "name": "_liquidityAsset", + "type": "address" + }, + { "internalType": "address", "name": "_vault", "type": "address" }, + { "internalType": "uint256", "name": "_claimDelay", "type": "uint256" }, + { + "internalType": "uint256", + "name": "_minSharesToRedeem", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "allowance", "type": "uint256" }, + { "internalType": "uint256", "name": "needed", "type": "uint256" } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "uint256", "name": "balance", "type": "uint256" }, + { "internalType": "uint256", "name": "needed", "type": "uint256" } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { "internalType": "address", "name": "approver", "type": "address" } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { "internalType": "address", "name": "receiver", "type": "address" } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { "internalType": "address", "name": "sender", "type": "address" } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { "inputs": [], "name": "InvalidInitialization", "type": "error" }, + { "inputs": [], "name": "NotInitializing", "type": "error" }, + { + "inputs": [ + { "internalType": "uint8", "name": "bits", "type": "uint8" }, + { "internalType": "int256", "name": "value", "type": "int256" } + ], + "name": "SafeCastOverflowedIntDowncast", + "type": "error" + }, + { + "inputs": [{ "internalType": "int256", "name": "value", "type": "int256" }], + "name": "SafeCastOverflowedIntToUint", + "type": "error" + }, + { + "inputs": [ + { "internalType": "uint8", "name": "bits", "type": "uint8" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "SafeCastOverflowedUintDowncast", + "type": "error" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "SafeCastOverflowedUintToInt", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "armBuffer", + "type": "uint256" + } + ], + "name": "ARMBufferUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "market", + "type": "address" + } + ], + "name": "ActiveMarketUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "market", + "type": "address" + }, + { + "indexed": false, + "internalType": "int256", + "name": "assets", + "type": "int256" + } + ], + "name": "Allocated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "capManager", + "type": "address" + } + ], + "name": "CapManagerUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256[]", + "name": "requestIds", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountClaimed", + "type": "uint256" + } + ], + "name": "ClaimOriginWithdrawals", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "crossPrice", + "type": "uint256" + } + ], + "name": "CrossPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "feeCollector", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "FeeCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFeeCollector", + "type": "address" + } + ], + "name": "FeeCollectorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "FeeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "market", + "type": "address" + } + ], + "name": "MarketAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "market", + "type": "address" + } + ], + "name": "MarketRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "OperatorChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "withdrawer", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "name": "RedeemClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "withdrawer", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "queued", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimTimestamp", + "type": "uint256" + } + ], + "name": "RedeemRequested", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "RequestOriginWithdrawal", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "traderate0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "traderate1", + "type": "uint256" + } + ], + "name": "TraderateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "FEE_SCALE", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_CROSS_PRICE_DEVIATION", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PRICE_SCALE", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "activeMarket", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address[]", "name": "_markets", "type": "address[]" } + ], + "name": "addMarkets", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "allocate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "address", "name": "spender", "type": "address" } + ], + "name": "allowance", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "approve", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "armBuffer", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "account", "type": "address" } + ], + "name": "balanceOf", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "baseAsset", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "capManager", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimDelay", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256[]", "name": "requestIds", "type": "uint256[]" } + ], + "name": "claimOriginWithdrawals", + "outputs": [ + { "internalType": "uint256", "name": "amountClaimed", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "requestId", "type": "uint256" } + ], + "name": "claimRedeem", + "outputs": [ + { "internalType": "uint256", "name": "assets", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimable", + "outputs": [ + { + "internalType": "uint256", + "name": "claimableAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collectFees", + "outputs": [ + { "internalType": "uint256", "name": "fees", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "shares", "type": "uint256" } + ], + "name": "convertToAssets", + "outputs": [ + { "internalType": "uint256", "name": "assets", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "assets", "type": "uint256" } + ], + "name": "convertToShares", + "outputs": [ + { "internalType": "uint256", "name": "shares", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "crossPrice", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "assets", "type": "uint256" }, + { "internalType": "address", "name": "receiver", "type": "address" } + ], + "name": "deposit", + "outputs": [ + { "internalType": "uint256", "name": "shares", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "assets", "type": "uint256" } + ], + "name": "deposit", + "outputs": [ + { "internalType": "uint256", "name": "shares", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "outputs": [{ "internalType": "uint16", "name": "", "type": "uint16" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeCollector", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feesAccrued", + "outputs": [ + { "internalType": "uint256", "name": "fees", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "string", "name": "_name", "type": "string" }, + { "internalType": "string", "name": "_symbol", "type": "string" }, + { "internalType": "address", "name": "_operator", "type": "address" }, + { "internalType": "uint256", "name": "_fee", "type": "uint256" }, + { "internalType": "address", "name": "_feeCollector", "type": "address" }, + { "internalType": "address", "name": "_capManager", "type": "address" } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lastAvailableAssets", + "outputs": [{ "internalType": "int128", "name": "", "type": "int128" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "liquidityAsset", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minSharesToRedeem", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nextWithdrawalIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "operator", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "assets", "type": "uint256" } + ], + "name": "previewDeposit", + "outputs": [ + { "internalType": "uint256", "name": "shares", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "shares", "type": "uint256" } + ], + "name": "previewRedeem", + "outputs": [ + { "internalType": "uint256", "name": "assets", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_market", "type": "address" } + ], + "name": "removeMarket", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "requestOriginWithdrawal", + "outputs": [ + { "internalType": "uint256", "name": "requestId", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "shares", "type": "uint256" } + ], + "name": "requestRedeem", + "outputs": [ + { "internalType": "uint256", "name": "requestId", "type": "uint256" }, + { "internalType": "uint256", "name": "assets", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_armBuffer", "type": "uint256" } + ], + "name": "setARMBuffer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_market", "type": "address" } + ], + "name": "setActiveMarket", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_capManager", "type": "address" } + ], + "name": "setCapManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "newCrossPrice", "type": "uint256" } + ], + "name": "setCrossPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_fee", "type": "uint256" } + ], + "name": "setFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_feeCollector", "type": "address" } + ], + "name": "setFeeCollector", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "newOperator", "type": "address" } + ], + "name": "setOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "setOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "buyT1", "type": "uint256" }, + { "internalType": "uint256", "name": "sellT1", "type": "uint256" } + ], + "name": "setPrices", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "market", "type": "address" } + ], + "name": "supportedMarkets", + "outputs": [ + { "internalType": "bool", "name": "supported", "type": "bool" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, + { "internalType": "uint256", "name": "amountOutMin", "type": "uint256" }, + { "internalType": "address[]", "name": "path", "type": "address[]" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "deadline", "type": "uint256" } + ], + "name": "swapExactTokensForTokens", + "outputs": [ + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "inToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "outToken", + "type": "address" + }, + { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, + { "internalType": "uint256", "name": "amountOutMin", "type": "uint256" }, + { "internalType": "address", "name": "to", "type": "address" } + ], + "name": "swapExactTokensForTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "amountOut", "type": "uint256" }, + { "internalType": "uint256", "name": "amountInMax", "type": "uint256" }, + { "internalType": "address[]", "name": "path", "type": "address[]" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "deadline", "type": "uint256" } + ], + "name": "swapTokensForExactTokens", + "outputs": [ + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "inToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "outToken", + "type": "address" + }, + { "internalType": "uint256", "name": "amountOut", "type": "uint256" }, + { "internalType": "uint256", "name": "amountInMax", "type": "uint256" }, + { "internalType": "address", "name": "to", "type": "address" } + ], + "name": "swapTokensForExactTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token0", + "outputs": [ + { "internalType": "contract IERC20", "name": "", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token1", + "outputs": [ + { "internalType": "contract IERC20", "name": "", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalAssets", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "traderate0", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "traderate1", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "transfer", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vaultWithdrawalAmount", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "requestId", "type": "uint256" } + ], + "name": "withdrawalRequests", + "outputs": [ + { "internalType": "address", "name": "withdrawer", "type": "address" }, + { "internalType": "bool", "name": "claimed", "type": "bool" }, + { "internalType": "uint40", "name": "claimTimestamp", "type": "uint40" }, + { "internalType": "uint128", "name": "assets", "type": "uint128" }, + { "internalType": "uint128", "name": "queued", "type": "uint128" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawsClaimed", + "outputs": [{ "internalType": "uint128", "name": "", "type": "uint128" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawsQueued", + "outputs": [{ "internalType": "uint128", "name": "", "type": "uint128" }], + "stateMutability": "view", + "type": "function" + } +] diff --git a/src/js/actions/allocateSonic.js b/src/js/actions/allocateSonic.js new file mode 100644 index 0000000..c56bce0 --- /dev/null +++ b/src/js/actions/allocateSonic.js @@ -0,0 +1,35 @@ +const { Defender } = require("@openzeppelin/defender-sdk"); +const { ethers } = require("ethers"); + +const { allocate } = require("../tasks/admin"); +const { sonic } = require("../utils/addresses"); +const armAbi = require("../../abis/OriginARM.json"); + +// Entrypoint for the Defender Action +const handler = async (event) => { + // Initialize defender relayer provider and signer + const client = new Defender(event); + const provider = client.relaySigner.getProvider({ ethersVersion: "v6" }); + const signer = await client.relaySigner.getSigner(provider, { + speed: "fastest", + ethersVersion: "v6", + }); + + console.log( + `DEBUG env var in handler before being set: "${process.env.DEBUG}"` + ); + + // References to contracts + const arm = new ethers.Contract(sonic.OriginARM, armAbi, signer); + + try { + await allocate({ + signer, + arm, + }); + } catch (error) { + console.error(error); + } +}; + +module.exports = { handler }; diff --git a/src/js/actions/autoRequestWithdrawSonic.js b/src/js/actions/autoRequestWithdrawSonic.js index 936d793..f1c7146 100644 --- a/src/js/actions/autoRequestWithdrawSonic.js +++ b/src/js/actions/autoRequestWithdrawSonic.js @@ -28,7 +28,7 @@ const handler = async (event) => { signer, asset, arm, - minAmount: 1, + minAmount: 50, confirm: true, }); }; diff --git a/src/js/actions/collectFeesSonic.js b/src/js/actions/collectFeesSonic.js index e18b175..ecf229a 100644 --- a/src/js/actions/collectFeesSonic.js +++ b/src/js/actions/collectFeesSonic.js @@ -1,7 +1,7 @@ const { Defender } = require("@openzeppelin/defender-sdk"); const { ethers } = require("ethers"); -const { collectFees } = require("../tasks/lidoQueue"); +const { collectFees } = require("../tasks/admin"); const { sonic } = require("../utils/addresses"); const lidoARMAbi = require("../../abis/LidoARM.json"); diff --git a/src/js/actions/rollup.config.cjs b/src/js/actions/rollup.config.cjs index 8a8c1c3..98e1344 100644 --- a/src/js/actions/rollup.config.cjs +++ b/src/js/actions/rollup.config.cjs @@ -96,6 +96,14 @@ module.exports = [ }, ...commonConfig, }, + { + input: "allocateSonic.js", + output: { + file: "dist/allocateSonic/index.js", + format: "cjs", + }, + ...commonConfig, + }, { input: "collectRewardsSonic.js", output: { diff --git a/src/js/tasks/sonicHarvest.js b/src/js/tasks/sonicHarvest.js index a4b1d44..3024498 100644 --- a/src/js/tasks/sonicHarvest.js +++ b/src/js/tasks/sonicHarvest.js @@ -1,8 +1,7 @@ -const { formatUnits, parseUnits } = require("ethers"); +const { formatUnits } = require("ethers"); const { resolveAsset } = require("../utils/assets"); const { logTxDetails } = require("../utils/txLogger"); -const { sonic } = require("../utils/addresses"); const { magpieQuote } = require("../utils/magpie"); const log = require("../utils/logger")("task:sonic:harvest"); @@ -15,8 +14,7 @@ async function collectRewards({ siloMarket, signer }) { async function harvestRewards({ harvester, signer }) { const silo = await resolveAsset("SILO"); - // const siloRewards = await silo.balanceOf(harvester.getAddress()); - const siloRewards = parseUnits("100"); + const siloRewards = await silo.balanceOf(harvester.getAddress()); if (siloRewards == 0n) { console.log("No Silo rewards to harvest"); @@ -29,7 +27,7 @@ async function harvestRewards({ harvester, signer }) { amount: siloRewards, slippage: 0.5, swapper: await harvester.getAddress(), - recipient: sonic.OriginARM, + recipient: await harvester.getAddress(), }); log(`About to harvest ${formatUnits(siloRewards)} Silo rewards using Magpie`); From 6ca0d2bfe21f499ece8a609b6058235f36ac518d Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Thu, 29 May 2025 23:42:38 +1000 Subject: [PATCH 4/6] Fixed auto claim of OS withdrawals --- src/js/actions/autoClaimWithdrawSonic.js | 17 ++++++++++++----- src/js/tasks/liquidity.js | 4 +++- src/js/utils/armQueue.js | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/js/actions/autoClaimWithdrawSonic.js b/src/js/actions/autoClaimWithdrawSonic.js index 1b45416..774ec9a 100644 --- a/src/js/actions/autoClaimWithdrawSonic.js +++ b/src/js/actions/autoClaimWithdrawSonic.js @@ -3,8 +3,9 @@ const { ethers } = require("ethers"); const { autoClaimWithdraw } = require("../tasks/liquidity"); const { sonic } = require("../utils/addresses"); +const { logTxDetails } = require("../utils/txLogger"); const erc20Abi = require("../../abis/ERC20.json"); -const oethARMAbi = require("../../abis/OethARM.json"); +const armAbi = require("../../abis/OriginARM.json"); const vaultAbi = require("../../abis/vault.json"); // Entrypoint for the Autotask @@ -24,9 +25,9 @@ const handler = async (event) => { // References to contracts const liquidityAsset = new ethers.Contract(sonic.WS, erc20Abi, signer); const vault = new ethers.Contract(sonic.OSonicVaultProxy, vaultAbi, signer); - const arm = new ethers.Contract(sonic.OriginARM, oethARMAbi, signer); + const arm = new ethers.Contract(sonic.OriginARM, armAbi, signer); - await autoClaimWithdraw({ + const requestIds = await autoClaimWithdraw({ signer, liquidityAsset, arm, @@ -34,8 +35,14 @@ const handler = async (event) => { confirm: true, }); - // Allocate any excess liquidity to the lending market - await arm.allocate(); + console.log(`Claimed requests "${requestIds}"`); + + // If any requests were claimed + if (requestIds?.length > 0) { + // Allocate any excess liquidity to the lending market + const tx = await arm.allocate(); + await logTxDetails(tx, "allocate"); + } }; module.exports = { handler }; diff --git a/src/js/tasks/liquidity.js b/src/js/tasks/liquidity.js index bc74feb..402b868 100644 --- a/src/js/tasks/liquidity.js +++ b/src/js/tasks/liquidity.js @@ -96,7 +96,7 @@ const autoClaimWithdraw = async ({ if (requestIds.length === 0) { log("No claimable requests"); - return; + return requestIds; } log(`About to claim requests: ${requestIds} `); @@ -105,6 +105,8 @@ const autoClaimWithdraw = async ({ liquiditySymbol == "wS" ? "claimOriginWithdrawals" : "claimWithdrawals"; const tx = await arm.connect(signer)[functionName](requestIds); await logTxDetails(tx, "claimWithdrawals", confirm); + + return requestIds; }; const withdrawRequestStatus = async ({ id, arm, vault }) => { diff --git a/src/js/utils/armQueue.js b/src/js/utils/armQueue.js index 1a8e2ae..094fccd 100644 --- a/src/js/utils/armQueue.js +++ b/src/js/utils/armQueue.js @@ -70,7 +70,7 @@ const claimableRequests = async ({ withdrawer, queuedAmountClaimable }) => { log( `About to get claimable withdrawal requests for withdrawer ${withdrawer} up to ${formatUnits( queuedAmountClaimable - )} WETH` + )}` ); const query = gql` From 59c5662f6a072d1ab945eec6f2d712f5fd4d0877 Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Fri, 30 May 2025 00:27:21 +1000 Subject: [PATCH 5/6] Changed collectRewards HH task --- src/js/actions/collectRewardsSonic.js | 2 ++ src/js/tasks/tasks.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/js/actions/collectRewardsSonic.js b/src/js/actions/collectRewardsSonic.js index 17f3200..8d73a45 100644 --- a/src/js/actions/collectRewardsSonic.js +++ b/src/js/actions/collectRewardsSonic.js @@ -34,6 +34,8 @@ const handler = async (event) => { } catch (error) { console.error(error); } + + // TODO do Silo, beS and wOS swaps with Magpie }; module.exports = { handler }; diff --git a/src/js/tasks/tasks.js b/src/js/tasks/tasks.js index 4380ce0..b13e792 100644 --- a/src/js/tasks/tasks.js +++ b/src/js/tasks/tasks.js @@ -826,7 +826,7 @@ task("collectFees").setAction(async (_, __, runSuper) => { subtask("collectRewards", "Collect rewards") .addOptionalParam( - "name", + "arm", "The name of the ARM to collect rewards for. eg Lido or Origin", "Origin", types.string From 8d69bbe974c597f97a0d5c8c8fb5f42a3040f7f9 Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Fri, 30 May 2025 00:27:45 +1000 Subject: [PATCH 6/6] Updated README with Defender ids --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 084d9e5..e98edd7 100644 --- a/README.md +++ b/README.md @@ -253,7 +253,7 @@ npx hardhat setActionVars --id 84b5f134-8351-4402-8f6a-fb4376034bc4 npx hardhat setActionVars --id ffcfc580-7b0a-42ed-a4f2-3f0a3add9779 npx hardhat setActionVars --id 32dbc67b-89f3-4856-8f3d-ad4dc5a09322 npx hardhat setActionVars --id 7a0cb2c9-11c2-41dd-bcd0-d7c2dbda6af6 -npx hardhat setActionVars --id +npx hardhat setActionVars --id a9fc4c86-0506-4809-afbc-93b5e558cb68 npx hardhat setActionVars --id 12977d51-d107-45eb-ac20-45942009ab01 npx hardhat setActionVars --id 6ec46510-0b8e-48b4-a4c8-de759aad0ba4 @@ -270,7 +270,7 @@ npx defender-autotask update-code 84b5f134-8351-4402-8f6a-fb4376034bc4 ./dist/co npx defender-autotask update-code ffcfc580-7b0a-42ed-a4f2-3f0a3add9779 ./dist/setPrices npx defender-autotask update-code 32dbc67b-89f3-4856-8f3d-ad4dc5a09322 ./dist/collectFeesSonic npx defender-autotask update-code 7a0cb2c9-11c2-41dd-bcd0-d7c2dbda6af6 ./dist/allocateSonic -npx defender-autotask update-code ./dist/collectRewardsSonic +npx defender-autotask update-code a9fc4c86-0506-4809-afbc-93b5e558cb68 ./dist/collectRewardsSonic npx defender-autotask update-code 12977d51-d107-45eb-ac20-45942009ab01 ./dist/autoRequestWithdrawSonic npx defender-autotask update-code 6ec46510-0b8e-48b4-a4c8-de759aad0ba4 ./dist/autoClaimWithdrawSonic ```