Skip to main content
All notable changes to the Amplify SDK are documented here. This project adheres to Semantic Versioning.

Latest Release

0.5.3
2026-04-10

Terminology Change

Starting in v0.5.3, the documentation and UI refer to “accounts” instead of “vaults”. This is a naming change only — all SDK API identifiers (getVaultsByConfig, AmplifyVault, vaultName, vaultAddress, etc.) remain unchanged. No code migration is required.

New Features

  • Supply cap awareness — The SDK now reads and enforces account deposit supply caps on-chain. Deposits that would exceed the account’s supplyCapInBase (read from the DistributorCodeDepositor contract) are rejected with a descriptive APIError before submitting a transaction. The cached AmplifyVault type exposes a new depositCap?: VaultDepositCap field with supplyCapInBase and hasDepositCap.
  • getDepositCap() — New display helper that reads the supply cap and fee module address from the DCD contract on-chain. Returns supplyCapInBase, hasDepositCap, depositFeeModuleAddress, and hasFees.
  • getCurrentSupply() — New display helper that reads the current total account supply from the BoringVault and Accountant contracts. Returns totalShareSupply, exchangeRate, accountantDecimals, and totalValueInBase for comparing against the supply cap.
  • calculateDepositFee() — New display helper that reads deposit fee parameters from the on-chain fee module. Returns a full fee breakdown: feePercentage, flatFee, variableFeeAmount, totalFeeAmount, depositAmountAfterFees, and assetDecimals.
  • getShareValue() — New display helper that calculates the value of account shares in a quote asset using the on-chain getRateInQuote exchange rate. Accepts either a userAddress (reads balanceOf on-chain) or an explicit shareAmount.
  • Deposit fee data on accountsAmplifyVault.depositFees?: VaultDepositFees carries per-asset fee data from the indexer, enriched with defaults when the fee module is configured but indexer data is missing. Includes hasFees, feeModuleAddress, and per-asset feePercentage/flatFee.
  • Withdraw fee data on accountsAmplifyVault.withdrawFees?: VaultWithdrawFees carries withdraw queue fee metadata from the indexer. Includes hasFees, feeModuleAddress, offerFeeBps, and offerFeeRate.
  • Account enrichmentgetVaults() now automatically enriches accounts with on-chain supply caps and default fee structures during cache population. Supply cap reads only run for accounts with both a communityCodeDepositorAddress and depositFeeModuleAddress.

Improvements

  • VaultContracts expanded — Added depositFeeModuleAddress and withdrawFeeModuleAddress fields to the account contracts interface.
  • Deposit cap enforcementprepareDepositTxData() and prepareDepositWithPermitTxData() now validate deposits against the supply cap before building the transaction, comparing the deposit amount (converted to base units via accountant rate) against remaining capacity.

Migration from v0.5.2

Upgrade is non-breaking. Install @paxoslabs/amplify-sdk@0.5.3 to pick up the new features.The new depositCap, depositFees, and withdrawFees fields on AmplifyVault are optional — existing code that destructures account objects will not break. If you want to display fee or cap information, use the new display helpers:
import {
  getDepositCap,
  getCurrentSupply,
  calculateDepositFee,
  getShareValue,
} from '@paxoslabs/amplify-sdk'
Docs
2026-04-01

Direct Contract Integration — KYT Accounts

  • KYT-only deposit documentation — The Direct Contract deposits guide now documents the DistributorCodeDepositorV1 (KYT) contract exclusively. Both deposit() and depositWithPermit() include the required _attestation tuple parameter with empty/zero default values. Contact the Paxos Labs team to implement a compliance policy.
  • KYT callout on Direct Contract overview — Added a warning banner to the Direct Contract overview page about the KYT account requirement.

