| Crates.io | usdc-plus-exchange |
| lib.rs | usdc-plus-exchange |
| version | 0.1.4 |
| created_at | 2025-08-31 23:22:31.896586+00 |
| updated_at | 2025-09-16 11:55:48.867605+00 |
| description | USDC <-> USDC+ exchange library for the Reflect protocol. |
| homepage | |
| repository | |
| max_upload_size | |
| id | 1818951 |
| size | 142,039 |
A Rust library for computing real-time exchange rates between USDC and USDC+ tokens in the Reflect Protocol, incorporating live yield from lending.
This crate provides four core functions for calculating USDC ↔ USDC+ conversions:
Deposit (USDC → USDC+)
exchange_rate_usdc_input – raw-data versionexchange_rate_usdc_accounts – AccountInfo validated versionRedeem (USDC+ → USDC)
exchange_rate_receipt_input – raw-data versionexchange_rate_receipt_accounts – AccountInfo validated versionAll functions automatically incorporate pending yield before computing the exchange rate.
use usdc_plus_exchange::{
exchange_rate_usdc_input,
exchange_rate_usdc_accounts,
};
// With raw account bytes:
let tokens = exchange_rate_usdc_input(
&controller_data, // USDC controller account bytes
&spot_market_data, // Drift spot market account bytes
&user_account_data, // Drift user account bytes
&usdc_plus_mint_data, // USDC+ mint account bytes
1_000_000_000 // 1000 USDC (6 decimals)
)?;
// With Anchor AccountInfo (validates account addresses):
let tokens_validated = exchange_rate_usdc_accounts(
&ctx.accounts.usdc_controller,
&ctx.accounts.spot_market,
&ctx.accounts.drift_user,
&ctx.accounts.usdc_plus_mint,
1_000_000_000 // 1000 USDC (6 decimals)
)?;
use usdc_plus_exchange::{
exchange_rate_receipt_input,
exchange_rate_receipt_accounts,
};
// With raw account bytes:
let usdc = exchange_rate_receipt_input(
&controller_data, // USDC controller account bytes
&spot_market_data, // Drift spot market account bytes
&user_account_data, // Drift user account bytes
&usdc_plus_mint_data, // USDC+ mint account bytes
1_000_000_000 // 1000 USDC+ (6 decimals)
)?;
// With AccountInfo (validates account addresses):
let usdc_validated = exchange_rate_receipt_accounts(
&ctx.accounts.usdc_controller,
&ctx.accounts.spot_market,
&ctx.accounts.drift_user,
&ctx.accounts.usdc_plus_mint,
1_000_000_000 // 1000 USDC+ (6 decimals)
)?;
exchange_rate_usdc_inputCalculates how many USDC+ tokens you receive for a USDC deposit using raw account data.
pub fn exchange_rate_usdc_input(
data_usdc_controller: &[u8],
data_spot_market_usdc: &[u8],
data_user_account: &[u8],
data_usdc_plus_mint: &[u8],
usdc_amount: u64,
) -> Result<u64>
exchange_rate_usdc_accountsValidates accounts before calling exchange_rate_usdc_input.
pub fn exchange_rate_usdc_accounts(
usdc_controller_account: &AccountInfo,
spot_market_usdc_account: &AccountInfo,
reflect_user_account: &AccountInfo,
usdc_plus_mint_account: &AccountInfo,
usdc_amount: u64,
) -> Result<u64>
require!)exchange_rate_usdc_input but with account address validation."exchange_rate_receipt_inputCalculates how much USDC you receive for redeeming USDC+ tokens using raw account data.
pub fn exchange_rate_receipt_input(
data_usdc_controller: &[u8],
data_spot_market_usdc: &[u8],
data_user_account: &[u8],
data_usdc_plus_mint: &[u8],
receipt_amount: u64,
) -> Result<u64>
exchange_rate_receipt_accountsValidates accounts before calling exchange_rate_receipt_input.
pub fn exchange_rate_receipt_accounts(
usdc_controller_account: &AccountInfo,
spot_market_usdc_account: &AccountInfo,
reflect_user_account: &AccountInfo,
usdc_plus_mint_account: &AccountInfo,
receipt_amount: u64,
) -> Result<u64>
exchange_rate_receipt_input but with account address validation."Deposit: USDC+ = USDC × usdc_plus_supply / deposited_vault_value
Redeem: USDC = USDC+ × deposited_vault_value / usdc_plus_supply
Where:
usdc_plus_supply = total user sharesdeposited_vault_value = vault’s actual USDC value*_accounts variants when running inside an Anchor program for account validation.All functions return Result<u64> and may fail with:
InvalidAccount – if account validation failsMathError – division by zero or overflowDeserializationError – invalid or truncated account dataInsufficientData – provided account data is too short