3rd Party Signers
Account Kit is designed to be flexible and allow you to use any Signer you want. If you choose not use our signer, you can either:
- Use a 3rd party library as a Signer that integrates with Account Kit.
- Implement
SmartAccountSigner
(exported in@aa-sdk/core
). - If your Signer is an EIP-1193 compliant provider, you can leverage
viem
’sWalletClient
and theWalletClientSigner
(exported in@aa-sdk/core
).
Then you can use your Signer as an owner on Smart Contracts exported from @account-kit/smart-contracts
and with our infra Smart Account Clients exported from @account-kit/infra
.
Third Party SDKs
If you’ve built an SDK or Guide that leverages any of the methods below to use as a 3rd Party Signer, we’re happy to include you in this list!
Please open a PR to add a link to your content in this section.
Implementing SmartAccountAuthenticator
or SmartAccountSigner
Smart accounts in Account Kit expect an implementation of SmartAccountSigner
to work in Account Kit. We also include a SmartAccountAuthenticator
interface that extends SmartAccountSigner
and wraps any SDKs you may wish to use as part of the implementation of your own Signer.
import type { import AddressAddress } from "abitype";
import type {
type Hex = `0x${string}`Hex,
type OneOf<union extends object, fallback extends object | undefined = undefined, keys extends KeyofUnion<union> = KeyofUnion<union>> = union extends infer item ? { [K in keyof (item & { [key in Exclude<keys, keyof item>]?: (fallback extends object ? key extends keyof fallback ? fallback[key] : undefined : undefined) | undefined; })]: (item & { [key in Exclude<keys, keyof item>]?: (fallback extends object ? key extends keyof fallback ? fallback[key] : undefined : undefined) | undefined; })[K]; } : neverOneOf,
type SignableMessage = string | {
raw: Hex | ByteArray;
}SignableMessage,
type TypedData = {
[x: string]: readonly TypedDataParameter[];
[x: `string[${string}]`]: undefined;
[x: `function[${string}]`]: undefined;
[x: `address[${string}]`]: undefined;
[x: `bool[${string}]`]: undefined;
[x: `bytes[${string}]`]: undefined;
[x: `bytes1[${string}]`]: undefined;
[x: `bytes2[${string}]`]: undefined;
[x: `bytes3[${string}]`]: undefined;
[x: `bytes4[${string}]`]: undefined;
[x: `bytes5[${string}]`]: undefined;
[x: `bytes6[${string}]`]: undefined;
[x: `bytes7[${string}]`]: undefined;
[x: `bytes8[${string}]`]: undefined;
[x: `bytes9[${string}]`]: undefined;
[x: `bytes10[${string}]`]: undefined;
[x: `bytes11[${string}]`]: undefined;
[x: `bytes12[${string}]`]: undefined;
[x: `bytes13[${string}]`]: undefined;
[x: `bytes14[${string}]`]: undefined;
[x: `bytes15[${string}]`]: undefined;
[x: `bytes16[${string}]`]: undefined;
[x: `bytes17[${string}]`]: undefined;
[x: `bytes18[${string}]`]: undefined;
[x: `bytes19[${string}]`]: undefined;
[x: `bytes20[${string}]`]: undefined;
[x: `bytes21[${string}]`]: undefined;
[x: `bytes22[${string}]`]: undefined;
[x: `bytes23[${string}]`]: undefined;
[x: `bytes24[${string}]`]: undefined;
[x: `bytes25[${string}]`]: undefined;
[x: `bytes26[${string}]`]: undefined;
[x: `bytes27[${string}]`]: undefined;
[x: `bytes28[${string}]`]: undefined;
[x: `bytes29[${string}]`]: undefined;
[x: `bytes30[${string}]`]: undefined;
[x: `bytes31[${string}]`]: undefined;
[x: `bytes32[${string}]`]: undefined;
[x: `int[${ ...EIP-712 Typed Data Specification
TypedData,
type TypedDataDefinition<typedData extends TypedData | Record<string, unknown> = { [x: string]: readonly TypedDataParameter[]; [x: `string[${string}]`]: undefined; [x: `function[${string}]`]: undefined; [x: `address[${string}]`]: undefined; [x: `bool[${string}]`]: undefined; [x: `bytes[${string}]`]: undefined; [x: `bytes1[${string}]`]: undefined; [x: `bytes2[${string}]`]: undefined; [x: `bytes3[${string}]`]: undefined; [x: `bytes4[${string}]`]: undefined; [x: `bytes5[${string}]`]: undefined; [x: `bytes6[${string}]`]: undefined; [x: `bytes7[${string}]`]: undefined; [x: `bytes8[${string}]`]: undefined; [x: `bytes9[${string}]`]: undefined; [x: `bytes10[${string}]`]: undefined; [x: `bytes11[${string}]`]: undefined; [x: `bytes12[${string}]`]: undefined; [x: `bytes13[${string}]`]: undefined; [x: `bytes14[${string}]`]: undefined; [x: `bytes15[${string}]`]: undefined; [x: `bytes16[${string}]`]: undefined; [x: `bytes17[${string}]`]: undefined; [x: `bytes18[${string}]`]: undefined; [x: `bytes19[${string}]`]: undefined; [x: `bytes20[${string}]`]: undefined; [x: `bytes21[${string}]`]: undefined; [x: `bytes22[${string}]`]: undefined; [x: `bytes23[${string}]`]: undefined; [x: `bytes24[${string}]`]: undefined; [x: `bytes25[${string}]`]: undefined; [x: `bytes26[${string}]`]: undefined; [x: `bytes27[${string}]`]: undefined; [x: `bytes28[${string}]`]: undefined; [x: `bytes29[${string}]`]: undefined; [x: `bytes30[${string}]`]: undefined; [x: `bytes31[${string}]`]: undefined; [x: `bytes32[${string}]`]: undefined; [x: `int[${string}]`]: undefined; [x: `int8[${string}]`]: undefined; [x: `int16[${string}]`]: undefined; [ ... = primaryType extends "EIP712Domain" ? EIP712DomainDefinition<typedData, primaryType, typedData extends {
[x: string]: readonly TypedDataParameter[];
[x: `string[${string}]`]: undefined;
[x: `function[${string}]`]: undefined;
[x: `address[${string}]`]: undefined;
[x: `bool[${string}]`]: undefined;
[x: `bytes[${string}]`]: undefined;
[x: `bytes1[${string}]`]: undefined;
[x: `bytes2[${string}]`]: undefined;
[x: `bytes3[${string}]`]: undefined;
[x: `bytes4[${string}]`]: undefined;
[x: `bytes5[${string}]`]: undefined;
[x: `bytes6[${string}]`]: undefined;
[x: `bytes7[${string}]`]: undefined;
[x: `bytes8[${string}]`]: undefined;
[x: `bytes9[${string}]`]: undefined;
[x: `bytes10[${string}]`]: undefined;
[x: `bytes11[${string}]`]: undefined;
[x: `bytes12[${string}]`]: undefined;
[x: `bytes13[${string}]`]: undefined;
[x: `bytes14[${string}]`]: undefined;
[x: `bytes15[${string}]`]: undefined;
[x: `bytes16[${string}]`]: undefined;
[x: `bytes17[${string}]`]: undefined;
[x: `bytes18[${string}]`]: undefined;
[x: `bytes19[${string}]`]: undefined;
[x: `bytes20[${string}]`]: undefined;
[x: `bytes21[${string}]`]: undefined;
[x: `bytes22[${string}]`]: undefined;
[x: `bytes23[${string}]`]: undefined;
[x: `bytes24[${string}]`]: undefined;
[x: `bytes25[${string}]`]: undefined;
[x: `bytes26[${string}]`]: undefined;
[x: `bytes27[${string}]`]: undefined;
[x: `bytes28[${string}]`]: undefined;
[x: `bytes29[${string}]`]: undefined;
[x: `bytes30[${string}]`]: undefined ...TypedDataDefinition,
type SignedAuthorization<uint32 = number> = {
address: Address;
chainId: uint32;
nonce: uint32;
} & Signature<uint32>SignedAuthorization,
} from "viem";
// [!region SmartAccountAuthenticator]
/**
* Extends the @interface SmartAccountSigner interface with authentication.
*
* @template AuthParams - the generic type of the authentication parameters
* @template AuthDetails - the generic type of the authentication details
* @template Inner - the generic type of the inner client that the signer wraps to provide functionality such as signing, etc.
*/
export interface interface SmartAccountAuthenticator<AuthParams, AuthDetails, Inner = any>Extends the
SmartAccountAuthenticator<function (type parameter) AuthParams in SmartAccountAuthenticator<AuthParams, AuthDetails, Inner = any>the generic type of the authentication parameters
AuthParams, function (type parameter) AuthDetails in SmartAccountAuthenticator<AuthParams, AuthDetails, Inner = any>the generic type of the authentication details
AuthDetails, function (type parameter) Inner in SmartAccountAuthenticator<AuthParams, AuthDetails, Inner = any>the generic type of the inner client that the signer wraps to provide functionality such as signing, etc.
Inner = any>
extends interface SmartAccountSigner<Inner = any>A signer that can sign messages and typed data.
SmartAccountSigner<function (type parameter) Inner in SmartAccountAuthenticator<AuthParams, AuthDetails, Inner = any>the generic type of the inner client that the signer wraps to provide functionality such as signing, etc.
Inner> {
SmartAccountAuthenticator<AuthParams, AuthDetails, Inner = any>.authenticate: (params: AuthParams) => Promise<AuthDetails>authenticate: (params: AuthParamsparams: function (type parameter) AuthParams in SmartAccountAuthenticator<AuthParams, AuthDetails, Inner = any>the generic type of the authentication parameters
AuthParams) => interface Promise<T>Represents the completion of an asynchronous operation
Promise<function (type parameter) AuthDetails in SmartAccountAuthenticator<AuthParams, AuthDetails, Inner = any>the generic type of the authentication details
AuthDetails>;
SmartAccountAuthenticator<AuthParams, AuthDetails, Inner = any>.getAuthDetails: () => Promise<AuthDetails>getAuthDetails: () => interface Promise<T>Represents the completion of an asynchronous operation
Promise<function (type parameter) AuthDetails in SmartAccountAuthenticator<AuthParams, AuthDetails, Inner = any>the generic type of the authentication details
AuthDetails>;
}
// [!endregion SmartAccountAuthenticator]
// [!region SmartAccountSigner]
// TODO: This is a temporary type to be removed when viem is updated
export type type AuthorizationRequest<uint32 = number> = OneOf<{
address: Address;
} | {
contractAddress: Address;
}> & {
chainId: uint32;
nonce: uint32;
}AuthorizationRequest<function (type parameter) uint32 in type AuthorizationRequest<uint32 = number>uint32 = number> = type OneOf<union extends object, fallback extends object | undefined = undefined, keys extends KeyofUnion<union> = KeyofUnion<union>> = union extends infer item ? { [K in keyof (item & { [key in Exclude<keys, keyof item>]?: (fallback extends object ? key extends keyof fallback ? fallback[key] : undefined : undefined) | undefined; })]: (item & { [key in Exclude<keys, keyof item>]?: (fallback extends object ? key extends keyof fallback ? fallback[key] : undefined : undefined) | undefined; })[K]; } : neverOneOf<
| {
address: Addressaddress: import AddressAddress;
}
| {
contractAddress: AddresscontractAddress: import AddressAddress;
}
> & {
/** Chain ID. */
chainId: uint32 = numberChain ID.
chainId: function (type parameter) uint32 in type AuthorizationRequest<uint32 = number>uint32;
/** Nonce of the EOA to delegate to. */
nonce: uint32 = numberNonce of the EOA to delegate to.
nonce: function (type parameter) uint32 in type AuthorizationRequest<uint32 = number>uint32;
};
/**
* A signer that can sign messages and typed data.
*
* @template Inner - the generic type of the inner client that the signer wraps to provide functionality such as signing, etc.
*/
export interface interface SmartAccountSigner<Inner = any>A signer that can sign messages and typed data.
SmartAccountSigner<function (type parameter) Inner in SmartAccountSigner<Inner = any>the generic type of the inner client that the signer wraps to provide functionality such as signing, etc.
Inner = any> {
SmartAccountSigner<Inner = any>.signerType: stringsignerType: string;
SmartAccountSigner<Inner = any>.inner: Inner = anyinner: function (type parameter) Inner in SmartAccountSigner<Inner = any>the generic type of the inner client that the signer wraps to provide functionality such as signing, etc.
Inner;
SmartAccountSigner<Inner = any>.getAddress: () => Promise<Address>getAddress: () => interface Promise<T>Represents the completion of an asynchronous operation
Promise<import AddressAddress>;
SmartAccountSigner<Inner = any>.signMessage: (message: SignableMessage) => Promise<Hex>signMessage: (message: SignableMessagemessage: type SignableMessage = string | {
raw: Hex | ByteArray;
}SignableMessage) => interface Promise<T>Represents the completion of an asynchronous operation
Promise<type Hex = `0x${string}`Hex>;
SmartAccountSigner<Inner = any>.signTypedData: <const TTypedData extends TypedData | Record<string, unknown>, TPrimaryType extends keyof TTypedData | "EIP712Domain" = keyof TTypedData>(params: TypedDataDefinition<TTypedData, TPrimaryType>) => Promise<Hex>signTypedData: <
const function (type parameter) TTypedData in <const TTypedData extends TypedData | Record<string, unknown>, TPrimaryType extends keyof TTypedData | "EIP712Domain" = keyof TTypedData>(params: TypedDataDefinition<TTypedData, TPrimaryType>): Promise<Hex>TTypedData extends type TypedData = {
[x: string]: readonly TypedDataParameter[];
[x: `string[${string}]`]: undefined;
[x: `function[${string}]`]: undefined;
[x: `address[${string}]`]: undefined;
[x: `bool[${string}]`]: undefined;
[x: `bytes[${string}]`]: undefined;
[x: `bytes1[${string}]`]: undefined;
[x: `bytes2[${string}]`]: undefined;
[x: `bytes3[${string}]`]: undefined;
[x: `bytes4[${string}]`]: undefined;
[x: `bytes5[${string}]`]: undefined;
[x: `bytes6[${string}]`]: undefined;
[x: `bytes7[${string}]`]: undefined;
[x: `bytes8[${string}]`]: undefined;
[x: `bytes9[${string}]`]: undefined;
[x: `bytes10[${string}]`]: undefined;
[x: `bytes11[${string}]`]: undefined;
[x: `bytes12[${string}]`]: undefined;
[x: `bytes13[${string}]`]: undefined;
[x: `bytes14[${string}]`]: undefined;
[x: `bytes15[${string}]`]: undefined;
[x: `bytes16[${string}]`]: undefined;
[x: `bytes17[${string}]`]: undefined;
[x: `bytes18[${string}]`]: undefined;
[x: `bytes19[${string}]`]: undefined;
[x: `bytes20[${string}]`]: undefined;
[x: `bytes21[${string}]`]: undefined;
[x: `bytes22[${string}]`]: undefined;
[x: `bytes23[${string}]`]: undefined;
[x: `bytes24[${string}]`]: undefined;
[x: `bytes25[${string}]`]: undefined;
[x: `bytes26[${string}]`]: undefined;
[x: `bytes27[${string}]`]: undefined;
[x: `bytes28[${string}]`]: undefined;
[x: `bytes29[${string}]`]: undefined;
[x: `bytes30[${string}]`]: undefined;
[x: `bytes31[${string}]`]: undefined;
[x: `bytes32[${string}]`]: undefined;
[x: `int[${ ...EIP-712 Typed Data Specification
TypedData | type Record<K extends keyof any, T> = { [P in K]: T; }Construct a type with a set of properties K of type T
Record<string, unknown>,
function (type parameter) TPrimaryType in <const TTypedData extends TypedData | Record<string, unknown>, TPrimaryType extends keyof TTypedData | "EIP712Domain" = keyof TTypedData>(params: TypedDataDefinition<TTypedData, TPrimaryType>): Promise<Hex>TPrimaryType extends keyof function (type parameter) TTypedData in <const TTypedData extends TypedData | Record<string, unknown>, TPrimaryType extends keyof TTypedData | "EIP712Domain" = keyof TTypedData>(params: TypedDataDefinition<TTypedData, TPrimaryType>): Promise<Hex>TTypedData | "EIP712Domain" = keyof function (type parameter) TTypedData in <const TTypedData extends TypedData | Record<string, unknown>, TPrimaryType extends keyof TTypedData | "EIP712Domain" = keyof TTypedData>(params: TypedDataDefinition<TTypedData, TPrimaryType>): Promise<Hex>TTypedData,
>(
params: TypedDataDefinition<TTypedData, TPrimaryType>params: type TypedDataDefinition<typedData extends TypedData | Record<string, unknown> = { [x: string]: readonly TypedDataParameter[]; [x: `string[${string}]`]: undefined; [x: `function[${string}]`]: undefined; [x: `address[${string}]`]: undefined; [x: `bool[${string}]`]: undefined; [x: `bytes[${string}]`]: undefined; [x: `bytes1[${string}]`]: undefined; [x: `bytes2[${string}]`]: undefined; [x: `bytes3[${string}]`]: undefined; [x: `bytes4[${string}]`]: undefined; [x: `bytes5[${string}]`]: undefined; [x: `bytes6[${string}]`]: undefined; [x: `bytes7[${string}]`]: undefined; [x: `bytes8[${string}]`]: undefined; [x: `bytes9[${string}]`]: undefined; [x: `bytes10[${string}]`]: undefined; [x: `bytes11[${string}]`]: undefined; [x: `bytes12[${string}]`]: undefined; [x: `bytes13[${string}]`]: undefined; [x: `bytes14[${string}]`]: undefined; [x: `bytes15[${string}]`]: undefined; [x: `bytes16[${string}]`]: undefined; [x: `bytes17[${string}]`]: undefined; [x: `bytes18[${string}]`]: undefined; [x: `bytes19[${string}]`]: undefined; [x: `bytes20[${string}]`]: undefined; [x: `bytes21[${string}]`]: undefined; [x: `bytes22[${string}]`]: undefined; [x: `bytes23[${string}]`]: undefined; [x: `bytes24[${string}]`]: undefined; [x: `bytes25[${string}]`]: undefined; [x: `bytes26[${string}]`]: undefined; [x: `bytes27[${string}]`]: undefined; [x: `bytes28[${string}]`]: undefined; [x: `bytes29[${string}]`]: undefined; [x: `bytes30[${string}]`]: undefined; [x: `bytes31[${string}]`]: undefined; [x: `bytes32[${string}]`]: undefined; [x: `int[${string}]`]: undefined; [x: `int8[${string}]`]: undefined; [x: `int16[${string}]`]: undefined; [ ... = primaryType extends "EIP712Domain" ? EIP712DomainDefinition<typedData, primaryType, typedData extends {
[x: string]: readonly TypedDataParameter[];
[x: `string[${string}]`]: undefined;
[x: `function[${string}]`]: undefined;
[x: `address[${string}]`]: undefined;
[x: `bool[${string}]`]: undefined;
[x: `bytes[${string}]`]: undefined;
[x: `bytes1[${string}]`]: undefined;
[x: `bytes2[${string}]`]: undefined;
[x: `bytes3[${string}]`]: undefined;
[x: `bytes4[${string}]`]: undefined;
[x: `bytes5[${string}]`]: undefined;
[x: `bytes6[${string}]`]: undefined;
[x: `bytes7[${string}]`]: undefined;
[x: `bytes8[${string}]`]: undefined;
[x: `bytes9[${string}]`]: undefined;
[x: `bytes10[${string}]`]: undefined;
[x: `bytes11[${string}]`]: undefined;
[x: `bytes12[${string}]`]: undefined;
[x: `bytes13[${string}]`]: undefined;
[x: `bytes14[${string}]`]: undefined;
[x: `bytes15[${string}]`]: undefined;
[x: `bytes16[${string}]`]: undefined;
[x: `bytes17[${string}]`]: undefined;
[x: `bytes18[${string}]`]: undefined;
[x: `bytes19[${string}]`]: undefined;
[x: `bytes20[${string}]`]: undefined;
[x: `bytes21[${string}]`]: undefined;
[x: `bytes22[${string}]`]: undefined;
[x: `bytes23[${string}]`]: undefined;
[x: `bytes24[${string}]`]: undefined;
[x: `bytes25[${string}]`]: undefined;
[x: `bytes26[${string}]`]: undefined;
[x: `bytes27[${string}]`]: undefined;
[x: `bytes28[${string}]`]: undefined;
[x: `bytes29[${string}]`]: undefined;
[x: `bytes30[${string}]`]: undefined ...TypedDataDefinition<function (type parameter) TTypedData in <const TTypedData extends TypedData | Record<string, unknown>, TPrimaryType extends keyof TTypedData | "EIP712Domain" = keyof TTypedData>(params: TypedDataDefinition<TTypedData, TPrimaryType>): Promise<Hex>TTypedData, function (type parameter) TPrimaryType in <const TTypedData extends TypedData | Record<string, unknown>, TPrimaryType extends keyof TTypedData | "EIP712Domain" = keyof TTypedData>(params: TypedDataDefinition<TTypedData, TPrimaryType>): Promise<Hex>TPrimaryType>,
) => interface Promise<T>Represents the completion of an asynchronous operation
Promise<type Hex = `0x${string}`Hex>;
SmartAccountSigner<Inner = any>.signAuthorization?: ((unsignedAuthorization: AuthorizationRequest<number>) => Promise<SignedAuthorization<number>>) | undefinedsignAuthorization?: (
unsignedAuthorization: AuthorizationRequest<number>unsignedAuthorization: type AuthorizationRequest<uint32 = number> = OneOf<{
address: Address;
} | {
contractAddress: Address;
}> & {
chainId: uint32;
nonce: uint32;
}AuthorizationRequest<number>,
) => interface Promise<T>Represents the completion of an asynchronous operation
Promise<type SignedAuthorization<uint32 = number> = {
address: Address;
chainId: uint32;
nonce: uint32;
} & Signature<uint32>SignedAuthorization<number>>;
}
// [!endregion SmartAccountSigner]
Using WalletClientSigner
Viem allows you to create a WalletClient
, which can be used to wrap local or JSON RPC based wallets. You can see the complete docs for leveraging the WalletClient
here.
We support a SmartAccountSigner
implementation called WalletClientSigner
that makes it really easy to use a viem WalletClient
as a signer on your Smart Contract Account. If your Signer is EIP-1193 compliant, it is really easy to use with WalletClient
. Let’s take a look at a simple example:
import { class WalletClientSignerRepresents a wallet client signer for smart accounts, providing methods to get the address, sign messages, and sign typed data.
WalletClientSigner, type interface SmartAccountSigner<Inner = any>A signer that can sign messages and typed data.
SmartAccountSigner } from "@aa-sdk/core";
import { function createWalletClient<transport extends Transport, chain extends Chain | undefined = undefined, accountOrAddress extends Account | Address | undefined = undefined, rpcSchema extends RpcSchema | undefined = undefined>(parameters: WalletClientConfig<transport, chain, accountOrAddress, rpcSchema>): WalletClient<transport, chain, ParseAccount<accountOrAddress>, rpcSchema>Creates a Wallet Client with a given Transport configured for a Chain.
Docs: https://viem.sh/docs/clients/wallet
A Wallet Client is an interface to interact with Ethereum Account(s) and provides the ability to retrieve accounts, execute transactions, sign messages, etc. through Wallet Actions.
The Wallet Client supports signing over:
JSON-RPC Accounts (e.g. Browser Extension Wallets, WalletConnect, etc).
Local Accounts (e.g. private key/mnemonic wallets).
createWalletClient, function custom<provider extends EthereumProvider>(provider: provider, config?: CustomTransportConfig): CustomTransportcustom } from "viem";
import { const sepolia: {
blockExplorers: {
readonly default: {
readonly name: "Etherscan";
readonly url: "https://sepolia.etherscan.io";
readonly apiUrl: "https://api-sepolia.etherscan.io/api";
};
};
... 11 more ...;
serializers?: ChainSerializers<...> | undefined;
}sepolia } from "viem/chains";
const const externalProvider: anyexternalProvider = anywindow.anyethereum; // or any other EIP-1193 provider
const const walletClient: {
account: undefined;
batch?: {
multicall?: boolean | Prettify<MulticallBatchOptions> | undefined;
} | undefined;
... 33 more ...;
extend: <const client extends {
...;
} & ExactPartial<...>>(fn: (client: Client<...>) => client) => Client<...>;
}walletClient = createWalletClient<CustomTransport, {
blockExplorers: {
readonly default: {
readonly name: "Etherscan";
readonly url: "https://sepolia.etherscan.io";
readonly apiUrl: "https://api-sepolia.etherscan.io/api";
};
};
... 11 more ...;
serializers?: ChainSerializers<...> | undefined;
}, undefined, undefined>(parameters: {
...;
}): {
...;
}Creates a Wallet Client with a given Transport configured for a Chain.
Docs: https://viem.sh/docs/clients/wallet
A Wallet Client is an interface to interact with Ethereum Account(s) and provides the ability to retrieve accounts, execute transactions, sign messages, etc. through Wallet Actions.
The Wallet Client supports signing over:
JSON-RPC Accounts (e.g. Browser Extension Wallets, WalletConnect, etc).
Local Accounts (e.g. private key/mnemonic wallets).
createWalletClient({
chain?: Chain | {
blockExplorers: {
readonly default: {
readonly name: "Etherscan";
readonly url: "https://sepolia.etherscan.io";
readonly apiUrl: "https://api-sepolia.etherscan.io/api";
};
};
... 11 more ...;
serializers?: ChainSerializers<...> | undefined;
} | undefinedChain for the client.
chain: const sepolia: {
blockExplorers: {
readonly default: {
readonly name: "Etherscan";
readonly url: "https://sepolia.etherscan.io";
readonly apiUrl: "https://api-sepolia.etherscan.io/api";
};
};
... 11 more ...;
serializers?: ChainSerializers<...> | undefined;
}sepolia, // can provide a different chain here
transport: CustomTransportThe RPC transport
transport: custom<any>(provider: any, config?: CustomTransportConfig): CustomTransportcustom(const externalProvider: anyexternalProvider),
});
export const const signer: SmartAccountSigner<any>signer: interface SmartAccountSigner<Inner = any>A signer that can sign messages and typed data.
SmartAccountSigner = new new WalletClientSigner(client: WalletClient, signerType: string): WalletClientSignerInitializes a signer with a given wallet client and signer type.
WalletClientSigner(
const walletClient: {
account: undefined;
batch?: {
multicall?: boolean | Prettify<MulticallBatchOptions> | undefined;
} | undefined;
... 33 more ...;
extend: <const client extends {
...;
} & ExactPartial<...>>(fn: (client: Client<...>) => client) => Client<...>;
}walletClient,
"json-rpc", // signerType
);