What You’ll Learn
- How ZIG Markets vaults work on Ethereum and how they differ from ERC-4626
- How to connect a Para wallet, approve USDC or USDT and deposit into the Nawa USDT vault or a Valdora vault
- How to read a user’s position, share price and vault TVL directly from the contracts
- How the asynchronous redemption flow works, which events to reconcile against, and the guardrails to code for
Why Combine Para and ZIG Markets
Para is already live in production on nawa.finance as the embedded wallet for the Nawa USDT vault deposit flow. The Nawa snippet in this module is distilled from that code.
Example Use Cases
- Fintech savings balance: a neobank or payments app offers a “USD earn” balance backed by a ZIG Markets vault, with Para creating the wallet behind an email login.
- Exchange earn tab: a centralised exchange routes idle user stablecoins into its own dedicated Valdora vault and displays yield in-app, with omnibus accounting on one address.
- Remittance float: a remittance or payout platform parks float in the Nawa USDT vault between corridors and redeems on demand.
- Wallet-native yield: a consumer wallet lists ZIG Markets vaults as an earn option alongside standard DeFi lending, using the same Para session for both.
What You Need
- A Para API key and an authenticated Para session (Para setup guides)
@getpara/react-sdk-liteand@getpara/wagmi-v2-integration, plus@wagmi/core,viemand@tanstack/react-query- An Ethereum mainnet RPC endpoint
- USDT or USDC in the user’s Para wallet, plus ETH for gas
- A vault address:
- Nawa USDT vault is public:
0x6FE78B942C566fE2b8D0881cf3577C1B1511F204 - Valdora vaults are deployed per distribution partner. Contact ZIG Markets for a vault dedicated to your integration; the live deployments listed below can be used for read calls and interface validation.
- Nawa USDT vault is public:
How the Vaults Work
Both vault families share the same shape. Code against these rules and the same integration serves either.- Not ERC-4626. Shares are plain ERC-20 tokens with a custom vault interface. Do not expect
totalAssets,convertToAssets,previewMint,withdraworredeem. - Deposits are synchronous.
approvethe vault on the stablecoin, then calldeposit(amount). Shares mint tomsg.senderin the same transaction at the current share price. - Redemptions are asynchronous. The user calls
requestRedeem(shares). An operator approves and settles under the vault’s terms, and the payout lands in the user’s wallet. There is nowithdraw(). - Yield accrues to the share price. The user’s share balance stays constant while its stablecoin value rises. Share price and TVL are pushed on-chain by an AUM updater under contract-enforced guards: 24-hour minimum between updates and a 2% maximum move per update.
- 6 decimals everywhere. Shares match the underlying stablecoin, so there is no scaling between asset and share units.
- Always call the proxy address. Both families are ERC-1967 upgradeable proxies. Take the ABI from the verified implementation and call the proxy.
- USDT quirk. USDT’s
approvereturns no bool, and a non-zero allowance must be reset to 0 before it can be changed. The snippets below handle this.
Step-by-Step Integration
There is no off-chain SDK for ZIG Markets vaults; both paths call the contracts directly with a Para wallet as the signer.Step 1: Install
Step 2: Connect a Para wallet
This wagmi configuration is shared by both vault paths. It is the production pattern running on nawa.finance.Path A: Nawa USDT Vault
A. Deployed addresses and chains
Ethereum mainnet only.
The vault is a UUPS upgradeable proxy; upgrades can only execute 72 hours after being queued publicly on the timelock.
B. Standard, token, decimals
Not ERC-4626. It is a custom ERC-20 share vault (OpenZeppelin upgradeable) with asynchronous redemptions, closer in spirit to ERC-7540, but no standard interface is claimed.- Share token name: Nawa USDT Vault
- Symbol: nzUSDT
- Decimals: 6 (same as USDT)
- Underlying asset: Ethereum mainnet USDT
C. ABI
Proxy and implementation are verified on Etherscan, so the ABI is publicly fetchable from the proxy address. Contract nameNawaUSDTVault, Solidity 0.8.19. The implementation ABI (148 entries) is also supplied with this module as nawa_vault_abi.json.
D. Function signatures for the full flow
withdraw(): settlement is pushed to the requester’s address (see F).
E. Deposit flow
Synchronous: one transaction mints nzUSDT tomsg.sender at the current share price and auto-forwards the net inflow to the strategy.
- Minimum deposit: 10 USDT (
minDeposit(), live-read) - Cap: global
mintingCap= 100,000,000 nzUSDT - Guard worth coding for: deposits revert with
StaleNavif the on-chain NAV report is older than 7 days (maxAumAge) - Omnibus deposits (one exchange address holding shares for many users) are explicitly fine
F. Redemption flow
Asynchronous, request-based.requestRedeem(shares) burns the shares immediately and locks the payout at the current share price, with no repricing later.
- Settlement is pushed to the requester’s wallet (operator settlement, FIFO netting against new deposits, or backstop funding); no claim step in the normal path
- No notice period, no redemption window, no daily limits
- SLA: the on-chain settlement deadline is 120 days (
maxSettlementWindow); the product commitment communicated to users is up to 75 days; in practice requests settle in days - Past each request’s
cancelAfter, the user can self-cancel and get shares re-minted - Minimum redemption: 1 nzUSDT (
minRedeemShares)
G. APY and TVL derivation
- TVL: fully on-chain.
latestAum()in USDT units, already net of the 15% performance fee (the fee is taken off-chain before reporting; the contract charges nothing on-chain) - Share price: fully on-chain.
pricePerShare(), oracle-updated viaupdateAumwith hard guards: minimum 24 h between updates, maximum 200 bps price move per update, 7-day staleness limit - Realised APY is derivable on-chain from the
AumUpdatedevent series (each event carriesnewPricePerShare) - The “~10%” shown on nawa.finance is an indicative off-chain figure for the private credit strategy, net of fee
H. Events for reconciliation
Transfer on the share token, and role and parameter-change events for governance monitoring.
I. Permissioning
None on-chain for users.deposit and requestRedeem are permissionless; no whitelist or blacklist exists in the vault (verified: zero role-mapping constructs in the deployed bytecode). Circuit breakers only: admin pause, and a guardian 48-hour outflow freeze.
Two caveats: USDT’s own token-level blacklist applies to transfers, and Nawa’s official frontend performs off-chain AML screening (Chainalysis) plus on-chain deposit monitoring, but nothing blocks a direct contract call.
J. Testnet for Para engineers
A Sepolia deployment exists (vault0x1eCf37A291F4FD3A1025Fa0b45a2bA1b7366e8EE, mock USDT 0x345D9b9f8Cf83b7a9F59Ca2aaF9013204D8A5FD8 with an open mint(address,uint256) faucet, 120-second timelock), but it predates the security audit and its interface differs. A fresh Sepolia deployment of the audited mainnet source is being prepared; the new addresses will be supplied as soon as it is live. Until then, treat mainnet as the interface source of truth and hold off coding against the old Sepolia addresses.
K. TypeScript: connect, approve, deposit, read, redeem
Distilled from the production code running on nawa.finance. Uses the sharedconfig from Step 2.
Path B: Valdora Vaults (USDC or USDT)
Valdora deploys one vault per distribution partner so that accounting and legal terms stay segregated. Every Valdora vault runs the same verified implementation, so one integration serves any of them.A. Deployed addresses and chains
Ethereum mainnet only. All are ERC-1967 upgradeable proxies; call the proxy, take the ABI from the implementation.
Asset addresses: USDC
0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48, USDT 0xdAC17F958D2ee523a2206206994597C13D831ec7.
These vaults are dedicated to the named partners. Use them for read calls and to validate the interface; write transactions should go to the vault deployed for your integration. Administrative control (upgrade, pause, parameters) sits with a 2-of-3 Gnosis Safe.
B. Standard, token, decimals
Not ERC-4626. A custom ERC-20 share vault (UUPS upgradeable, Solidity 0.8.24) with asynchronous, operator-approved redemptions.
Share decimals match the underlying at 6, so no scaling between asset and share units. Yield accrues to the share price.
C. ABI
One implementation ABI (167 entries) serves every Valdora vault; it is byte-for-byte identical across deployments. All implementations are verified on Etherscan and Blockscout, so the ABI is fetchable from any of them. It is also supplied with this module asvaldora_vault_abi.json. Do not use the proxy’s own 7-entry ABI.
D. Function signatures for the full flow
totalAssets, convertToAssets, convertToShares, previewDeposit, previewRedeem, maxDeposit, mint, withdraw, redeem.
E. Deposit flow
Synchronous:approve then deposit(uint256). Shares mint to msg.sender at the prevailing NAV in the same transaction. Deposits are continuous, subject to some cash drag before capital is deployed.
- Minimum: no on-chain minimum beyond a dust threshold of 1,000 base units (0.001 USDC/USDT) retained at first deposit
- Cap:
maxSupply()is the only cap, currently unset on all vaults, adjustable by the admin - Fee-on-transfer tokens are rejected (
FeeOnTransferNotSupported)
F. Redemption flow
Asynchronous and operator-approved. The holder callsrequestRedeem(shares); shares move into a pending state and the request is queued on-chain. An operator holding REDEEM_MANAGER_ROLE calls approveRequest or rejectRequest; approved requests settle to the user’s wallet. Where liquidity allows, the vault settles immediately and emits RedemptionSettledInstantly.
- The holder may
cancelRedeembefore approval and get shares back - No daily limits, no fixed lockup, no on-chain settlement deadline
- Settlement terms are set per vault and stated in that vault’s agreement; the underlying facilities are short-duration credit, so expect settlement in days to weeks, with an operational minimum of about 48 hours for off-ramping
- Queue state is readable via
pendingRequests,pendingRedemptionShares,pendingRedemptionAumandpendingRequestCount
G. APY and TVL derivation
NAV-based, not a fixed rate. Performance originates in the underlying ZIG Markets facilities and flows through to the vault.- TVL: on-chain.
aum()andeffectiveAum()in asset units. AUM is pushed by an operator holdingAUM_UPDATER_ROLEviaupdateAum(), guarded by a 24-hour cooldown (aumUpdateCooldownSecs), a 2% maximum change per update (aumChangeLimitBps) and a maximum override deviation. Valdora is also listed on DeFiLlama. - Share price: on-chain.
pricePerFullShare()returns price (1e18 scale), supply and AUM in one call.NAV_SCALEis 1e18. - Realised APY is derivable on-chain from the
AumUpdatedevent series. There is no APY function. - Reward vesting:
addRewardstreams operator-added rewards into NAV overrewardVestingSecs(7 days) vialockedProfit, so the share price rises smoothly rather than in steps.
H. Events for reconciliation
Transfer, and Paused, Unpaused, Upgraded, MaxSupplyUpdated, FundsManagerUpdated, RoleGranted, RoleRevoked for governance monitoring.
I. Permissioning
None on-chain for users.deposit and requestRedeem are permissionless at contract level; maxSupply() is the only cap. Access control is role-based and applies to administrative functions only (DEFAULT_ADMIN, AUM_UPDATER_ROLE, REDEEM_MANAGER_ROLE, ADD_REWARD_ROLE). Circuit breakers: admin pause.
Valdora performs off-chain AML and sanctions screening; wallets that fail screening are not permitted to use the product. USDT’s own token-level blacklist applies to USDT vaults.
J. Testnet for Para engineers
No testnet deployment is currently available. All read functions can be exercised against the verified mainnet proxies in section A. Write transactions should target the vault deployed for your integration. A testnet instance is being requested from Valdora and will be added here when live.K. TypeScript: connect, approve, deposit, read, redeem
Same Para connection as Path A (Step 2). Only the contract calls differ. Shown here for a USDC vault; for a USDT vault apply the reset-to-zero allowance rule from Path A.Related Resources
- Para viem and wagmi integration guides: https://docs.getpara.com/web/guides/evm/viem
- Para batch transactions example: https://github.com/getpara/examples-hub/blob/3.0.0/web/with-react-nextjs/signer-viem-v2/src/components/demos/BatchTransactionsDemo.tsx
- Nawa Finance: https://nawa.finance (Para live in the USDT vault deposit flow)
- Valdora Finance: https://valdora.finance
- ZIG Markets and ZIGChain: https://zigchain.com
- ABI files supplied with this module:
nawa_vault_abi.json,valdora_vault_abi.json - Support and vault requests: ZIG Markets partnerships, Arsalan Khan, arsalan@zigchain.com