ARU runs on a simple two-step flow: you submit a request, the multisig reviews and approves it within the price bounds you specified. Every step has explicit safeguards. This page shows exactly what happens where.
sequenceDiagram
autonumber
participant AP as AP wallet
participant SM as Subscription Manager
participant MS as Multisig
participant T as Treasury
AP->>SM: requestSubscription(usdcAmount, maxPricePerARU)
Note over AP,SM: USDC → contract (not treasury yet)
SM-->>AP: request ID + 48h expiry
rect rgb(240, 248, 255)
Note over MS: Review live NAV vs AP's maxPrice<br/>AutoSigner co-signs if within tolerance<br/>2 humans countersign
end
MS->>SM: approveSubscription(id, pricePerARU)
Note over SM: Reverts if pricePerARU > maxPricePerARU
SM->>AP: ARU minted
SM->>T: USDC released
Note over AP: Alternative paths:<br/>AP cancelSubscription(id) any time<br/>OR anyone cancelExpiredSubscription(id) after 48h
| # | Actor | Action | Safeguard |
|---|---|---|---|
| 1 | AP | Calls requestSubscription(100_000 USDC, 1.15 × 10¹⁸) meaning "deposit 100k USDC, don't mint at a price worse than $1.15 per ARU" |
AP allowlist check (isAP[msg.sender]); subscription-pause flag; minimum amount floor; open-request cap (50 per AP) |
| 2 | Contract | USDC transfers from AP → Subscription Manager contract (not treasury). Request struct stored with priceBound, createdAt, expiresAt = now + 48h, fulfilled = false |
USDC custody is in immutable contract; treasury never sees pending mint USDC, so it can't accidentally spend it |
| 3 | Multisig | Reviews the request on the ops dashboard. Compares current NAV to AP's maxPricePerARU. Proposes approveSubscription(id, pricePerARU) tx |
AutoSigner reads 3 NAV sources (Redstone + BlackRock IAU ref + internal model); co-signs only if within 100 bps tolerance. Humans independently verify |
| 4 | Contract | Verifies pricePerARU ≤ maxPricePerARU (reverts if not), marks request fulfilled, atomically: mints ARU to AP + transfers USDC from contract to treasury |
Price bound enforcement is on-chain. No off-chain trust that admin respects it. Contract reverts if admin tries to settle at a worse price than AP agreed to |
sequenceDiagram
participant A as Anyone
participant SM as Subscription Manager
Note over SM: Request expired (>48h since createdAt)
A->>SM: cancelExpiredSubscription(id)
SM->>SM: mark fulfilled=true (poison ID)
SM-->>A: (caller pays gas; no reward)
Note over SM: USDC returns to original AP address
Anyone can call cancelExpiredSubscription — a keeper, another AP, the original AP themselves. The refund always goes to the original AP, not the caller. This means your USDC is never stuck waiting on admin availability.
AP calls cancelSubscription(id)
→ USDC returns to AP immediately
→ request ID becomes non-approvable
No cooldown. No admin cooperation needed. Common reasons to cancel:
sequenceDiagram
autonumber
participant AP as AP wallet
participant SM as Subscription Manager
participant MS as Multisig
participant T as Treasury
AP->>SM: requestRedemption(aruAmount, minPricePerARU)
Note over AP,SM: ARU → contract (escrowed, NOT burned)
SM-->>AP: request ID + 48h expiry
rect rgb(240, 248, 255)
Note over MS: Review NAV vs AP's minPrice<br/>AutoSigner + humans as above
end
MS->>SM: approveRedemption(id, pricePerARU)
Note over SM: Reverts if pricePerARU < minPricePerARU
T->>SM: USDC transferFrom
SM->>AP: USDC
SM->>SM: burn escrowed ARU
Note over AP: Alternative paths:<br/>AP cancelRedemption(id) any time → ARU returned intact<br/>OR cancelExpiredRedemption(id) after 48h → ARU returned intact
Unlike some other RWA tokens (Ondo USDY burns on request), ARU stays intact in the contract during the pending window. It's only burned at the exact moment USDC lands in your wallet. If the treasury can't pay (insufficient USDC), approveRedemption reverts and your ARU remains untouched — you reclaim it after 48h expiry.
| # | Actor | Action | Safeguard |
|---|---|---|---|
| 1 | AP | Calls requestRedemption(50_000 ARU, 1.05 × 10¹⁸) meaning "redeem 50k ARU, don't settle below $1.05 per ARU" |
AP allowlist, redemption-pause flag, minimum amount floor, open-request cap |
| 2 | Contract | ARU transfers from AP → Subscription Manager (escrowed, not burned) | ARU is held intact until settlement actually completes |
| 3 | Multisig | Reviews + checks treasury has sufficient USDC | If treasury is thin, admin pauses new redemption requests and/or liquidates gold first |
| 4 | Contract | Verifies pricePerARU ≥ minPricePerARU, atomically: transfers USDC from treasury to AP + burns escrowed ARU |
Both sides fire or neither does. If treasury transfer reverts, ARU stays escrowed |
sequenceDiagram
participant MS as Multisig
participant SM as Subscription Manager
participant T as Treasury (insufficient USDC)
participant AP as AP wallet
MS->>SM: approveRedemption(id, price)
SM->>T: transferFrom USDC
T-->>SM: REVERT (insufficient balance)
Note over SM: Entire approval reverts.<br/>ARU remains escrowed.<br/>No partial state.
Note over MS,AP: Admin pauses new redemptions,<br/>treasury liquidates gold to USDC,<br/>retries approval later.
Note over AP: OR: 48h elapses, AP reclaims ARU<br/>via cancelExpiredRedemption(id)
Worst case is delay, never loss. The multisig cannot burn your ARU without successfully paying you USDC. The two operations are atomic — both succeed or both revert.
stateDiagram-v2
[*] --> Pending: AP submits request
Pending --> Approved: Multisig approves within bound
Pending --> Cancelled: AP cancels (any time)
Pending --> Expired: 48h elapsed
Expired --> Reclaimed: Anyone calls cancelExpired*
Approved --> [*]: Funds settled
Cancelled --> [*]: Funds returned
Reclaimed --> [*]: Funds returned
note right of Approved
Settlement price was within
AP's stated bound. ARU minted
(or USDC paid + ARU burned).
end note
note right of Reclaimed
Permissionless: any address
can trigger the refund. Funds
always go to original AP.
end note
Every pending request ends in one of three terminal states: Approved (settled successfully), Cancelled (AP withdrew), or Reclaimed (expired and refunded by keeper). There is no "stuck" state. There is no "partially settled" state.
| Protection | Mechanism |
|---|---|
| Price bound | Every request carries AP's priceBound. Approval transaction reverts if admin tries to settle outside the bound. Your explicit consent, captured immutably. |
| 48-hour expiry | After createdAt + 48h, the request can be cancelled by anyone (not just the admin or AP). Funds return to original AP. |
| User cancel anytime | cancelSubscription(id) / cancelRedemption(id) callable by the AP at any point before approval. No cooldown. Funds return immediately. |
| Atomic settlement | Approval either mints ARU + releases USDC (subscription) or pays USDC + burns ARU (redemption) in the same transaction. No half-settled states. |
| Subscription isolation from treasury | Pending mint USDC is held in the contract, not the treasury. Even if treasury is drained or frozen, your pending mint is refundable. |
| Redemption ARU is escrowed, not burned | Until approval actually fires, your ARU remains in the contract intact. Treasury insolvency can't cause ARU loss. |
| AP allowlist | Only allowlisted APs can submit requests. Protects the protocol's KYC/AML perimeter. |
| Immutable contracts | No proxy, no upgrade, no admin-installable backdoor. What deploys is what runs forever. |
| Multi-minter with 48h timelock | ARU's minter set changes require a 48h delay visible on-chain. Any adversarial minter addition has a 48h public window for response. |
| Protection | Mechanism |
|---|---|
| 3-of-5 multisig approval | Every settlement needs 3 of 5 signers. One-signer compromise insufficient. |
| AutoSigner NAV gate | Automated signer participates in the multisig; co-signs only if proposed price is within 100 bps of NAV from 3 independent sources. Fails open: pure human quorum always works if AutoSigner is down or refuses. |
| Multi-source NAV | Oracle price + BlackRock IAU reference + internal NAV model. Inter-source divergence check (sources must agree within 500 bps). |
| Treasury separation | Treasury is a separate Safe with its own signers. Manager contract pulls USDC via allowance; treasury can revoke at any time. |
| Cold owner multisig | The role that controls minter add/remove is a different Safe from operational MANAGER_ADMIN. Even full compromise of operations can't mint ARU without owner cooperation via 48h timelock. |
| Protection | Mechanism |
|---|---|
| No pause on transfers | ARU tokens transfer freely on the secondary market regardless of primary-market state. Your ability to hold or sell on DEX is never revoked. |
| No blocklist | No authority can freeze your ARU. |
| No rebasing, no fee-on-transfer | Balance arithmetic is simple ERC-20. DEX integrations work without special handling. |
| Chainlink-compatible price feed | ARUPriceOracle implements AggregatorV3Interface with an additional strict variant for consumers wanting hard-fail on stale. |
You trust the multisig to approve requests within your stated bounds within 48 hours; if they don't, you (or anyone) reclaim your funds; if the treasury is insolvent, your pending positions remain safe and reclaimable.
Nothing you submit can be lost to contract logic, admin bounded misbehavior, or operational stalling. The 48h expiry with permissionless reclaim is the ultimate safety valve.