Contracts

A developer guide to using Sages Vaults ✨

Sage is a decentralized protocol that offers institutional yield on-chain through USDC lending. Users provide collateral to Sage vaults, which is then lent to borrowers investing in RWA assets like U.S. Treasury bills and on-chain credit products. Yield is returned as stUSDC, a stablecoin combining USDC's security with RWA-backed compounding yields.


The Sage Protocol's deployed codebase is available here: Sage Finance GitHub Repository.


Core

SageAddressProviderRegistry.sol

This contract is the entry point to the deployed Sage protocol and provides a registry for all the deployed Sage vaults. Each vault is represented by mapping an numeric id to the address of a SageAddressProvider contract.

SageAddressProvider.sol

This contract collects all the active addresses within a Sage vault. The Sage vault contracts query this contract when they need to access sibling contracts (e.g., reading a user's requested redemptions for stUSDC shares from the History contract).

SageRoles.sol

Roles for the different permissions within the SageProtocol:

  • DEFAULT_ROLE

  • VAULT_ADMIN

  • HOLDING_CONTRACT_ADMIN

  • HOLDING_CONTRACT

  • HOLDING_CONTRACT_MULTI

The DEFAULT_ROLE and *_ADMIN roles will most often be set to a multisig or governance-controlled contract.

Inherited libraries: OpenZeppelin UUPSUpgradeable, OpenZeppelin AccessControlDefaultAdminRulesUpgradeable

SageVaultBase.sol

The base ERC4626 contract for Sage vaults. This contract contains an emergency rescue method callable by the vault admin address.

Inherited libraries: OpenZeppelin ERC4626Upgradeable

Last updated