UNPKG

viem

Version:

TypeScript Interface for Ethereum

1,694 lines (1,693 loc) • 87 kB
import * as Hex from 'ox/Hex'; import { TokenId, TokenRole } from 'ox/tempo'; import { parseAccount } from '../../accounts/utils/parseAccount.js'; import { multicall } from '../../actions/public/multicall.js'; import { readContract } from '../../actions/public/readContract.js'; import { watchContractEvent } from '../../actions/public/watchContractEvent.js'; import { sendTransaction } from '../../actions/wallet/sendTransaction.js'; import { sendTransactionSync, } from '../../actions/wallet/sendTransactionSync.js'; import { writeContract } from '../../actions/wallet/writeContract.js'; import { writeContractSync } from '../../actions/wallet/writeContractSync.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 { defineCall } from '../internal/utils.js'; /** * Approves a spender to transfer TIP20 tokens on behalf of the caller. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { const { token, ...rest } = parameters; return approve.inner(writeContract, client, parameters, { ...rest, token }); } (function (approve) { /** @internal */ async function inner(action, client, parameters, args) { const call = approve.call(args); return (await action(client, { ...parameters, ...call, })); } approve.inner = inner; /** * 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 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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. */ function call(args) { const { spender, amount, token } = args; return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'approve', args: [spender, amount], }); } approve.call = call; function extractEvent(logs) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'Approval', }); if (!log) throw new Error('`Approval` event not found.'); return log; } approve.extractEvent = extractEvent; })(approve || (approve = {})); /** * Approves a spender to transfer TIP20 tokens on behalf of the caller. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { const { throwOnReceiptRevert = true, ...rest } = parameters; const receipt = await approve.inner(writeContractSync, client, { ...parameters, throwOnReceiptRevert }, rest); const { args } = approve.extractEvent(receipt.logs); return { ...args, receipt, }; } /** * Burns TIP20 tokens from a blocked address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { return burnBlocked.inner(writeContract, client, parameters); } (function (burnBlocked) { /** @internal */ async function inner(action, client, parameters) { const { amount, from, token, ...rest } = parameters; const call = burnBlocked.call({ amount, from, token }); return (await action(client, { ...rest, ...call, })); } burnBlocked.inner = inner; /** * 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 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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. */ function call(args) { const { from, amount, token } = args; return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'burnBlocked', args: [from, amount], }); } burnBlocked.call = call; /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ function extractEvent(logs) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'BurnBlocked', }); if (!log) throw new Error('`BurnBlocked` event not found.'); return log; } burnBlocked.extractEvent = extractEvent; })(burnBlocked || (burnBlocked = {})); /** * Burns TIP20 tokens from a blocked address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { const { throwOnReceiptRevert = true, ...rest } = parameters; const receipt = await burnBlocked.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, }); const { args } = burnBlocked.extractEvent(receipt.logs); return { ...args, receipt, }; } /** * Burns TIP20 tokens from the caller's balance. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { return burn.inner(writeContract, client, parameters); } (function (burn) { /** @internal */ async function inner(action, client, parameters) { const { amount, memo, token, ...rest } = parameters; const call = burn.call({ amount, memo, token }); return (await action(client, { ...rest, ...call, })); } burn.inner = inner; /** * 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 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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. */ function call(args) { const { amount, memo, token } = args; const callArgs = memo ? { functionName: 'burnWithMemo', args: [amount, Hex.padLeft(memo, 32)], } : { functionName: 'burn', args: [amount], }; return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, ...callArgs, }); } burn.call = call; /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ function extractEvent(logs) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'Burn', }); if (!log) throw new Error('`Burn` event not found.'); return log; } burn.extractEvent = extractEvent; })(burn || (burn = {})); /** * Burns TIP20 tokens from the caller's balance. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { const { throwOnReceiptRevert = true, ...rest } = parameters; const receipt = await burn.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, }); const { args } = burn.extractEvent(receipt.logs); return { ...args, receipt, }; } /** * Changes the transfer policy ID for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { return changeTransferPolicy.inner(writeContract, client, parameters); } (function (changeTransferPolicy) { /** @internal */ async function inner(action, client, parameters) { const { policyId, token, ...rest } = parameters; const call = changeTransferPolicy.call({ policyId, token }); return (await action(client, { ...rest, ...call, })); } changeTransferPolicy.inner = inner; /** * 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 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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. */ function call(args) { const { token, policyId } = args; return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'changeTransferPolicyId', args: [policyId], }); } changeTransferPolicy.call = call; /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ function extractEvent(logs) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'TransferPolicyUpdate', }); if (!log) throw new Error('`TransferPolicyUpdate` event not found.'); return log; } changeTransferPolicy.extractEvent = extractEvent; })(changeTransferPolicy || (changeTransferPolicy = {})); /** * Changes the transfer policy ID for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { const { throwOnReceiptRevert = true, ...rest } = parameters; const receipt = await changeTransferPolicy.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, }); const { args } = changeTransferPolicy.extractEvent(receipt.logs); return { ...args, receipt, }; } /** * Creates a new TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { return create.inner(writeContract, client, parameters); } (function (create) { /** @internal */ async function inner(action, client, parameters) { 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, { ...parameters, account, chain, ...call, })); } create.inner = inner; /** * 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 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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. */ function call(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', }); } create.call = call; /** * Extracts the `TokenCreated` event from logs. * * @param logs - The logs. * @returns The `TokenCreated` event. */ function extractEvent(logs) { const [log] = parseEventLogs({ abi: Abis.tip20Factory, logs, eventName: 'TokenCreated', strict: true, }); if (!log) throw new Error('`TokenCreated` event not found.'); return log; } create.extractEvent = extractEvent; })(create || (create = {})); /** * Creates a new TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { const { throwOnReceiptRevert = true, ...rest } = parameters; const receipt = await create.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, }); const { args } = create.extractEvent(receipt.logs); const tokenId = TokenId.fromAddress(args.token); return { ...args, receipt, tokenId, }; } /** * Gets TIP20 token allowance. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { 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 }), }); } (function (getAllowance) { /** * Defines a call to the `allowance` function. * * @param args - Arguments. * @returns The call. */ function call(args) { const { account, spender, token } = args; return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'allowance', args: [account, spender], }); } getAllowance.call = call; })(getAllowance || (getAllowance = {})); /** * Gets TIP20 token balance for an address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { 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 }), }); } (function (getBalance) { /** * Defines a call to the `balanceOf` function. * * @param args - Arguments. * @returns The call. */ function call(args) { const { account, token } = args; return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'balanceOf', args: [account], }); } getBalance.call = call; })(getBalance || (getBalance = {})); /** * Gets TIP20 token metadata including name, symbol, currency, decimals, and total supply. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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, parameters) { 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', }, ], 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', }, ], allowFailure: false, deployless: true, }).then(([currency, decimals, quoteToken, name, paused, supplyCap, symbol, totalSupply, transferPolicyId,]) => ({ name, symbol, currency, decimals, quoteToken, totalSupply, paused, supplyCap, transferPolicyId, })); } /** * Gets the admin role for a specific role in a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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, parameters) { return readContract(client, { ...parameters, ...getRoleAdmin.call(parameters), }); } (function (getRoleAdmin) { /** * Defines a call to the `getRoleAdmin` function. * * @param args - Arguments. * @returns The call. */ function call(args) { const { role, token } = args; return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'getRoleAdmin', args: [TokenRole.serialize(role)], }); } getRoleAdmin.call = call; })(getRoleAdmin || (getRoleAdmin = {})); /** * Checks if an account has a specific role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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(client, parameters) { 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 }), }); } (function (hasRole) { /** * Defines a call to the `hasRole` function. * * @param args - Arguments. * @returns The call. */ function call(args) { const { account, role, token } = args; return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'hasRole', args: [account, TokenRole.serialize(role)], }); } hasRole.call = call; })(hasRole || (hasRole = {})); /** * Grants a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { return grantRoles.inner(sendTransaction, client, parameters); } (function (grantRoles) { /** @internal */ async function inner(action, client, parameters) { return (await action(client, { ...parameters, calls: parameters.roles.map((role) => { const call = grantRoles.call({ ...parameters, role }); return { ...call, data: encodeFunctionData(call), }; }), })); } grantRoles.inner = inner; /** * 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 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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. */ function call(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], }); } grantRoles.call = call; /** * Extracts the events from the logs. * * @param logs - Logs. * @returns The events. */ function extractEvents(logs) { const events = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'RoleMembershipUpdated', }); if (events.length === 0) throw new Error('`RoleMembershipUpdated` events not found.'); return events; } grantRoles.extractEvents = extractEvents; })(grantRoles || (grantRoles = {})); /** * Grants a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { const { throwOnReceiptRevert = true, ...rest } = parameters; const receipt = await grantRoles.inner(sendTransactionSync, client, { ...rest, throwOnReceiptRevert, }); const events = grantRoles.extractEvents(receipt.logs); const value = events.map((event) => event.args); return { receipt, value, }; } /** * Mints TIP20 tokens to an address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { return mint.inner(writeContract, client, parameters); } (function (mint) { /** @internal */ async function inner(action, client, parameters) { const call = mint.call(parameters); return (await action(client, { ...parameters, ...call, })); } mint.inner = inner; /** * 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 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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. */ function call(args) { const { to, amount, memo, token } = args; const callArgs = memo ? { functionName: 'mintWithMemo', args: [to, amount, Hex.padLeft(memo, 32)], } : { functionName: 'mint', args: [to, amount], }; return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, ...callArgs, }); } mint.call = call; /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ function extractEvent(logs) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'Mint', }); if (!log) throw new Error('`Mint` event not found.'); return log; } mint.extractEvent = extractEvent; })(mint || (mint = {})); /** * Mints TIP20 tokens to an address. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { const { throwOnReceiptRevert = true, ...rest } = parameters; const receipt = await mint.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, }); const { args } = mint.extractEvent(receipt.logs); return { ...args, receipt, }; } /** * Pauses a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { return pause.inner(writeContract, client, parameters); } (function (pause) { /** @internal */ async function inner(action, client, parameters) { const { token, ...rest } = parameters; const call = pause.call({ token }); return (await action(client, { ...rest, ...call, })); } pause.inner = inner; /** * 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 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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. */ function call(args) { const { token } = args; return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'pause', args: [], }); } pause.call = call; /** * Extracts the event from the logs. * * @param logs - Logs. * @returns The event. */ function extractEvent(logs) { const [log] = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'PauseStateUpdate', }); if (!log) throw new Error('`PauseStateUpdate` event not found.'); return log; } pause.extractEvent = extractEvent; })(pause || (pause = {})); /** * Pauses a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { const { throwOnReceiptRevert = true, ...rest } = parameters; const receipt = await pause.inner(writeContractSync, client, { ...rest, throwOnReceiptRevert, }); const { args } = pause.extractEvent(receipt.logs); return { ...args, receipt, }; } /** * Renounces a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { return renounceRoles.inner(sendTransaction, client, parameters); } (function (renounceRoles) { /** @internal */ async function inner(action, client, parameters) { return (await action(client, { ...parameters, calls: parameters.roles.map((role) => { const call = renounceRoles.call({ ...parameters, role }); return { ...call, data: encodeFunctionData(call), }; }), })); } renounceRoles.inner = inner; /** * 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 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * * const client = createClient({ * chain: tempo({ 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. */ function call(args) { const { token, role } = args; const roleHash = TokenRole.serialize(role); return defineCall({ address: TokenId.toAddress(token), abi: Abis.tip20, functionName: 'renounceRole', args: [roleHash], }); } renounceRoles.call = call; /** * Extracts the events from the logs. * * @param logs - Logs. * @returns The events. */ function extractEvents(logs) { const events = parseEventLogs({ abi: Abis.tip20, logs, eventName: 'RoleMembershipUpdated', }); if (events.length === 0) throw new Error('`RoleMembershipUpdated` events not found.'); return events; } renounceRoles.extractEvents = extractEvents; })(renounceRoles || (renounceRoles = {})); /** * Renounces a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { const { throwOnReceiptRevert = true, ...rest } = parameters; const receipt = await renounceRoles.inner(sendTransactionSync, client, { ...rest, throwOnReceiptRevert, }); const events = renounceRoles.extractEvents(receipt.logs); const value = events.map((event) => event.args); return { receipt, value, }; } /** * Revokes a role for a TIP20 token. * * @example * ```ts * import { createClient, http } from 'viem' * import { tempo } from 'tempo.ts/chains' * import { Actions } from 'tempo.ts/viem' * import { privateKeyToAccount } from 'viem/accounts' * * const client = createClient({ * account: privateKeyToAccount('0x...'), * chain: tempo({ 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(client, parameters) { return revokeRoles.inner(sendTransaction, client, parameters); } (function (revokeRoles) { /** @internal */ async function inner(action, client, parameters) { return (await action(client, { ...parameters, calls: parameters.roles.map((role) => { const call = revokeRoles.call({ ...parameters, role }); return { ...call, data: encodeFunctionData(call), }; }), })); } revokeRoles.inner = inner; /** * 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