import type { Address } from 'abitype' import * as Hex from 'ox/Hex' import { TokenId, TokenRole } from 'ox/tempo' import type { Account } from '../../accounts/types.js' import { parseAccount } from '../../accounts/utils/parseAccount.js' import { multicall } from '../../actions/public/multicall.js' import type { ReadContractReturnType } from '../../actions/public/readContract.js' import { readContract } from '../../actions/public/readContract.js' import type { WatchContractEventParameters, WatchContractEventReturnType, } from '../../actions/public/watchContractEvent.js' import { watchContractEvent } from '../../actions/public/watchContractEvent.js' import { sendTransaction } from '../../actions/wallet/sendTransaction.js' import { type SendTransactionSyncParameters, sendTransactionSync, } from '../../actions/wallet/sendTransactionSync.js' import type { WriteContractReturnType } from '../../actions/wallet/writeContract.js' import { writeContract } from '../../actions/wallet/writeContract.js' import { writeContractSync } from '../../actions/wallet/writeContractSync.js' import type { Client } from '../../clients/createClient.js' import type { Transport } from '../../clients/transports/createTransport.js' import type { BaseErrorType } from '../../errors/base.js' import type { Chain } from '../../types/chain.js' import type { ExtractAbiItem, GetEventArgs } from '../../types/contract.js' import type { Log, Log as viem_Log } from '../../types/log.js' import type { Compute, OneOf, UnionOmit } from '../../types/utils.js' import { encodeFunctionData } from '../../utils/abi/encodeFunctionData.js' import { parseEventLogs } from '../../utils/abi/parseEventLogs.js' import * as Abis from '../Abis.js' import * as Addresses from '../Addresses.js' import type { GetAccountParameter, ReadParameters, WriteParameters, } from '../internal/types.js' import { defineCall } from '../internal/utils.js' import type { TransactionReceipt } from '../Transaction.js' /** * Approves a spender to transfer TIP20 tokens on behalf of the caller. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.approve(client, { * spender: '0x...', * amount: 100n, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function approve< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: approve.Parameters, ): Promise { const { token, ...rest } = parameters return approve.inner(writeContract, client, parameters, { ...rest, token }) } export namespace approve { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** Amount of tokens to approve. */ amount: bigint /** Address of the spender. */ spender: Address /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: approve.Parameters, args: Args, ): Promise> { const call = approve.call(args) return (await action(client, { ...parameters, ...call, } as never)) as never } /** * Defines a call to the `approve` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.approve.call({ * spender: '0x20c0...beef', * amount: 100n, * token: '0x20c0...babe', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { spender, amount, token } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'approve', args: [spender, amount], }) } export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'Approval', }) if (!log) throw new Error('`Approval` event not found.') return log } } /** * Approves a spender to transfer TIP20 tokens on behalf of the caller. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.approveSync(client, { * spender: '0x...', * amount: 100n, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function approveSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: approveSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await approve.inner( writeContractSync, client, { ...parameters, throwOnReceiptRevert } as never, rest, ) const { args } = approve.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace approveSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = approve.Parameters export type Args = approve.Args export type ReturnValue = Compute< GetEventArgs< typeof Abis.tip20, 'Approval', { IndexedOnly: false Required: true } > & { /** Transaction receipt. */ receipt: TransactionReceipt } > // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Burns TIP20 tokens from a blocked address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.burnBlocked(client, { * from: '0x...', * amount: 100n, * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function burnBlocked< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: burnBlocked.Parameters, ): Promise { return burnBlocked.inner(writeContract, client, parameters) } export namespace burnBlocked { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** Amount of tokens to burn. */ amount: bigint /** Address to burn tokens from. */ from: Address /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: burnBlocked.Parameters, ): Promise> { const { amount, from, token, ...rest } = parameters const call = burnBlocked.call({ amount, from, token }) return (await action(client, { ...rest, ...call, } as never)) as never } /** * Defines a call to the `burnBlocked` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.burnBlocked.call({ * from: '0x20c0...beef', * amount: 100n, * token: '0x20c0...babe', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { from, amount, token } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'burnBlocked', args: [from, amount], }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'BurnBlocked', }) if (!log) throw new Error('`BurnBlocked` event not found.') return log } } /** * Burns TIP20 tokens from a blocked address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.burnBlockedSync(client, { * from: '0x...', * amount: 100n, * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function burnBlockedSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: burnBlockedSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await burnBlocked.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, } as never) const { args } = burnBlocked.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace burnBlockedSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = burnBlocked.Parameters export type Args = burnBlocked.Args export type ReturnValue = Compute< GetEventArgs< typeof Abis.tip20, 'BurnBlocked', { IndexedOnly: false Required: true } > & { /** Transaction receipt. */ receipt: TransactionReceipt } > // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Burns TIP20 tokens from the caller's balance. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.burn(client, { * amount: 100n, * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function burn< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: burn.Parameters, ): Promise { return burn.inner(writeContract, client, parameters) } export namespace burn { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** Amount of tokens to burn. */ amount: bigint /** Memo to include in the transfer. */ memo?: Hex.Hex | undefined /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: burn.Parameters, ): Promise> { const { amount, memo, token, ...rest } = parameters const call = burn.call({ amount, memo, token }) return (await action(client, { ...rest, ...call, } as never)) as never } /** * Defines a call to the `burn` or `burnWithMemo` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.burn.call({ * amount: 100n, * token: '0x20c0...babe', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { amount, memo, token } = args const callArgs = memo ? ({ functionName: 'burnWithMemo', args: [amount, Hex.padLeft(memo, 32)], } as const) : ({ functionName: 'burn', args: [amount], } as const) return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, ...callArgs, }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'Burn', }) if (!log) throw new Error('`Burn` event not found.') return log } } /** * Burns TIP20 tokens from the caller's balance. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.burnSync(client, { * amount: 100n, * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function burnSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: burnSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await burn.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, } as never) const { args } = burn.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace burnSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = burn.Parameters export type Args = burn.Args export type ReturnValue = Compute< GetEventArgs< typeof Abis.tip20, 'Burn', { IndexedOnly: false Required: true } > & { receipt: TransactionReceipt } > // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Changes the transfer policy ID for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.changeTransferPolicy(client, { * token: '0x...', * policyId: 1n, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function changeTransferPolicy< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: changeTransferPolicy.Parameters, ): Promise { return changeTransferPolicy.inner(writeContract, client, parameters) } export namespace changeTransferPolicy { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** New transfer policy ID. */ policyId: bigint /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: changeTransferPolicy.Parameters, ): Promise> { const { policyId, token, ...rest } = parameters const call = changeTransferPolicy.call({ policyId, token }) return (await action(client, { ...rest, ...call, } as never)) as never } /** * Defines a call to the `changeTransferPolicyId` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.changeTransferPolicy.call({ * token: '0x20c0...babe', * policyId: 1n, * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { token, policyId } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'changeTransferPolicyId', args: [policyId], }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'TransferPolicyUpdate', }) if (!log) throw new Error('`TransferPolicyUpdate` event not found.') return log } } /** * Changes the transfer policy ID for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.changeTransferPolicySync(client, { * token: '0x...', * policyId: 1n, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function changeTransferPolicySync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: changeTransferPolicySync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await changeTransferPolicy.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, } as never) const { args } = changeTransferPolicy.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace changeTransferPolicySync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = changeTransferPolicy.Parameters export type Args = changeTransferPolicy.Args export type ReturnValue = Compute< GetEventArgs< typeof Abis.tip20, 'TransferPolicyUpdate', { IndexedOnly: false Required: true } > & { receipt: TransactionReceipt } > // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Creates a new TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.create(client, { * name: 'My Token', * symbol: 'MTK', * currency: 'USD', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function create< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: create.Parameters, ): Promise { return create.inner(writeContract, client, parameters) } export namespace create { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Omit & (account extends Account ? { admin?: Account | Address | undefined } : { admin: Account | Address }) export type Args = { /** Admin address. */ admin: Address /** Currency (e.g. "USD"). */ currency: string /** Token name. */ name: string /** Quote token. */ quoteToken?: TokenId.TokenIdOrAddress | undefined /** Unique salt. @default Hex.random(32) */ salt?: Hex.Hex | undefined /** Token symbol. */ symbol: string } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: any, ): Promise> { const { account = client.account, admin: admin_ = client.account, chain = client.chain, ...rest } = parameters const admin = admin_ ? parseAccount(admin_) : undefined if (!admin) throw new Error('admin is required.') const call = create.call({ ...rest, admin: admin.address }) return (await action( client as never, { ...parameters, account, chain, ...call, } as never, )) as never } /** * Defines a call to the `createToken` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.create.call({ * name: 'My Token', * symbol: 'MTK', * currency: 'USD', * admin: '0xfeed...fede', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { name, symbol, currency, quoteToken = Addresses.pathUsd, admin, salt = Hex.random(32), } = args return defineCall({ address: Addresses.tip20Factory, abi: Abis.tip20Factory, args: [ name, symbol, currency, TokenId.toAddress(quoteToken), admin, salt, ], functionName: 'createToken', }) } /** * Extracts the `TokenCreated` event from logs. * * @param logs - The logs. * @returns The `TokenCreated` event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20Factory, logs, eventName: 'TokenCreated', strict: true, }) if (!log) throw new Error('`TokenCreated` event not found.') return log } } /** * Creates a new TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.createSync(client, { * name: 'My Token', * symbol: 'MTK', * currency: 'USD', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function createSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: createSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await create.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, } as never) const { args } = create.extractEvent(receipt.logs) const tokenId = TokenId.fromAddress(args.token) return { ...args, receipt, tokenId, } as never } export namespace createSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = create.Parameters export type Args = create.Args export type ReturnValue = Compute< GetEventArgs< typeof Abis.tip20Factory, 'TokenCreated', { IndexedOnly: false; Required: true } > & { /** Token ID. */ tokenId: TokenId.TokenId /** Transaction receipt. */ receipt: TransactionReceipt } > // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Gets TIP20 token allowance. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const allowance = await Actions.token.getAllowance(client, { * spender: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The token allowance. */ export async function getAllowance< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: getAllowance.Parameters, ): Promise { const { account = client.account } = parameters const address = account ? parseAccount(account).address : undefined if (!address) throw new Error('account is required.') return readContract(client, { ...parameters, ...getAllowance.call({ ...parameters, account: address }), }) } export namespace getAllowance { export type Parameters< account extends Account | undefined = Account | undefined, > = ReadParameters & GetAccountParameter & Omit & {} export type Args = { /** Account address. */ account: Address /** Address of the spender. */ spender: Address /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = ReadContractReturnType< typeof Abis.tip20, 'allowance', never > /** * Defines a call to the `allowance` function. * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { account, spender, token } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'allowance', args: [account, spender], }) } } /** * Gets TIP20 token balance for an address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const balance = await Actions.token.getBalance(client, { * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The token balance. */ export async function getBalance< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: getBalance.Parameters, ): Promise { const { account = client.account, ...rest } = parameters const address = account ? parseAccount(account).address : undefined if (!address) throw new Error('account is required.') return readContract(client, { ...rest, ...getBalance.call({ account: address, ...rest }), }) } export namespace getBalance { export type Parameters< account extends Account | undefined = Account | undefined, > = ReadParameters & GetAccountParameter & Omit export type Args = { /** Account address. */ account: Address /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = ReadContractReturnType< typeof Abis.tip20, 'balanceOf', never > /** * Defines a call to the `balanceOf` function. * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { account, token } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'balanceOf', args: [account], }) } } /** * Gets TIP20 token metadata including name, symbol, currency, decimals, and total supply. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const metadata = await Actions.token.getMetadata(client, { * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The token metadata. */ export async function getMetadata( client: Client, parameters: getMetadata.Parameters, ): Promise { const { token, ...rest } = parameters const address = TokenId.toAddress(token) const abi = Abis.tip20 if (TokenId.from(token) === TokenId.fromAddress(Addresses.pathUsd)) return multicall(client, { ...rest, contracts: [ { address, abi, functionName: 'currency', }, { address, abi, functionName: 'decimals', }, { address, abi, functionName: 'name', }, { address, abi, functionName: 'symbol', }, { address, abi, functionName: 'totalSupply', }, ] as const, allowFailure: false, deployless: true, }).then(([currency, decimals, name, symbol, totalSupply]) => ({ name, symbol, currency, decimals, totalSupply, })) return multicall(client, { ...rest, contracts: [ { address, abi, functionName: 'currency', }, { address, abi, functionName: 'decimals', }, { address, abi, functionName: 'quoteToken', }, { address, abi, functionName: 'name', }, { address, abi, functionName: 'paused', }, { address, abi, functionName: 'supplyCap', }, { address, abi, functionName: 'symbol', }, { address, abi, functionName: 'totalSupply', }, { address, abi, functionName: 'transferPolicyId', }, ] as const, allowFailure: false, deployless: true, }).then( ([ currency, decimals, quoteToken, name, paused, supplyCap, symbol, totalSupply, transferPolicyId, ]) => ({ name, symbol, currency, decimals, quoteToken, totalSupply, paused, supplyCap, transferPolicyId, }), ) } export declare namespace getMetadata { export type Parameters = { /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = Compute<{ /** * Currency (e.g. "USD"). */ currency: string /** * Decimals of the token. */ decimals: number /** * Quote token. * * Returns `undefined` for the default quote token (`0x20c...0000`). */ quoteToken?: Address | undefined /** * Name of the token. */ name: string /** * Whether the token is paused. * * Returns `undefined` for the default quote token (`0x20c...0000`). */ paused?: boolean | undefined /** * Supply cap. * * Returns `undefined` for the default quote token (`0x20c...0000`). */ supplyCap?: bigint | undefined /** * Symbol of the token. */ symbol: string /** * Total supply of the token. */ totalSupply: bigint /** * Transfer policy ID. * 0="always-reject", 1="always-allow", >2=custom policy * * Returns `undefined` for the default quote token (`0x20c...0000`). */ transferPolicyId?: bigint | undefined }> } /** * Gets the admin role for a specific role in a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const adminRole = await Actions.token.getRoleAdmin(client, { * role: 'issuer', * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The admin role hash. */ export async function getRoleAdmin( client: Client, parameters: getRoleAdmin.Parameters, ): Promise { return readContract(client, { ...parameters, ...getRoleAdmin.call(parameters), }) } export namespace getRoleAdmin { export type Parameters = ReadParameters & Args export type Args = { /** Role to get admin for. */ role: TokenRole.TokenRole /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = ReadContractReturnType< typeof Abis.tip20, 'getRoleAdmin', never > /** * Defines a call to the `getRoleAdmin` function. * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { role, token } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'getRoleAdmin', args: [TokenRole.serialize(role)], }) } } /** * Checks if an account has a specific role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const hasRole = await Actions.token.hasRole(client, { * account: '0x...', * role: 'issuer', * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns Whether the account has the role. */ export async function hasRole< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: hasRole.Parameters, ): Promise { const { account = client.account } = parameters const address = account ? parseAccount(account).address : undefined if (!address) throw new Error('account is required.') return readContract(client, { ...parameters, ...hasRole.call({ ...parameters, account: address }), }) } export namespace hasRole { export type Parameters< account extends Account | undefined = Account | undefined, > = ReadParameters & Omit & GetAccountParameter export type Args = { /** Account address to check. */ account: Address /** Role to check. */ role: TokenRole.TokenRole /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = ReadContractReturnType< typeof Abis.tip20, 'hasRole', never > /** * Defines a call to the `hasRole` function. * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { account, role, token } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'hasRole', args: [account, TokenRole.serialize(role)], }) } } /** * Grants a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.grantRoles(client, { * token: '0x...', * to: '0x...', * roles: ['issuer'], * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function grantRoles< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: grantRoles.Parameters, ): Promise { return grantRoles.inner(sendTransaction, client, parameters) } export namespace grantRoles { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Omit & { /** Role to grant. */ roles: readonly TokenRole.TokenRole[] } export type Args = { /** Role to grant. */ role: TokenRole.TokenRole /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress /** Address to grant the role to. */ to: Address } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof sendTransaction | typeof sendTransactionSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: grantRoles.Parameters, ): Promise> { return (await action(client, { ...parameters, calls: parameters.roles.map((role) => { const call = grantRoles.call({ ...parameters, role }) return { ...call, data: encodeFunctionData(call), } }), } as never)) as never } /** * Defines a call to the `grantRole` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.grantRoles.call({ * token: '0x20c0...babe', * to: '0x20c0...beef', * role: 'issuer', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { token, to, role } = args const roleHash = TokenRole.serialize(role) return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'grantRole', args: [roleHash, to], }) } /** * Extracts the events from the logs. * * @param logs - Logs. * @returns The events. */ export function extractEvents(logs: Log[]) { const events = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'RoleMembershipUpdated', }) if (events.length === 0) throw new Error('`RoleMembershipUpdated` events not found.') return events } } /** * Grants a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.grantRolesSync(client, { * token: '0x...', * to: '0x...', * roles: ['issuer'], * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function grantRolesSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: grantRolesSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await grantRoles.inner(sendTransactionSync, client, { ...rest, throwOnReceiptRevert, } as never) const events = grantRoles.extractEvents(receipt.logs) const value = events.map((event) => event.args) return { receipt, value, } } export namespace grantRolesSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = grantRoles.Parameters export type Args = grantRoles.Args export type ReturnValue = { receipt: TransactionReceipt value: readonly GetEventArgs< typeof Abis.tip20, 'RoleMembershipUpdated', { IndexedOnly: false; Required: true } >[] } // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Mints TIP20 tokens to an address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.mint(client, { * to: '0x...', * amount: 100n, * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function mint< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: mint.Parameters, ): Promise { return mint.inner(writeContract, client, parameters) } export namespace mint { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** Amount of tokens to mint. */ amount: bigint /** Memo to include in the mint. */ memo?: Hex.Hex | undefined /** Address to mint tokens to. */ to: Address /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: any, ): Promise> { const call = mint.call(parameters) return (await action(client, { ...parameters, ...call, } as never)) as never } /** * Defines a call to the `mint` or `mintWithMemo` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.mint.call({ * to: '0x20c0...beef', * amount: 100n, * token: '0x20c0...babe', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { to, amount, memo, token } = args const callArgs = memo ? ({ functionName: 'mintWithMemo', args: [to, amount, Hex.padLeft(memo, 32)], } as const) : ({ functionName: 'mint', args: [to, amount], } as const) return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, ...callArgs, }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'Mint', }) if (!log) throw new Error('`Mint` event not found.') return log } } /** * Mints TIP20 tokens to an address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.mintSync(client, { * to: '0x...', * amount: 100n, * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function mintSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: mintSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await mint.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, } as never) const { args } = mint.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace mintSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = mint.Parameters export type Args = mint.Args export type ReturnValue = Compute< GetEventArgs< typeof Abis.tip20, 'Mint', { IndexedOnly: false Required: true } > & { receipt: TransactionReceipt } > // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Pauses a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.pause(client, { * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function pause< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: pause.Parameters, ): Promise { return pause.inner(writeContract, client, parameters) } export namespace pause { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: pause.Parameters, ): Promise> { const { token, ...rest } = parameters const call = pause.call({ token }) return (await action(client, { ...rest, ...call, } as never)) as never } /** * Defines a call to the `pause` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.pause.call({ * token: '0x20c0...babe', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { token } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'pause', args: [], }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'PauseStateUpdate', }) if (!log) throw new Error('`PauseStateUpdate` event not found.') return log } } /** * Pauses a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.pauseSync(client, { * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function pauseSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: pauseSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await pause.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, } as never) const { args } = pause.extractEvent(receipt.logs) return { ...args, receipt, } } export namespace pauseSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = pause.Parameters export type Args = pause.Args export type ReturnValue = GetEventArgs< typeof Abis.tip20, 'PauseStateUpdate', { IndexedOnly: false; Required: true } > & { receipt: TransactionReceipt } // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Renounces a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.renounceRoles(client, { * token: '0x...', * roles: ['issuer'], * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function renounceRoles< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: renounceRoles.Parameters, ): Promise { return renounceRoles.inner(sendTransaction, client, parameters) } export namespace renounceRoles { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Omit & { /** Roles to renounce. */ roles: readonly TokenRole.TokenRole[] } export type Args = { /** Role to renounce. */ role: TokenRole.TokenRole /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof sendTransaction | typeof sendTransactionSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: renounceRoles.Parameters, ): Promise> { return (await action(client, { ...parameters, calls: parameters.roles.map((role) => { const call = renounceRoles.call({ ...parameters, role }) return { ...call, data: encodeFunctionData(call), } }), } as never)) as never } /** * Defines a call to the `renounceRole` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.renounceRoles.call({ * token: '0x20c0...babe', * role: 'issuer', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { token, role } = args const roleHash = TokenRole.serialize(role) return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'renounceRole', args: [roleHash], }) } /** * Extracts the events from the logs. * * @param logs - Logs. * @returns The events. */ export function extractEvents(logs: Log[]) { const events = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'RoleMembershipUpdated', }) if (events.length === 0) throw new Error('`RoleMembershipUpdated` events not found.') return events } } /** * Renounces a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.renounceRolesSync(client, { * token: '0x...', * roles: ['issuer'], * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function renounceRolesSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: renounceRolesSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await renounceRoles.inner(sendTransactionSync, client, { ...rest, throwOnReceiptRevert, } as never) const events = renounceRoles.extractEvents(receipt.logs) const value = events.map((event) => event.args) return { receipt, value, } } export namespace renounceRolesSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = renounceRoles.Parameters export type Args = renounceRoles.Args export type ReturnValue = { receipt: TransactionReceipt value: readonly GetEventArgs< typeof Abis.tip20, 'RoleMembershipUpdated', { IndexedOnly: false; Required: true } >[] } // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Revokes a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.revokeRoles(client, { * token: '0x...', * from: '0x...', * roles: ['issuer'], * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function revokeRoles< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: revokeRoles.Parameters, ): Promise { return revokeRoles.inner(sendTransaction, client, parameters) } export namespace revokeRoles { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = SendTransactionSyncParameters & Omit & { /** Role to revoke. */ roles: readonly TokenRole.TokenRole[] } export type Args = { /** Address to revoke the role from. */ from: Address /** Role to revoke. */ role: TokenRole.TokenRole /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof sendTransaction | typeof sendTransactionSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: revokeRoles.Parameters, ): Promise> { const { from: _, ...rest } = parameters return (await action(client, { ...rest, calls: parameters.roles.map((role) => { const call = revokeRoles.call({ ...parameters, role }) return { ...call, data: encodeFunctionData(call), } }), } as never)) as never } /** * Defines a call to the `revokeRole` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.revokeRoles.call({ * token: '0x20c0...babe', * from: '0x20c0...beef', * role: 'issuer', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { token, from, role } = args const roleHash = TokenRole.serialize(role) return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'revokeRole', args: [roleHash, from], }) } /** * Extracts the events from the logs. * * @param logs - Logs. * @returns The events. */ export function extractEvents(logs: Log[]) { const events = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'RoleMembershipUpdated', }) if (events.length === 0) throw new Error('`RoleMembershipUpdated` events not found.') return events } } /** * Revokes a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.revokeRolesSync(client, { * token: '0x...', * from: '0x...', * roles: ['issuer'], * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function revokeRolesSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: revokeRolesSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await revokeRoles.inner(sendTransactionSync, client, { ...rest, throwOnReceiptRevert, } as never) const events = revokeRoles.extractEvents(receipt.logs) const value = events.map((event) => event.args) return { receipt, value, } } export namespace revokeRolesSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = revokeRoles.Parameters export type Args = revokeRoles.Args export type ReturnValue = { receipt: TransactionReceipt value: readonly GetEventArgs< typeof Abis.tip20, 'RoleMembershipUpdated', { IndexedOnly: false; Required: true } >[] } // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Sets the supply cap for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.setSupplyCap(client, { * token: '0x...', * supplyCap: 1000000n, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function setSupplyCap< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: setSupplyCap.Parameters, ): Promise { return setSupplyCap.inner(writeContract, client, parameters) } export namespace setSupplyCap { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** New supply cap. */ supplyCap: bigint /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: setSupplyCap.Parameters, ): Promise> { const { supplyCap, token, ...rest } = parameters const call = setSupplyCap.call({ supplyCap, token }) return (await action(client, { ...rest, ...call, } as never)) as never } /** * Defines a call to the `setSupplyCap` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.setSupplyCap.call({ * token: '0x20c0...babe', * supplyCap: 1000000n, * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { token, supplyCap } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'setSupplyCap', args: [supplyCap], }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'SupplyCapUpdate', }) if (!log) throw new Error('`SupplyCapUpdate` event not found.') return log } } /** * Sets the supply cap for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.setSupplyCapSync(client, { * token: '0x...', * supplyCap: 1000000n, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function setSupplyCapSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: setSupplyCapSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await setSupplyCap.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, } as never) const { args } = setSupplyCap.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace setSupplyCapSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = setSupplyCap.Parameters export type Args = setSupplyCap.Args export type ReturnValue = GetEventArgs< typeof Abis.tip20, 'SupplyCapUpdate', { IndexedOnly: false; Required: true } > & { receipt: TransactionReceipt } // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Sets the admin role for a specific role in a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.setRoleAdmin(client, { * token: '0x...', * role: 'issuer', * adminRole: 'admin', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function setRoleAdmin< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: setRoleAdmin.Parameters, ): Promise { return setRoleAdmin.inner(writeContract, client, parameters) } export namespace setRoleAdmin { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** New admin role. */ adminRole: TokenRole.TokenRole /** Role to set admin for. */ role: TokenRole.TokenRole /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: setRoleAdmin.Parameters, ): Promise> { const { adminRole, role, token, ...rest } = parameters const call = setRoleAdmin.call({ adminRole, role, token }) return (await action(client, { ...rest, ...call, } as never)) as never } /** * Defines a call to the `setRoleAdmin` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.setRoleAdmin.call({ * token: '0x20c0...babe', * role: 'issuer', * adminRole: 'admin', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { token, role, adminRole } = args const roleHash = TokenRole.serialize(role) const adminRoleHash = TokenRole.serialize(adminRole) return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'setRoleAdmin', args: [roleHash, adminRoleHash], }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'RoleAdminUpdated', }) if (!log) throw new Error('`RoleAdminUpdated` event not found.') return log } } /** * Sets the admin role for a specific role in a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.setRoleAdminSync(client, { * token: '0x...', * role: 'issuer', * adminRole: 'admin', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function setRoleAdminSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: setRoleAdminSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await setRoleAdmin.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, } as never) const { args } = setRoleAdmin.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace setRoleAdminSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = setRoleAdmin.Parameters export type Args = setRoleAdmin.Args export type ReturnValue = GetEventArgs< typeof Abis.tip20, 'RoleAdminUpdated', { IndexedOnly: false; Required: true } > & { receipt: TransactionReceipt } // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Transfers TIP20 tokens to another address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.transfer(client, { * to: '0x...', * amount: 100n, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function transfer< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: transfer.Parameters, ): Promise { return transfer.inner(writeContract, client, parameters) } export namespace transfer { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** Amount of tokens to transfer. */ amount: bigint /** Address to transfer tokens from. */ from?: Address | undefined /** Memo to include in the transfer. */ memo?: Hex.Hex | undefined /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress /** Address to transfer tokens to. */ to: Address } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: transfer.Parameters, ): Promise> { const { amount, from, memo, token, to, ...rest } = parameters const call = transfer.call({ amount, from, memo, token, to }) return (await action(client, { ...rest, ...call, } as never)) as never } /** * Defines a call to the `transfer`, `transferFrom`, `transferWithMemo`, or `transferFromWithMemo` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.transfer.call({ * to: '0x20c0...beef', * amount: 100n, * token: '0x20c0...babe', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { amount, from, memo, token, to } = args const callArgs = (() => { if (memo && from) return { functionName: 'transferFromWithMemo', args: [from, to, amount, Hex.padLeft(memo, 32)], } as const if (memo) return { functionName: 'transferWithMemo', args: [to, amount, Hex.padLeft(memo, 32)], } as const if (from) return { functionName: 'transferFrom', args: [from, to, amount], } as const return { functionName: 'transfer', args: [to, amount], } as const })() return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, ...callArgs, }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'Transfer', }) if (!log) throw new Error('`Transfer` event not found.') return log } } /** * Transfers TIP20 tokens to another address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.transferSync(client, { * to: '0x...', * amount: 100n, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function transferSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: transferSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await transfer.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, } as never) const { args } = transfer.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace transferSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = transfer.Parameters export type Args = transfer.Args export type ReturnValue = GetEventArgs< typeof Abis.tip20, 'Transfer', { IndexedOnly: false; Required: true } > & { receipt: TransactionReceipt } // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Unpauses a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.unpause(client, { * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function unpause< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: unpause.Parameters, ): Promise { return unpause.inner(writeContract, client, parameters) } export namespace unpause { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: unpause.Parameters, ): Promise> { const { token, ...rest } = parameters const call = unpause.call({ token }) return (await action(client, { ...rest, ...call, } as never)) as never } /** * Defines a call to the `unpause` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.unpause.call({ * token: '0x20c0...babe', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { token } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'unpause', args: [], }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'PauseStateUpdate', }) if (!log) throw new Error('`PauseStateUpdate` event not found.') return log } } /** * Unpauses a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.unpauseSync(client, { * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function unpauseSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: unpauseSync.Parameters, ): Promise { const { throwOnReceiptRevert = true, ...rest } = parameters const receipt = await unpause.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, } as never) const { args } = unpause.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace unpauseSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = unpause.Parameters export type Args = unpause.Args export type ReturnValue = GetEventArgs< typeof Abis.tip20, 'PauseStateUpdate', { IndexedOnly: false; Required: true } > & { receipt: TransactionReceipt } // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Updates the quote token for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.prepareUpdateQuoteToken(client, { * token: '0x...', * quoteToken: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function prepareUpdateQuoteToken< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: prepareUpdateQuoteToken.Parameters, ): Promise { return prepareUpdateQuoteToken.inner(writeContract, client, parameters) } export namespace prepareUpdateQuoteToken { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** New quote token address. */ quoteToken: TokenId.TokenIdOrAddress /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: prepareUpdateQuoteToken.Parameters, ): Promise> { const { quoteToken, token, ...rest } = parameters const call = prepareUpdateQuoteToken.call({ quoteToken, token }) return (await action(client, { ...rest, ...call, } as never)) as never } /** * Defines a call to the `prepareUpdateQuoteToken` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.prepareUpdateQuoteToken.call({ * token: '0x20c0...babe', * quoteToken: '0x20c0...cafe', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { token, quoteToken } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'setNextQuoteToken', args: [TokenId.toAddress(quoteToken)], }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'NextQuoteTokenSet', }) if (!log) throw new Error('`NextQuoteTokenSet` event not found.') return log } } /** * Updates the quote token for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.prepareUpdateQuoteTokenSync(client, { * token: '0x...', * quoteToken: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function prepareUpdateQuoteTokenSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: prepareUpdateQuoteTokenSync.Parameters, ): Promise { const receipt = await prepareUpdateQuoteToken.inner( writeContractSync, client, parameters, ) const { args } = prepareUpdateQuoteToken.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace prepareUpdateQuoteTokenSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = prepareUpdateQuoteToken.Parameters export type Args = prepareUpdateQuoteToken.Args export type ReturnValue = Compute< GetEventArgs< typeof Abis.tip20, 'NextQuoteTokenSet', { IndexedOnly: false Required: true } > & { receipt: TransactionReceipt } > // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Updates the quote token for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.updateQuoteToken(client, { * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction hash. */ export async function updateQuoteToken< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: updateQuoteToken.Parameters, ): Promise { return updateQuoteToken.inner(writeContract, client, parameters) } export namespace updateQuoteToken { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = WriteParameters & Args export type Args = { /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WriteContractReturnType // TODO: exhaustive error type export type ErrorType = BaseErrorType /** @internal */ export async function inner< action extends typeof writeContract | typeof writeContractSync, chain extends Chain | undefined, account extends Account | undefined, >( action: action, client: Client, parameters: updateQuoteToken.Parameters, ): Promise> { const { token, ...rest } = parameters const call = updateQuoteToken.call({ token }) return (await action(client, { ...rest, ...call, } as never)) as never } /** * Defines a call to the `updateQuoteToken` function. * * Can be passed as a parameter to: * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls * * @example * ```ts * import { createClient, http, walletActions } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }).extend(walletActions) * * const { result } = await client.sendCalls({ * calls: [ * actions.token.updateQuoteToken.call({ * token: '0x20c0...babe', * }), * ] * }) * ``` * * @param args - Arguments. * @returns The call. */ export function call(args: Args) { const { token } = args return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'completeQuoteTokenUpdate', args: [], }) } /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ export function extractEvent(logs: Log[]) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'QuoteTokenUpdate', }) if (!log) throw new Error('`QuoteTokenUpdateCompleted` event not found.') return log } } /** * Updates the quote token for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const result = await Actions.token.updateQuoteTokenSync(client, { * token: '0x...', * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns The transaction receipt and event data. */ export async function updateQuoteTokenSync< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: updateQuoteTokenSync.Parameters, ): Promise { const receipt = await updateQuoteToken.inner( writeContractSync, client, parameters, ) const { args } = updateQuoteToken.extractEvent(receipt.logs) return { ...args, receipt, } as never } export namespace updateQuoteTokenSync { export type Parameters< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = updateQuoteToken.Parameters export type Args = updateQuoteToken.Args export type ReturnValue = Compute< GetEventArgs< typeof Abis.tip20, 'QuoteTokenUpdate', { IndexedOnly: false Required: true } > & { receipt: TransactionReceipt } > // TODO: exhaustive error type export type ErrorType = BaseErrorType } /** * Watches for TIP20 token approval events. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const unwatch = actions.token.watchApprove(client, { * onApproval: (args, log) => { * console.log('Approval:', args) * }, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns A function to unsubscribe from the event. */ export function watchApprove< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: watchApprove.Parameters, ) { const { onApproval, token, ...rest } = parameters return watchContractEvent(client, { ...rest, address: TokenId.toAddress(token), abi: Abis.tip20, eventName: 'Approval', onLogs: (logs) => { for (const log of logs) onApproval(log.args, log) }, strict: true, }) } export declare namespace watchApprove { export type Args = GetEventArgs< typeof Abis.tip20, 'Approval', { IndexedOnly: false; Required: true } > export type Log = viem_Log< bigint, number, false, ExtractAbiItem, true > export type Parameters = UnionOmit< WatchContractEventParameters, 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict' > & { /** Callback to invoke when tokens are approved. */ onApproval: (args: Args, log: Log) => void /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } } /** * Watches for TIP20 token burn events. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const unwatch = actions.token.watchBurn(client, { * onBurn: (args, log) => { * console.log('Burn:', args) * }, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns A function to unsubscribe from the event. */ export function watchBurn< chain extends Chain | undefined, account extends Account | undefined, >(client: Client, parameters: watchBurn.Parameters) { const { onBurn, token, ...rest } = parameters return watchContractEvent(client, { ...rest, address: TokenId.toAddress(token), abi: Abis.tip20, eventName: 'Burn', onLogs: (logs) => { for (const log of logs) onBurn(log.args, log) }, strict: true, }) } export declare namespace watchBurn { export type Args = GetEventArgs< typeof Abis.tip20, 'Burn', { IndexedOnly: false; Required: true } > export type Log = viem_Log< bigint, number, false, ExtractAbiItem, true > export type Parameters = UnionOmit< WatchContractEventParameters, 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict' > & { /** Callback to invoke when tokens are burned. */ onBurn: (args: Args, log: Log) => void /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } } /** * Watches for new TIP20 tokens created. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const unwatch = actions.token.watchCreate(client, { * onTokenCreated: (args, log) => { * console.log('Token created:', args) * }, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns A function to unsubscribe from the event. */ export function watchCreate< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: watchCreate.Parameters, ) { const { onTokenCreated, ...rest } = parameters return watchContractEvent(client, { ...rest, address: Addresses.tip20Factory, abi: Abis.tip20Factory, eventName: 'TokenCreated', onLogs: (logs) => { for (const log of logs) onTokenCreated(log.args, log) }, strict: true, }) } export declare namespace watchCreate { export type Args = GetEventArgs< typeof Abis.tip20Factory, 'TokenCreated', { IndexedOnly: false; Required: true } > export type Log = viem_Log< bigint, number, false, ExtractAbiItem, true > export type Parameters = UnionOmit< WatchContractEventParameters< typeof Abis.tip20Factory, 'TokenCreated', true >, 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict' > & { /** Callback to invoke when a new TIP20 token is created. */ onTokenCreated: (args: Args, log: Log) => void } } /** * Watches for TIP20 token mint events. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const unwatch = actions.token.watchMint(client, { * onMint: (args, log) => { * console.log('Mint:', args) * }, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns A function to unsubscribe from the event. */ export function watchMint< chain extends Chain | undefined, account extends Account | undefined, >(client: Client, parameters: watchMint.Parameters) { const { onMint, token, ...rest } = parameters return watchContractEvent(client, { ...rest, address: TokenId.toAddress(token), abi: Abis.tip20, eventName: 'Mint', onLogs: (logs) => { for (const log of logs) onMint(log.args, log) }, strict: true, }) } export declare namespace watchMint { export type Args = GetEventArgs< typeof Abis.tip20, 'Mint', { IndexedOnly: false; Required: true } > export type Log = viem_Log< bigint, number, false, ExtractAbiItem, true > export type Parameters = UnionOmit< WatchContractEventParameters, 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict' > & { /** Callback to invoke when tokens are minted. */ onMint: (args: Args, log: Log) => void /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } export type ReturnValue = WatchContractEventReturnType } /** * Watches for TIP20 token role admin updates. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const unwatch = actions.token.watchAdminRole(client, { * onRoleAdminUpdated: (args, log) => { * console.log('Role admin updated:', args) * }, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns A function to unsubscribe from the event. */ export function watchAdminRole< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: watchAdminRole.Parameters, ) { const { onRoleAdminUpdated, token, ...rest } = parameters return watchContractEvent(client, { ...rest, address: TokenId.toAddress(token), abi: Abis.tip20, eventName: 'RoleAdminUpdated', onLogs: (logs) => { for (const log of logs) onRoleAdminUpdated(log.args, log) }, strict: true, }) } export declare namespace watchAdminRole { export type Args = GetEventArgs< typeof Abis.tip20, 'RoleAdminUpdated', { IndexedOnly: false; Required: true } > export type Log = viem_Log< bigint, number, false, ExtractAbiItem, true > export type Parameters = UnionOmit< WatchContractEventParameters, 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict' > & { /** Callback to invoke when a role admin is updated. */ onRoleAdminUpdated: (args: Args, log: Log) => void /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } } /** * Watches for TIP20 token role membership updates. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const unwatch = actions.token.watchRole(client, { * onRoleUpdated: (args, log) => { * console.log('Role updated:', args) * }, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns A function to unsubscribe from the event. */ export function watchRole< chain extends Chain | undefined, account extends Account | undefined, >(client: Client, parameters: watchRole.Parameters) { const { onRoleUpdated, token, ...rest } = parameters return watchContractEvent(client, { ...rest, address: TokenId.toAddress(token), abi: Abis.tip20, eventName: 'RoleMembershipUpdated', onLogs: (logs) => { for (const log of logs) { const type = log.args.hasRole ? 'granted' : 'revoked' onRoleUpdated({ ...log.args, type }, log) } }, strict: true, }) } export declare namespace watchRole { export type Args = GetEventArgs< typeof Abis.tip20, 'RoleMembershipUpdated', { IndexedOnly: false; Required: true } > & { /** Type of role update. */ type: 'granted' | 'revoked' } export type Log = viem_Log< bigint, number, false, ExtractAbiItem, true > export type Parameters = UnionOmit< WatchContractEventParameters< typeof Abis.tip20, 'RoleMembershipUpdated', true >, 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict' > & { /** Callback to invoke when a role membership is updated. */ onRoleUpdated: (args: Args, log: Log) => void /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } } /** * Watches for TIP20 token transfer events. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const unwatch = actions.token.watchTransfer(client, { * onTransfer: (args, log) => { * console.log('Transfer:', args) * }, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns A function to unsubscribe from the event. */ export function watchTransfer< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: watchTransfer.Parameters, ) { const { onTransfer, token, ...rest } = parameters return watchContractEvent(client, { ...rest, address: TokenId.toAddress(token), abi: Abis.tip20, eventName: 'Transfer', onLogs: (logs) => { for (const log of logs) onTransfer(log.args, log) }, strict: true, }) } export declare namespace watchTransfer { export type Args = GetEventArgs< typeof Abis.tip20, 'Transfer', { IndexedOnly: false; Required: true } > export type Log = viem_Log< bigint, number, false, ExtractAbiItem, true > export type Parameters = UnionOmit< WatchContractEventParameters, 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict' > & { /** Callback to invoke when tokens are transferred. */ onTransfer: (args: Args, log: Log) => void /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } } /** * Watches for TIP20 token quote token update events. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'viem/chains' * import { Actions } from 'viem/tempo' * * const client = createClient({ * chain: tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001' }) * transport: http(), * }) * * const unwatch = actions.token.watchUpdateQuoteToken(client, { * onUpdateQuoteToken: (args, log) => { * if (args.completed) * console.log('quote token update completed:', args.newQuoteToken) * else * console.log('quote token update proposed:', args.newQuoteToken) * }, * }) * ``` * * @param client - Client. * @param parameters - Parameters. * @returns A function to unsubscribe from the event. */ export function watchUpdateQuoteToken< chain extends Chain | undefined, account extends Account | undefined, >( client: Client, parameters: watchUpdateQuoteToken.Parameters, ) { const { onUpdateQuoteToken, token, ...rest } = parameters const address = TokenId.toAddress(token) return watchContractEvent(client, { ...rest, address, abi: Abis.tip20, onLogs: ( logs: viem_Log< bigint, number, false, ExtractAbiItem< typeof Abis.tip20, 'NextQuoteTokenSet' | 'QuoteTokenUpdate' >, true >[], ) => { for (const log of logs) { if ( log.eventName !== 'NextQuoteTokenSet' && log.eventName !== 'QuoteTokenUpdate' ) continue onUpdateQuoteToken( { ...log.args, completed: log.eventName === 'QuoteTokenUpdate', }, log, ) } }, strict: true, } as never) } export declare namespace watchUpdateQuoteToken { export type Args = OneOf< | GetEventArgs< typeof Abis.tip20, 'NextQuoteTokenSet', { IndexedOnly: false; Required: true } > | GetEventArgs< typeof Abis.tip20, 'QuoteTokenUpdate', { IndexedOnly: false; Required: true } > > & { /** Whether the update has been completed. */ completed: boolean } export type Log = viem_Log export type Parameters = UnionOmit< WatchContractEventParameters, 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict' > & { /** Callback to invoke when a quote token update is proposed or completed. */ onUpdateQuoteToken: (args: Args, log: Log) => void /** Address or ID of the TIP20 token. */ token: TokenId.TokenIdOrAddress } }