Skip to main content
This guide walks you through integrating an Advanced Strategy into your platform. By the end, you’ll be able to display vaults in-app, handle deposits and redemptions, and monitor positions through the Railnet API.
While Railnet is not fully live, the integration and distribution of Advanced Strategies is done directly from the Vault 7540.
For a detailed overview of how Advanced Strategies work (architecture, vault lifecycle, NAV reporting, fee structure, roles), see Advanced Strategies.

Prerequisites

Before integrating, make sure you have the following.

Advanced Strategy distribution address

Each Advanced Strategy is distributed from a single shared 7540 Vault. For testing, use the ready-to-use deployments on mainnets below.

Referral code

Every deposit your platform routes carries a referral address as a function parameter. This is what attributes the deposit to your organization for reporting and revenue share. The attribution is recorded on-chain via the Referral event:
Solidity
Contact the Railnet team to be assigned a referral address before going live. Without it, deposits cannot be attributed, and your organization and the TVL driven by your platform will not be credited.
For testing purposes, you can set the referral parameter to the zero address (0x0000000000000000000000000000000000000000). The deposit will go through normally; it just will not be attributed to any partner.

Reporting API

The Railnet Reporting API powers vault details, position tracking, and activity history. Full documentation, including request and response schemas, is available at docs.api.railnet.org/#tag/Async-Vaults.
Testing against the ready-to-use deployments? Those vaults report to the staging environment. Swap the API base URL in every example below from https://api.railnet.org to https://api.staging.railnet.org. The endpoint paths and request/response shapes are identical; only the host changes. The reference docs link above (docs.api.railnet.org) is the same regardless of environment.

Reporting

Use the Railnet Reporting API to surface vault details, user positions, and activity history inside your platform. All endpoints share the base path /v1/railnet/async-vaults.

Fetch vault information

To populate your platform’s vault listing or product detail page (name, asset, icon, APY, TVL, share price, fees), query the /vaults endpoint.
GET
Parameters:
  • vault_ids (query): filter to one or more specific vaults. Each id is formatted as <chain_id>_<vault_address>. Multiple values are comma-separated.
  • chain_ids, asset_ids, status (query, optional): additional filters. See the /vaults reference for the full list.
Returns: A data array of vault objects, with fields grouped by:
  • Identity: name, symbol, state (Open / Closing / Closed).
  • Underlying asset: deposit_asset.symbol, deposit_asset.decimals (use decimals to format _in_asset amounts).
  • Vault performance: apy.last_7d, apy.last_30d, apy.last_1y, apy.all_time (returned in percentage points).
  • TVL: total_value_in_asset (TVL in min units of the deposit asset), total_value_in_usd (USD).
  • Share price: share_price_in_asset, share_price_in_usd (use to convert between shares and assets when previewing operations).
  • Fees: fees.management_bps, fees.performance_bps, fees.protocol_bps (basis points).
  • Freshness: updated_at — when the data was last refreshed.
Example request:
cURL
Example response:
JSON
You can cache this data and reuse it later to map it to a user position or surface it in different parts of your UI.

Vault activity

/vaults gives you the vault’s current state. To complement it with the vault’s recent activity (deposits, redemptions, NAV proposals and NAV settlements), query the /operations endpoint with only the vault_ids parameter and no wallets. This returns vault-scoped activity across all users, sorted by timestamp.
GET
Parameters:
  • vault_ids (query, required): one or more vault ids (<chain_id>_<vault_address>). Multiple values are comma-separated.
  • wallets (query): omit to get vault-scoped activity across all users. When set, the endpoint returns wallet-scoped activity instead — see Get user activity.
Returns: A data array of operation entries, returned newest-first. Without a wallets filter, the feed mixes vault-level events (no wallet field) with user-level events (each carries a wallet field; the same five types are surfaced in Get user activity when scoped to a wallet). Vault-level events:
  • nav_proposal: the asset manager has proposed a new NAV for the next settlement. proposed_nav_in_asset is the proposed value in the deposit asset’s min units. Capital does not move at this stage — it’s an announcement.
  • nav_update: the proposed NAV has been applied on-chain. total_assets is the new vault NAV (deposit asset’s min units), used as the share price reference until the next NAV update.
  • settlement: an epoch has been settled. epoch_id identifies which epoch was processed; settlement_type is "deposit" or "redeem" (a single epoch settles one direction); total_assets and total_supply reflect vault state immediately after settlement.
User-level events:
  • request_deposit: a user submitted an async deposit request. amount_in_asset is the deposited amount; epoch_id is the epoch the request will settle in.
  • cancel_deposit: a user canceled a pending deposit request before settlement. epoch_id matches the canceled request.
  • claim_shares: a user claimed shares from a settled deposit. amount_in_asset is the deposit consumed; amount_in_shares is the shares minted. Sync deposits also produce this row but skip the request and settlement steps.
  • request_redemption: a user submitted an async redemption request. amount_in_shares is the shares put in escrow; epoch_id is the epoch.
  • claim_assets: a user claimed assets from a settled redemption. amount_in_asset is the underlying received; amount_in_shares is the shares burned.
Every entry carries vault_id, vault_chain_id, vault_address, tx_hash, and timestamp. User-level events additionally carry wallet, plus sender, recipient, controller, and owner where applicable. Example request:
cURL
Example response (truncated to one example per event type):
JSON
Use this feed to render a “Recent activity” panel on the vault page, surface the latest settlement (the most recent settlement event), or join epoch_id across request_*, cancel_deposit, and settlement rows to see which user requests were fulfilled.

Track historical performance

To chart a vault’s share price or TVL over time, query the /period-summaries endpoint. A period is the interval between two consecutive NAV updates (each corresponds to a nav_update event / on-chain TotalAssetsUpdated). Each entry captures the vault’s assets, share supply, and share price at the start and end of that interval.
GET
Parameters:
  • vault_ids (query, required): one or more vault ids (<chain_id>_<vault_address>). Multiple values are comma-separated.
  • start_date (query, optional): filter to periods on or after this date, inclusive. Format YYYY-MM-DD.
  • end_date (query, optional): filter to periods on or before this date, inclusive. Format YYYY-MM-DD.
Returns: A data array with one object per vault. Each vault object carries:
  • Identity: vault_id, vault_chain_id, vault_address.
  • Decimals: deposit_asset_decimals (to format the total_assets_* and share_price_* amounts, which are in the deposit asset’s min units) and share_decimals (to format the total_supply_* amounts).
  • periods: an array of period entries, each with:
    • Boundary: timestamp — when the period ended (the NAV update fired); duration — length of the period in seconds ("0" means two NAV updates landed in the same block).
    • Assets: total_assets_at_start (post-settlement from the previous boundary, including deposit inflows) and total_assets_at_end (after the NAV update, before this boundary’s settlement), both in the deposit asset’s min units.
    • Supply: total_supply_at_start, total_supply_at_end (before fees), and net_total_supply_at_end (after fee shares are minted to fee recipients — higher than total_supply_at_end by the minted amount), all in share min units.
    • Share price: share_price_in_asset_at_start and share_price_in_asset_at_end (net of fees), in the deposit asset’s min units per whole share. Derived as total_assets × 10^share_decimals / total_supply.
Example request:
cURL
Example response:
JSON
Plot share_price_in_asset_at_end (or total_assets_at_end for TVL) against timestamp to build a performance chart. To show the return realized in a single period, compare share_price_in_asset_at_start to share_price_in_asset_at_end; annualize using duration when you need an APY-style figure.

Get user positions

To display a user’s position inside a vault (current balance, rewards earned, pending deposits, pending redemptions), query the /positions endpoint.
GET
Parameters:
  • wallets (query, required): the user wallet(s) you want to retrieve positions for. Multiple values are comma-separated.
  • vault_ids (query): scope to one or more specific vaults. Each id is <chain_id>_<vault_address>. Multiple values are comma-separated.
Returns: A data array of position objects, one per (wallet, vault) pair, with fields grouped by:
  • Current balance: balance_in_asset (the user’s position expressed in the vault’s underlying asset, in min units), balance_in_usd (USD), balance_in_shares (yield-bearing receipt token amount). You can abstract the receipt token away and display only the underlying-asset amount.
  • Rewards earned: total_rewards_in_asset, total_rewards_in_usd (cumulative yield generated since the user first deposited).
  • Pending deposits: pending_deposits.unfulfilled lists requests still awaiting settlement; pending_deposits.claimable_in_shares / claimable_in_asset is what is settled and ready for the user to claim on-chain (call deposit / mint on the vault).
  • Pending redemptions: mirror of the above for redeem requests; pending_redemptions.claimable_in_asset / claimable_in_shares is what the user can claim on-chain via redeem / withdraw.
  • Lifetime activity: net_deposited_in_asset, net_withdrawn_in_asset (in min units of the deposit asset).
  • Freshness: updated_at.
Example request:
cURL
Example response:
JSON

Get user activity

To display a user’s transaction history (deposit requests, cancellations, share claims, redemption requests, asset claims), query the same /operations endpoint used for vault activity, this time scoped to one or more wallets.
GET
Parameters:
  • vault_ids (query, required): one or more vault ids (<chain_id>_<vault_address>). Multiple values are comma-separated.
  • wallets (query, required): the user wallet(s) whose history you want. Multiple values are comma-separated.
Returns: A data array of user-level operation entries, returned newest-first. Each entry includes:
  • type: the action the user took. The values you will encounter are request_deposit, cancel_deposit, claim_shares (claiming after a settled deposit), request_redemption, and claim_assets (claiming after a settled redemption). Sync paths produce the same claim_* records but skip the request and settlement steps.
  • Amounts: amount_in_asset and / or amount_in_shares depending on the operation type. Format with the corresponding decimals from /vaults.
  • Vault context: vault_id, vault_chain_id, vault_address. Useful when you query multiple vault_ids at once and need to know which vault each row belongs to.
  • On-chain reference: tx_hash and timestamp. Use tx_hash to link out to a block explorer.
  • Request identifiers: epoch_id on request_deposit, cancel_deposit, and request_redemption. This is the same id you receive from the requestDeposit / requestRedeem calls on-chain and the same id reported on settlement rows from the vault activity feed, so you can join the user’s request to the settlement that fulfilled it.
  • Counterparties: sender, recipient, controller, owner (set per operation type). Most platforms only need to display the user’s own wallet, but these are useful when your platform manages claims on behalf of users (controller != owner).
Example request:
cURL
Example response (truncated to one example per operation type):
JSON
Use this endpoint to render a “Transaction history” tab on the user’s account page. For pending state (“you have a deposit request waiting on the next settlement”), prefer /positions (pending_deposits.unfulfilled and pending_redemptions.unfulfilled) since it pre-computes claimability for you.

Vault interactions

Now that you have access to the full reporting data, you can start interacting with the vaults. In this section, we cover how to perform deposits and redemptions via direct contract calls, along with related actions such as canceling a deposit, claiming shares, and claiming assets.

Deposit flow

The 7540 Vault supports two deposit paths:
  • Synchronous: the user deposits and receives shares in the same transaction. Available when the vault’s NAV is fresh and sync mode permits it.
  • Asynchronous: the user submits a request, the asset manager settles at the next NAV update, and the user (or your platform on their behalf) claims the resulting shares.
The two paths are mutually exclusive: the vault enforces which one to use based on whether the vault’s NAV is currently fresh.
  • When the NAV is fresh and sync mode permits sync deposits, only syncDeposit works (requestDeposit reverts with OnlySyncDepositAllowed).
  • When the NAV is expired, only requestDeposit works (syncDeposit reverts with TotalAssetsExpired).
Your platform must always check which path is currently active before submitting the transaction.

Choose the deposit path

Before you submit the user’s transaction, your platform must call previewSyncDeposit on the vault to find out which path is currently active.
Solidity
Parameters:
  • assets: the amount of underlying asset (in the asset’s min units) the user is about to deposit. The vault uses this both as the gate input (returns 0 if sync deposit is not currently allowed) and to compute the corresponding number of shares net of entry fees.
Returns:
  • shares: the number of vault shares the user would receive after the entry fee. A non-zero value means the sync path is the only one currently allowed (requestDeposit would revert with OnlySyncDepositAllowed). A zero value means the async path is the only one currently allowed (syncDeposit would revert with TotalAssetsExpired or SyncOperationNotAllowed).
Example (TypeScript, ethers v6):
TypeScript

Approve the vault

Both deposit paths (sync and async) require the user’s wallet to have approved the 7540 Vault to spend the deposit amount of the underlying asset. Before submitting syncDeposit or requestDeposit, your platform must check the current allowance and, if it is insufficient, prompt the user to send a new approval.
1

Check the current allowance

Call allowance on the underlying ERC-20 asset contract:
Solidity
Parameters:
  • owner: the user’s wallet address (the holder of the deposit asset).
  • spender: the 7540 Vault address.
Returns: the amount of asset the vault is currently authorized to pull from owner. If this is less than the deposit amount the user intends to make, you must request a new approval before calling either deposit function.
2

Request approval if insufficient

Prompt the user to send an approval transaction to the underlying asset contract:
Solidity
Parameters:
  • spender: the 7540 Vault address.
  • amount: the amount the vault is allowed to pull, in the asset’s min units. Pass at least the deposit amount.
The transaction is sent to the underlying asset contract (not the vault), from the user’s wallet, with value = 0. After it confirms, you can submit the deposit transaction.

Synchronous deposit

When previewSyncDeposit returns a non-zero value, the user can deposit and receive shares in a single transaction. Make sure the vault is approved to pull assets of the underlying token from the depositor first.
Solidity
Parameters:
  • assets: the amount of underlying to deposit, in the asset’s min units. Must be >0 and within the vault’s maxCap headroom (totalAssets() + assets + siloBalance <= maxCap()); otherwise the call reverts with MaxCapReached.
  • receiver: the address that will receive the minted shares.
  • referral: your Railnet-assigned referral address. Use the zero address (0x0000000000000000000000000000000000000000) for testing if you do not have a referral address yet.
Returns:
  • shares: the number of vault shares minted to receiver, net of the entry fee.
Native ETH path: if the underlying asset is wETH, you can fund the deposit with native ETH by passing msg.value and leaving assets = 0. The vault wraps the ETH on the user’s behalf. Sending msg.value when the underlying is not wETH reverts with CantDepositNativeToken.
Example (TypeScript, ethers v6):
TypeScript

Asynchronous deposit

When previewSyncDeposit returns 0, the user must use the async path: request → settle → claim. Make sure the vault is approved to pull assets from the owner first.
1

Submit the request

Solidity
Parameters:
  • assets: the amount of underlying to deposit, in the asset’s min units. Subject to the vault’s maxCap (MaxCapReached revert if exceeded).
  • controller: the address that owns the request and can later claim the resulting shares. Set it equal to owner unless your platform manages claims on behalf of users (e.g. claiming into a different receiver).
  • owner: the address that provides the underlying.
  • referral: your Railnet-assigned referral address. Use the zero address (0x0000000000000000000000000000000000000000) for testing.
Returns:
  • requestId: the epoch ID this request was registered against. You do not need to store it for the normal claim flow: the Reporting API tracks settlement state by wallet. The id is still useful as a cross-reference to the matching settlement row in the /operations feed (where it appears as epoch_id) for observability or audit purposes.
After this call, assets move into escrow. No shares are minted yet; the share price is determined at settlement.
A controller cannot have two pending requests across different epochs. Calling requestDeposit again in the same epoch adds to the existing request; calling it in a later epoch while a previous one is still pending reverts with OnlyOneRequestAllowed.
2

Cancel the request (optional, same epoch only)

If the user changes their mind before the next settlement, the controller can cancel the request and recover the full deposited amount.
Solidity
Parameters: none. The vault uses msg.sender as the controller.Behavior: refunds the full deposited amount of the controller’s pending request to msg.sender. Only works while the request is still in the current epoch; once a settlement has rolled the epoch, the call reverts with RequestNotCancelable.
3

Wait for settlement

After the next NAV update, the asset manager settles the epoch and the user’s shares become claimable. The recommended way to detect this is via the Reporting API’s /positions endpoint: you are most likely already polling it for the user’s portfolio view, and it aggregates settlement state per (wallet, vault) so you do not need to track requestIds yourself.
GET
Fields to watch inside data[0].pending_deposits:
  • unfulfilled: array of requests still in escrow, waiting for the next settlement. While this is non-empty, the user’s deposit is “pending” in your UI.
  • claimable_in_asset: total asset amount that has settled and is ready to claim, in the asset’s min units. Pass this directly to deposit (Option A in the next step).
  • claimable_in_shares: total share amount that has settled and is ready to claim, in share min units. Pass this directly to mint (Option B in the next step).
When claimable_in_asset > 0 (or claimable_in_shares > 0), the request is settled and the user can claim. pending_deposits.claimable_in_* is aggregated across all of the user’s settled-but-unclaimed deposits in this vault, so a single value covers multiple settled epochs.
Alternatives (use only if you do not want a server-side dependency on the Reporting API):
  • On-chain view claimableDepositRequest(uint256 requestId, address controller) returns the claimable asset amount for a single request; pass requestId = 0 to query the controller’s latest request.
  • Subscribe to the vault’s SettleDeposit events (the epochId field matches the requestId returned in step 1).
  • Poll the Reporting API’s /operations endpoint and watch for a row with type = "settlement" and an epoch_id matching your request.
4

Claim shares

Once pending_deposits.claimable_in_asset > 0, the controller (or anyone they have authorized) can claim the shares. Two equivalent functions are available so you can claim in whichever unit is more convenient: pass claimable_in_asset to deposit (Option A), or claimable_in_shares to mint (Option B). Both support partial claims.
Solidity
Parameters:
  • assets: the asset amount to claim, in the asset’s min units. Must be <= pending_deposits.claimable_in_asset from the /positions response. Pass any positive value <= claimable for partial claims.
  • receiver: the address that receives the minted shares.
  • controller: the request controller.
Returns:
  • shares: the number of shares minted to receiver, computed at the epoch’s snapshot share price net of the entry fee that was active at settlement.
The share price used for the claim is locked at settlement time, regardless of when the user claims.
Some strategies are configured to auto-claim shares on behalf of depositors during settlement. In that case, shares appear in receiver’s wallet without your platform calling deposit or mint. Always check balanceOf(receiver) (or claimableDepositRequest) before prompting the user to claim.
Example (TypeScript, ethers v6):
TypeScript

Redemption flow

The 7540 Vault supports two redemption paths:
  • Synchronous (instant): the user burns their shares and receives the underlying assets in the same transaction. Available when sync mode permits it, NAV is fresh, and the strategy holds enough liquid assets to cover the payout.
  • Asynchronous: the user submits a redeem request, the asset manager settles at the next NAV update, and the user (or your platform) claims the resulting assets.
Unlike the deposit flow (where the vault enforces which path is active), redemption gives you a real choice: requestRedeem always works, and syncRedeem is an opportunistic single-transaction shortcut when conditions are met. Prefer sync when it is available, since it spares the user the wait for the next settlement.
There is no referral parameter on redemption; attribution carries forward from the original deposit.

Choose the redemption path

Two conditions must hold for sync redeem to succeed: the vault’s previewSyncRedeem returns a non-zero value, and the strategy’s treasury holds enough underlying to honor the payout. previewSyncRedeem checks the first; the second has to be verified separately because the preview function does not look at the treasury’s balance.
Solidity
Parameters:
  • shares: the number of vault shares the user intends to redeem.
Returns:
  • assets: the amount of underlying the user would receive net of exit and haircut fees. Returns 0 if sync redeem is not currently possible (paused, sync mode disabled, NAV expired, or async-only mode active). A non-zero value means sync redeem is eligible, but you still need to verify treasury liquidity before submitting.
Treasury balance check: previewSyncRedeem only confirms that sync redeem is allowed by the vault’s policy; it does not check that the treasury actually holds the assets to pay out. To verify, take the treasury_address field from the /vaults response and read its balance with the standard ERC-20 balanceOf view on the deposit asset contract:
Solidity
Sync redeem is viable only when:
If the balance is short, fall back to the async path: the request stays in queue and is retried by the asset manager at the next settlement, once liquidity returns to the treasury. Example (TypeScript, ethers v6):
TypeScript

Synchronous redemption

When both previewSyncRedeem(shares) > 0 AND the strategy’s treasury holds enough underlying, the user can burn shares and receive assets in a single transaction.
Solidity
Parameters:
  • shares: the number of vault shares to burn. The full amount is always burned (no partial output). msg.sender must own these shares; sync redeem cannot be called on behalf of another address.
  • receiver: the address that receives the underlying assets.
  • minimumAssets: slippage floor. The call reverts with BelowMinimumAssets(assets, minimumAssets) if the post-fee output is below this. Compute it from previewSyncRedeem(shares) minus an acceptable buffer (e.g. 50 to 100 bps).
Returns:
  • assets: the amount of underlying transferred to receiver, net of exit fee and haircut fee. Always >= minimumAssets on success.
Fees applied: an exit fee (capped at 2%) and a haircut fee (capped at 20%, burned and accruing to remaining shareholders) may be applied. Sync redemptions can be intentionally more expensive than async redemptions: the haircut discourages runs and protects long-term holders.
Example (TypeScript, ethers v6):
TypeScript
Run the treasury-balance check in production before this call; otherwise syncRedeem reverts with a generic ERC-20 transfer failure rather than a clean error.

