Skip to content

[ARM] Deploy 037 Stables ARM (PYUSD/USDG) on mainnet - #290

Closed
clement-ux wants to merge 2 commits into
mainfrom
clement/deploy-037-stables-arm-paxos
Closed

[ARM] Deploy 037 Stables ARM (PYUSD/USDG) on mainnet#290
clement-ux wants to merge 2 commits into
mainfrom
clement/deploy-037-stables-arm-paxos

Conversation

@clement-ux

Copy link
Copy Markdown
Collaborator

Description

Record the mainnet deployment of the Stables ARM: a USDC-quoted MultiAssetARM with two Paxos-issued base assets, each wired through its own PaxosAssetAdapter behind a proxy:

  • PYUSD — pegged 1:1 to USDC, redeemed off-chain through Paxos Actions that settle USDC back to the adapter.
  • USDG — pegged 1:1 to USDC, same off-chain Paxos redemption flow.

Ownership of the ARM, its CapManager and both adapter proxies is handed to the multi-chain 2/8 multisig (STRATEGIST); the operational role (request/claim redemptions, submit Paxos redeems, set prices) is the Talos KMS relayer (ARM_TALOS_RELAYER). No lending market is wired up — idle USDC stays in the ARM until a market is added in a follow-up script.

This PR also marks 036_DeployMultiAssetARMScript (the WETH-quoted LST ARM) as skipped — it is not being deployed in this round.

The following PRs are included in this deployment

ARM

Deployment

Script script/deploy/mainnet/037_DeployPaxosARMScript.s.sol

Contracts

Contract Address
Stables ARM (MultiAssetARM) proxy 0x03D727Fc343FE42621DD28074350f99d005f0D18
Stables ARM implementation (MultiAssetARM) 0x16dd498828Ecd2835d113e838Af18A4b7f7B10F3
Stables ARM CapManager proxy 0x93D182bF55F9B320a731cEbD1c39916319241FFE
Stables ARM CapManager implementation 0xE63730c6D1045A183E7153F6cB915b8a8f464525
PaxosAssetAdapter (PYUSD) implementation 0x0CD57291231E4ba8788E13939eD9aA22825A0F11
PaxosAssetAdapter (PYUSD) proxy 0x720395F299526b1EeD73D15cdFA8a9788084EBce
PaxosAssetAdapter (USDG) implementation 0xbf87518d0c366D0E0A5aF12720d85f10640f6fF6
PaxosAssetAdapter (USDG) proxy 0xC905Cd9DC6d4032282494ca792b3e93Dac737554

Contract diff

make match file=src/contracts/Proxy.sol addr=0x03D727Fc343FE42621DD28074350f99d005f0D18
make match file=src/contracts/MultiAssetARM.sol addr=0x16dd498828Ecd2835d113e838Af18A4b7f7B10F3
make match file=src/contracts/Proxy.sol addr=0x93D182bF55F9B320a731cEbD1c39916319241FFE
make match file=src/contracts/CapManager.sol addr=0xE63730c6D1045A183E7153F6cB915b8a8f464525
make match file=src/contracts/adapters/PaxosAssetAdapter.sol addr=0x0CD57291231E4ba8788E13939eD9aA22825A0F11
make match file=src/contracts/Proxy.sol addr=0x720395F299526b1EeD73D15cdFA8a9788084EBce
make match file=src/contracts/adapters/PaxosAssetAdapter.sol addr=0xbf87518d0c366D0E0A5aF12720d85f10640f6fF6
make match file=src/contracts/Proxy.sol addr=0xC905Cd9DC6d4032282494ca792b3e93Dac737554

Configuration

The ARM implementation is deployed with USDC (6-decimal) parameters — the 6-decimal analogues of the 035/036 18-decimal WETH values:

Param Value Note
liquidityAsset 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 USDC
claimDelay 10 minutes
minSharesToRedeem 1e6 1 USDC
allocateThreshold 100e6 100 USDC
name / symbol Stables ARM / ARM-USDC-Stables
performance fee 2000 20%
fee collector 0xBB077E716A5f1F1B63ed5244eBFf5214E50fec8c BUYBACK_OPERATOR
owner (ARM / CapManager / adapter proxies) 0x4FF1b9D9ba8558F5EAfCec096318eA0d8b541971 STRATEGIST — multi-chain 2/8 multisig
operator 0x739212d5bAfE6AAC8Be49a60B7d003bD41DBf38b ARM_TALOS_RELAYER

CapManager: total-assets cap 100,000e6 (100,000 USDC), account cap enabled, per-LP cap 100,000e6 for TREASURY_LP (0x6E3fddab68Bf1EBaf9daCF9F7907c7Bc0951D1dc).

addBaseAsset parameters (PYUSD)

Param Value Note
newBaseAsset 0x6c3ea9036406852006290770BEdFcAbA0e23A0e8 PYUSD
adapter 0x720395F299526b1EeD73D15cdFA8a9788084EBce PaxosAssetAdapter (PYUSD) proxy
buyPrice 998000000000000000000000000000000000 0.998e36
sellPrice 1000000000000000000000000000000000000 1e36
buyAmount 0 no swaps until the operator enables trading via setPrices()
sellAmount 0 no swaps until the operator enables trading via setPrices()
newCrossPrice 999970000000000000000000000000000000 0.99997e36 — totalAssets() valuation
peggedToLiquidityAsset true

addBaseAsset parameters (USDG)