Documentation Fixes

  • Permit deposit txData shape corrected — Code examples in the Deposit Workflow, Deposits Guide (Privy, Wagmi, and Viem tabs), and Quickstart now use the flat txData structure (txData.abi, txData.functionName, txData.args) introduced in v0.5.2. Previously these examples incorrectly referenced the pre-v0.5.2 nested shape (txData.data.abi).
  • BigInt serialization fix for Privy permit signing — Replaced JSON.stringify(auth.permitData) with the SDK’s toEthSignTypedDataV4() helper in the Deposits Guide (Privy tab) and Quickstart. JSON.stringify throws a TypeError on BigInt values in permitData.message.
  • getRateInQuoteSafe ABI corrected — The Accountant ABI in the Direct Contract Deposits and Withdrawals guides now includes the required quote: address input parameter. The previous ABI had an empty inputs array, which would produce the wrong function selector on-chain.
  • VaultContracts field name corrected — Renamed distributorCodeDepositorAddress to communityCodeDepositorAddress in the Types reference to match the SDK’s actual VaultContracts interface.
  • AmplifyVault type updated — Added missing inDeprecation: boolean and enterpriseConfig?: EnterpriseConfig fields to the AmplifyVault interface in the Types reference, getVaultsByConfig, findVaultByConfig, and AI Reference docs.
  • getWithdrawalFee() parameters corrected — Fixed parameter names (withdrawAssetAddressassetAddress, withdrawAmountamount) and added missing required parameters (offerAsset, wantAsset, receiver) in the AI Reference. Return type corrected from string to bigint.
  • getMinimumWithdrawalOrderSize() parameter corrected — Fixed parameter name (withdrawAssetAddressassetAddress) in the AI Reference. Return type corrected from string to bigint with additional shareDecimals: number field.
0.5.2
2026-03-27

New Features

  • KYT deposit routing — Deposits automatically route to the KYT-enabled DistributorCodeDepositorV1 contract when an account has enterpriseConfig.predicatePolicyId set. The SDK returns a discriminated union (StandardDepositTxData | KytDepositTxData) with a depositType field so consumers can distinguish between standard and KYT deposits. Type guards isKytDeposit() and isStandardDeposit() are exported for narrowing.
  • Account deprecation warnings — Accounts with inDeprecation: true now trigger a warning via the SDK logger when prepareDepositTxData() or prepareDepositWithPermitTxData() is called. The AmplifyVault type exposes the new inDeprecation: boolean field.
  • Enterprise config on accountsAmplifyVault.enterpriseConfig carries predicatePolicyId from the GraphQL schema, enabling client-side KYT policy awareness.

Improvements

  • Flattened permit deposit returnprepareDepositWithPermitTxData() now returns a flat object ({ depositType, abi, address, functionName, args, chainId }) matching the shape of prepareDepositTxData(). Previously the ABI and args were nested under a .data property. This makes both functions directly spreadable into viem’s writeContract.

Migration from v0.5.1

Upgrade is non-breaking for standard deposits. If you use prepareDepositWithPermitTxData() directly, update property access:
// Before (v0.5.1)
await writeContract({
  address: txData.address,
  abi: txData.data.abi,
  functionName: txData.data.functionName,
  args: txData.data.args,
})

// After (v0.5.2)
await writeContract({
  address: txData.address,
  abi: txData.abi,
  functionName: txData.functionName,
  args: txData.args,
})
If you use the unified prepareDeposit() workflow, no changes are needed — it handles the new shape internally.
0.5.1
2026-03-23

New Features

  • Base mainnet — Base (chainId 8453) is included in the SDK’s built-in chain map, so getVaultsByConfig(), deposit and withdrawal preparation, and on-chain reads resolve a proper viem Chain for Base without extra configuration. Pass chainId: 8453 anywhere you already pass Ethereum or HyperEVM IDs.
  • Cross-chain chain resolution — When the wallet’s chain differs from the account’s chain (for example, multi-chain or bridged-asset flows), chain utilities can resolve the correct built-in chain config for the user’s chainId as well as the account’s.
Upgrade from v0.5.0 is non-breaking for application code; install @paxoslabs/amplify-sdk@0.5.1 (or latest patch) to pick up Base support.
0.5.0
2026-03-18

Breaking Changes

