Skip to content
LogoLogo

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)

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)

Prepare 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),
})

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,
})

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 transaction, pass the configurable 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 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.