Open Channel
channel.open
Opens and funds a TIP-20 channel reserve channel.
Usage
import { } from './viem.config'
const { , ... } = await ..({
: 100000000n,
: '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC',
: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',
: '0x0000000000000000000000000000000000000000000000000000000000000101',
: '0x20c0000000000000000000000000000000000001',
})
.('Opened:', )
Opened: { channelId: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', payer: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', payee: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', operator: '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC', token: '0x20c0000000000000000000000000000000000001', authorizedSigner: '0x0000000000000000000000000000000000000000', salt: '0x0000000000000000000000000000000000000000000000000000000000000101', expiringNonceHash: '0x0000000000000000000000000000000000000000000000000000000000000000', deposit: 100000000n }import { , } from 'viem/tempo'
export const = .({
: .('0x...'),
})Asynchronous Usage
The examples above use 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 channel.open action and wait for inclusion manually:
import { } from 'viem/tempo'
import { } from './viem.config'
const = await ..({
: 100000000n,
: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',
: '0x20c0000000000000000000000000000000000001',
})
const = await ..({ }).
const { } = ...(.)Recipes
Open a Channel and Sign the First Voucher
Combine channel.openSync with channel.signVoucher to start paying for a metered service the moment the channel exists.
import { } from './viem.config'
const { } = await ..({
: 100_000000n,
: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
: '0x20c0000000000000000000000000000000000000',
})
const = await ..({
: ,
: 1_000000n,
})import { , } from 'viem/tempo'
export const = .({
: .('0x...'),
})Delegate Voucher Signing to a Hot Key
Pass authorizedSigner when a dedicated service key signs vouchers through channel.signVoucher's account option, keeping the treasury key that funded the channel offline.
import { } from './viem.config'
await ..({
: '0x8ba1f109551bD432803012645Ac136ddd64DBA72',
: 500_000000n,
: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
: '0x20c0000000000000000000000000000000000000',
})import { , } from 'viem/tempo'
export const = .({
: .('0x...'),
})Run a Channel per Project with Deterministic Salts
Derive salt from an internal identifier to keep several channels open to the same payee and token, one per project, with reproducible channel identities.
import { } from 'viem/utils'
import { } from './viem.config'
const = 'project-atlas'
const { } = await ..({
: 100_000000n,
: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
: .(, { : 32 }),
: '0x20c0000000000000000000000000000000000000',
})import { , } from 'viem/tempo'
export const = .({
: .('0x...'),
})Return Value
type ReturnType = {
/** Channel ID. */
channelId: Hex
/** Channel payer. */
payer: Address
/** Channel payee. */
payee: Address
/** Channel operator. */
operator: Address
/** Token address. */
token: Address
/** Authorized voucher signer. */
authorizedSigner: Address
/** Channel salt. */
salt: Hex
/** Expiring nonce hash. */
expiringNonceHash: Hex
/** Initial deposit. */
deposit: bigint
/** Transaction receipt. */
receipt: TransactionReceipt
}The transaction receipt and decoded event data.
Parameters
authorizedSigner
- Type:
Address
Optional signer for vouchers. Zero means payer signs.
deposit
- Type:
bigint
Amount of TIP-20 token to deposit.
operator
- Type:
Address
Optional relayer allowed to submit settle for the payee.
payee
- Type:
Address
Account that receives settled voucher payments.
salt
- Type:
Hex
User-supplied salt to distinguish otherwise identical channels.
token
- Type:
Address | bigint
TIP-20 token address or ID held by the channel.
account (optional)
- Type:
Account | Address
Account that will be used to send the transaction.
feePayer (optional)
- Type:
Account | boolean
Fee payer for the transaction (TIP-1 gas sponsorship).
Pass true to defer the fee token to an external fee payer (e.g. a relay), or a local Account to co-sign the transaction as the fee payer.
feeToken (optional)
- Type:
Address | bigint
Fee token for the transaction.
Can be an unpaused USD-denominated TIP-20 token address or ID.
gas (optional)
- Type:
bigint
Gas limit for the transaction.
keyAuthorization (optional)
- Type:
KeyAuthorization
Signed key authorization to include with the transaction, authorizing an access key to act for the sending account.
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' | 'random' | bigint
Nonce key for the transaction (TIP-1009 2D nonces).
Use 'expiring' to select an expiring nonce, which enables concurrent transaction submission without nonce ordering. Use 'random' to select a random key.
throwOnReceiptRevert (optional)
- Type:
boolean - Default:
true
Whether a Sync action throws when the receipt reports a revert.
validAfter (optional)
- Type:
number
Unix timestamp after which the transaction can be included.
validBefore (optional)
- Type:
number
Unix timestamp before which the transaction must be included.