Param Value Note
newBaseAsset 0xe343167631d89B6Ffc58B88d6b7fB0228795491D USDG
adapter 0xC905Cd9DC6d4032282494ca792b3e93Dac737554 PaxosAssetAdapter (USDG) proxy
buyPrice 998000000000000000000000000000000000 0.998e36
sellPrice 1000000000000000000000000000000000000 1e36
buyAmount 0 no swaps until the operator enables trading via setPrices()
sellAmount 0 no swaps until the operator enables trading via setPrices()
newCrossPrice 999970000000000000000000000000000000 0.99997e36 — totalAssets() valuation
peggedToLiquidityAsset true

Governance

Unlike EtherFiARM (Timelock-owned), the Stables ARM is owned by the multi-chain 2/8 multisig (STRATEGIST, 0x4FF1b9D9ba8558F5EAfCec096318eA0d8b541971). Ownership of the ARM, its CapManager and both adapter proxies is transferred to that multisig directly inside _execute() — there is no GovernorSix proposal and no _buildGovernanceProposal() for this script.

The deployment is therefore recorded in build/deployments-1.json with proposalId: 1 (NO_GOVERNANCE), so the fork/smoke framework replays the deployment without simulating any governance action.

Skipped script

036_DeployMultiAssetARMScript (the WETH-quoted LST ARM: stETH / wstETH / eETH / weETH) is marked skip = true. It is not deployed in this round and is left in place for a future deployment.

Post-deployment follow-ups (owner / operator)

  • Set the real Paxos deposit address. Both adapters are initialized with PAXOS_RECIPIENT = 0x…dEaD as a placeholder; the 2/8 multisig owner must call setPaxosRecipient() on each adapter with the real Paxos deposit address before enabling redemptions.
  • Enable trading. buyAmount / sellAmount are both 0, so no swaps are possible until the operator (Talos) sets the swap limits via setPrices().

Record the on-chain execution of 037_DeployPaxosARMScript: the USDC-quoted
Stables ARM (MultiAssetARM) with PYUSD and USDG wired through their own
PaxosAssetAdapter proxies. Adds the 8 deployed contracts and the 037 execution
entry to deployments-1.json, and normalizes the 035 proposalId to a string.

Skip 036_DeployMultiAssetARMScript (the WETH-quoted LST ARM), which is not
being deployed in this round.
@naddison36

Copy link
Copy Markdown
Collaborator

I've verified the deployed contract

✅ Success: Local contract Proxy                matches deployment at 0x03D727Fc343FE42621DD28074350f99d005f0D18
✅ Success: Local contract MultiAssetARM        matches deployment at 0x16dd498828Ecd2835d113e838Af18A4b7f7B10F3
✅ Success: Local contract Proxy                matches deployment at 0x93D182bF55F9B320a731cEbD1c39916319241FFE
✅ Success: Local contract CapManager           matches deployment at 0xE63730c6D1045A183E7153F6cB915b8a8f464525
✅ Success: Local contract PaxosAssetAdapter    matches deployment at 0x0CD57291231E4ba8788E13939eD9aA22825A0F11
✅ Success: Local contract Proxy                matches deployment at 0x720395F299526b1EeD73D15cdFA8a9788084EBce
✅ Success: Local contract PaxosAssetAdapter    matches deployment at 0xbf87518d0c366D0E0A5aF12720d85f10640f6fF6
✅ Success: Local contract Proxy                matches deployment at 0xC905Cd9DC6d4032282494ca792b3e93Dac737554

I also verified the live mainnet config against the PR: proxy implementations, owners, operator, fee collector, USDC liquidity asset, caps, base asset configs, zero swap liquidity, and Paxos recipient placeholders all match.

Comment thread build/deployments-1.json Outdated
"name": "037_DeployPaxosARMScript",
"proposalId": 1,
"tsDeployment": 1783421579,
"tsGovernance": 0

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't tsGovernance be set to 1?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch — fixed in 098d036.

037_DeployPaxosARMScript has no governance proposal and no pending manual actions (ownership of the ARM, CapManager and both adapter proxies is handed to the 2/8 STRATEGIST multisig inside _execute()), so this should be NO_GOVERNANCE (1) like every other non-governance deployment in the file.

The 0 is just what _recordExecution() emits: when there are no governance actions it sets proposalId = NO_GOVERNANCE (1) but leaves tsGovernance at its default 0, which then has to be bumped to 1 manually (as the docstring / ARCHITECTURE.md note). With tsGovernance: 0 the framework treats the script as pending and re-runs it on every fork/smoke replay instead of skipping it.

037_DeployPaxosARMScript has no governance proposal and no pending manual
actions (ownership is handed to the 2/8 STRATEGIST multisig within _execute()).
Record tsGovernance as NO_GOVERNANCE (1) instead of 0 so the deploy framework
treats it as fully done and skips it on fork/smoke replays, matching every other
non-governance deployment in the file.
@clement-ux clement-ux self-assigned this Jul 7, 2026
@clement-ux clement-ux added the Deployment Deploys smart contracts to the network. label Jul 7, 2026

@naddison36 naddison36 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've verified the deployment

@clement-ux

Copy link
Copy Markdown
Collaborator Author

Superseded by #292.

The smart contract was renamed (037_DeployPaxosARMScript037_DeployUSDARMScript; deployment names STABLES_ARM*USD_ARM*; ARM name/symbol Stables ARM/ARM-USDC-StablesUSD ARM/ARM-USD) and both ARMs were actually deployed on-chain in the same round, so the recorded addresses here are stale and this PR's "skip 036" no longer reflects reality. The USD ARM (037) is now recorded in #292 with the real deployed addresses, and the companion LST ARM (036) in #293. Closing in favor of #292.

@clement-ux clement-ux closed this Jul 8, 2026
@clement-ux
clement-ux deleted the clement/deploy-037-stables-arm-paxos branch July 8, 2026 07:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Deployment Deploys smart contracts to the network.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants