For the complete documentation index, see llms.txt. This page is also available as Markdown.

List approved assets

Discover which assets a fund accepts for subscriptions and redemptions.

Different funds accept different assets, and some support several. Query the shares contract to discover what a fund accepts:

function getApprovedAssets() external view returns (address[] memory);
function getApprovedAsset(address asset) external view returns (ApprovedAsset memory);
function isApprovedAsset(address asset) external view returns (bool);
function assetDecimals(address asset) external view returns (uint8);

struct ApprovedAsset {
    address asset;
    string  symbol;
    uint8   decimals;
    bool    isFeeModuleAsset;
    bool    canDeposit;   // accepted for subscriptions
    bool    canRedeem;    // accepted for redemptions
}

isApprovedAsset returns true if the asset is approved for deposits or redemptions; check the canDeposit / canRedeem flags from getApprovedAsset to know which.

import { createPublicClient, http, parseAbi } from "viem";
import { mainnet } from "viem/chains";

const SHARES = "0x...";
const abi = parseAbi([
  "function getApprovedAssets() view returns (address[])",
  "function getApprovedAsset(address asset) view returns ((address asset, string symbol, uint8 decimals, bool isFeeModuleAsset, bool canDeposit, bool canRedeem))",
  "function isApprovedAsset(address asset) view returns (bool)",
]);

const client = createPublicClient({ chain: mainnet, transport: http() });

const assets = await client.readContract({ address: SHARES, abi, functionName: "getApprovedAssets" });
// e.g. ["0xA0b8...eB48", "0xdAC1...1ec7"]

for (const a of assets) {
  const info = await client.readContract({ address: SHARES, abi, functionName: "getApprovedAsset", args: [a] });
  console.log(info.symbol, { canDeposit: info.canDeposit, canRedeem: info.canRedeem });
  // "USDC" { canDeposit: true, canRedeem: true }
}
import { ethers } from "ethers";

const SHARES = "0x...";
const abi = [
  "function getApprovedAssets() view returns (address[])",
  "function getApprovedAsset(address asset) view returns (tuple(address asset, string symbol, uint8 decimals, bool isFeeModuleAsset, bool canDeposit, bool canRedeem))",
  "function isApprovedAsset(address asset) view returns (bool)",
];

const provider = new ethers.JsonRpcProvider("https://eth.llamarpc.com");
const shares = new ethers.Contract(SHARES, abi, provider);

const assets = await shares.getApprovedAssets();
for (const a of assets) {
  const info = await shares.getApprovedAsset(a);
  console.log(info.symbol, { canDeposit: info.canDeposit, canRedeem: info.canRedeem });
}

Last updated