Asynchronous redemption

When sync redemption is unavailable (or you simply prefer the async path: lower fees, no haircut), use the request → settle → claim flow.
Unlike async deposit, there is no cancel for redemption requests: once submitted, the shares are locked until settlement. Surface a confirmation step in your UX before the user signs.
1

Submit the request

Solidity
Parameters:
  • shares: the number of vault shares to redeem.
  • controller: the address that owns the request and can later claim the resulting assets. Set it equal to owner unless your platform manages claims on behalf of users.
  • owner: the holder of the shares being redeemed. If msg.sender != owner, the caller must be an approved operator on the vault, or hold an ERC-20 allowance from owner for at least shares.
Returns:
  • requestId: the epoch ID this request was registered against. You do not need to store it for the normal claim flow: the Reporting API tracks settlement state by wallet. The id is still useful as a cross-reference to the matching settlement row in the /operations feed (where it appears as epoch_id) for observability or audit purposes.
After this call, shares move into escrow. The redemption price is not fixed yet; it is determined at settlement. A controller cannot have two pending requests across different epochs (OnlyOneRequestAllowed revert).
2

Wait for settlement

After the next NAV update, the asset manager settles the epoch and the user’s assets become claimable. The recommended way to detect this is via the Reporting API’s /positions endpoint: you are most likely already polling it for the user’s portfolio view, and it aggregates settlement state per (wallet, vault) so you do not need to track requestIds yourself.
GET
Fields to watch inside data[0].pending_redemptions:
  • unfulfilled: array of requests still in escrow, waiting for the next settlement. While this is non-empty, the user’s redemption is “pending” in your UI.
  • claimable_in_shares: total share amount that has settled and is ready to claim, in share min units. Pass this directly to redeem (Option A in the next step).
  • claimable_in_asset: total asset amount that has settled and is ready to claim, in the asset’s min units. Pass this directly to withdraw (Option B in the next step).
When claimable_in_shares > 0 (or claimable_in_asset > 0), the request is settled and the user can claim. pending_redemptions.claimable_in_* is aggregated across all of the user’s settled-but-unclaimed redemptions in this vault, so a single value covers multiple settled epochs.
Alternatives (use only if you do not want a server-side dependency on the Reporting API):
  • On-chain views: pendingRedeemRequest(requestId, controller) returns the share amount still pending settlement; claimableRedeemRequest(requestId, controller) returns the share amount settled and ready to claim. Pass requestId = 0 to query the controller’s latest request.
  • Subscribe to the vault’s SettleRedeem events (the epochId field matches the requestId returned in step 1).
  • Poll the Reporting API’s /operations endpoint and watch for a row with type = "settlement" and an epoch_id matching your request.
Async redemption settlement is all-or-nothing per epoch. If the strategy is short on liquid assets when the asset manager attempts to settle, the request stays pending and is retried at the next NAV update. The user does not need to (and cannot) resubmit.
3

Claim assets

Once pending_redemptions.claimable_in_shares > 0, the controller (or anyone they have authorized) can claim the assets. Two equivalent functions are available so you can claim in whichever unit is more convenient: pass claimable_in_shares to redeem (Option A), or claimable_in_asset to withdraw (Option B). Both support partial claims.
Solidity
Parameters:
  • shares: the number of shares to claim, in share min units. Must be <= pending_redemptions.claimable_in_shares from the /positions response. Pass any positive value <= claimable for partial claims.
  • receiver: the address that receives the underlying assets.
  • controller: the request controller.
Returns:
  • assets: the asset amount transferred to receiver, computed at the epoch’s snapshot share price net of the exit fee that was active at settlement.
The redemption price is locked at settlement time, regardless of when the user claims.
Some strategies are configured to auto-claim assets on behalf of redeemers during settlement. In that case, assets appear in receiver’s wallet without your platform calling redeem or withdraw. Always check balanceOf(receiver) (in the underlying asset) or pending_redemptions.claimable_in_asset from /positions before prompting the user to claim.
Example (TypeScript, ethers v6):
TypeScript

Next steps

Advanced Strategies overview

Architecture, vault lifecycle, NAV reporting, fee structure, and roles.

Vault 7540 mechanics

How the 7540 Vault enforces sync vs. async paths and settles requests.

Reporting API reference

Full request and response schemas for vault, position, and operations endpoints.

Integrate a Conduit

Build an earn experience on top of a Railnet Conduit instead.