Skip to main content
Connect Para wallets to ZIG Markets vaults on Ethereum and let users earn stablecoin yield from real-economy private credit: invoice factoring, SME finance and cross-border PayFi in the GCC and beyond. ZIG Markets is the institutional yield arm of the ZIGChain ecosystem, operated under Merritt Administrators (Pty) Ltd, an FSCA-licensed financial services provider (Category I and II). The vaults are built and operated by two ecosystem protocols, Nawa Finance (one public USDT vault) and Valdora Finance (dedicated USDC or USDT vaults per distribution partner). Both are Ethereum mainnet contracts, verified on Etherscan, and both follow the same pattern: synchronous deposits, NAV-based share tokens, asynchronous redemptions.

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

  1. 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.
  2. 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.
  3. Remittance float: a remittance or payout platform parks float in the Nawa USDT vault between corridors and redeems on demand.
  4. 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-lite and @getpara/wagmi-v2-integration, plus @wagmi/core, viem and @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.
Availability: [jurisdiction and eligibility wording to be inserted by ZIG Markets before publication]

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, withdraw or redeem.
  • Deposits are synchronous. approve the vault on the stablecoin, then call deposit(amount). Shares mint to msg.sender in 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 no withdraw().
  • 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 approve returns 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.
Para’s batch transactions example lets you combine the approve and deposit calls into a single user confirmation.

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
Yield accrues to the share price, not the balance: an integrator’s nzUSDT balance stays constant while its USDT value grows. Audited by Oak Security.

C. ABI

Proxy and implementation are verified on Etherscan, so the ABI is publicly fetchable from the proxy address. Contract name NawaUSDTVault, 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

There is deliberately no withdraw(): settlement is pushed to the requester’s address (see F).

E. Deposit flow

Synchronous: one transaction mints nzUSDT to msg.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 StaleNav if 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 via updateAum with 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 AumUpdated event series (each event carries newPricePerShare)
  • The “~10%” shown on nawa.finance is an indicative off-chain figure for the private credit strategy, net of fee

H. Events for reconciliation

Plus the standard ERC-20 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 (vault 0x1eCf37A291F4FD3A1025Fa0b45a2bA1b7366e8EE, 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 shared config 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 as valdora_vault_abi.json. Do not use the proxy’s own 7-entry ABI.

D. Function signatures for the full flow

Not present, and integrators will look for them: 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 calls requestRedeem(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 cancelRedeem before 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, pendingRedemptionAum and pendingRequestCount

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() and effectiveAum() in asset units. AUM is pushed by an operator holding AUM_UPDATER_ROLE via updateAum(), 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_SCALE is 1e18.
  • Realised APY is derivable on-chain from the AumUpdated event series. There is no APY function.
  • Reward vesting: addReward streams operator-added rewards into NAV over rewardVestingSecs (7 days) via lockedProfit, so the share price rises smoothly rather than in steps.
a freshly deployed Valdora vault returns 0 from pricePerFullShare(), aum() and lastAumUpdateAt() until the first deposit and AUM update land. Check lastAumUpdateAt() > 0 before displaying a price.

H. Events for reconciliation

Plus the standard ERC-20 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.