This release contains breaking changes. All transaction and display helper functions now identify accounts by vaultName instead of yieldType. Review the migration steps below before upgrading.
ChangeBefore (v0.4.2)After (v0.5.0)
Account identifier in transaction functionsyieldType: YieldTypevaultName: string
Account identifier in display helpersyieldType: YieldTypevaultName: string
Account discoveryImplicit (SDK resolved internally)Explicit via getVaultsByConfig()
Withdrawal asset discoveryNot availablegetWithdrawSupportedAssets()
Account fetchingfetchVaults()getVaults()
Asset fetchingfetchSupportedAssets()getSupportedAssets()
Affected functions — the yieldType parameter has been replaced by vaultName in all of the following:
CategoryFunctions
DepositprepareDepositAuthorization, prepareDeposit, prepareDepositTxData, prepareDepositPermitSignature, prepareDepositWithPermitTxData, prepareApproveDepositTokenTxData
WithdrawalprepareWithdrawalAuthorization, prepareWithdrawal, prepareWithdrawOrderTxData, prepareApproveWithdrawOrderTxData, prepareCancelWithdrawOrderTxData
DisplaygetMinimumMint, getWithdrawalFee, getMinimumWithdrawalOrderSize

New Features

  • getVaults() — Renamed from fetchVaults(). Same cache-first behavior, new name for consistency.
  • getSupportedAssets() — Renamed from fetchSupportedAssets(). Same cache-first behavior, new name for consistency.
  • getVaultsByConfig() — Multi-filter account discovery. Filter by yieldType, chainId, depositAssetAddress, withdrawAssetAddress, and settlementAssetAddress.
  • getWithdrawSupportedAssets() — Fetch all supported withdrawal assets grouped by token with their available accounts.
  • vaultName parameter on display helpersgetVaultAPY, getVaultTVL, and getWithdrawalRequests now accept vaultName as an alternative to vaultAddress.
  • Cache management — Fully documented: initializeCache(), getCache(), refreshVaultCache(), isCacheReady(), waitForCacheReady().

Migration Guide

Why this change?

In v0.4.2, yieldType served as the account identifier. This worked when each yield type mapped to a single account per chain, but broke down as multiple accounts with the same yield type launched on the same chain. The vaultName identifier is unique per account and future-proof.The new pattern is: discover → then transact.
// 1. Discover (once, at app startup or on chain/asset change)
const [vault] = await getVaultsByConfig({
  yieldType: YieldType.CORE,
  chainId: 1,
  depositAssetAddress: USDC,
})

// 2. Transact (using the vault's name)
await prepareDeposit({
  vaultName: vault.name,
  depositAsset: USDC,
  depositAmount: '1000',
  to: userAddress,
  chainId: 1,
})
Add a call to getVaultsByConfig() wherever you previously passed yieldType directly to a transaction function. Cache the result for the session.
import { getVaultsByConfig, YieldType } from '@paxoslabs/amplify-sdk'

// Before — no discovery step needed
// After  — discover the vault first
const [vault] = await getVaultsByConfig({
  yieldType: YieldType.CORE,
  chainId: 1,
  depositAssetAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
})

// vault.name is used in all subsequent calls
Replace yieldType with vaultName in every deposit function call.
// Before (v0.4.2)
await prepareDepositTxData({
  yieldType: YieldType.CORE,
  depositAsset: '0x...',
  depositAmount: '1000',
  to: userAddress,
  chainId: 1,
})

// After (v0.5.0)
await prepareDepositTxData({
  vaultName: vault.name,
  depositAsset: '0x...',
  depositAmount: '1000',
  to: userAddress,
  chainId: 1,
})
The same change applies to:
  • prepareDepositAuthorization()
  • prepareDeposit()
  • prepareDepositPermitSignature()
  • prepareDepositWithPermitTxData()
  • prepareApproveDepositTokenTxData()
// Before (v0.4.2)
await prepareWithdrawalAuthorization({
  yieldType: 'CORE',
  wantAsset: USDC,
  withdrawAmount: '1.0',
  userAddress,
  chainId: 1,
})

// After (v0.5.0)
const [vault] = await getVaultsByConfig({ yieldType: 'CORE', chainId: 1 })

