{"version":3,"sources":["../src/evm/account.ts","../src/evm/client.ts"],"names":["ERC1155_ABI_TRANSFER_FROM","KeybanEvmAccount","KeybanAccount","#publicClient","#walletClient","rpcClient","publicClient","walletClient","message","to","value","txOptions","isAddress","SdkError","err","maxFeePerGas","maxPriorityFeePerGas","gasCost","params","contractAddress","getContract","erc20Abi","InsufficientFundsError","EstimateGasExecutionError","tokenId","standard","#transferERC1155","#transferERC721","erc721Contract","erc721Abi","from","erc1155Contract","#estimateERC1155Transfer","#estimateERC721Transfer","KeybanEvmClient","KeybanClientBase","#viem","config","metadataConfig","transport","http","chain","createPublicClient","clientShare","publicKey","account","toAccount","publicKeyToAddress","hash","hashMessage","transaction","options","serializer","serializeTransaction","signableTransaction","signature","keccak256","parseSignature","typedDataDefinition","hashTypedData","createWalletClient"],"mappings":"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","file":"evm-SFTA44SI.mjs","sourcesContent":["import {\n  type Chain,\n  type ContractFunctionExecutionErrorType,\n  erc20Abi,\n  erc721Abi,\n  EstimateGasExecutionError,\n  getContract,\n  InsufficientFundsError,\n  isAddress,\n  type LocalAccount,\n  type PublicClient,\n  type Transport,\n  type WalletClient,\n} from \"viem\";\n\nimport { SdkError } from \"~/errors\";\nimport {\n  type Address,\n  EstimateERC20TransferParams,\n  EstimateNftTransferParams,\n  FeesEstimation,\n  type Hash,\n  type Hex,\n  KeybanAccount,\n  TransactionOptions,\n  TransferERC20Params,\n  TransferNftParams,\n} from \"~/index\";\nimport { RpcClient } from \"~/rpc\";\n\nconst ERC1155_ABI_TRANSFER_FROM = [\n  {\n    type: \"function\",\n    name: \"safeTransferFrom\",\n    inputs: [\n      { name: \"from\", type: \"address\", internalType: \"address\" },\n      { name: \"to\", type: \"address\", internalType: \"address\" },\n      { name: \"id\", type: \"uint256\", internalType: \"uint256\" },\n      { name: \"value\", type: \"uint256\", internalType: \"uint256\" },\n      { name: \"data\", type: \"bytes\", internalType: \"bytes\" },\n    ],\n    outputs: [],\n    stateMutability: \"nonpayable\",\n  },\n];\n\nexport class KeybanEvmAccount extends KeybanAccount {\n  #publicClient: PublicClient<Transport, Chain>;\n  #walletClient: WalletClient<Transport, Chain, LocalAccount>;\n\n  constructor(\n    rpcClient: RpcClient,\n    publicClient: PublicClient<Transport, Chain>,\n    walletClient: WalletClient<Transport, Chain, LocalAccount>,\n  ) {\n    super(rpcClient);\n\n    this.#publicClient = publicClient;\n    this.#walletClient = walletClient;\n  }\n\n  get address(): Address {\n    return this.#walletClient.account.address.toLowerCase() as Address;\n  }\n\n  get publicKey(): Hex {\n    return this.#walletClient.account.publicKey.toLowerCase() as Hex;\n  }\n\n  async signMessage(message: string): Promise<Hex> {\n    // For now, even EDDSA messages are prefixed with the Ethereum message prefix.\n    // This may need to be updated when the eddsa signer is associated with a specific chain (e.g., Solana).\n    return this.#walletClient.signMessage({ message });\n  }\n\n  async transfer(\n    to: Address,\n    value: bigint,\n    txOptions?: TransactionOptions,\n  ): Promise<Hash> {\n    if (!isAddress(to)) {\n      throw new SdkError(\n        SdkError.types.AddressInvalid,\n        \"KeybanAccount.transfer\",\n      );\n    }\n\n    if (value <= 0n) {\n      throw new SdkError(\n        SdkError.types.AmountInvalid,\n        \"KeybanAccount.transfer\",\n      );\n    }\n\n    return this.#walletClient\n      .sendTransaction({\n        to,\n        value,\n        type: \"eip1559\",\n        maxFeePerGas: txOptions?.maxFeePerGas,\n        maxPriorityFeePerGas: txOptions?.maxPriorityFeePerGas,\n      })\n      .catch((err) => {\n        throw err.cause;\n      });\n  }\n\n  async estimateTransfer(to: Address): Promise<FeesEstimation> {\n    const [{ maxFeePerGas, maxPriorityFeePerGas }, gasCost] = await Promise.all(\n      [\n        this.#publicClient.estimateFeesPerGas({ type: \"eip1559\" }),\n        this.#publicClient.estimateGas({\n          to: to as `0x${string}`,\n          account: this.address as `0x${string}`,\n        }),\n      ],\n    );\n\n    return {\n      maxFees: maxFeePerGas * gasCost,\n      details: {\n        maxFeePerGas,\n        maxPriorityFeePerGas,\n        gasCost,\n      },\n    };\n  }\n\n  async transferERC20(params: TransferERC20Params): Promise<Hash> {\n    const { contractAddress, to, value, txOptions } = params;\n\n    if (!isAddress(to)) {\n      throw new SdkError(\n        SdkError.types.AddressInvalid,\n        \"KeybanAccount.transferERC20\",\n      );\n    }\n    if (!isAddress(contractAddress)) {\n      throw new SdkError(\n        SdkError.types.AddressInvalid,\n        \"KeybanAccount.transferERC20\",\n      );\n    }\n    if (to === this.address) {\n      throw new SdkError(\n        SdkError.types.RecipientAddressEqualsSender,\n        \"KeybanAccount.transferERC20\",\n      );\n    }\n\n    if (value <= 0n) {\n      throw new SdkError(\n        SdkError.types.AmountInvalid,\n        \"KeybanAccount.transferERC20\",\n      );\n    }\n\n    const erc20Contract = getContract({\n      address: contractAddress,\n      abi: erc20Abi,\n      client: {\n        public: this.#publicClient,\n        wallet: this.#walletClient,\n      },\n    });\n\n    return erc20Contract.write\n      .transfer([to, value], txOptions)\n      .catch((err: ContractFunctionExecutionErrorType) => {\n        switch (true) {\n          case err.cause.cause instanceof InsufficientFundsError:\n          case err.cause.cause instanceof EstimateGasExecutionError:\n            throw new SdkError(\n              SdkError.types.InsufficientFunds,\n              \"KeybanAccount.transferERC20\",\n            );\n\n          default:\n            throw err.cause;\n        }\n      });\n  }\n\n  async estimateERC20Transfer(\n    params: EstimateERC20TransferParams,\n  ): Promise<FeesEstimation> {\n    const { contractAddress, to, value } = params;\n    const [{ maxFeePerGas, maxPriorityFeePerGas }, gasCost] = await Promise.all(\n      [\n        this.#publicClient.estimateFeesPerGas({ type: \"eip1559\" }),\n        this.#publicClient.estimateContractGas({\n          address: contractAddress as `0x${string}`,\n          abi: erc20Abi,\n          functionName: \"transfer\",\n          args: [to as `0x${string}`, value],\n          account: this.address as `0x${string}`,\n        }),\n      ],\n    );\n\n    return {\n      maxFees: maxFeePerGas * gasCost,\n      details: {\n        maxFeePerGas,\n        maxPriorityFeePerGas,\n        gasCost,\n      },\n    };\n  }\n\n  async transferNft(params: TransferNftParams): Promise<Hash> {\n    const { contractAddress, tokenId, to, value, standard, txOptions } = params;\n\n    if (!isAddress(to)) {\n      throw new SdkError(\n        SdkError.types.AddressInvalid,\n        \"KeybanAccount.transferNft\",\n      );\n    }\n    if (!isAddress(contractAddress)) {\n      throw new SdkError(\n        SdkError.types.AddressInvalid,\n        \"KeybanAccount.transferNft\",\n      );\n    }\n    if (to === this.address) {\n      throw new SdkError(\n        SdkError.types.RecipientAddressEqualsSender,\n        \"KeybanAccount.transferNft\",\n      );\n    }\n\n    if (standard === \"ERC1155\") {\n      if (value === undefined) {\n        throw new SdkError(\n          SdkError.types.AmountRequired,\n          \"KeybanAccount.transferNft\",\n        );\n      }\n      if (value <= 0n) {\n        throw new SdkError(\n          SdkError.types.AmountInvalid,\n          \"KeybanAccount.transferNft\",\n        );\n      }\n      return this.#transferERC1155({\n        contractAddress,\n        tokenId,\n        value,\n        to,\n        txOptions,\n      });\n    }\n\n    if (standard === \"ERC721\") {\n      if (value !== undefined && value !== 1n) {\n        throw new SdkError(\n          SdkError.types.AmountIrrelevant,\n          \"KeybanAccount.transferNft\",\n        );\n      }\n      return this.#transferERC721({ contractAddress, tokenId, to, txOptions });\n    }\n\n    throw new SdkError(\n      SdkError.types.InvalidNftStandard,\n      \"KeybanAccount.transferNft\",\n    );\n  }\n\n  async #transferERC721({\n    contractAddress,\n    tokenId,\n    to,\n    txOptions,\n  }: Omit<TransferNftParams, \"value\" | \"standard\">): Promise<Hash> {\n    const erc721Contract = getContract({\n      address: contractAddress as `0x${string}`,\n      abi: erc721Abi,\n      client: {\n        public: this.#publicClient,\n        wallet: this.#walletClient,\n      },\n    });\n\n    const from = this.address;\n    return erc721Contract.write\n      .transferFrom(\n        [from as `0x${string}`, to as `0x${string}`, tokenId],\n        txOptions,\n      )\n      .catch((err: ContractFunctionExecutionErrorType) => {\n        switch (true) {\n          case err.cause.cause instanceof InsufficientFundsError:\n          case err.cause.cause instanceof EstimateGasExecutionError:\n            throw new SdkError(\n              SdkError.types.InsufficientFunds,\n              \"KeybanAccount.transferNft\",\n            );\n\n          default:\n            throw err.cause;\n        }\n      });\n  }\n\n  async #transferERC1155({\n    contractAddress,\n    tokenId,\n    value,\n    to,\n    txOptions,\n  }: Omit<TransferNftParams, \"standard\">): Promise<Hash> {\n    const erc1155Contract = getContract({\n      address: contractAddress as `0x${string}`,\n      abi: ERC1155_ABI_TRANSFER_FROM,\n      client: {\n        public: this.#publicClient,\n        wallet: this.#walletClient,\n      },\n    });\n\n    const from = this.address;\n    return erc1155Contract.write\n      .safeTransferFrom([from, to, tokenId, value, \"\"], txOptions)\n      .catch((err: ContractFunctionExecutionErrorType) => {\n        switch (true) {\n          case err.cause.cause instanceof InsufficientFundsError:\n          case err.cause.cause instanceof EstimateGasExecutionError:\n            throw new SdkError(\n              SdkError.types.InsufficientFunds,\n              \"KeybanAccount.transferNft\",\n            );\n\n          default:\n            throw err.cause;\n        }\n      });\n  }\n\n  async estimateNftTransfer(\n    params: EstimateNftTransferParams,\n  ): Promise<FeesEstimation> {\n    const { standard, contractAddress, tokenId, to, value } = params;\n\n    if (standard === \"ERC1155\") {\n      return this.#estimateERC1155Transfer({\n        contractAddress,\n        tokenId,\n        to,\n        value,\n      });\n    }\n    if (standard === \"ERC721\") {\n      if (value !== undefined && value !== 1n) {\n        throw new SdkError(\n          SdkError.types.AmountIrrelevant,\n          \"KeybanAccount.transferNft\",\n        );\n      }\n      return this.#estimateERC721Transfer({ contractAddress, tokenId, to });\n    }\n    throw new SdkError(\n      SdkError.types.InvalidNftStandard,\n      \"KeybanAccount.estimateNftTransfer\",\n    );\n  }\n\n  async #estimateERC721Transfer({\n    contractAddress,\n    tokenId,\n    to,\n  }: Omit<\n    EstimateNftTransferParams,\n    \"standard\" | \"value\"\n  >): Promise<FeesEstimation> {\n    const from = this.address;\n    const [{ maxFeePerGas, maxPriorityFeePerGas }, gasCost] = await Promise.all(\n      [\n        this.#publicClient.estimateFeesPerGas({ type: \"eip1559\" }),\n        this.#publicClient.estimateContractGas({\n          address: contractAddress as `0x${string}`,\n          abi: erc721Abi,\n          functionName: \"transferFrom\",\n          args: [from as `0x${string}`, to as `0x${string}`, tokenId],\n          account: this.address as `0x${string}`,\n        }),\n      ],\n    );\n\n    return {\n      maxFees: maxFeePerGas * gasCost,\n      details: {\n        maxFeePerGas,\n        maxPriorityFeePerGas,\n        gasCost,\n      },\n    };\n  }\n\n  async #estimateERC1155Transfer({\n    contractAddress,\n    tokenId,\n    to,\n    value,\n  }: Omit<EstimateNftTransferParams, \"standard\">): Promise<FeesEstimation> {\n    const from = this.address;\n    const [{ maxFeePerGas, maxPriorityFeePerGas }, gasCost] = await Promise.all(\n      [\n        this.#publicClient.estimateFeesPerGas({ type: \"eip1559\" }),\n        this.#publicClient.estimateContractGas({\n          address: contractAddress as `0x${string}`,\n          abi: ERC1155_ABI_TRANSFER_FROM,\n          functionName: \"safeTransferFrom\",\n          args: [from, to, tokenId, value, \"\"],\n          account: this.address as `0x${string}`,\n        }),\n      ],\n    );\n\n    return {\n      maxFees: maxFeePerGas * gasCost,\n      details: {\n        maxFeePerGas,\n        maxPriorityFeePerGas,\n        gasCost,\n      },\n    };\n  }\n}\n","import type { Chain, PublicClient, Transport } from \"viem\";\nimport {\n  createPublicClient,\n  createWalletClient,\n  hashMessage,\n  hashTypedData,\n  http,\n  keccak256,\n  parseSignature,\n  serializeTransaction,\n} from \"viem\";\nimport { publicKeyToAddress, toAccount } from \"viem/accounts\";\nimport * as chains from \"viem/chains\";\n\nimport { KeybanClientBase, KeybanClientConfig, MetadataConfig } from \"~/client\";\nimport { KeybanEvmAccount } from \"~/evm/account\";\nimport { KeybanNetwork } from \"~/network\";\n\nexport class KeybanEvmClient extends KeybanClientBase {\n  #viem: {\n    chain: Chain;\n    transport: Promise<Transport>;\n    publicClient: Promise<PublicClient<Transport, Chain>>;\n  };\n\n  constructor(\n    config: KeybanClientConfig,\n    metadataConfig?: Promise<MetadataConfig>,\n  ) {\n    super(config, metadataConfig);\n\n    const transport = this.metadataConfig.then((config) =>\n      http(config.network.rpcUrl),\n    );\n\n    const chain = {\n      [KeybanNetwork.EthereumAnvil]: chains.anvil,\n      [KeybanNetwork.PolygonAmoy]: chains.polygonAmoy,\n      [KeybanNetwork.StarknetDevnet]: null,\n      [KeybanNetwork.StarknetSepolia]: null,\n      [KeybanNetwork.StarknetMainnet]: null,\n      [KeybanNetwork.StellarQuickstart]: null,\n      [KeybanNetwork.StellarTestnet]: null,\n      [KeybanNetwork.StellarMainnet]: null,\n    }[this.network]!;\n\n    const publicClient = transport.then((transport) =>\n      createPublicClient({ chain, transport }),\n    );\n\n    this.#viem = { chain, transport, publicClient };\n  }\n\n  async initialize(): Promise<KeybanEvmAccount> {\n    let clientShare = await this.clientShareProvider.get(\"ecdsa\");\n    if (!clientShare) {\n      clientShare = await this.rpcClient.call(\"ecdsa\", \"dkg\");\n      await this.clientShareProvider.set(\"ecdsa\", clientShare);\n    }\n\n    const publicKey = await this.rpcClient.call(\n      \"ecdsa\",\n      \"publicKey\",\n      clientShare,\n    );\n\n    const account = toAccount({\n      address: publicKeyToAddress(publicKey),\n      signMessage: async ({ message }) => {\n        const hash = hashMessage(message, \"hex\");\n        return this.rpcClient.call(\"ecdsa\", \"sign\", clientShare, hash);\n      },\n      signTransaction: async (transaction, options) => {\n        const serializer = options?.serializer ?? serializeTransaction;\n\n        // For EIP-4844 Transactions, we want to sign the transaction payload body (tx_payload_body) without the sidecars (i.e., without the network wrapper).\n        // See: https://github.com/ethereum/EIPs/blob/e00f4daa66bd56e2dbd5f1d36d09fd613811a48b/EIPS/eip-4844.md#networking\n        const signableTransaction =\n          transaction.type === \"eip4844\"\n            ? { ...transaction, sidecars: false }\n            : transaction;\n\n        const signature = await this.rpcClient\n          .call(\n            \"ecdsa\",\n            \"sign\",\n            clientShare,\n            keccak256(serializer(signableTransaction)),\n          )\n          .then(parseSignature);\n\n        return serializer(transaction, signature);\n      },\n      signTypedData: async (typedDataDefinition) => {\n        const hash = hashTypedData(typedDataDefinition);\n        return this.rpcClient.call(\"ecdsa\", \"sign\", clientShare, hash);\n      },\n    });\n\n    // Assign the public key to the account\n    account.publicKey = publicKey;\n\n    const publicClient = await this.#viem.publicClient;\n    const walletClient = createWalletClient({\n      chain: publicClient.chain,\n      transport: await this.#viem.transport,\n      account,\n    });\n\n    return new KeybanEvmAccount(this.rpcClient, publicClient, walletClient);\n  }\n}\n"]}