UNPKG

accounts

Version:

Tempo Accounts SDK

285 lines 13.9 kB
import type { KeyAuthorization } from 'ox/tempo'; import type { Client, Hex, Transport } from 'viem'; import type { Address } from 'viem/accounts'; import type { tempo } from 'viem/chains'; import type * as Account from './Account.js'; import type * as Schema from './Schema.js'; import type * as Storage from './Storage.js'; import type * as Store from './Store.js'; import type * as Rpc from './zod/rpc.js'; /** Wire-format request (method + params) for a given RPC schema item. */ type EncodedRequest<encoded extends { method: unknown; params: unknown; }> = Pick<encoded, 'method' | 'params'>; /** Adapter interface for the provider. */ export type Adapter = SetupFn & Meta; /** The setup function an adapter must implement. */ export type SetupFn = (params: SetupFn.Parameters) => Instance; /** Static metadata attached to an adapter function. */ export type Meta = { /** Data URI of the provider icon. @default Black 1×1 SVG. */ icon?: `data:image/${string}` | undefined; /** Display name of the provider (e.g. `"My Wallet"`). @default "Injected Wallet" */ name?: string | undefined; /** Reverse DNS identifier (e.g. `"com.example.mywallet"`). @default `com.{lowercase name}` */ rdns?: string | undefined; }; export type Instance = { /** Adapter actions dispatched by the provider's `request()` method. */ actions: { /** Grant an access key for the active account. */ authorizeAccessKey?: ((params: authorizeAccessKey.Parameters, request: EncodedRequest<Rpc.wallet_authorizeAccessKey.Encoded>) => Promise<authorizeAccessKey.ReturnType>) | undefined; /** Create a new account (e.g. WebAuthn registration). */ createAccount: (params: createAccount.Parameters, request: EncodedRequest<Rpc.wallet_connect.Encoded>) => Promise<createAccount.ReturnType>; /** Deposit funds into the account. */ deposit?: ((params: deposit.Parameters, request: EncodedRequest<Rpc.wallet_deposit.Encoded>) => Promise<deposit.ReturnType>) | undefined; /** Open the zone-deposit flow. */ depositZone?: ((params: depositZone.Parameters, request: EncodedRequest<Rpc.wallet_depositZone.Encoded>) => Promise<depositZone.ReturnType>) | undefined; /** Disconnect hook for adapter-specific cleanup. */ disconnect?: (() => Promise<void>) | undefined; /** Discover existing accounts (e.g. WebAuthn assertion). */ loadAccounts: (params: loadAccounts.Parameters | undefined, request: EncodedRequest<Rpc.wallet_connect.Encoded>) => Promise<loadAccounts.ReturnType>; /** Revoke an access key. */ revokeAccessKey?: ((params: revokeAccessKey.Parameters, request: EncodedRequest<Rpc.wallet_revokeAccessKey.Encoded>) => Promise<void>) | undefined; /** Open the send-token flow. */ transfer?: ((params: transfer.Parameters, request: EncodedRequest<Rpc.wallet_transfer.Encoded>) => Promise<transfer.ReturnType>) | undefined; /** Open the swap flow. */ swap?: ((params: swap.Parameters, request: EncodedRequest<Rpc.wallet_swap.Encoded>) => Promise<swap.ReturnType>) | undefined; /** Send a transaction. */ sendTransaction: (params: sendTransaction.Parameters, request: EncodedRequest<Rpc.eth_sendTransaction.Encoded>) => Promise<sendTransaction.ReturnType>; /** Send a transaction and wait for the receipt. */ sendTransactionSync: (params: sendTransactionSync.Parameters, request: EncodedRequest<Rpc.eth_sendTransactionSync.Encoded>) => Promise<sendTransactionSync.ReturnType>; /** Sign a personal message (EIP-191). */ signPersonalMessage: (params: signPersonalMessage.Parameters, request: EncodedRequest<Rpc.personal_sign.Encoded>) => Promise<Hex>; /** Sign a transaction without broadcasting it. */ signTransaction: (params: signTransaction.Parameters, request: EncodedRequest<Rpc.eth_signTransaction.Encoded>) => Promise<signTransaction.ReturnType>; /** Sign EIP-712 typed data. */ signTypedData: (params: signTypedData.Parameters, request: EncodedRequest<Rpc.eth_signTypedData_v4.Encoded>) => Promise<Hex>; /** Switch chain hook for adapter-specific handling. */ switchChain?: ((params: switchChain.Parameters) => Promise<void>) | undefined; /** Open the zone-withdraw flow. */ withdrawZone?: ((params: withdrawZone.Parameters, request: EncodedRequest<Rpc.wallet_withdrawZone.Encoded>) => Promise<withdrawZone.ReturnType>) | undefined; }; /** Cleanup function called when the provider is destroyed. */ cleanup?: (() => void) | undefined; /** * When `true`, the provider skips Server Authentication orchestration on * `wallet_connect` and forwards `capabilities.auth` to the adapter * verbatim. Used by remote-forwarding adapters (e.g. `dialog`) so the * wallet host's own Provider runs the orchestration instead of racing * the dapp-side Provider for the challenge. * * Wallet-host adapters (`local`, `webAuthn`, `secp256k1`) * leave this unset. */ forwardsAuth?: boolean | undefined; /** When `true`, the provider merges new accounts onto existing ones instead of replacing. */ persistAccounts?: boolean | undefined; }; export declare namespace SetupFn { /** Parameters passed to an adapter's setup function. */ type Parameters = { /** Returns the rehydrated local account for the given address, or the active account if omitted. */ getAccount: Account.Find; /** Get the viem client for a given chain ID. Defaults to the active chain. */ getClient: (options?: getClient.Options | undefined) => Client<Transport, typeof tempo>; /** Storage adapter used by the provider. */ storage: Storage.Storage; /** Reactive state store. */ store: Store.Store; }; /** Value returned from an adapter's setup function. */ type ReturnType = Instance; } /** Creates an adapter from metadata and a setup function. */ export declare function define(meta: Meta, fn: SetupFn): Adapter; /** Spreads decoded params. */ export type ActionRequest<item extends Schema.Item> = Schema.Decoded<item>['params'] extends readonly [infer first] ? first : never; export declare namespace getClient { type Options = { /** Chain ID. Defaults to the active chain. */ chainId?: number | undefined; /** Fee payer service URL, or `false` to opt out of fee payers for this transaction if set globally. */ feePayer?: string | false | undefined; }; } export declare namespace createAccount { type Parameters = { /** Grant an access key during the ceremony. */ authorizeAccessKey?: authorizeAccessKey.Parameters | undefined; /** Digest to sign. */ digest?: Hex | undefined; /** Display name for the new account (e.g. credential name for WebAuthn). */ name: string; /** * `personal_sign` (EIP-191) request folded into the create-account * ceremony. The wallet computes `hashMessage(message)` and signs it * in the same passkey prompt that creates the account, so this costs * no extra prompt over a plain `wallet_connect` register. */ personalSign?: { message: string; } | undefined; /** Opaque user identifier (e.g. for WebAuthn `user.id`). */ userId?: string | undefined; }; type ReturnType = { accounts: readonly Store.Account[]; /** Email associated with the account. */ email?: string | null | undefined; /** Signed key authorization, if an access key was granted. */ keyAuthorization?: KeyAuthorization.Rpc | undefined; /** * Echo of the `personalSign` request, present iff the caller supplied * `personalSign`. The signature lives on the top-level `signature` * field — the message is echoed so consumers can verify locally * without round-tripping it. */ personalSign?: { message: string; } | undefined; /** Signature over the digest, if one was provided. */ signature?: Hex | undefined; /** Username associated with the account. */ username?: string | null | undefined; }; } export declare namespace deposit { type Parameters = ActionRequest<typeof Rpc.wallet_deposit.schema>; type ReturnType = Rpc.wallet_deposit.Encoded['returns']; } /** Parameters and return type for the `wallet_depositZone` action. */ export declare namespace depositZone { type Parameters = ActionRequest<typeof Rpc.wallet_depositZone.schema>; type ReturnType = Rpc.wallet_depositZone.Encoded['returns']; } /** Parameters and return type for the `wallet_withdrawZone` action. */ export declare namespace withdrawZone { type Parameters = ActionRequest<typeof Rpc.wallet_withdrawZone.schema>; type ReturnType = Rpc.wallet_withdrawZone.Encoded['returns']; } export declare namespace loadAccounts { type Parameters = { /** Grant an access key during the ceremony. */ authorizeAccessKey?: authorizeAccessKey.Parameters | undefined; /** Credential ID to restrict authentication to a specific credential. */ credentialId?: string | undefined; /** Digest to sign. */ digest?: Hex | undefined; /** * `personal_sign` (EIP-191) request folded into the load-accounts * ceremony. The wallet computes `hashMessage(message)` and signs it * in the same passkey prompt that loads the account, so this costs * no extra prompt over a plain `wallet_connect`. */ personalSign?: { message: string; } | undefined; /** When `true`, prompts the user to pick from all available credentials instead of using the last-used one. */ selectAccount?: boolean | undefined; }; type ReturnType = { /** Loaded accounts. */ accounts: readonly Store.Account[]; /** Email associated with the account. */ email?: string | null | undefined; /** Signed key authorization, if an access key was granted. */ keyAuthorization?: KeyAuthorization.Rpc | undefined; /** * Echo of the `personalSign` request, present iff the caller supplied * `personalSign`. The signature lives on the top-level `signature` * field — the message is echoed so consumers can verify locally * without round-tripping it. */ personalSign?: { message: string; } | undefined; /** Signature over the digest, if one was provided. */ signature?: Hex | undefined; /** Username associated with the account. */ username?: string | null | undefined; }; } export declare namespace signPersonalMessage { type Parameters = { /** Address of the account to sign with. */ address: Address; /** Hex-encoded message data. */ data: Hex; }; } export declare namespace signTypedData { type Parameters = { /** Address of the account to sign with. */ address: Address; /** JSON-encoded EIP-712 typed data. */ data: string; }; } export declare namespace authorizeAccessKey { type Parameters = { /** Access key address. Alternative to `publicKey` when the caller already knows the derived address. */ address?: Address | undefined; /** Chain ID the key authorization is scoped to. Defaults to the active chain. */ chainId?: bigint | undefined; /** Unix timestamp (seconds) when the key expires. */ expiry: number; /** Key type of the external public key. Required when `publicKey` or `address` is provided. */ keyType?: 'secp256k1' | 'p256' | 'webAuthn' | undefined; /** TIP-20 spending limits for this key. */ limits?: readonly { token: Address; limit: bigint; period?: number | undefined; }[] | undefined; /** External public key to authorize. When provided, no key pair is generated — the caller holds the signing material. */ publicKey?: Hex | undefined; /** Call scopes restricting which contracts/selectors this key can call. */ scopes?: readonly { address: Address; selector?: Hex | string | undefined; recipients?: readonly Address[] | undefined; }[] | undefined; }; type ReturnType = { keyAuthorization: KeyAuthorization.Rpc; rootAddress: Address; }; } export declare namespace revokeAccessKey { type Parameters = { /** Root account address. */ address: Address; /** Address of the access key to revoke. */ accessKeyAddress: Address; }; } export declare namespace transfer { type Parameters = ActionRequest<typeof Rpc.wallet_transfer.schema>; type ReturnType = Rpc.wallet_transfer.Encoded['returns']; } /** Parameters and return type for the `wallet_swap` action. */ export declare namespace swap { type Parameters = ActionRequest<typeof Rpc.wallet_swap.schema>; type ReturnType = Rpc.wallet_swap.Encoded['returns']; } export declare namespace sendTransaction { type Parameters = ActionRequest<typeof Rpc.eth_sendTransaction.schema>; type ReturnType = Rpc.eth_sendTransaction.Encoded['returns']; } export declare namespace sendTransactionSync { type Parameters = ActionRequest<typeof Rpc.eth_sendTransactionSync.schema>; type ReturnType = Rpc.eth_sendTransactionSync.Encoded['returns']; } export declare namespace signTransaction { type Parameters = ActionRequest<typeof Rpc.eth_signTransaction.schema>; type ReturnType = Hex; } export declare namespace switchChain { type Parameters = { chainId: number; }; } export {}; //# sourceMappingURL=Adapter.d.ts.map