zone.encryptedDeposit
Deposits tokens into a zone on the parent Tempo chain with an encrypted recipient and memo. The recipient and memo are encrypted client-side using ECIES (AES-256-GCM) with the sequencer's public encryption key so that only the zone sequencer can decrypt the deposit details.
A transaction receipt does not confirm that the zone credited the deposit. See Read Deposit Outcomes to check the ZoneInbox processing result.
For an ordinary deposit, encryption uses the transaction's sending account. Both the zone recipient and the parent-chain refund recipient default to that account, including an account override. Prepared deposits keep the recipient instructions and refund recipient chosen during preparation.
Usage
import { parseUnits } from 'viem'
import { client } from './viem.config'
const { receipt } = await client.zone.encryptedDepositSync({
amount: parseUnits('100', 6),
token: '0x20c0000000000000000000000000000000000001',
zoneId: 7,
})
console.log('Transaction hash:', receipt.transactionHash)import { Account, createClient } from 'viem/tempo'
export const client = createClient({
account: Account.fromSecp256k1('0x...'),
})Asynchronous Usage
The example above uses a *Sync variant of the action, that will wait for the transaction to be included before returning.
If you are optimizing for performance, you should use the non-sync zone.encryptedDeposit action and wait for inclusion manually:
import { parseUnits } from 'viem'
import { client } from './viem.config'
const hash = await client.zone.encryptedDeposit({
amount: parseUnits('100', 6),
token: '0x20c0000000000000000000000000000000000001',
zoneId: 7,
})
const receipt = await client.waitForTransactionReceipt({ hash })Prepared Usage
Use zone.encryptedDeposit.prepare when one party should choose the private zone recipient, but another party will submit the parent-chain deposit transaction.
import { parseUnits } from 'viem'
import { broadcaster, client } from './prepared.config'
const prepared = await client.zone.encryptedDeposit.prepare({
amount: parseUnits('100', 6),
recipient: '0x0000000000000000000000000000000000000001',
sender: broadcaster.account.address,
tempoRefundRecipient: broadcaster.account.address,
token: '0x20c0000000000000000000000000000000000001',
zoneId: 7,
})
const hash = await broadcaster.zone.encryptedDeposit(prepared)import { Account, createClient } from 'viem/tempo'
export const client = createClient({
account: Account.fromSecp256k1('0x...'),
})
export const broadcaster = clientPrepare Only the Encrypted Recipient
Use zone.encryptedDeposit.prepareRecipient when another contract or service controls token movement and only needs the ZonePortal encryption fields. The sender defaults to client.account.address; set it explicitly when another account will call the Zone portal.
import { client } from './viem.config'
const { encrypted, keyIndex } =
await client.zone.encryptedDeposit.prepareRecipient({
recipient: '0x0000000000000000000000000000000000000001',
sender: client.account.address,
zoneId: 7,
})Recipes
Compose a Prepared Deposit
Use zone.encryptedDeposit.prepare to encrypt recipient instructions before constructing calls. zone.encryptedDeposit.calls requires the prepared payload, including its encryption key index. The broadcasting account must match prepared.sender.
import { Actions } from 'viem/tempo'
import { client } from './viem.config'
const prepared = await client.zone.encryptedDeposit.prepare({
amount: 1_000_000n,
recipient: '0x0000000000000000000000000000000000000001',
sender: client.account.address,
tempoRefundRecipient: '0x0000000000000000000000000000000000000001',
token: '0x20c0000000000000000000000000000000000001',
zoneId: 7,
})
const hash = await client.sendTransaction({
calls: Actions.zone.encryptedDeposit.calls(prepared),
})import { Account, createClient } from 'viem/tempo'
export const client = createClient({
account: Account.fromSecp256k1('0x...'),
})Select a Current Portal for Zone 6 or 7
The default portal addresses for Zone IDs 6 and 7 retain their earlier testnet deployments. When using a current Zone with either ID, set portalAddress from its current Zone chain ID.
import { Addresses } from 'viem/tempo'
import { client } from './viem.config'
const hash = await client.zone.encryptedDeposit({
amount: 1_000_000n,
portalAddress: Addresses.zonePortal(1_424_310_006),
token: '0x20c0000000000000000000000000000000000001',
zoneId: 6,
})import { Account, createClient } from 'viem/tempo'
export const client = createClient({
account: Account.fromSecp256k1('0x...'),
})Return Type
type ReturnType = {
/** Transaction receipt */
receipt: TransactionReceipt
}Parameters
amount
- Type:
bigint
Amount of tokens to deposit.
memo (optional)
- Type:
Hex - Default:
0x00...00
Deposit memo. A supplied memo must be valid hex encoding exactly 32 bytes; invalid values are rejected before submission.
pollingInterval (optional)
- Type:
number - Default:
client.pollingInterval
Receipt polling interval in milliseconds. Only applicable to zone.encryptedDepositSync, which uses sendTransactionSync.
portalAddress (optional)
- Type:
Address - Default: Derived from
zoneId.
Zone portal on the parent Tempo chain. For current Zones with ID 6 or 7, set it explicitly as shown in Select a Current Portal for Zone 6 or 7.
recipient (optional)
- Type:
Address - Default: The transaction's sending account address.
Recipient address in the zone. Applies when preparing an ordinary deposit.
tempoRefundRecipient (optional)
- Type:
Address - Default: The transaction's sending account address.
Parent-chain recipient of refunded tokens if the deposit bounces. Required when calling zone.encryptedDeposit.prepare.
timeout (optional)
- Type:
number - Default:
Math.max(chain.blockTime * 3, 5_000)
Timeout in milliseconds to wait for the parent-chain transaction receipt. Only applicable to zone.encryptedDepositSync.
token
- Type:
Address | bigint
Token address or ID to deposit.
zoneId
- Type:
number
Zone ID to deposit into (e.g. 7).
account (optional)
- Type:
Account | Address
Account that sends the transaction. For a coordinated multisig transaction, pass the multisig account.
feeToken (optional)
- Type:
Address | bigint
Fee token for the transaction.
Can be an unpaused USD-denominated TIP-20 token address or ID. Use client.fee.validateToken({ token }) to validate a token before submitting a transaction or setting it as a fee preference.
feePayer (optional)
- Type:
Account | true
Fee payer for the transaction.
Can be a Viem Account, or true if a Fee Payer Service will be used.
gas (optional)
- Type:
bigint
Gas limit for the transaction.
maxFeePerGas (optional)
- Type:
bigint
Max fee per gas for the transaction.
maxPriorityFeePerGas (optional)
- Type:
bigint
Max priority fee per gas for the transaction.
nonce (optional)
- Type:
number
Nonce for the transaction.
nonceKey (optional)
- Type:
'expiring' | bigint
Nonce key for the transaction. Use 'expiring' to use expiring nonces (TIP-1009), which enables concurrent transaction submission without nonce ordering.
owner (optional)
- Type:
Account | Address
Local owner that signs one coordinated multisig approval.
validBefore (optional)
- Type:
number
Unix timestamp before which the transaction must be included.
validAfter (optional)
- Type:
number
Unix timestamp after which the transaction can be included.
throwOnReceiptRevert (optional)
- Type:
boolean - Default:
true
Whether to throw an error if the transaction receipt indicates a revert. Only applicable to *Sync actions.