Skip to main content
The Amplify SDK wraps several REST API endpoints and on-chain reads behind convenient functions like getVaultAPY() and getWithdrawalRequests(). When integrating directly, you call these yourself. This page covers every read-only operation the SDK provides, with the raw API calls and contract reads you need.
All REST API endpoints require an API key passed via the x-api-key header. Contact Paxos Labs to get one. See the API Reference for full endpoint documentation including pagination, filtering, and response schemas.

Vault Discovery

The SDK’s getVaultsByConfig() and getSupportedAssets() are powered by a GraphQL API. For direct integrations, use the REST endpoint GET /v2/amplify/vaultAssets instead.

List All Vaults

curl -s "https://api.paxoslabs.com/v2/amplify/vaultAssets?pageSize=100" \
  -H "x-api-key: $AMPLIFY_API_KEY" | jq
Response shape:
{
  "vaultAssets": [
    {
      "vaultAddress": "0x...",
      "chainId": 1,
      "assetAddress": "0x...",
      "depositable": true,
      "withdrawable": true
    }
  ],
  "nextPageToken": null,
  "tokenMetadata": {
    "1:0xA0b8...": {
      "address": "0xA0b8...",
      "chain_id": "1",
      "symbol": "USDC",
      "name": "USD Coin",
      "decimals": "6"
    }
  }
}
The tokenMetadata map is keyed by chainId:address and provides symbol, name, and decimals for each token — so you don’t need separate on-chain calls to resolve token info.

Withdraw-Eligible Assets

To find which assets support withdrawals for a specific vault, filter the vaultAssets endpoint by withdrawable=true:
curl -s "https://api.paxoslabs.com/v2/amplify/vaultAssets?filter=withdrawable%3Dtrue%20AND%20vaultAddress%3D0x...&pageSize=100" \
  -H "x-api-key: $AMPLIFY_API_KEY" | jq

Vault APY

Equivalent to SDK’s getVaultAPY(). Uses GET /v2/amplify/vaultApys.
VAULT_ADDRESS="0x..."
curl -s "https://api.paxoslabs.com/v2/amplify/vaultApys?filter=vaultAddress%3D${VAULT_ADDRESS}&orderByTimestamp=desc&pageSize=1" \
  -H "x-api-key: $AMPLIFY_API_KEY" | jq '.vaultApys[0]'
The apy field is a decimal (e.g., 0.0523 = 5.23%). Multiply by 100 to display as a percentage.

Vault TVL

Equivalent to SDK’s getVaultTVL(). Uses GET /v2/amplify/vaultTvls.
VAULT_ADDRESS="0x..."
curl -s "https://api.paxoslabs.com/v2/amplify/vaultTvls?filter=vaultAddress%3D${VAULT_ADDRESS}&includeCurrent=true&orderByTimestamp=desc&pageSize=1" \
  -H "x-api-key: $AMPLIFY_API_KEY" | jq '.vaultTvls[0]'

Withdrawal Request History

Equivalent to SDK’s getWithdrawalRequests(). Uses GET /v2/amplify/withdrawalRequests.
USER_ADDRESS="0x..."
curl -s "https://api.paxoslabs.com/v2/amplify/withdrawalRequests?filter=userAddress%3D${USER_ADDRESS}&pageSize=20" \
  -H "x-api-key: $AMPLIFY_API_KEY" | jq

Status Values

StatusDescription
PENDINGOrder submitted, awaiting fulfillment by the vault operator
COMPLETEFulfilled — want asset sent to receiver
PENDING_REFUNDCancellation in progress — shares being returned
REFUNDEDCancelled — shares returned to refund receiver

Token Balances

Read ERC-20 token balances directly from the blockchain. Equivalent to the SDK’s internal getErc20Balance().
const erc20Abi = [
  { inputs: [{ name: 'account', type: 'address' }], name: 'balanceOf', outputs: [{ name: '', type: 'uint256' }], stateMutability: 'view', type: 'function' },
  { inputs: [], name: 'decimals', outputs: [{ name: '', type: 'uint8' }], stateMutability: 'view', type: 'function' },
] as const

async function getTokenBalance(tokenAddress: Address, walletAddress: Address) {
  const [balance, decimals] = await Promise.all([
    publicClient.readContract({ address: tokenAddress, abi: erc20Abi, functionName: 'balanceOf', args: [walletAddress] }),
    publicClient.readContract({ address: tokenAddress, abi: erc20Abi, functionName: 'decimals' }),
  ])
  return { balance, decimals }
}

Allowance Checking

Equivalent to SDK’s isDepositSpendApproved() and isWithdrawalSpendApproved().
async function checkAllowance(tokenAddress: Address, owner: Address, spender: Address) {
  const allowanceAbi = [{ inputs: [{ name: 'owner', type: 'address' }, { name: 'spender', type: 'address' }], name: 'allowance', outputs: [{ name: '', type: 'uint256' }], stateMutability: 'view', type: 'function' }] as const
  const allowance = await publicClient.readContract({ address: tokenAddress, abi: allowanceAbi, functionName: 'allowance', args: [owner, spender] })
  return allowance
}

