Skip to main content
Token transfers on BULK are protocol-native operations. You can transfer any supported token (USDC, USDT, and others as listed) between any accounts on the network.
All transfers are gasless and carry zero fees - there is no cost to move tokens between accounts.
For the full request/response shape, response statuses, and signing rules, see Transfer (Signed).

Transfer Types

BULK supports two kinds of transfers, distinguished by scope and recipient handling.

Internal Transfer

Moves tokens between accounts that share the same owner. The signer must be the master account, and both the source and destination must be within the signer’s account tree (the master itself or any of its sub-accounts). Typical flows:
  • Master to sub-account (fund a sub-account)
  • Sub-account to master (sweep profits back)
  • Sub-account to sub-account (rebalance between sub-accounts)
Internal transfers do not have a minimum amount requirement.

External Transfer

Moves tokens from one account to any other account on the network, regardless of ownership. This is how you send funds to another trader or move tokens to a completely separate wallet. External transfers have a minimum amount threshold to prevent dust spam. If the destination account does not exist, the protocol auto-creates it as a new master account - but only if the destination public key is on-curve (a valid Solana wallet). Off-curve addresses that do not already exist as protocol accounts are rejected.

Transfer Action

A transfer is submitted as a single transfer action with the following fields: The transaction signer is the authorizing account. For internal transfers, this must be the master account that owns both from and to, or any agent wallet registered on it. For external transfers, this is the account that owns the source. See Transaction Signing for the canonical wincode message. For full request/response shape and signing details, see Transfer (Signed).

Withdrawal Safety

Before executing a transfer, the protocol checks whether the source account can safely release the requested tokens. The withdrawable amount is bounded by: max_withdraw=min⁡(equity−1.05×MM,margin_pnl)\text{max\_withdraw} = \min(\text{equity} - 1.05 \times MM, \text{margin\_pnl}) Where:
  • equity = position PnL + margin PnL (total account value)
  • MM = maintenance margin (current risk requirement)
  • The 1.05 multiplier provides a 5% safety buffer above maintenance
If the requested amount exceeds the withdrawable maximum, the transfer is rejected. This prevents transfers from pushing an account into liquidation territory.

Sub-Accounts

Sub-accounts are the primary mechanism for internal transfers. Each master can have up to 64 sub-accounts, and tokens can be moved freely between them. See the Sub-Accounts page for full details on creating, managing, and removing sub-accounts.

Error Handling

All error responses include the specific reason for rejection. Failed transfers do not modify any account state.