Skip to main content

Core Concepts

Smart Wallets (Safe)

Every Zet-managed wallet is a Safe smart account — an ERC-4337 compliant smart contract wallet that lives on-chain.

Why smart accounts?

FeatureEOA (Traditional)Safe Smart Account
Gas paymentUser pays gas in native tokenSponsored by Zet (gasless)
Multi-chainDifferent address per chainSame address on all EVM chains
Batch transactionsOne tx at a timeMultiple ops in one tx
RecoveryLost key = lost fundsProgrammable recovery
UpgradeabilityNoneModular, upgradeable

Deterministic addresses

When you create a wallet via the Zet API, the address is derived deterministically from the same factory contract, salt, and owner. This means:
  • The wallet address is identical on Base, BSC, and all supported EVM chains
  • No separate deployment step per chain — lazy deployment happens on first use
  • You can show users a single address for all chains

Gas sponsorship

Zet sponsors gas for all transactions executed through Zet-managed wallets via Pimlico paymaster. Your users never need to hold native tokens (ETH, BNB) for gas.

Custodial vs Non-Custodial

Zet supports both integration models:

Custodial (Zet-managed wallets)

Use walletId in your API calls. Zet handles everything:
{
  "quoteId": "qt_01H8X3...",
  "walletId": "wal_01H8X3..."
}
  • Zet creates and manages the wallet
  • Transactions are signed and broadcast automatically
  • Gas is sponsored — zero native token balance needed
  • Best for: fintech apps, neobanks, custodial exchanges

Non-Custodial (bring your own wallet)

Use sourceAddress / destinationAddress in your API calls. Zet returns transaction data for the user to sign:
{
  "quoteId": "qt_01H8X3...",
  "sourceAddress": "0xabc..."
}
  • User controls their own wallet and keys
  • Zet returns unsigned transaction data (approvalData, transactionData)
  • User must sign and broadcast transactions themselves
  • Gas paid by the user
  • Best for: DeFi apps, self-custody wallets, advanced users

Transaction lifecycle

Every transaction follows the same lifecycle:
Quote → Initiate/Execute → Pending → Completed/Failed
1

Quote

Request a price quote. Includes fees, rates, and estimated output. Valid for ~5 minutes.
2

Initiate / Execute

Submit the quote ID to start the transaction. For ramps, this returns deposit details. For swaps/transfers, execution begins immediately (custodial) or returns transaction data (non-custodial).
3

Pending

The transaction is in progress. For on-ramps, waiting for user’s bank transfer. For swaps, the route is being executed on-chain.
4

Completed / Failed

Terminal state. On completion, crypto is delivered and webhook fires. On failure, an errorMessage explains what went wrong.
Use webhooks for production to receive real-time status updates. Polling (GET /onramp/{id}) is available but webhooks are more efficient and reliable.

Fee structure

Zet charges transparent, predictable fees. All fees are included in the quote response — what you see is what you get.

On-ramp (Buy crypto with NGN)

FeeAmountCondition
Provider fee0.1% of CNGN amountAlways
Flat fee50 NGNOnly for amounts > 50,000 NGN
Swap fee20 NGNOnly if target token ≠ CNGN

Off-ramp (Sell crypto for NGN)

FeeAmountCondition
Platform fee20 NGNAlways
Processing fee0.1% of fiat amountCapped at 200 NGN
Stamp duty50 NGNOnly for amounts ≥ 10,000 NGN
Swap fee20 NGNOnly if source token ≠ CNGN

Swap

FeeAmountCondition
Platform fee20 NGN equivalentSame-chain swap
Platform fee50 NGN equivalentCross-chain swap
DEX/Bridge feeVariableSet by routing provider

Cross-chain transfer

FeeAmountCondition
Platform fee50 NGN equivalentAlways
Bridge feeVariableSet by bridge protocol
Platform fees in NGN are converted to the source token at the current market rate and deducted from the transaction.

Routing

Swaps and cross-chain transfers are routed through LiFi — a multi-chain liquidity aggregator that finds the optimal path across:
  • DEXs: Uniswap, SushiSwap, PancakeSwap, Aerodrome, and more
  • Bridges: Stargate, Across, Hop, Connext, and more
The routing engine considers:
  • Best price across all available paths
  • Slippage tolerance (default: 0.3%)
  • Gas costs on source and destination chains
  • Bridge reliability and speed

Idempotency

Use the reference field when initiating transactions to ensure idempotency. If you retry a request with the same reference, Zet returns the existing transaction instead of creating a duplicate.
{
  "quoteId": "qt_01H8X3...",
  "walletId": "wal_01H8X3...",
  "reference": "order_12345"
}