// For deposits: checkAllowance(USDC, walletAddress, COMMUNITY_CODE_DEPOSITOR)
// For withdrawals: checkAllowance(BORING_VAULT, walletAddress, WITHDRAW_QUEUE)

Exchange Rate

The Accountant contract tracks the exchange rate between vault shares and the underlying asset. Equivalent to SDK’s internal getRateInQuoteWithAssetDecimals(). You must pass the quote asset address (e.g., USDC) to get the rate denominated in that asset.
const accountantAbi = [{ inputs: [{ name: 'quote', type: 'address' }], name: 'getRateInQuoteSafe', outputs: [{ name: 'rateInQuote', type: 'uint256' }], stateMutability: 'view', type: 'function' }] as const

async function getExchangeRate(accountantAddress: Address, quoteAsset: Address) {
  return publicClient.readContract({ address: accountantAddress, abi: accountantAbi, functionName: 'getRateInQuoteSafe', args: [quoteAsset] })
}

Withdrawal Fees

Equivalent to SDK’s getWithdrawalFee(). Reads from the WithdrawQueue’s FeeModule on-chain.
const queueFeeAbi = [{ inputs: [], name: 'feeModule', outputs: [{ name: '', type: 'address' }], stateMutability: 'view', type: 'function' }] as const
const feeModuleAbi = [
  { inputs: [{ name: 'amount', type: 'uint256' }, { name: 'offerAsset', type: 'address' }, { name: 'wantAsset', type: 'address' }, { name: 'receiver', type: 'address' }], name: 'calculateOfferFees', outputs: [{ name: 'feeAmount', type: 'uint256' }], stateMutability: 'view', type: 'function' },
  { inputs: [], name: 'offerFeePercentage', outputs: [{ name: '', type: 'uint256' }], stateMutability: 'view', type: 'function' },
] as const

async function getWithdrawalFee(shareAmount: bigint, wantAsset: Address, receiver: Address) {
  const feeModuleAddr = await publicClient.readContract({ address: WITHDRAW_QUEUE, abi: queueFeeAbi, functionName: 'feeModule' })
  const [feeAmount, feePercentage] = await Promise.all([
    publicClient.readContract({ address: feeModuleAddr, abi: feeModuleAbi, functionName: 'calculateOfferFees', args: [shareAmount, BORING_VAULT, wantAsset, receiver] }),
    publicClient.readContract({ address: feeModuleAddr, abi: feeModuleAbi, functionName: 'offerFeePercentage' }),
  ])
  return { feeAmount, feePercentage }
}

Pause State

Before submitting transactions, check whether the vault is paused. Equivalent to SDK’s internal getPausedStates().
const tellerAbi = [{ inputs: [], name: 'isPaused', outputs: [{ name: '', type: 'bool' }], stateMutability: 'view', type: 'function' }] as const

async function checkPauseState(tellerAddress: Address) {
  return publicClient.readContract({ address: tellerAddress, abi: tellerAbi, functionName: 'isPaused' })
}
If the Teller is paused, deposit and withdrawal transactions will revert. Check pause state before submitting transactions in production.

SDK-to-Direct Mapping Reference

SDK FunctionDirect Contract Equivalent
initAmplifySDK()No equivalent needed — configure RPC client and contract addresses directly
getVaultsByConfig()GET /v2/amplify/vaultAssets
getSupportedAssets()GET /v2/amplify/vaultAssets — filter by depositable: true
getWithdrawSupportedAssets()GET /v2/amplify/vaultAssets — filter by withdrawable=true
getVaultAPY()GET /v2/amplify/vaultApys
getVaultTVL()GET /v2/amplify/vaultTvls
getWithdrawalRequests()GET /v2/amplify/withdrawalRequests
getMinimumMint()On-chain: Accountant.getRateInQuoteSafe(quoteAsset) + math (see Deposits)
getMinimumWithdrawalOrderSize()On-chain: WithdrawQueue.minimumOrderSize() (see Withdrawals)
getWithdrawalFee()On-chain: WithdrawQueue.feeModule()FeeModule.calculateOfferFees()
isDepositSpendApproved()On-chain: ERC20.allowance(owner, depositor)
isWithdrawalSpendApproved()On-chain: BoringVault.allowance(owner, queue)
prepareDeposit()Encode DistributorCodeDepositor.deposit() or depositWithPermit() directly
prepareWithdrawal()Encode WithdrawQueue.submitOrder() directly
prepareCancelWithdrawOrderTxData()Encode WithdrawQueue.cancelOrder() directly

Next Steps