Zcash chainId in LI.FI is
20000000000005. The chain key is zec and the chain type is UTXO.GET /v1/chains returns EVM chains only by default. Pass chainTypes to include Zcash, for example GET /v1/chains?chainTypes=EVM,UTXO.Native ZEC is addressed as zcash with 8 decimals. Amounts are always expressed in zatoshi (1 ZEC = 100,000,000 zatoshi).Requesting a quote
A quote for Zcash can be requested using the same endpoints as EVM. Only the chain ids, the token address and the transaction data differ.Addresses
LI.FI sends from transparent Zcash addresses only. It pays out to a transparent address, or to a unified address that carries an Orchard receiver.fromAddress when the source chain is Zcash accepts:- A single transparent address:
t1cSswzBCTiKZ9XwEUCurkfGSQFGunU5CDM - Several addresses, separated by a semicolon:
t1address1;t1address2;t3address3
toAddress when Zcash is the destination chain accepts a t1 or t3 address, or a u1 unified address with an Orchard receiver. When bridging out of Zcash, toAddress is a regular address on the destination chain.Unified destinations. A unified address bundles several receivers into one address. NearIntents pays the Orchard receiver, even when the address also carries a transparent receiver. A unified address without an Orchard receiver is refused, because a bridge would pay its transparent receiver and the payout would not be shielded.Unit pays out to transparent addresses only. For a unified
toAddress, /v1/quote returns no Unit route, and /v1/advanced/routes lists the Unit route in unavailableRoutes.filteredOut with the reason. A step posted to /v1/advanced/stepTransaction that pays a unified address through Unit is refused.Refused addresses. A refused Zcash address returns HTTP 400 with error code
1011 (ValidationError). The message names the field, the reason and the accepted forms, for example:UTXO collection. LI.FI pools the UTXOs of every address in
fromAddress and selects them largest-first until they cover the transfer plus the network fee. The pooled set must cover both, otherwise no quote is returned.Two kinds of UTXO are never selected:- A UTXO with zero confirmations. Wait for one confirmation.
- A coinbase (mining reward) output. Zcash requires a coinbase spend to move the value into a shielded pool, which a transparent transaction cannot do.
Token approvals
Zcash needs no token approval. Zcash is a UTXO chain with one asset, so a transfer is authorized by the signature on the transaction itself. IgnoreapprovalAddress on a Zcash step.
NearIntents integration
Registered as the tool keynear (“NearIntents”). It bridges native ZEC between Zcash and 15 chains: Ethereum, Arbitrum, Base, Optimism, Polygon, Avalanche, BNB Smart Chain, Gnosis, Berachain, Monad, X Layer, Bitcoin, Solana, Tron, and Stellar.
14 of those chains route in both directions. Stellar is a destination only: LI.FI can bridge ZEC to Stellar, but not from Stellar to Zcash.
u1...) address. The payout goes to the address’s Orchard receiver, so the ZEC arrives in a shielded balance.
Contract receiver for a unified address. A unified address does not fit in 32 bytes. When the source chain is an EVM chain, the LI.FI contract call therefore carries
sha256(toAddress) as the non-EVM receiver, and the BridgeToNonEVMChainBytes32 event emits that digest. NearIntents pays the full toAddress, which the quote binds to the deposit address.Unit integration
Registered as the tool keyunit (“Unit”). It bridges native ZEC in both directions between Zcash and Hyperliquid.
Unit enforces a minimum transfer of 0.07 ZEC (
7000000 zatoshi) on both sides. A smaller amount returns no quote.Unit pays out to transparent (t1 or t3) addresses only. A Hyperliquid to Zcash transfer to a unified toAddress gets no Unit route.Executing a transaction
Transaction data
transactionRequest.data is not a PSBT. Zcash transparent transactions are signed with the ZIP-243 signature hash, which is personalized by the consensus branch id and by the transaction’s versionGroupId and expiryHeight. No Bitcoin PSBT library can produce it, so LI.FI returns a structured unsigned transaction instead.
The payload is a JSON object describing a v4 (ZIP-243) transaction:
consensusBranchIdis read live from the node for every quote. It changes at every Zcash network upgrade and it personalizes the signature hash, so never cache it and never substitute a constant.inputs[].addressis the address the UTXO belongs to. Derive that input’s previous output script from it.inputs[].valueZatis required by the ZIP-243 signature hash, so keep it.outputs[].addressis set on a payment output (transfer, fee collection, change). Build the standard P2PKH or P2SH script for it yourself.outputs[].scriptHexis set on theOP_RETURNoutput instead, and itsvalueZatis always"0". Encode that script verbatim.- All amounts are zatoshi strings. Parse them as big integers, never as floating-point numbers.
OP_RETURN tracking memo, then any fee-collection outputs, then the change output when there is one.
To execute the transaction:
- Request the transaction data through the regular quote flow.
- Serialize the transaction as Zcash v4 (ZIP-243) from the fields above.
- Sign every input with the key of its
address. - Broadcast the signed transaction to the Zcash network.
Gas
The network fee is returned in the step’sestimate.gasCosts in zatoshi (ZEC, 8 decimals).
Zcash has no fee market. The fee follows the ZIP-317 formula:
logicalActions is derived from the shape of the transaction, so the network minimum is 10,000 zatoshi (0.0001 ZEC) and there is no fee rate to bid. gasCosts[0].price is reported as 0 for that reason, and paying more does not confirm the transaction faster.
Change below 5,000 zatoshi is added to the fee rather than paid out, because such an output costs more to spend later than it is worth.
Status tracking
Transaction status can be tracked using the regular status tracking flow.When polling
/status for a transaction that originates on Zcash, always pass fromChain=zec (or the Zcash chain id 20000000000005). Zcash transaction hashes are 64-character hex strings and are otherwise indistinguishable from Bitcoin transaction hashes.Shielded payouts. A payout to a unified address goes into the shielded pool, and the amount of a shielded output is not public. For that payout,
receiving.amount is the amount that NearIntents reports.receiving.txLink points to CipherScan, which shows the shielded (Orchard) part of a payout. Some other Zcash explorers show a shielded payout as 0 ZEC.
