@avalanche-sdk/client
Version:
A TypeScript SDK for interacting with the Avalanche network through JSON-RPC APIs. This SDK provides a comprehensive set of tools to interact with all Avalanche chains (P-Chain, X-Chain, C-Chain) and various APIs, including wallet functionality for transa
170 lines (158 loc) • 4.83 kB
text/typescript
import {
Account,
Chain,
Client,
CreatePublicClientErrorType,
Prettify,
rpcSchema,
RpcSchema,
Transport,
walletActions,
WalletActions,
WalletRpcSchema,
} from "viem";
import { XPAccount } from "../accounts/avalancheAccount.js";
import { AvalancheWalletRpcSchema } from "../methods/wallet/avalancheWalletRPCSchema.js";
import { AvalancheCoreClient } from "./createAvalancheCoreClient.js";
import {
AvalancheWalletCoreClient,
AvalancheWalletCoreClientConfig,
createAvalancheWalletCoreClient,
} from "./createAvalancheWalletCoreClient.js";
import {
avalancheWalletActions,
AvalancheWalletActions,
} from "./decorators/avalancheWallet.js";
import {
cChainWalletActions,
CChainWalletActions,
} from "./decorators/cChainWallet.js";
import { Erc20Actions, erc20Actions } from "./decorators/erc20.js";
import {
pChainWalletActions,
PChainWalletActions,
} from "./decorators/pChainWallet.js";
import {
xChainWalletActions,
XChainWalletActions,
} from "./decorators/xChainWallet.js";
export type AvalancheWalletClientConfig<
transport extends Transport = Transport,
chain extends Chain | undefined = Chain | undefined,
account extends Account | undefined = undefined,
rpcSchema extends RpcSchema | undefined = undefined,
raw extends boolean = false
> = Prettify<
AvalancheWalletCoreClientConfig<transport, chain, account, rpcSchema, raw>
>;
export type AvalancheWalletClient<
transport extends Transport = Transport,
chain extends Chain | undefined = Chain | undefined,
account extends Account | undefined = undefined,
rpcSchema extends RpcSchema | undefined = undefined
> = Prettify<
Client<
transport,
chain,
account,
rpcSchema extends RpcSchema
? [...WalletRpcSchema, ...AvalancheWalletRpcSchema, ...rpcSchema]
: [...WalletRpcSchema, ...AvalancheWalletRpcSchema],
WalletActions<chain, account> & AvalancheWalletActions
> & {
xpAccount?: XPAccount;
pChainClient: AvalancheCoreClient;
cChainClient: AvalancheCoreClient;
xChainClient: AvalancheCoreClient;
} & {
erc20: AvalancheWalletCoreClient<
transport,
chain,
account,
rpcSchema,
Erc20Actions
>;
cChain: AvalancheWalletCoreClient<
transport,
chain,
account,
rpcSchema,
CChainWalletActions
>;
pChain: AvalancheWalletCoreClient<
transport,
chain,
account,
rpcSchema,
PChainWalletActions
>;
xChain: AvalancheWalletCoreClient<
transport,
chain,
account,
rpcSchema,
XChainWalletActions
>;
}
>;
export type CreateAvalancheWalletClientErrorType = CreatePublicClientErrorType;
/**
* Creates an Avalanche Wallet Client with a given transport configured for a Chain.
*
* The Avalanche Wallet Client is an interface to interact with the Core Wallet API through Avalanche-specific JSON-RPC API methods.
* @see https://docs.core.app/docs/reference/json-rpc-api
*
* @param parameters - {@link AvalancheWalletClientConfig}
* @returns A Avalanche Wallet Client. {@link AvalancheWalletClient}
*
* @example
* ```ts
* import { createAvalancheWalletClient } from '@avalanche-sdk/client'
* import { avalanche } from '@avalanche-sdk/client/chains'
*
* const client = createAvalancheWalletClient({
* chain: avalanche,
* transport: { type: "http" },
* })
*
* const pubKey = await client.getAccountPubKey()
* ```
*/
export function createAvalancheWalletClient<
transport extends Transport = Transport,
chain extends Chain | undefined = Chain | undefined,
account extends Account | undefined = undefined,
rpcSchema extends RpcSchema | undefined = undefined
>(
parameters: AvalancheWalletClientConfig<transport, chain, account, rpcSchema>
): AvalancheWalletClient<transport, chain, account, rpcSchema> {
const { key = "avalancheWallet", name = "Avalanche Wallet Client" } =
parameters;
const client = createAvalancheWalletCoreClient({
...parameters,
key,
name,
type: "avalancheWalletClient",
rpcSchema: rpcSchema<AvalancheWalletRpcSchema & WalletRpcSchema>(),
});
const avalancheWalletClient = client
.extend(walletActions)
.extend(avalancheWalletActions as any);
const erc20Client = client.extend(walletActions).extend(erc20Actions as any);
const cChainClient = client
.extend(walletActions)
.extend(cChainWalletActions as any);
const pChainClient = client
.extend(walletActions)
.extend(pChainWalletActions as any);
const xChainClient = client
.extend(walletActions)
.extend(xChainWalletActions as any);
return {
...(avalancheWalletClient as any),
erc20: erc20Client,
cChain: cChainClient,
pChain: pChainClient,
xChain: xChainClient,
} as AvalancheWalletClient<transport, chain, account, rpcSchema>;
}