Balance Operations (Deposit, Withdraw, Transfers)
The Symmio Deposit and Withdraw System enables users to securely deposit, initiate withdrawals, and optionally perform express withdrawals from their isolated balances.
Standard withdrawals may be subject to a cooldown period, during which the requested funds are temporarily locked. To bypass this delay, users can request express withdrawals via registered liquidity providers—typically in exchange for a fee—offering faster access to their funds.
Deposit
Users can deposit collateral into their isolated balance using the deposit
function. This process handles internal accounting, enforces system constraints, and optionally transfers ERC-20 tokens from the user's wallet.
deposit(address collateral, uint256 amount) // user = msg.sender
depositFor(address collateral, address user, uint256 amount)
Upon invocation, the function:
Validates that the specified
collateral
token is whitelisted.Ensures
amount
is greater than zero and thatuser
is a valid address.Verifies the deposit will not exceed the
balanceLimitPerUser
.Normalizes the
amount
to 18 decimals for internal consistency.Increases the user’s isolated balance accordingly.
Transfers tokens from the user’s wallet to the protocol if
doTransfer
is set totrue
.
Note:
The
virtualDepositFor
function enables balance updates without transferring the actual collateral. This function can only be called by addresses granted theVIRTUAL_DEPOSITOR_ROLE
.
Withdraw
The Symmio Withdraw System enables users to withdraw funds from their isolated balances through a two-phase process: initiation and completion. This design introduces a cooldown period between the two phases to strengthen protocol security and mitigate abuse or malicious withdrawal attempts.
To improve user experience and flexibility, Symmio also supports express withdrawals via approved third-party express providers. These providers pre-fund the user’s withdrawal amount immediately, in exchange for a fee, and later receive the actual withdrawal from the protocol after the cooldown period ends. This allows users to bypass the waiting period, while the express provider assumes the risk of delayed settlement or security-based withdrawal failures.
1. Initiate Withdraw
Users can request a withdrawal using one of the following functions:
function initiateWithdraw(address collateral, uint256 amount, address to)
function initiateExpressWithdraw(
address collateral,
uint256 amount,
address to,
address provider,
bytes memory userData
)
Parameters:
collateral
: The ERC-20 token to withdraw.amount
: Amount to withdraw, specified in collateral decimals.to
: Destination address to receive funds.provider
: Registered express withdrawal provider.userData
: Arbitrary data passed to the provider for validation (used in express withdrawals).
Function Behavior:
Validates that the sender has sufficient available (unlocked) balance.
Verifies solvency and per-user balance limits.
Immediately deducts the withdrawal amount from the user’s isolated balance.
Creates a
Withdraw
object with statusINITIATED
.
If a provider is specified:
Ensures the provider is registered and active.
Calls
validateWithdraw(...)
on the provider contract.Records provider metadata in the
Withdraw
object.
2. Complete Withdraw
Once the cooldown period has elapsed, the withdrawal can be finalized:
function completeWithdraw(uint256 id)
For reading the current cooldown durations you can call these methods of contract:
partyADeallocateCooldown
for Party A.function getPartyADeallocateCooldown() external view returns (uint256)
partyBDeallocateCooldown
for Party B.function getPartyBDeallocateCooldown() external view returns (uint256)
Final Transfer Destination:
If an express provider was used: funds are sent to the provider’s configured
receiver
.Otherwise: funds are transferred to the original
to
address.
The function updates the Withdraw
status to COMPLETED
.
Cancel Withdraw (Non-Express Only)
function cancelWithdraw(uint256 id)
Usage:
Allowed only if no express provider was specified.
Restores the withdrawn amount to the user’s isolated balance.
Marks the withdrawal request as
CANCELED
.
Suspend & Restore
These administrative functions handle invalid or disputed withdrawals.
function suspendWithdraw(uint256 id)
function restoreWithdraw(uint256 id, uint256 validAmount)
Behavior:
suspendWithdraw
: Marks the withdrawal asSUSPENDED
.restoreWithdraw
: RestoresvalidAmount
to the user, and sends any excess to the system-ownedinvalidWithdrawalsAmountsPool
.
Express Withdraw System
The express withdrawal system allows external providers to pre-fund user withdrawals in exchange for liquidity fees or execution spreads. This enables instant withdrawals, bypassing the standard cooldown.
Provider Requirements
To be eligible, an express withdrawal provider must:
Implement the
IExpressWithdrawProvider
interface.Be registered with
isActive == true
and a valid, non-zeroreceiver
address.Implement
validateWithdraw(...)
to enforce any custom logic or verification.
If validation fails, the protocol reverts with:
ExpressWithdrawRejectedByProvider(provider, reason)
Final Fund Flow (with Provider)
When a provider is used:
The actual protocol withdrawal funds are sent to the provider’s receiver address.
The provider is responsible for funding the user immediately (typically off-chain or via liquidity routing).
This withdrawal framework is designed to improve user experience, support modular liquidity, and reduce withdrawal friction by introducing a pluggable express liquidity layer within the Symmio ecosystem.
Internal Transfer
The internalTransfer
function enables users to transfer collateral directly from their available Symmio balance to another user’s isolated balance, within the same protocol (e.g., Symmio Options).
internalTransfer(address collateral, address user, uint256 amount)
This function:
Transfers collateral from the sender (
msg.sender
) to the recipientuser
inside the Symmio system.Does not move tokens externally—only updates internal accounting.
Enforces security and solvency checks for both sender and receiver.
Validation & Behavior
Verifies that
amount
is greater than zero.Ensures the recipient
user
address is not zero.Checks that both parties are not suspended or paused.
Validates that the sender has sufficient available balance (excluding locked funds).
Enforces the receiver’s balance cap (
balanceLimitPerUser
) if they are not Party B.Emits an
InternalTransfer
event containing pre- and post-transfer balances.
Restrictions:
Cannot be used by Party B accounts.
Cannot be used when the protocol is in instant mode or if internal transfers are paused.
External Transfer
The externalTransfer
function is used to move collateral from a user's Symmio balance to a whitelisted external target contract, such as another Symmio service (e.g., Symmio Perpetuals or Lending). This allows instant, cooldown-free fund transfers across Symmio subsystems.
externalTransfer(address collateral, address user, uint256 amount, address target)
This function:
Transfers collateral from
msg.sender
to a designated external system (e.g., from Options to Perpetuals).Skips any withdrawal delay or cooldown period.
Performs both internal balance deduction and ERC-20 token transfer.
Notifies the receiving contract via a standardized callback.
Validation & Behavior
Requires a non-zero
amount
,user
, andtarget
address.Ensures the
target
contract is whitelisted for the specified collateral.Subtracts the amount from sender’s isolated balance.
Converts internal units (18 decimals) to the token’s native decimals.
Performs an ERC-20 transfer to the
target
contract.Invokes
onTransfer
on thetarget
contract for integration handling.Emits an
ExternalTransfer
event.
Use Cases:
Instant liquidity movement between Symmio Options ↔ Symmio Perps
Transfers between isolated product-specific accounts without user withdrawal
Restrictions:
Sender must not be suspended or paused.
Transfers only allowed to whitelisted target contracts.
Cannot be used if external transfers are paused
Last updated