await prepareWithdrawalAuthorization({
  vaultName: vault.name,
  wantAsset: USDC,
  withdrawAmount: '1.0',
  userAddress,
  chainId: 1,
})
The same change applies to:
  • prepareWithdrawal()
  • prepareWithdrawOrderTxData()
  • prepareApproveWithdrawOrderTxData()
  • prepareCancelWithdrawOrderTxData()
Display helpers that previously used yieldType to locate an account now use vaultName.
// Before (v0.4.2)
const result = await getMinimumMint({
  yieldType: YieldType.CORE,
  chainId: 1,
  depositAssetAddress: USDC,
  depositAmount: '1000.0',
})

// After (v0.5.0)
const [vault] = await getVaultsByConfig({
  yieldType: YieldType.CORE,
  chainId: 1,
})

const result = await getMinimumMint({
  vaultName: vault.name,
  chainId: 1,
  depositAssetAddress: USDC,
  depositAmount: '1000.0',
})
The same change applies to:
  • getWithdrawalFee()
  • getMinimumWithdrawalOrderSize()
Additionally, getVaultAPY(), getVaultTVL(), and getWithdrawalRequests() now accept vaultName as an alternative to vaultAddress:
// New — use vaultName instead of looking up vaultAddress manually
const apy = await getVaultAPY({ vaultName: vault.name })
const tvl = await getVaultTVL({ vaultName: vault.name, chainId: 1 })
If you wrapped SDK calls in React hooks, update the interface and params:
// Before (v0.4.2)
interface DepositParams {
  amount: string
  depositAsset: `0x${string}`
  yieldType: YieldType
}

const params = {
  yieldType,
  depositAsset,
  depositAmount: amount,
  to: address,
  chainId,
}

// After (v0.5.0)
interface DepositParams {
  amount: string
  depositAsset: `0x${string}`
  vaultName: string
}

const params = {
  vaultName,
  depositAsset,
  depositAmount: amount,
  to: address,
  chainId,
}
Use getVaultsByConfig() in a useQuery or useEffect to discover the account name at component mount time, then pass it to your deposit/withdrawal hooks.
Use these patterns to locate all call sites in your codebase:
# Find all yieldType usages in SDK calls
rg "yieldType.*YieldType\." --type ts
rg "yieldType.*['\"]CORE['\"]" --type ts

# Find all affected function calls
rg "prepare(Deposit|Withdrawal|WithdrawOrder|ApproveWithdraw|CancelWithdrawOrder)" --type ts
rg "get(MinimumMint|WithdrawalFee|MinimumWithdrawalOrderSize)" --type ts

0.4.2
2026-02-13

Breaking Changes

  • Withdrawal flow migrated from AtomicQueue to WithdrawQueue.
  • Renamed withdrawal APIs:
    • prepareWithdrawTransactionData() -> prepareWithdrawOrderTxData()
    • prepareApproveWithdrawToken() -> prepareApproveWithdrawOrderTxData()
  • Added prepareCancelWithdrawOrderTxData() for order cancellation.
  • Withdrawal slippage parameters removed from the new flow.

Highlights

  • Added unified prepareWithdrawal() wrapper for withdrawal execution.
  • Added unified prepareWithdrawalAuthorization() wrapper.
  • Added smart-wallet detection for deposit/withdraw authorization routing.
  • Added forceMethod parameter for explicit authorization routing.

0.3.0-beta.0
2025-01-30

Breaking Changes

This release contains breaking changes. Review the migration steps below before upgrading.
ChangeBeforeAfter
Deposit parameter namesdepositToken, recipientAddressdepositAsset, to
Node.js requirement20+22+
Yield type constantsPRIME, TBILL, LENDINGCORE, TREASURY, FRONTIER
// Before (v0.2.x)
await prepareDepositTxData({
  depositToken: "0x...",
  recipientAddress: "0x...",
  // ...
});

// After (v0.3.0)
await prepareDepositTxData({
depositAsset: "0x...",
to: "0x...",
// ...
});

// Before (v0.2.x)
import { YieldType } from "@paxoslabs/amplify-sdk";
YieldType.PRIME;
YieldType.TBILL;
YieldType.LENDING;

