UNPKG

@account-kit/infra

Version:

adapters for @aa-sdk/core for interacting with alchemy services

242 lines (232 loc) 6.66 kB
import { encodeFunctionData, type Address, type Chain, type Hex } from "viem"; import { arbitrum, arbitrumSepolia, base, baseSepolia, fraxtal, fraxtalSepolia, mainnet, optimism, optimismSepolia, polygon, polygonAmoy, unichainSepolia, worldChainSepolia, sepolia, zora, zoraSepolia, shapeSepolia, optimismGoerli, arbitrumGoerli, arbitrumNova, baseGoerli, beraChainBartio, celoMainnet, gensynTestnet, goerli, inkMainnet, inkSepolia, monadTestnet, opbnbMainnet, opbnbTestnet, openlootSepolia, polygonMumbai, riseTestnet, shape, soneiumMainnet, soneiumMinato, storyAeneid, storyMainnet, teaSepolia, unichainMainnet, worldChain, } from "./chains.js"; import type { EntryPointVersion } from "@aa-sdk/core"; export const AlchemyPaymasterAddressV06Unify = "0x0000000000ce04e2359130e7d0204A5249958921"; export const AlchemyPaymasterAddressV07Unify = "0x00000000000667F27D4DB42334ec11a25db7EBb4"; export const AlchemyPaymasterAddressV4 = "0xEaf0Cde110a5d503f2dD69B3a49E031e29b3F9D2"; export const AlchemyPaymasterAddressV3 = "0x4f84a207A80c39E9e8BaE717c1F25bA7AD1fB08F"; export const AlchemyPaymasterAddressV2 = "0x4Fd9098af9ddcB41DA48A1d78F91F1398965addc"; export const ArbSepoliaPaymasterAddress = "0x0804Afe6EEFb73ce7F93CD0d5e7079a5a8068592"; export const AlchemyPaymasterAddressV1 = "0xc03aac639bb21233e0139381970328db8bceeb67"; export const AlchemyPaymasterAddressV07V2 = "0x2cc0c7981D846b9F2a16276556f6e8cb52BfB633"; export const AlchemyPaymasterAddressV07V1 = "0xEF725Aa22d43Ea69FB22bE2EBe6ECa205a6BCf5B"; /** * Retrieves the Alchemy paymaster address for the given chain. Returns different addresses based on the chain ID. * * @example * ```ts * import { sepolia, getAlchemyPaymasterAddress } from "@account-kit/infra"; * * const paymasterAddress = getAlchemyPaymasterAddress(sepolia, "0.6.0"); * ``` * * @param {Chain} chain The chain for which the paymaster address is required * @param {EntryPointVersion} version The version of the entry point * @returns {Address} The Alchemy paymaster address corresponding to the specified chain */ export const getAlchemyPaymasterAddress = ( chain: Chain, version: EntryPointVersion, ): Address => { switch (version) { case "0.6.0": switch (chain.id) { case fraxtalSepolia.id: case worldChainSepolia.id: case shapeSepolia.id: case unichainSepolia.id: case opbnbTestnet.id: case inkSepolia.id: case monadTestnet.id: case openlootSepolia.id: case gensynTestnet.id: case riseTestnet.id: case storyAeneid.id: case teaSepolia.id: case arbitrumGoerli.id: case goerli.id: case optimismGoerli.id: case baseGoerli.id: case polygonMumbai.id: case worldChain.id: case shape.id: case unichainMainnet.id: case soneiumMinato.id: case soneiumMainnet.id: case opbnbMainnet.id: case beraChainBartio.id: case inkMainnet.id: case arbitrumNova.id: case storyMainnet.id: case celoMainnet.id: return AlchemyPaymasterAddressV4; case polygonAmoy.id: case optimismSepolia.id: case baseSepolia.id: case zora.id: case zoraSepolia.id: case fraxtal.id: return AlchemyPaymasterAddressV3; case mainnet.id: case arbitrum.id: case optimism.id: case polygon.id: case base.id: return AlchemyPaymasterAddressV2; case arbitrumSepolia.id: return ArbSepoliaPaymasterAddress; case sepolia.id: return AlchemyPaymasterAddressV1; default: return AlchemyPaymasterAddressV06Unify; } case "0.7.0": switch (chain.id) { case arbitrumNova.id: case celoMainnet.id: case gensynTestnet.id: case inkMainnet.id: case inkSepolia.id: case monadTestnet.id: case opbnbMainnet.id: case opbnbTestnet.id: case openlootSepolia.id: case riseTestnet.id: case shape.id: case shapeSepolia.id: case soneiumMainnet.id: case soneiumMinato.id: case storyAeneid.id: case storyMainnet.id: case teaSepolia.id: case unichainMainnet.id: case unichainSepolia.id: case worldChain.id: case worldChainSepolia.id: return AlchemyPaymasterAddressV07V1; case arbitrum.id: case arbitrumGoerli.id: case arbitrumSepolia.id: case base.id: case baseGoerli.id: case baseSepolia.id: case beraChainBartio.id: case fraxtal.id: case fraxtalSepolia.id: case goerli.id: case mainnet.id: case optimism.id: case optimismGoerli.id: case optimismSepolia.id: case polygon.id: case polygonAmoy.id: case polygonMumbai.id: case sepolia.id: case zora.id: case zoraSepolia.id: return AlchemyPaymasterAddressV07V2; default: return AlchemyPaymasterAddressV07Unify; } default: throw new Error(`Unsupported EntryPointVersion: ${version}`); } }; export const PermitTypes = { EIP712Domain: [ { name: "name", type: "string" }, { name: "version", type: "string" }, { name: "chainId", type: "uint256" }, { name: "verifyingContract", type: "address" }, ], Permit: [ { name: "owner", type: "address" }, { name: "spender", type: "address" }, { name: "value", type: "uint256" }, { name: "nonce", type: "uint256" }, { name: "deadline", type: "uint256" }, ], } as const; export const ERC20Abis = [ "function decimals() public view returns (uint8)", "function balanceOf(address owner) external view returns (uint256)", "function allowance(address owner, address spender) external view returns (uint256)", "function approve(address spender, uint256 amount) external returns (bool)", ] as const; export const EIP7597Abis = [ "function nonces(address owner) external view returns (uint)", ] as const; export const approveTokenCallData = ( paymasterAddress: Address, allowance: BigInt, ) => { return encodeFunctionData({ abi: ERC20Abis, functionName: "approve", args: [paymasterAddress, allowance], }); }; export type PermitMessage = { owner: Hex; spender: Hex; value: bigint; nonce: bigint; deadline: bigint; }; export type PermitDomain = { name: string; version: string; chainId: bigint; verifyingContract: Hex; };