@aave/client 4.0.0-next.47 → 4.0.0-next.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters.ts","../src/viem.ts","../src/privy.ts"],"names":["hasApprovals","plan","supportsPermit","isOneEntryArray","transactionError","chain","txHash","request","baseUrl","link","TransactionError","allChains","viemChains","sendTransaction","privy","walletId","hash","sendTransactionAndWait","extractChain","publicClient","createPublicClient","http","ResultAsync","err","SigningError","waitForTransactionReceipt","UnexpectedError","receipt","errAsync","okAsync","executePlan","result","approval","ValidationError","sendWith","permitWith","action","permitTypedData","signTypedDataWith","signature","permitSig","signTypedData","data","response","typedData","signatureFrom"],"mappings":"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","file":"privy.cjs","sourcesContent":["import type { Erc20Approval, PermitTypedData } from '@aave/graphql';\nimport { isOneEntryArray } from '@aave/types';\n\ntype WithApprovals = { approvals: Erc20Approval[] };\n\nfunction hasApprovals(plan: unknown): plan is WithApprovals {\n return (\n typeof plan === 'object' &&\n plan !== null &&\n 'approvals' in plan &&\n Array.isArray(plan.approvals)\n );\n}\n\n/**\n * Checks if a plan supports permit (single approval with bySignature).\n * Works with union types - picks any member that has an `approvals` array\n * with a single entry containing `bySignature`.\n *\n * @internal\n */\nexport function supportsPermit<T>(plan: T): plan is T &\n Extract<T, WithApprovals> & {\n approvals: [Erc20Approval & { bySignature: PermitTypedData }];\n } {\n return (\n hasApprovals(plan) &&\n isOneEntryArray(plan.approvals) &&\n !!plan.approvals[0].bySignature\n );\n}\n","import {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n Chain,\n ERC20PermitSignature,\n ExecutionPlan,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n chainId,\n errAsync,\n invariant,\n isObject,\n okAsync,\n ResultAsync,\n type Signature,\n signatureFrom,\n type TxHash,\n txHash,\n} from '@aave/types';\nimport {\n type Account,\n defineChain,\n type ProviderRpcError,\n type RpcError,\n SwitchChainError,\n TransactionExecutionError,\n type Transport,\n UserRejectedRequestError,\n type Chain as ViemChain,\n type WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n waitForTransactionReceipt,\n} from 'viem/actions';\nimport { mainnet, sepolia } from 'viem/chains';\nimport type { AaveClient } from './AaveClient';\nimport { chain as fetchChain } from './actions';\nimport { supportsPermit } from './adapters';\nimport type {\n ExecutionPlanHandler,\n SignTypedDataError,\n TransactionResult,\n TypedData,\n TypedDataHandler,\n} from './types';\n\nfunction isRpcError(err: unknown): err is RpcError {\n return isObject(err) && 'code' in err && 'message' in err;\n}\n\nfunction isProviderRpcError(\n err: unknown,\n): err is ProviderRpcError<{ originalError?: { code: number } }> {\n return isObject(err) &&\n 'name' in err &&\n 'message' in err &&\n 'originalError' in err\n ? isRpcError(err.originalError) && 'code' in err.originalError\n : true;\n}\n\nfunction signTypedData(\n walletClient: WalletClient,\n data: TypedData,\n): ResultAsync<Signature, SignTypedDataError> {\n invariant(\n walletClient.account,\n 'Wallet account is required to sign typed data',\n );\n\n return ResultAsync.fromPromise(\n walletClient.signTypedData({\n account: walletClient.account,\n domain: data.domain,\n types: data.types,\n primaryType: data.primaryType,\n message: data.message,\n }),\n (err) => {\n if (err instanceof UserRejectedRequestError) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n ).map(signatureFrom);\n}\n\n/**\n * @internal\n */\nexport function toViemChain(chain: Chain): ViemChain {\n // known chains\n switch (chain.chainId) {\n case chainId(mainnet.id):\n return mainnet;\n\n case chainId(sepolia.id):\n return sepolia;\n }\n\n // most likely a tenderly fork\n return defineChain({\n id: chain.chainId,\n name: chain.name,\n nativeCurrency: {\n name: chain.nativeInfo.name,\n symbol: chain.nativeInfo.symbol,\n decimals: chain.nativeInfo.decimals,\n },\n rpcUrls: { default: { http: [chain.rpcUrl] } },\n blockExplorers: {\n default: {\n name: `${chain.name} Explorer`,\n url: chain.explorerUrl,\n },\n },\n });\n}\n\n/**\n * @internal\n */\nexport function viemChainsFrom(chains: Chain[]): ViemChain[] {\n return chains.map(toViemChain);\n}\n\n/**\n * @internal\n */\nexport function ensureChain(\n aaveClient: AaveClient,\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<void, CancelError | SigningError | UnexpectedError> {\n return ResultAsync.fromPromise(walletClient.getChainId(), (err) =>\n SigningError.from(err),\n ).andThen((chainId) => {\n if (chainId === request.chainId) {\n return okAsync();\n }\n\n return fetchChain(\n aaveClient,\n { chainId: request.chainId },\n { batch: false },\n ).andThen((chain) => {\n invariant(chain, `Chain ${request.chainId} is not supported`);\n\n return ResultAsync.fromPromise(\n walletClient.switchChain({ id: request.chainId }),\n (err) => SigningError.from(err),\n ).orElse((err) => {\n const code = isRpcError(err.cause)\n ? err.cause.code\n : // Unwrapping for MetaMask Mobile\n // https://github.com/MetaMask/metamask-mobile/issues/2944#issuecomment-976988719\n isProviderRpcError(err.cause)\n ? err.cause.data?.originalError?.code\n : undefined;\n\n if (code === SwitchChainError.code) {\n return ResultAsync.fromPromise(\n walletClient.addChain({ chain: toViemChain(chain) }),\n (err) => {\n if (\n isRpcError(err) &&\n err.code === UserRejectedRequestError.code\n ) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n );\n }\n\n return err.asResultAsync();\n });\n });\n });\n}\n\nfunction estimateGas(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<bigint, SigningError> {\n return ResultAsync.fromPromise(\n estimateGasWithViem(walletClient, {\n account: walletClient.account,\n data: request.data,\n to: request.to,\n value: BigInt(request.value),\n }),\n (err) => SigningError.from(err),\n ).map((gas) => (gas * 115n) / 100n); // 15% buffer\n}\n\nfunction sendEip1559Transaction(\n walletClient: WalletClient<Transport, ViemChain, Account>,\n request: TransactionRequest,\n): ResultAsync<TxHash, CancelError | SigningError> {\n return estimateGas(walletClient, request)\n .andThen((gas) =>\n ResultAsync.fromPromise(\n sendTransactionWithViem(walletClient, {\n account: walletClient.account,\n data: request.data,\n to: request.to,\n value: BigInt(request.value),\n chain: walletClient.chain,\n gas,\n }),\n (err) => {\n if (err instanceof TransactionExecutionError) {\n const rejected = err.walk(\n (err) => err instanceof UserRejectedRequestError,\n );\n\n if (rejected) {\n return CancelError.from(rejected);\n }\n }\n return SigningError.from(err);\n },\n ),\n )\n .map(txHash);\n}\n\nfunction isWalletClientWithAccount(\n walletClient: WalletClient,\n): walletClient is WalletClient<Transport, ViemChain, Account> {\n return walletClient.account !== undefined;\n}\n\n/**\n * @internal\n */\nexport function sendTransaction(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<TxHash, CancelError | SigningError> {\n invariant(\n isWalletClientWithAccount(walletClient),\n 'Wallet client with account is required',\n );\n\n return sendEip1559Transaction(walletClient, request);\n}\n\n/**\n * @internal\n */\nexport function transactionError(\n chain: ViemChain | undefined,\n txHash: TxHash,\n request: TransactionRequest,\n): TransactionError {\n const baseUrl = chain?.blockExplorers?.default?.url;\n const link = baseUrl && new URL(`/tx/${txHash}`, baseUrl).toString();\n\n return TransactionError.new({ txHash, request, link });\n}\n\n/**\n * @internal\n */\nexport function waitForTransactionResult(\n walletClient: WalletClient,\n request: TransactionRequest,\n initialTxHash: TxHash,\n): ResultAsync<\n TransactionResult,\n CancelError | TransactionError | UnexpectedError\n> {\n return ResultAsync.fromPromise(\n waitForTransactionReceipt(walletClient, {\n hash: initialTxHash,\n pollingInterval: 100,\n retryCount: 20,\n retryDelay: 50,\n }),\n (err) => UnexpectedError.from(err),\n ).andThen((receipt) => {\n const hash = txHash(receipt.transactionHash);\n\n switch (receipt.status) {\n case 'reverted':\n if (initialTxHash !== hash) {\n return errAsync(CancelError.from(`Transaction replaced by ${hash}`));\n }\n return errAsync(transactionError(walletClient.chain, hash, request));\n case 'success':\n return okAsync({\n // viem's waitForTransactionReceipt supports transaction replacement\n // so it's important to use the transaction hash from the receipt\n txHash: hash,\n operations: request.operations,\n });\n }\n });\n}\n\nfunction sendTransactionAndWait(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<\n TransactionResult,\n CancelError | SigningError | TransactionError | UnexpectedError\n> {\n return sendTransaction(walletClient, request).andThen((hash) =>\n waitForTransactionResult(walletClient, request, hash),\n );\n}\n\nfunction executePlan(\n walletClient: WalletClient,\n result: ExecutionPlan,\n): ReturnType<ExecutionPlanHandler> {\n switch (result.__typename) {\n case 'TransactionRequest':\n return sendTransactionAndWait(walletClient, result);\n\n case 'Erc20ApprovalRequired':\n return result.approvals\n .reduce<ReturnType<typeof sendTransactionAndWait>>(\n (chain, approval) =>\n chain.andThen(() =>\n sendTransactionAndWait(walletClient, approval.byTransaction),\n ),\n okAsync(undefined as never),\n )\n .andThen(() =>\n sendTransactionAndWait(walletClient, result.originalTransaction),\n );\n\n case 'PreContractActionRequired':\n return sendTransactionAndWait(walletClient, result.transaction).andThen(\n () => sendTransactionAndWait(walletClient, result.originalTransaction),\n );\n\n case 'InsufficientBalanceError':\n return errAsync(ValidationError.fromGqlNode(result));\n }\n}\n\n/**\n * Creates an execution plan handler that sends transactions using the provided wallet client.\n */\nexport function sendWith(walletClient: WalletClient): ExecutionPlanHandler;\n/**\n * Sends execution plan transactions using the provided wallet client.\n */\nexport function sendWith<T extends ExecutionPlan = ExecutionPlan>(\n walletClient: WalletClient,\n result: T,\n): ReturnType<ExecutionPlanHandler<T>>;\nexport function sendWith<T extends ExecutionPlan = ExecutionPlan>(\n walletClient: WalletClient,\n result?: T,\n): ExecutionPlanHandler<T> | ReturnType<ExecutionPlanHandler<T>> {\n return result\n ? executePlan(walletClient, result)\n : executePlan.bind(null, walletClient);\n}\n\n/**\n * Creates a function that signs EIP-712 typed data (ERC-20 permits, swap intents, etc.) using the provided wallet client.\n *\n * @param walletClient - The wallet client to use for signing.\n * @returns A function that takes typed data and returns a ResultAsync containing the raw signature.\n *\n * ```ts\n * const result = await prepareSwapCancel(client, request)\n * .andThen(signTypedDataWith(wallet));\n * ```\n */\nexport function signTypedDataWith(walletClient: WalletClient): TypedDataHandler;\n\n/**\n * Signs EIP-712 typed data (ERC-20 permits, swap intents, etc.) using the provided wallet client.\n *\n * @param walletClient - The wallet client to use for signing.\n * @param data - The typed data to sign.\n * @returns A ResultAsync containing the raw signature.\n *\n * ```ts\n * const result = await signTypedDataWith(wallet, typedData);\n * ```\n */\nexport function signTypedDataWith(\n walletClient: WalletClient,\n data: TypedData,\n): ReturnType<TypedDataHandler>;\n\nexport function signTypedDataWith(\n walletClient: WalletClient,\n data?: TypedData,\n): TypedDataHandler | ReturnType<TypedDataHandler> {\n if (data === undefined) {\n return signTypedData.bind(null, walletClient);\n }\n return signTypedData(walletClient, data);\n}\n\n/**\n * Handles ERC20 permit signing for actions that require token approval.\n *\n * Calls the action to get an initial execution plan. If the plan requires ERC20 approval\n * and the token supports permit signatures, signs the permit and re-calls the action\n * with the signature to get a new plan that can be sent directly.\n *\n * ```ts\n * const result = await permitWith(walletClient, (permitSig) =>\n * supply(client, {\n * reserve: reserve.id,\n * amount: { erc20: { value: amount, permitSig } },\n * sender: evmAddress(walletClient.account.address),\n * })\n * )\n * .andThen(sendWith(walletClient))\n * .andThen(client.waitForTransaction);\n * ```\n *\n * @param walletClient - The wallet client to use for signing permits.\n * @param action - A function that returns an execution plan, accepting an optional permit signature.\n * @returns A ResultAsync containing the resolved ExecutionPlan ready to be sent with `sendWith`.\n */\nexport function permitWith<E>(\n walletClient: WalletClient,\n action: (permitSig?: ERC20PermitSignature) => ResultAsync<ExecutionPlan, E>,\n): ResultAsync<ExecutionPlan, E | SignTypedDataError> {\n return action().andThen((result) => {\n if (supportsPermit(result)) {\n const permitTypedData = result.approvals[0].bySignature;\n // Sign and wrap with deadline\n return signTypedDataWith(walletClient, permitTypedData)\n .map((signature) => ({\n deadline: permitTypedData.message.deadline as number,\n value: signature,\n }))\n .andThen((permitSig) => action(permitSig));\n }\n return okAsync(result);\n });\n}\n","import {\n SigningError,\n type TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n ERC20PermitSignature,\n ExecutionPlan,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n errAsync,\n okAsync,\n ResultAsync,\n signatureFrom,\n type TxHash,\n txHash,\n} from '@aave/types';\nimport type { PrivyClient } from '@privy-io/server-auth';\nimport { createPublicClient, extractChain, http } from 'viem';\nimport { waitForTransactionReceipt } from 'viem/actions';\nimport * as viemChains from 'viem/chains';\nimport { supportsPermit } from './adapters';\nimport type {\n ExecutionPlanHandler,\n SignTypedDataError,\n TransactionResult,\n TypedData,\n TypedDataHandler,\n} from './types';\nimport { transactionError } from './viem';\n\nconst allChains = Object.values(viemChains);\n\nasync function sendTransaction(\n privy: PrivyClient,\n request: TransactionRequest,\n walletId: string,\n): Promise<TxHash> {\n const { hash } = await privy.walletApi.ethereum.sendTransaction({\n walletId,\n caip2: `eip155:${request.chainId}`,\n transaction: {\n from: request.from,\n to: request.to,\n value: `0x${BigInt(request.value).toString(16)}`,\n chainId: request.chainId,\n data: request.data,\n },\n });\n return txHash(hash);\n}\n\nfunction sendTransactionAndWait(\n privy: PrivyClient,\n request: TransactionRequest,\n walletId: string,\n): ResultAsync<\n TransactionResult,\n SigningError | TransactionError | UnexpectedError\n> {\n const chain = extractChain({\n chains: allChains,\n id: request.chainId as (typeof allChains)[number]['id'],\n });\n\n const publicClient = createPublicClient({\n chain,\n transport: http(),\n });\n\n return ResultAsync.fromPromise(\n sendTransaction(privy, request, walletId),\n (err) => SigningError.from(err),\n )\n .andThen((hash) =>\n ResultAsync.fromPromise(\n waitForTransactionReceipt(publicClient, {\n hash,\n pollingInterval: 100,\n retryCount: 20,\n retryDelay: 50,\n }),\n (err) => UnexpectedError.from(err),\n ),\n )\n .andThen((receipt) => {\n const hash = txHash(receipt.transactionHash);\n\n if (receipt.status === 'reverted') {\n return errAsync(transactionError(chain, hash, request));\n }\n return okAsync({\n txHash: hash,\n operations: request.operations,\n });\n });\n}\n\nfunction executePlan(\n privy: PrivyClient,\n walletId: string,\n result: ExecutionPlan,\n): ReturnType<ExecutionPlanHandler> {\n switch (result.__typename) {\n case 'TransactionRequest':\n return sendTransactionAndWait(privy, result, walletId);\n\n case 'Erc20ApprovalRequired':\n return result.approvals\n .reduce<ReturnType<typeof sendTransactionAndWait>>(\n (chain, approval) =>\n chain.andThen(() =>\n sendTransactionAndWait(privy, approval.byTransaction, walletId),\n ),\n okAsync(undefined as never),\n )\n .andThen(() =>\n sendTransactionAndWait(privy, result.originalTransaction, walletId),\n );\n\n case 'PreContractActionRequired':\n return sendTransactionAndWait(\n privy,\n result.transaction,\n walletId,\n ).andThen(() =>\n sendTransactionAndWait(privy, result.originalTransaction, walletId),\n );\n\n case 'InsufficientBalanceError':\n return errAsync(ValidationError.fromGqlNode(result));\n }\n}\n\n/**\n * Creates an execution plan handler that sends transactions using the specified Privy wallet.\n */\nexport function sendWith<T extends ExecutionPlan = ExecutionPlan>(\n privy: PrivyClient,\n walletId: string,\n): ExecutionPlanHandler<T>;\n/**\n * Sends execution plan transactions using the specified Privy wallet.\n */\nexport function sendWith<T extends ExecutionPlan = ExecutionPlan>(\n privy: PrivyClient,\n walletId: string,\n result: T,\n): ReturnType<ExecutionPlanHandler<T>>;\nexport function sendWith<T extends ExecutionPlan = ExecutionPlan>(\n privy: PrivyClient,\n walletId: string,\n result?: T,\n): ExecutionPlanHandler<T> | ReturnType<ExecutionPlanHandler<T>> {\n return result\n ? executePlan(privy, walletId, result)\n : executePlan.bind(null, privy, walletId);\n}\n\n/**\n * Handles ERC20 permit signing for actions that require token approval.\n *\n * Calls the action to get an initial execution plan. If the plan requires ERC20 approval\n * and the token supports permit signatures, signs the permit and re-calls the action\n * with the signature to get a new plan that can be sent directly.\n *\n * ```ts\n * const result = await permitWith(privy, walletId, (permitSig) =>\n * supply(client, {\n * reserve: reserve.id,\n * amount: { erc20: { value: amount, permitSig } },\n * sender: evmAddress(walletAddress),\n * })\n * )\n * .andThen(sendWith(privy, walletId))\n * .andThen(client.waitForTransaction);\n * ```\n *\n * @param privy - The Privy client for signing permits.\n * @param walletId - The ID of the Privy wallet to use.\n * @param action - A function that returns an execution plan, accepting an optional permit signature.\n * @returns A ResultAsync containing the resolved ExecutionPlan ready to be sent with `sendWith`.\n */\nexport function permitWith<E>(\n privy: PrivyClient,\n walletId: string,\n action: (permitSig?: ERC20PermitSignature) => ResultAsync<ExecutionPlan, E>,\n): ResultAsync<ExecutionPlan, E | SignTypedDataError> {\n return action().andThen((result) => {\n if (supportsPermit(result)) {\n const permitTypedData = result.approvals[0].bySignature;\n return signTypedDataWith(privy, walletId, permitTypedData)\n .map((signature) => ({\n deadline: permitTypedData.message.deadline as number,\n value: signature,\n }))\n .andThen((permitSig) => action(permitSig));\n }\n return okAsync(result);\n });\n}\n\nfunction signTypedData(\n privy: PrivyClient,\n walletId: string,\n data: TypedData,\n): ResultAsync<string, SigningError> {\n return ResultAsync.fromPromise(\n privy.walletApi.ethereum.signTypedData({\n walletId,\n typedData: {\n domain: data.domain,\n types: data.types,\n message: data.message,\n primaryType: data.primaryType,\n },\n }),\n (err) => SigningError.from(err),\n ).map((response) => response.signature);\n}\n\n/**\n * Creates a function that signs EIP-712 typed data (ERC-20 permits, swap intents, etc.) using the specified Privy wallet.\n *\n * @param privy - The Privy client instance.\n * @param walletId - The wallet ID to use for signing.\n * @returns A function that takes typed data and returns a ResultAsync containing the raw signature.\n *\n * ```ts\n * const result = await prepareSwapCancel(client, request)\n * .andThen(signTypedDataWith(privy, walletId));\n * ```\n */\nexport function signTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n): TypedDataHandler;\n\n/**\n * Signs EIP-712 typed data (ERC-20 permits, swap intents, etc.) using the specified Privy wallet.\n *\n * @param privy - The Privy client instance.\n * @param walletId - The wallet ID to use for signing.\n * @param data - The typed data to sign.\n * @returns A ResultAsync containing the raw signature.\n *\n * ```ts\n * const result = await signTypedDataWith(privy, walletId, typedData);\n * ```\n */\nexport function signTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n data: TypedData,\n): ReturnType<TypedDataHandler>;\n\nexport function signTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n data?: TypedData,\n): TypedDataHandler | ReturnType<TypedDataHandler> {\n if (data === undefined) {\n return (typedData: TypedData) =>\n signTypedData(privy, walletId, typedData).map(signatureFrom);\n }\n return signTypedData(privy, walletId, data).map(signatureFrom);\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters.ts","../src/viem.ts","../src/privy.ts"],"names":["hasApprovals","plan","supportsPermit","isOneEntryArray","transactionError","chain","txHash","request","baseUrl","link","TransactionError","allChains","viemChains","sendTransaction","privy","walletId","hash","sendTransactionAndWait","extractChain","publicClient","createPublicClient","http","ResultAsync","err","SigningError","waitForTransactionReceipt","UnexpectedError","receipt","errAsync","okAsync","executePlan","result","approval","ValidationError","sendWith","permitWith","action","permitTypedData","signTypedDataWith","signature","permitSig","signTypedData","data","response","typedData","signatureFrom"],"mappings":"6fAKA,SAASA,CAAAA,CAAaC,CAAAA,CAAsC,CAC1D,OACE,OAAOA,CAAAA,EAAS,QAAA,EAChBA,IAAS,IAAA,EACT,WAAA,GAAeA,CAAAA,EACf,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,SAAS,CAEhC,CASO,SAASC,CAAAA,CAAkBD,CAAAA,CAG9B,CACF,OACED,CAAAA,CAAaC,CAAI,CAAA,EACjBE,sBAAgBF,CAAAA,CAAK,SAAS,CAAA,EAC9B,CAAC,CAACA,CAAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CAAE,WAExB,CCuOO,SAASG,CAAAA,CACdC,CAAAA,CACAC,EACAC,CAAAA,CACkB,CAClB,IAAMC,CAAAA,CAAUH,CAAAA,EAAO,cAAA,EAAgB,OAAA,EAAS,GAAA,CAC1CI,CAAAA,CAAOD,CAAAA,EAAW,IAAI,GAAA,CAAI,CAAA,IAAA,EAAOF,CAAM,CAAA,CAAA,CAAIE,CAAO,EAAE,QAAA,EAAS,CAEnE,OAAOE,qBAAAA,CAAiB,GAAA,CAAI,CAAE,MAAA,CAAAJ,CAAAA,CAAQ,OAAA,CAAAC,CAAAA,CAAS,IAAA,CAAAE,CAAK,CAAC,CACvD,CC7OA,IAAME,EAAY,MAAA,CAAO,MAAA,CAAOC,YAAU,CAAA,CAE1C,eAAeC,CAAAA,CACbC,CAAAA,CACAP,CAAAA,CACAQ,CAAAA,CACiB,CACjB,GAAM,CAAE,IAAA,CAAAC,CAAK,CAAA,CAAI,MAAMF,EAAM,SAAA,CAAU,QAAA,CAAS,eAAA,CAAgB,CAC9D,QAAA,CAAAC,CAAAA,CACA,KAAA,CAAO,CAAA,OAAA,EAAUR,EAAQ,OAAO,CAAA,CAAA,CAChC,WAAA,CAAa,CACX,IAAA,CAAMA,CAAAA,CAAQ,IAAA,CACd,EAAA,CAAIA,EAAQ,EAAA,CACZ,KAAA,CAAO,CAAA,EAAA,EAAK,MAAA,CAAOA,CAAAA,CAAQ,KAAK,CAAA,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,CAC9C,OAAA,CAASA,CAAAA,CAAQ,OAAA,CACjB,IAAA,CAAMA,CAAAA,CAAQ,IAChB,CACF,CAAC,CAAA,CACD,OAAOD,YAAAA,CAAOU,CAAI,CACpB,CAEA,SAASC,CAAAA,CACPH,CAAAA,CACAP,CAAAA,CACAQ,CAAAA,CAIA,CACA,IAAMV,CAAAA,CAAQa,kBAAa,CACzB,MAAA,CAAQP,CAAAA,CACR,EAAA,CAAIJ,CAAAA,CAAQ,OACd,CAAC,CAAA,CAEKY,CAAAA,CAAeC,uBAAAA,CAAmB,CACtC,KAAA,CAAAf,CAAAA,CACA,SAAA,CAAWgB,SAAAA,EACb,CAAC,CAAA,CAED,OAAOC,iBAAAA,CAAY,WAAA,CACjBT,CAAAA,CAAgBC,CAAAA,CAAOP,CAAAA,CAASQ,CAAQ,EACvCQ,CAAAA,EAAQC,iBAAAA,CAAa,IAAA,CAAKD,CAAG,CAChC,CAAA,CACG,OAAA,CAASP,CAAAA,EACRM,kBAAY,WAAA,CACVG,iCAAAA,CAA0BN,CAAAA,CAAc,CACtC,IAAA,CAAAH,CAAAA,CACA,eAAA,CAAiB,GAAA,CACjB,UAAA,CAAY,EAAA,CACZ,UAAA,CAAY,EACd,CAAC,CAAA,CACAO,CAAAA,EAAQG,oBAAAA,CAAgB,KAAKH,CAAG,CACnC,CACF,CAAA,CACC,OAAA,CAASI,CAAAA,EAAY,CACpB,IAAMX,CAAAA,CAAOV,YAAAA,CAAOqB,CAAAA,CAAQ,eAAe,CAAA,CAE3C,OAAIA,CAAAA,CAAQ,MAAA,GAAW,WACdC,cAAAA,CAASxB,CAAAA,CAAiBC,CAAAA,CAAOW,CAAAA,CAAMT,CAAO,CAAC,CAAA,CAEjDsB,aAAAA,CAAQ,CACb,MAAA,CAAQb,CAAAA,CACR,UAAA,CAAYT,CAAAA,CAAQ,UACtB,CAAC,CACH,CAAC,CACL,CAEA,SAASuB,CAAAA,CACPhB,CAAAA,CACAC,CAAAA,CACAgB,CAAAA,CACkC,CAClC,OAAQA,CAAAA,CAAO,UAAA,EACb,KAAK,oBAAA,CACH,OAAOd,CAAAA,CAAuBH,CAAAA,CAAOiB,EAAQhB,CAAQ,CAAA,CAEvD,KAAK,uBAAA,CACH,OAAOgB,CAAAA,CAAO,SAAA,CACX,MAAA,CACC,CAAC1B,CAAAA,CAAO2B,CAAAA,GACN3B,CAAAA,CAAM,OAAA,CAAQ,IACZY,CAAAA,CAAuBH,CAAAA,CAAOkB,EAAS,aAAA,CAAejB,CAAQ,CAChE,CAAA,CACFc,aAAAA,CAAQ,MAAkB,CAC5B,CAAA,CACC,OAAA,CAAQ,IACPZ,CAAAA,CAAuBH,CAAAA,CAAOiB,CAAAA,CAAO,mBAAA,CAAqBhB,CAAQ,CACpE,EAEJ,KAAK,2BAAA,CACH,OAAOE,CAAAA,CACLH,CAAAA,CACAiB,CAAAA,CAAO,WAAA,CACPhB,CACF,CAAA,CAAE,OAAA,CAAQ,IACRE,CAAAA,CAAuBH,CAAAA,CAAOiB,CAAAA,CAAO,mBAAA,CAAqBhB,CAAQ,CACpE,CAAA,CAEF,KAAK,0BAAA,CACH,OAAOa,cAAAA,CAASK,oBAAAA,CAAgB,WAAA,CAAYF,CAAM,CAAC,CACvD,CACF,CAiBO,SAASG,EAAAA,CACdpB,CAAAA,CACAC,CAAAA,CACAgB,CAAAA,CAC+D,CAC/D,OAAOA,CAAAA,CACHD,CAAAA,CAAYhB,CAAAA,CAAOC,CAAAA,CAAUgB,CAAM,CAAA,CACnCD,CAAAA,CAAY,IAAA,CAAK,IAAA,CAAMhB,CAAAA,CAAOC,CAAQ,CAC5C,CA0BO,SAASoB,EAAAA,CACdrB,EACAC,CAAAA,CACAqB,CAAAA,CACoD,CACpD,OAAOA,CAAAA,EAAO,CAAE,OAAA,CAASL,CAAAA,EAAW,CAClC,GAAI7B,CAAAA,CAAe6B,CAAM,CAAA,CAAG,CAC1B,IAAMM,CAAAA,CAAkBN,EAAO,SAAA,CAAU,CAAC,CAAA,CAAE,WAAA,CAC5C,OAAOO,CAAAA,CAAkBxB,CAAAA,CAAOC,CAAAA,CAAUsB,CAAe,CAAA,CACtD,GAAA,CAAKE,CAAAA,GAAe,CACnB,QAAA,CAAUF,CAAAA,CAAgB,OAAA,CAAQ,SAClC,KAAA,CAAOE,CACT,CAAA,CAAE,CAAA,CACD,OAAA,CAASC,CAAAA,EAAcJ,CAAAA,CAAOI,CAAS,CAAC,CAC7C,CACA,OAAOX,aAAAA,CAAQE,CAAM,CACvB,CAAC,CACH,CAEA,SAASU,CAAAA,CACP3B,CAAAA,CACAC,CAAAA,CACA2B,CAAAA,CACmC,CACnC,OAAOpB,iBAAAA,CAAY,WAAA,CACjBR,CAAAA,CAAM,SAAA,CAAU,QAAA,CAAS,aAAA,CAAc,CACrC,QAAA,CAAAC,CAAAA,CACA,UAAW,CACT,MAAA,CAAQ2B,CAAAA,CAAK,MAAA,CACb,KAAA,CAAOA,CAAAA,CAAK,KAAA,CACZ,OAAA,CAASA,EAAK,OAAA,CACd,WAAA,CAAaA,CAAAA,CAAK,WACpB,CACF,CAAC,CAAA,CACAnB,CAAAA,EAAQC,kBAAa,IAAA,CAAKD,CAAG,CAChC,CAAA,CAAE,GAAA,CAAKoB,CAAAA,EAAaA,CAAAA,CAAS,SAAS,CACxC,CAqCO,SAASL,CAAAA,CACdxB,CAAAA,CACAC,CAAAA,CACA2B,CAAAA,CACiD,CACjD,OAAIA,CAAAA,GAAS,MAAA,CACHE,CAAAA,EACNH,CAAAA,CAAc3B,CAAAA,CAAOC,CAAAA,CAAU6B,CAAS,CAAA,CAAE,IAAIC,mBAAa,CAAA,CAExDJ,CAAAA,CAAc3B,CAAAA,CAAOC,CAAAA,CAAU2B,CAAI,CAAA,CAAE,GAAA,CAAIG,mBAAa,CAC/D","file":"privy.cjs","sourcesContent":["import type { Erc20Approval, PermitTypedData } from '@aave/graphql';\nimport { isOneEntryArray } from '@aave/types';\n\ntype WithApprovals = { approvals: Erc20Approval[] };\n\nfunction hasApprovals(plan: unknown): plan is WithApprovals {\n return (\n typeof plan === 'object' &&\n plan !== null &&\n 'approvals' in plan &&\n Array.isArray(plan.approvals)\n );\n}\n\n/**\n * Checks if a plan supports permit (single approval with bySignature).\n * Works with union types - picks any member that has an `approvals` array\n * with a single entry containing `bySignature`.\n *\n * @internal\n */\nexport function supportsPermit<T>(plan: T): plan is T &\n Extract<T, WithApprovals> & {\n approvals: [Erc20Approval & { bySignature: PermitTypedData }];\n } {\n return (\n hasApprovals(plan) &&\n isOneEntryArray(plan.approvals) &&\n !!plan.approvals[0].bySignature\n );\n}\n","import {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n Chain,\n ERC20PermitSignature,\n ExecutionPlan,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n chainId,\n errAsync,\n invariant,\n isObject,\n okAsync,\n ResultAsync,\n type Signature,\n signatureFrom,\n type TxHash,\n txHash,\n} from '@aave/types';\nimport {\n type Account,\n defineChain,\n type ProviderRpcError,\n type RpcError,\n SwitchChainError,\n TransactionExecutionError,\n type Transport,\n UserRejectedRequestError,\n type Chain as ViemChain,\n type WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n waitForTransactionReceipt,\n} from 'viem/actions';\nimport { mainnet, sepolia } from 'viem/chains';\nimport type { AaveClient } from './AaveClient';\nimport { chain as fetchChain } from './actions';\nimport { supportsPermit } from './adapters';\nimport type {\n ExecutionPlanHandler,\n SignTypedDataError,\n TransactionResult,\n TypedData,\n TypedDataHandler,\n} from './types';\n\nfunction isRpcError(err: unknown): err is RpcError {\n return isObject(err) && 'code' in err && 'message' in err;\n}\n\nfunction isProviderRpcError(\n err: unknown,\n): err is ProviderRpcError<{ originalError?: { code: number } }> {\n return isObject(err) &&\n 'name' in err &&\n 'message' in err &&\n 'originalError' in err\n ? isRpcError(err.originalError) && 'code' in err.originalError\n : true;\n}\n\nfunction signTypedData(\n walletClient: WalletClient,\n data: TypedData,\n): ResultAsync<Signature, SignTypedDataError> {\n invariant(\n walletClient.account,\n 'Wallet account is required to sign typed data',\n );\n\n return ResultAsync.fromPromise(\n walletClient.signTypedData({\n account: walletClient.account,\n domain: data.domain,\n types: data.types,\n primaryType: data.primaryType,\n message: data.message,\n }),\n (err) => {\n if (err instanceof UserRejectedRequestError) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n ).map(signatureFrom);\n}\n\n/**\n * @internal\n */\nexport function toViemChain(chain: Chain): ViemChain {\n // known chains\n switch (chain.chainId) {\n case chainId(mainnet.id):\n return mainnet;\n\n case chainId(sepolia.id):\n return sepolia;\n }\n\n // most likely a tenderly fork\n return defineChain({\n id: chain.chainId,\n name: chain.name,\n nativeCurrency: {\n name: chain.nativeInfo.name,\n symbol: chain.nativeInfo.symbol,\n decimals: chain.nativeInfo.decimals,\n },\n rpcUrls: { default: { http: [chain.rpcUrl] } },\n blockExplorers: {\n default: {\n name: `${chain.name} Explorer`,\n url: chain.explorerUrl,\n },\n },\n });\n}\n\n/**\n * @internal\n */\nexport function viemChainsFrom(chains: Chain[]): ViemChain[] {\n return chains.map(toViemChain);\n}\n\n/**\n * @internal\n */\nexport function ensureChain(\n aaveClient: AaveClient,\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<void, CancelError | SigningError | UnexpectedError> {\n return ResultAsync.fromPromise(walletClient.getChainId(), (err) =>\n SigningError.from(err),\n ).andThen((chainId) => {\n if (chainId === request.chainId) {\n return okAsync();\n }\n\n return fetchChain(\n aaveClient,\n { chainId: request.chainId },\n { batch: false },\n ).andThen((chain) => {\n invariant(chain, `Chain ${request.chainId} is not supported`);\n\n return ResultAsync.fromPromise(\n walletClient.switchChain({ id: request.chainId }),\n (err) => SigningError.from(err),\n ).orElse((err) => {\n const code = isRpcError(err.cause)\n ? err.cause.code\n : // Unwrapping for MetaMask Mobile\n // https://github.com/MetaMask/metamask-mobile/issues/2944#issuecomment-976988719\n isProviderRpcError(err.cause)\n ? err.cause.data?.originalError?.code\n : undefined;\n\n if (code === SwitchChainError.code) {\n return ResultAsync.fromPromise(\n walletClient.addChain({ chain: toViemChain(chain) }),\n (err) => {\n if (\n isRpcError(err) &&\n err.code === UserRejectedRequestError.code\n ) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n );\n }\n\n return err.asResultAsync();\n });\n });\n });\n}\n\nfunction estimateGas(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<bigint, SigningError> {\n return ResultAsync.fromPromise(\n estimateGasWithViem(walletClient, {\n account: walletClient.account,\n data: request.data,\n to: request.to,\n value: BigInt(request.value),\n prepare: false,\n }),\n (err) => SigningError.from(err),\n ).map((gas) => (gas * 115n) / 100n); // 15% buffer\n}\n\nfunction sendEip1559Transaction(\n walletClient: WalletClient<Transport, ViemChain, Account>,\n request: TransactionRequest,\n): ResultAsync<TxHash, CancelError | SigningError> {\n return estimateGas(walletClient, request)\n .andThen((gas) =>\n ResultAsync.fromPromise(\n sendTransactionWithViem(walletClient, {\n account: walletClient.account,\n data: request.data,\n to: request.to,\n value: BigInt(request.value),\n chain: walletClient.chain,\n gas,\n }),\n (err) => {\n if (err instanceof TransactionExecutionError) {\n const rejected = err.walk(\n (err) => err instanceof UserRejectedRequestError,\n );\n\n if (rejected) {\n return CancelError.from(rejected);\n }\n }\n return SigningError.from(err);\n },\n ),\n )\n .map(txHash);\n}\n\nfunction isWalletClientWithAccount(\n walletClient: WalletClient,\n): walletClient is WalletClient<Transport, ViemChain, Account> {\n return walletClient.account !== undefined;\n}\n\n/**\n * @internal\n */\nexport function sendTransaction(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<TxHash, CancelError | SigningError> {\n invariant(\n isWalletClientWithAccount(walletClient),\n 'Wallet client with account is required',\n );\n\n return sendEip1559Transaction(walletClient, request);\n}\n\n/**\n * @internal\n */\nexport function transactionError(\n chain: ViemChain | undefined,\n txHash: TxHash,\n request: TransactionRequest,\n): TransactionError {\n const baseUrl = chain?.blockExplorers?.default?.url;\n const link = baseUrl && new URL(`/tx/${txHash}`, baseUrl).toString();\n\n return TransactionError.new({ txHash, request, link });\n}\n\n/**\n * @internal\n */\nexport function waitForTransactionResult(\n walletClient: WalletClient,\n request: TransactionRequest,\n initialTxHash: TxHash,\n): ResultAsync<\n TransactionResult,\n CancelError | TransactionError | UnexpectedError\n> {\n return ResultAsync.fromPromise(\n waitForTransactionReceipt(walletClient, {\n hash: initialTxHash,\n pollingInterval: 100,\n retryCount: 20,\n retryDelay: 50,\n }),\n (err) => UnexpectedError.from(err),\n ).andThen((receipt) => {\n const hash = txHash(receipt.transactionHash);\n\n switch (receipt.status) {\n case 'reverted':\n if (initialTxHash !== hash) {\n return errAsync(CancelError.from(`Transaction replaced by ${hash}`));\n }\n return errAsync(transactionError(walletClient.chain, hash, request));\n case 'success':\n return okAsync({\n // viem's waitForTransactionReceipt supports transaction replacement\n // so it's important to use the transaction hash from the receipt\n txHash: hash,\n operations: request.operations,\n });\n }\n });\n}\n\nfunction sendTransactionAndWait(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<\n TransactionResult,\n CancelError | SigningError | TransactionError | UnexpectedError\n> {\n return sendTransaction(walletClient, request).andThen((hash) =>\n waitForTransactionResult(walletClient, request, hash),\n );\n}\n\nfunction executePlan(\n walletClient: WalletClient,\n result: ExecutionPlan,\n): ReturnType<ExecutionPlanHandler> {\n switch (result.__typename) {\n case 'TransactionRequest':\n return sendTransactionAndWait(walletClient, result);\n\n case 'Erc20ApprovalRequired':\n return result.approvals\n .reduce<ReturnType<typeof sendTransactionAndWait>>(\n (chain, approval) =>\n chain.andThen(() =>\n sendTransactionAndWait(walletClient, approval.byTransaction),\n ),\n okAsync(undefined as never),\n )\n .andThen(() =>\n sendTransactionAndWait(walletClient, result.originalTransaction),\n );\n\n case 'PreContractActionRequired':\n return sendTransactionAndWait(walletClient, result.transaction).andThen(\n () => sendTransactionAndWait(walletClient, result.originalTransaction),\n );\n\n case 'InsufficientBalanceError':\n return errAsync(ValidationError.fromGqlNode(result));\n }\n}\n\n/**\n * Creates an execution plan handler that sends transactions using the provided wallet client.\n */\nexport function sendWith(walletClient: WalletClient): ExecutionPlanHandler;\n/**\n * Sends execution plan transactions using the provided wallet client.\n */\nexport function sendWith<T extends ExecutionPlan = ExecutionPlan>(\n walletClient: WalletClient,\n result: T,\n): ReturnType<ExecutionPlanHandler<T>>;\nexport function sendWith<T extends ExecutionPlan = ExecutionPlan>(\n walletClient: WalletClient,\n result?: T,\n): ExecutionPlanHandler<T> | ReturnType<ExecutionPlanHandler<T>> {\n return result\n ? executePlan(walletClient, result)\n : executePlan.bind(null, walletClient);\n}\n\n/**\n * Creates a function that signs EIP-712 typed data (ERC-20 permits, swap intents, etc.) using the provided wallet client.\n *\n * @param walletClient - The wallet client to use for signing.\n * @returns A function that takes typed data and returns a ResultAsync containing the raw signature.\n *\n * ```ts\n * const result = await prepareSwapCancel(client, request)\n * .andThen(signTypedDataWith(wallet));\n * ```\n */\nexport function signTypedDataWith(walletClient: WalletClient): TypedDataHandler;\n\n/**\n * Signs EIP-712 typed data (ERC-20 permits, swap intents, etc.) using the provided wallet client.\n *\n * @param walletClient - The wallet client to use for signing.\n * @param data - The typed data to sign.\n * @returns A ResultAsync containing the raw signature.\n *\n * ```ts\n * const result = await signTypedDataWith(wallet, typedData);\n * ```\n */\nexport function signTypedDataWith(\n walletClient: WalletClient,\n data: TypedData,\n): ReturnType<TypedDataHandler>;\n\nexport function signTypedDataWith(\n walletClient: WalletClient,\n data?: TypedData,\n): TypedDataHandler | ReturnType<TypedDataHandler> {\n if (data === undefined) {\n return signTypedData.bind(null, walletClient);\n }\n return signTypedData(walletClient, data);\n}\n\n/**\n * Handles ERC20 permit signing for actions that require token approval.\n *\n * Calls the action to get an initial execution plan. If the plan requires ERC20 approval\n * and the token supports permit signatures, signs the permit and re-calls the action\n * with the signature to get a new plan that can be sent directly.\n *\n * ```ts\n * const result = await permitWith(walletClient, (permitSig) =>\n * supply(client, {\n * reserve: reserve.id,\n * amount: { erc20: { value: amount, permitSig } },\n * sender: evmAddress(walletClient.account.address),\n * })\n * )\n * .andThen(sendWith(walletClient))\n * .andThen(client.waitForTransaction);\n * ```\n *\n * @param walletClient - The wallet client to use for signing permits.\n * @param action - A function that returns an execution plan, accepting an optional permit signature.\n * @returns A ResultAsync containing the resolved ExecutionPlan ready to be sent with `sendWith`.\n */\nexport function permitWith<E>(\n walletClient: WalletClient,\n action: (permitSig?: ERC20PermitSignature) => ResultAsync<ExecutionPlan, E>,\n): ResultAsync<ExecutionPlan, E | SignTypedDataError> {\n return action().andThen((result) => {\n if (supportsPermit(result)) {\n const permitTypedData = result.approvals[0].bySignature;\n // Sign and wrap with deadline\n return signTypedDataWith(walletClient, permitTypedData)\n .map((signature) => ({\n deadline: permitTypedData.message.deadline as number,\n value: signature,\n }))\n .andThen((permitSig) => action(permitSig));\n }\n return okAsync(result);\n });\n}\n","import {\n SigningError,\n type TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n ERC20PermitSignature,\n ExecutionPlan,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n errAsync,\n okAsync,\n ResultAsync,\n signatureFrom,\n type TxHash,\n txHash,\n} from '@aave/types';\nimport type { PrivyClient } from '@privy-io/server-auth';\nimport { createPublicClient, extractChain, http } from 'viem';\nimport { waitForTransactionReceipt } from 'viem/actions';\nimport * as viemChains from 'viem/chains';\nimport { supportsPermit } from './adapters';\nimport type {\n ExecutionPlanHandler,\n SignTypedDataError,\n TransactionResult,\n TypedData,\n TypedDataHandler,\n} from './types';\nimport { transactionError } from './viem';\n\nconst allChains = Object.values(viemChains);\n\nasync function sendTransaction(\n privy: PrivyClient,\n request: TransactionRequest,\n walletId: string,\n): Promise<TxHash> {\n const { hash } = await privy.walletApi.ethereum.sendTransaction({\n walletId,\n caip2: `eip155:${request.chainId}`,\n transaction: {\n from: request.from,\n to: request.to,\n value: `0x${BigInt(request.value).toString(16)}`,\n chainId: request.chainId,\n data: request.data,\n },\n });\n return txHash(hash);\n}\n\nfunction sendTransactionAndWait(\n privy: PrivyClient,\n request: TransactionRequest,\n walletId: string,\n): ResultAsync<\n TransactionResult,\n SigningError | TransactionError | UnexpectedError\n> {\n const chain = extractChain({\n chains: allChains,\n id: request.chainId as (typeof allChains)[number]['id'],\n });\n\n const publicClient = createPublicClient({\n chain,\n transport: http(),\n });\n\n return ResultAsync.fromPromise(\n sendTransaction(privy, request, walletId),\n (err) => SigningError.from(err),\n )\n .andThen((hash) =>\n ResultAsync.fromPromise(\n waitForTransactionReceipt(publicClient, {\n hash,\n pollingInterval: 100,\n retryCount: 20,\n retryDelay: 50,\n }),\n (err) => UnexpectedError.from(err),\n ),\n )\n .andThen((receipt) => {\n const hash = txHash(receipt.transactionHash);\n\n if (receipt.status === 'reverted') {\n return errAsync(transactionError(chain, hash, request));\n }\n return okAsync({\n txHash: hash,\n operations: request.operations,\n });\n });\n}\n\nfunction executePlan(\n privy: PrivyClient,\n walletId: string,\n result: ExecutionPlan,\n): ReturnType<ExecutionPlanHandler> {\n switch (result.__typename) {\n case 'TransactionRequest':\n return sendTransactionAndWait(privy, result, walletId);\n\n case 'Erc20ApprovalRequired':\n return result.approvals\n .reduce<ReturnType<typeof sendTransactionAndWait>>(\n (chain, approval) =>\n chain.andThen(() =>\n sendTransactionAndWait(privy, approval.byTransaction, walletId),\n ),\n okAsync(undefined as never),\n )\n .andThen(() =>\n sendTransactionAndWait(privy, result.originalTransaction, walletId),\n );\n\n case 'PreContractActionRequired':\n return sendTransactionAndWait(\n privy,\n result.transaction,\n walletId,\n ).andThen(() =>\n sendTransactionAndWait(privy, result.originalTransaction, walletId),\n );\n\n case 'InsufficientBalanceError':\n return errAsync(ValidationError.fromGqlNode(result));\n }\n}\n\n/**\n * Creates an execution plan handler that sends transactions using the specified Privy wallet.\n */\nexport function sendWith<T extends ExecutionPlan = ExecutionPlan>(\n privy: PrivyClient,\n walletId: string,\n): ExecutionPlanHandler<T>;\n/**\n * Sends execution plan transactions using the specified Privy wallet.\n */\nexport function sendWith<T extends ExecutionPlan = ExecutionPlan>(\n privy: PrivyClient,\n walletId: string,\n result: T,\n): ReturnType<ExecutionPlanHandler<T>>;\nexport function sendWith<T extends ExecutionPlan = ExecutionPlan>(\n privy: PrivyClient,\n walletId: string,\n result?: T,\n): ExecutionPlanHandler<T> | ReturnType<ExecutionPlanHandler<T>> {\n return result\n ? executePlan(privy, walletId, result)\n : executePlan.bind(null, privy, walletId);\n}\n\n/**\n * Handles ERC20 permit signing for actions that require token approval.\n *\n * Calls the action to get an initial execution plan. If the plan requires ERC20 approval\n * and the token supports permit signatures, signs the permit and re-calls the action\n * with the signature to get a new plan that can be sent directly.\n *\n * ```ts\n * const result = await permitWith(privy, walletId, (permitSig) =>\n * supply(client, {\n * reserve: reserve.id,\n * amount: { erc20: { value: amount, permitSig } },\n * sender: evmAddress(walletAddress),\n * })\n * )\n * .andThen(sendWith(privy, walletId))\n * .andThen(client.waitForTransaction);\n * ```\n *\n * @param privy - The Privy client for signing permits.\n * @param walletId - The ID of the Privy wallet to use.\n * @param action - A function that returns an execution plan, accepting an optional permit signature.\n * @returns A ResultAsync containing the resolved ExecutionPlan ready to be sent with `sendWith`.\n */\nexport function permitWith<E>(\n privy: PrivyClient,\n walletId: string,\n action: (permitSig?: ERC20PermitSignature) => ResultAsync<ExecutionPlan, E>,\n): ResultAsync<ExecutionPlan, E | SignTypedDataError> {\n return action().andThen((result) => {\n if (supportsPermit(result)) {\n const permitTypedData = result.approvals[0].bySignature;\n return signTypedDataWith(privy, walletId, permitTypedData)\n .map((signature) => ({\n deadline: permitTypedData.message.deadline as number,\n value: signature,\n }))\n .andThen((permitSig) => action(permitSig));\n }\n return okAsync(result);\n });\n}\n\nfunction signTypedData(\n privy: PrivyClient,\n walletId: string,\n data: TypedData,\n): ResultAsync<string, SigningError> {\n return ResultAsync.fromPromise(\n privy.walletApi.ethereum.signTypedData({\n walletId,\n typedData: {\n domain: data.domain,\n types: data.types,\n message: data.message,\n primaryType: data.primaryType,\n },\n }),\n (err) => SigningError.from(err),\n ).map((response) => response.signature);\n}\n\n/**\n * Creates a function that signs EIP-712 typed data (ERC-20 permits, swap intents, etc.) using the specified Privy wallet.\n *\n * @param privy - The Privy client instance.\n * @param walletId - The wallet ID to use for signing.\n * @returns A function that takes typed data and returns a ResultAsync containing the raw signature.\n *\n * ```ts\n * const result = await prepareSwapCancel(client, request)\n * .andThen(signTypedDataWith(privy, walletId));\n * ```\n */\nexport function signTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n): TypedDataHandler;\n\n/**\n * Signs EIP-712 typed data (ERC-20 permits, swap intents, etc.) using the specified Privy wallet.\n *\n * @param privy - The Privy client instance.\n * @param walletId - The wallet ID to use for signing.\n * @param data - The typed data to sign.\n * @returns A ResultAsync containing the raw signature.\n *\n * ```ts\n * const result = await signTypedDataWith(privy, walletId, typedData);\n * ```\n */\nexport function signTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n data: TypedData,\n): ReturnType<TypedDataHandler>;\n\nexport function signTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n data?: TypedData,\n): TypedDataHandler | ReturnType<TypedDataHandler> {\n if (data === undefined) {\n return (typedData: TypedData) =>\n signTypedData(privy, walletId, typedData).map(signatureFrom);\n }\n return signTypedData(privy, walletId, data).map(signatureFrom);\n}\n"]}
package/dist/privy.js CHANGED
@@ -1,2 +1,2 @@
1
- import {e}from'./chunk-G3SJ4NJN.js';import {a}from'./chunk-N4LXBTGY.js';import'./chunk-O65KFH4O.js';import {ValidationError,SigningError,UnexpectedError}from'@aave/core';import {okAsync,signatureFrom,errAsync,ResultAsync,txHash}from'@aave/types';import {extractChain,createPublicClient,http}from'viem';import {waitForTransactionReceipt}from'viem/actions';import*as R from'viem/chains';var D=Object.values(R);async function H(e,n,t){let{hash:r}=await e.walletApi.ethereum.sendTransaction({walletId:t,caip2:`eip155:${n.chainId}`,transaction:{from:n.from,to:n.to,value:`0x${BigInt(n.value).toString(16)}`,chainId:n.chainId,data:n.data}});return txHash(r)}function o(e$1,n,t){let r=extractChain({chains:D,id:n.chainId}),i=createPublicClient({chain:r,transport:http()});return ResultAsync.fromPromise(H(e$1,n,t),a=>SigningError.from(a)).andThen(a=>ResultAsync.fromPromise(waitForTransactionReceipt(i,{hash:a,pollingInterval:100,retryCount:20,retryDelay:50}),s=>UnexpectedError.from(s))).andThen(a=>{let s=txHash(a.transactionHash);return a.status==="reverted"?errAsync(e(r,s,n)):okAsync({txHash:s,operations:n.operations})})}function y(e,n,t){switch(t.__typename){case "TransactionRequest":return o(e,t,n);case "Erc20ApprovalRequired":return t.approvals.reduce((r,i)=>r.andThen(()=>o(e,i.byTransaction,n)),okAsync(void 0)).andThen(()=>o(e,t.originalTransaction,n));case "PreContractActionRequired":return o(e,t.transaction,n).andThen(()=>o(e,t.originalTransaction,n));case "InsufficientBalanceError":return errAsync(ValidationError.fromGqlNode(t))}}function F(e,n,t){return t?y(e,n,t):y.bind(null,e,n)}function U(e,n,t){return t().andThen(r=>{if(a(r)){let i=r.approvals[0].bySignature;return A(e,n,i).map(a=>({deadline:i.message.deadline,value:a})).andThen(a=>t(a))}return okAsync(r)})}function T(e,n,t){return ResultAsync.fromPromise(e.walletApi.ethereum.signTypedData({walletId:n,typedData:{domain:t.domain,types:t.types,message:t.message,primaryType:t.primaryType}}),r=>SigningError.from(r)).map(r=>r.signature)}function A(e,n,t){return t===void 0?r=>T(e,n,r).map(signatureFrom):T(e,n,t).map(signatureFrom)}export{U as permitWith,F as sendWith,A as signTypedDataWith};//# sourceMappingURL=privy.js.map
1
+ import {e}from'./chunk-2LML4TFR.js';import {a}from'./chunk-N4LXBTGY.js';import'./chunk-2GSAKHLR.js';import {ValidationError,SigningError,UnexpectedError}from'@aave/core';import {okAsync,signatureFrom,errAsync,ResultAsync,txHash}from'@aave/types';import {extractChain,createPublicClient,http}from'viem';import {waitForTransactionReceipt}from'viem/actions';import*as R from'viem/chains';var D=Object.values(R);async function H(e,n,t){let{hash:r}=await e.walletApi.ethereum.sendTransaction({walletId:t,caip2:`eip155:${n.chainId}`,transaction:{from:n.from,to:n.to,value:`0x${BigInt(n.value).toString(16)}`,chainId:n.chainId,data:n.data}});return txHash(r)}function o(e$1,n,t){let r=extractChain({chains:D,id:n.chainId}),i=createPublicClient({chain:r,transport:http()});return ResultAsync.fromPromise(H(e$1,n,t),a=>SigningError.from(a)).andThen(a=>ResultAsync.fromPromise(waitForTransactionReceipt(i,{hash:a,pollingInterval:100,retryCount:20,retryDelay:50}),s=>UnexpectedError.from(s))).andThen(a=>{let s=txHash(a.transactionHash);return a.status==="reverted"?errAsync(e(r,s,n)):okAsync({txHash:s,operations:n.operations})})}function y(e,n,t){switch(t.__typename){case "TransactionRequest":return o(e,t,n);case "Erc20ApprovalRequired":return t.approvals.reduce((r,i)=>r.andThen(()=>o(e,i.byTransaction,n)),okAsync(void 0)).andThen(()=>o(e,t.originalTransaction,n));case "PreContractActionRequired":return o(e,t.transaction,n).andThen(()=>o(e,t.originalTransaction,n));case "InsufficientBalanceError":return errAsync(ValidationError.fromGqlNode(t))}}function F(e,n,t){return t?y(e,n,t):y.bind(null,e,n)}function U(e,n,t){return t().andThen(r=>{if(a(r)){let i=r.approvals[0].bySignature;return A(e,n,i).map(a=>({deadline:i.message.deadline,value:a})).andThen(a=>t(a))}return okAsync(r)})}function T(e,n,t){return ResultAsync.fromPromise(e.walletApi.ethereum.signTypedData({walletId:n,typedData:{domain:t.domain,types:t.types,message:t.message,primaryType:t.primaryType}}),r=>SigningError.from(r)).map(r=>r.signature)}function A(e,n,t){return t===void 0?r=>T(e,n,r).map(signatureFrom):T(e,n,t).map(signatureFrom)}export{U as permitWith,F as sendWith,A as signTypedDataWith};//# sourceMappingURL=privy.js.map
2
2
  //# sourceMappingURL=privy.js.map
package/dist/testing.d.ts CHANGED
@@ -143,6 +143,7 @@ declare function createForkPublicClient(): Promise<{
143
143
  request?: (parameters: viem.CcipRequestParameters) => Promise<CcipRequestReturnType>;
144
144
  } | undefined;
145
145
  chain: Chain;
146
+ dataSuffix?: viem.DataSuffix | undefined;
146
147
  experimental_blockTag?: viem.BlockTag | undefined;
147
148
  key: string;
148
149
  name: string;
@@ -165,6 +166,7 @@ declare function createForkPublicClient(): Promise<{
165
166
  createPendingTransactionFilter: () => Promise<viem.CreatePendingTransactionFilterReturnType>;
166
167
  estimateContractGas: <chain extends Chain | undefined, const abi extends viem.Abi | readonly unknown[], functionName extends viem.ContractFunctionName<abi, "nonpayable" | "payable">, args extends viem.ContractFunctionArgs<abi, "nonpayable" | "payable", functionName>>(args: viem.EstimateContractGasParameters<abi, functionName, args, chain>) => Promise<viem.EstimateContractGasReturnType>;
167
168
  estimateGas: (args: viem.EstimateGasParameters<Chain>) => Promise<viem.EstimateGasReturnType>;
169
+ fillTransaction: <chainOverride extends Chain | undefined = undefined, accountOverride extends Account | viem.Address | undefined = undefined>(args: viem.FillTransactionParameters<Chain, Account | undefined, chainOverride, accountOverride>) => Promise<viem.FillTransactionReturnType<Chain, chainOverride>>;
168
170
  getBalance: (args: viem.GetBalanceParameters) => Promise<viem.GetBalanceReturnType>;
169
171
  getBlobBaseFee: () => Promise<viem.GetBlobBaseFeeReturnType>;
170
172
  getBlock: <includeTransactions extends boolean = false, blockTag extends viem.BlockTag = "latest">(args?: viem.GetBlockParameters<includeTransactions, blockTag> | undefined) => Promise<{
@@ -327,6 +329,7 @@ declare function createForkPublicClient(): Promise<{
327
329
  getChainId: () => Promise<viem.GetChainIdReturnType>;
328
330
  getCode: (args: viem.GetBytecodeParameters) => Promise<viem.GetBytecodeReturnType>;
329
331
  getContractEvents: <const abi extends viem.Abi | readonly unknown[], eventName extends viem.ContractEventName<abi> | undefined = undefined, strict extends boolean | undefined = undefined, fromBlock extends viem.BlockNumber | viem.BlockTag | undefined = undefined, toBlock extends viem.BlockNumber | viem.BlockTag | undefined = undefined>(args: viem.GetContractEventsParameters<abi, eventName, strict, fromBlock, toBlock>) => Promise<viem.GetContractEventsReturnType<abi, eventName, strict, fromBlock, toBlock>>;
332
+ getDelegation: (args: viem.GetDelegationParameters) => Promise<viem.GetDelegationReturnType>;
330
333
  getEip712Domain: (args: viem.GetEip712DomainParameters) => Promise<viem.GetEip712DomainReturnType>;
331
334
  getEnsAddress: (args: viem.GetEnsAddressParameters) => Promise<viem.GetEnsAddressReturnType>;
332
335
  getEnsAvatar: (args: viem.GetEnsAvatarParameters) => Promise<viem.GetEnsAvatarReturnType>;
@@ -3729,6 +3732,7 @@ declare function createForkPublicClient(): Promise<{
3729
3732
  }, (request["parameters"] extends readonly viem.PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "fees" | "gas" | "nonce" | "blobVersionedHashes" | "chainId" | "type") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly viem.PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "fees" | "gas" | "nonce" | "blobVersionedHashes" | "chainId" | "type") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: T[K]; } : never>;
3730
3733
  readContract: <const abi extends viem.Abi | readonly unknown[], functionName extends viem.ContractFunctionName<abi, "pure" | "view">, const args extends viem.ContractFunctionArgs<abi, "pure" | "view", functionName>>(args: viem.ReadContractParameters<abi, functionName, args>) => Promise<viem.ReadContractReturnType<abi, functionName, args>>;
3731
3734
  sendRawTransaction: (args: viem.SendRawTransactionParameters) => Promise<viem.SendRawTransactionReturnType>;
3735
+ sendRawTransactionSync: (args: viem.SendRawTransactionSyncParameters) => Promise<viem.TransactionReceipt>;
3732
3736
  simulate: <const calls extends readonly unknown[]>(args: viem.SimulateBlocksParameters<calls>) => Promise<viem.SimulateBlocksReturnType<calls>>;
3733
3737
  simulateBlocks: <const calls extends readonly unknown[]>(args: viem.SimulateBlocksParameters<calls>) => Promise<viem.SimulateBlocksReturnType<calls>>;
3734
3738
  simulateCalls: <const calls extends readonly unknown[]>(args: viem.SimulateCallsParameters<calls>) => Promise<viem.SimulateCallsReturnType<calls>>;
@@ -3751,6 +3755,7 @@ declare function createForkPublicClient(): Promise<{
3751
3755
  cacheTime?: undefined;
3752
3756
  ccipRead?: undefined;
3753
3757
  chain?: undefined;
3758
+ dataSuffix?: undefined;
3754
3759
  experimental_blockTag?: undefined;
3755
3760
  key?: undefined;
3756
3761
  name?: undefined;
@@ -3759,7 +3764,7 @@ declare function createForkPublicClient(): Promise<{
3759
3764
  transport?: undefined;
3760
3765
  type?: undefined;
3761
3766
  uid?: undefined;
3762
- } & viem.ExactPartial<Pick<viem.PublicActions<viem.HttpTransport<undefined, false>, Chain, undefined>, "call" | "createContractEventFilter" | "createEventFilter" | "estimateContractGas" | "estimateGas" | "getBlock" | "getBlockNumber" | "getChainId" | "getContractEvents" | "getEnsText" | "getFilterChanges" | "getGasPrice" | "getLogs" | "getTransaction" | "getTransactionCount" | "getTransactionReceipt" | "prepareTransactionRequest" | "readContract" | "sendRawTransaction" | "simulateContract" | "uninstallFilter" | "watchBlockNumber" | "watchContractEvent"> & Pick<viem.WalletActions<Chain, undefined>, "sendTransaction" | "writeContract">>>(fn: (client: viem.Client<viem.HttpTransport<undefined, false>, Chain, undefined, viem.PublicRpcSchema, viem.PublicActions<viem.HttpTransport<undefined, false>, Chain>>) => client) => viem.Client<viem.HttpTransport<undefined, false>, Chain, undefined, viem.PublicRpcSchema, { [K in keyof client]: client[K]; } & viem.PublicActions<viem.HttpTransport<undefined, false>, Chain>>;
3767
+ } & viem.ExactPartial<Pick<viem.PublicActions<viem.HttpTransport<undefined, false>, Chain, undefined>, "prepareTransactionRequest" | "call" | "createContractEventFilter" | "createEventFilter" | "estimateContractGas" | "estimateGas" | "getBlock" | "getBlockNumber" | "getChainId" | "getContractEvents" | "getEnsText" | "getFilterChanges" | "getGasPrice" | "getLogs" | "getTransaction" | "getTransactionCount" | "getTransactionReceipt" | "readContract" | "sendRawTransaction" | "simulateContract" | "uninstallFilter" | "watchBlockNumber" | "watchContractEvent"> & Pick<viem.WalletActions<Chain, undefined>, "sendTransaction" | "writeContract">>>(fn: (client: viem.Client<viem.HttpTransport<undefined, false>, Chain, undefined, viem.PublicRpcSchema, viem.PublicActions<viem.HttpTransport<undefined, false>, Chain>>) => client) => viem.Client<viem.HttpTransport<undefined, false>, Chain, undefined, viem.PublicRpcSchema, { [K in keyof client]: client[K]; } & viem.PublicActions<viem.HttpTransport<undefined, false>, Chain>>;
3763
3768
  }>;
3764
3769
  declare function createNewWallet(privateKey?: `0x${string}`): Promise<WalletClient<Transport, Chain, Account>>;
3765
3770
  declare function fundNativeAddress(address: EvmAddress, amount?: BigDecimal): ResultAsync<string, UnexpectedError>;