// After (v0.3.0)
import { YieldType } from "@paxoslabs/amplify-sdk";
YieldType.CORE;
YieldType.TREASURY;
YieldType.FRONTIER;

Features

  • Improved TypeScript inference for deposit functions
  • Added eth_signTypedData_v4 helper for better wallet compatibility

Bug Fixes

  • Fixed instanceof checks for APIError and WithdrawError in transpiled code

Refactoring

  • Standardized parameter naming across deposit APIs to match contract terminology
  • Removed deprecated display module and bridge functionality
  • Added explicit exports for tree-shaking optimization

Previous Releases

Bug Fixes

  • Fixed spender address and decimals for permit flow
  • Improved cache-based lookup for token address resolution
  • Aligned EIP712Domain with viem’s TypedDataDomain

Bug Fixes

  • Use non-interactive test command in release hooks
  • Resolved preact JSON VNode Injection vulnerability
  • Use DistributorCodeDepositor as approval spender
  • Aligned slippage defaults to DEFAULT_SLIPPAGE_BPS (50 bps)

Documentation

  • Completed Quick Start deposit example in README

Refactoring

  • Converted LogLevel enum to as const pattern for better tree-shaking

Features

  • Unified Deposit API: Added prepareDeposit and prepareDepositAuthorization wrapper functions
  • Observability: Added logging and telemetry infrastructure
  • ERC-20 Enhancements: Added getTokenPermitInfoWithAllowance with unified multicall

Bug Fixes

  • Updated Sei chain ID from 713715 to 1329
  • Fixed missing multicall mock in deposit-with-permit tests
  • Prevented duplicate buffer-full warning messages in telemetry

Refactoring

  • Converted DepositAuthMethod enum to as const pattern
  • Centralized API_BASE_URL constant
  • Use unified multicall for isDepositSpendApproved

Bug Fixes

  • Corrected DepositTxData args tuple
  • Fixed withdraw documentation
  • Resolved whatBump is not a function release error

Refactoring

  • Use DistributorCodeDepositor for all deposits and permit spender

Features

  • Export CommunityCodeDepositTxData type
  • Fixed cache check for account data

Bug Fixes

  • Updated DistributorCodeDepositor support for partner code deposits
  • Improved type safety and chain cache initialization

Refactoring

  • Updated branding from Earn SDK to Amplify SDK

Features

  • Initial SDK Release
    • Comprehensive AmplifyVault support
    • Multi-chain support for yield accounts
    • Complete deposit functionality with approval management
    • Slippage protection for all operations
  • Withdraw Flow
    • prepareWithdrawTransactionData() for transaction preparation
    • Automatic account data fetching via fetchSupportedAssets()
    • Three-field account resolution (yieldType + wantToken + chainId)
    • Configurable slippage protection (default 0.5%)
  • Developer Experience
    • Full TypeScript support with type safety
    • Comprehensive error handling with specific error codes
    • Exchange rate calculations

Build System

  • Automated release workflow with conventional commits
  • Semantic versioning with alpha/beta/rc support
  • CI/CD pipeline with quality gates
  • Security auditing and dependency scanning
  • Automated NPM publishing with provenance

SDK Rename Migration

The SDK was renamed from Earn SDK to Amplify SDK in version 0.1.0. Follow the migration steps below if upgrading from @paxoslabs/earn-sdk.
1

Update package

npm uninstall @paxoslabs/earn-sdk npm install @paxoslabs/amplify-sdk
2

Update imports

// Before
import { initEarnSDK, type EarnVault } from "@paxoslabs/earn-sdk";

// After
import { initAmplifySDK, type AmplifyVault } from "@paxoslabs/amplify-sdk";

3

Update function calls

// Before
await initEarnSDK("pxl_your_api_key");

// After
await initAmplifySDK("pxl_your_api_key");
4

Update type references

// Before
const vault: EarnVault = /* ... */;

// After
const vault: AmplifyVault = /_ ... _/;

API endpoints continue to use /v1/earn-sdk/* for backwards compatibility. No backend changes required.