# Any ERC-7540 vault \[Distribute yield from asynchronous vaults, settlement handled for you]

:::info
Railnet connects ERC-7540 vaults through the generic **`ERC7540Vehicle`** adapter.
:::

[ERC-7540](https://eips.ethereum.org/EIPS/eip-7540) extends the tokenized vault standard with a request and claim cycle, for vaults that cannot settle in the calling transaction, such as NAV-priced funds and tokenized credit.

## At a glance

| | |
|---|---|
| **Protocol** | [ERC-7540](https://eips.ethereum.org/EIPS/eip-7540), async vault standard |
| **Yield** | Whatever the vault earns |
| **Vehicle** | `ERC7540Vehicle` (generic async adapter) |
| **Deposit assets** | `vault.asset()` |
| **Status** | Live |

## Per-mode dispatch

Resolved per mode from the vault's ERC-165 answers:

| Vault answers | Path |
|---|---|
| `IERC7540Deposit` supported | Deposit queue |
| `IERC7540Redeem` supported | Redeem queue |
| Interface not supported | Synchronous ERC-4626 call |

## How Railnet integrates it

Each Vehicle owns two `ERC7540VehicleQueue` contracts, one per mode. Each Query's demand is batched into a single `requestDeposit` or `requestRedeem` under the Vehicle's address; the operator settles on its schedule, the queue claims, and the Queries move `PROCESSING → UNLOCKING → SETTLED`. The vault sees one participant, not each of your users, which is what makes permissioned vaults distributable. Keepers drive the transitions: `processRequest()` is permissionless, and `processRequest(uint256 maxSubmission)` is gated on `VEHICLE_PROCESS_QUEUE` to chunk a large backlog.

## Queue configuration

Each queue takes a `QueueParams` struct:

| Field | What it does |
|---|---|
| `allowRequestIncreases` | Whether new demand can join a request in flight. Set `false` for vaults minting a request ID per call. |
| `requestThreshold` | Minimum demand before the queue submits. Higher means fewer round-trips. |

## Considerations

* Settlement timing belongs to the vault operator. Quote your users its cadence.
* `requestThreshold` adds latency by design. Set it against expected deposit sizes.
* Permissioned vaults gate participants: predict the Vehicle with `getDeploymentAddress`, whitelist it before `spawn()`, then whitelist both queues.
* A vault being wound down may never settle another epoch. Do not route deposits into one.

## Spawn parameters

This factory takes its seed deposit as `initialDepositSize` rather than from the AssetRegistry, plus the two queue configurations.

```solidity [Solidity]
ERC7540VehicleFactory.SpawnParams memory params = ERC7540VehicleFactory.SpawnParams({
    vault: VAULT_ADDRESS,
    accessControl: accessControl,
    feeManager: FeeManager(address(0)),
    modulesManager: ModulesManager(address(0)),
    querySalt: bytes32(0),
    deploymentSalt: keccak256("platform-7540-v1"),
    initialDepositSize: 1e6,
    initialExpectedSupply: 0.8e18,
    depositQueueParams: ERC7540VehicleFactory.QueueParams({
        allowRequestIncreases: true,
        requestThreshold: 0
    }),
    redeemQueueParams: ERC7540VehicleFactory.QueueParams({
        allowRequestIncreases: true,
        requestThreshold: 0
    }),
    registry: queryRegistry
});
```

The seed deposit cannot settle in the spawn transaction: `spawn()` leaves the Vehicle `PROCESSING`, and `finalize()` claims, burns the seed shares and enables it. Both require `FACTORY_SPAWN`.

```solidity [Solidity]
address predicted = factory.getDeploymentAddress(params);   // For whitelisted vaults
ERC7540Vehicle vehicle = factory.spawn(params);
factory.finalize(vehicle);                                  // After the vault settles
```

Put a Conduit on it: [Quick start](/conduits/quick-start), [Integrate a Conduit](/developers/integrate-conduit).

## Live deployments

On Ethereum mainnet:

| Vehicle | Address |
|---|---|
| `$ERC7540-1-arm-wstETH-LOOP-WETH` | [0xf02db51f00b5630353204c92269a59017545fad5](https://etherscan.io/address/0xf02db51f00b5630353204c92269a59017545fad5) |
| `$ERC7540-2-arm-wmtWETH-WETH` | [0x73d5d0e76205284cb6eae7e75b71fdf145a139d6](https://etherscan.io/address/0x73d5d0e76205284cb6eae7e75b71fdf145a139d6) |
| `$ERC7540-3-arm-wstETH-BORROW-WETH` | [0x236de883ffdab4b008ffa117d583da2616f5702a](https://etherscan.io/address/0x236de883ffdab4b008ffa117d583da2616f5702a) |
| `$ERC7540-4-csUSDCigd-USDC` | [0x604f2e9fba764bd82a059be437fd57ee0cc6534a](https://etherscan.io/address/0x604f2e9fba764bd82a059be437fd57ee0cc6534a) |
| `$ERC7540-5-csUSDCdefi-USDC` | [0x6f4e00954d39c414a7a40f00347aaa91bd4ee3dc](https://etherscan.io/address/0x6f4e00954d39c414a7a40f00347aaa91bd4ee3dc) |

Railnet's [Advanced Strategies](/strategies/advanced) connect through this adapter too.

## Next steps

<Cards>
  <Card title="Centrifuge" description="Tokenized funds and RWA pools." icon="landmark" to="/yield-sources/centrifuge" />

  <Card title="Quick start" description="Specify your Conduit." icon="rocket" to="/conduits/quick-start" />
</Cards>
