@aave/client 4.0.0-next.11 → 4.0.0-next.13

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.
Files changed (49) hide show
  1. package/dist/{AaveClient-CgHY2iS9.d.ts → AaveClient-DOpqOo5z.d.ts} +1 -1
  2. package/dist/{AaveClient-L3v8kWvn.d.cts → AaveClient-DWLB8Q0H.d.cts} +1 -1
  3. package/dist/actions/index.cjs +1 -1
  4. package/dist/actions/index.cjs.map +1 -1
  5. package/dist/actions/index.d.cts +117 -15
  6. package/dist/actions/index.d.ts +117 -15
  7. package/dist/actions/index.js +1 -1
  8. package/dist/chunk-SE3G6F7Q.js +2 -0
  9. package/dist/chunk-SE3G6F7Q.js.map +1 -0
  10. package/dist/chunk-Y2VUAIEB.js +3 -0
  11. package/dist/chunk-Y2VUAIEB.js.map +1 -0
  12. package/dist/ethers.cjs +1 -1
  13. package/dist/ethers.cjs.map +1 -1
  14. package/dist/ethers.d.cts +3 -3
  15. package/dist/ethers.d.ts +3 -3
  16. package/dist/ethers.js +1 -1
  17. package/dist/ethers.js.map +1 -1
  18. package/dist/index.cjs +2 -2
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +2 -2
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.js +2 -2
  23. package/dist/index.js.map +1 -1
  24. package/dist/privy.cjs +2 -2
  25. package/dist/privy.cjs.map +1 -1
  26. package/dist/privy.d.cts +3 -3
  27. package/dist/privy.d.ts +3 -3
  28. package/dist/privy.js +1 -1
  29. package/dist/privy.js.map +1 -1
  30. package/dist/testing.js +5 -5
  31. package/dist/testing.js.map +1 -1
  32. package/dist/thirdweb.cjs +1 -2
  33. package/dist/thirdweb.cjs.map +1 -1
  34. package/dist/thirdweb.d.cts +10 -14
  35. package/dist/thirdweb.d.ts +10 -14
  36. package/dist/thirdweb.js +1 -2
  37. package/dist/thirdweb.js.map +1 -1
  38. package/dist/{types-Bu63z0x6.d.cts → types-BQNpCzsV.d.cts} +3 -3
  39. package/dist/{types-Bu63z0x6.d.ts → types-BQNpCzsV.d.ts} +3 -3
  40. package/dist/viem.cjs +2 -2
  41. package/dist/viem.cjs.map +1 -1
  42. package/dist/viem.d.cts +4 -4
  43. package/dist/viem.d.ts +4 -4
  44. package/dist/viem.js +1 -1
  45. package/package.json +4 -4
  46. package/dist/chunk-HH3XCL5T.js +0 -2
  47. package/dist/chunk-HH3XCL5T.js.map +0 -1
  48. package/dist/chunk-SRVGACO7.js +0 -3
  49. package/dist/chunk-SRVGACO7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/viem.ts","../src/privy.ts"],"names":["devnetChain","defineChain","supportedChains","chainId","transactionError","chain","txHash","request","baseUrl","link","TransactionError","sendTransaction","privy","walletId","hash","sendTransactionAndWait","publicClient","createPublicClient","http","ResultAsync","err","SigningError","waitForTransactionReceipt","receipt","errAsync","okAsync","executePlan","result","ValidationError","sendWith","signERC20Permit","response","signatureFrom","signERC20PermitWith","signSwapTypedData","message","signSwapTypedDataWith"],"mappings":"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","file":"privy.cjs","sourcesContent":["import {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\n Chain,\n ExecutionPlan,\n PermitTypedDataResponse,\n SwapByIntentTypedData,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n type ChainId,\n chainId,\n errAsync,\n invariant,\n isObject,\n okAsync,\n ResultAsync,\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 type TypedData,\n type TypedDataDomain,\n UserRejectedRequestError,\n type Chain as ViemChain,\n type WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n signTypedData,\n waitForTransactionReceipt,\n} from 'viem/actions';\nimport { mainnet, sepolia } from 'viem/chains';\nimport type { AaveClient } from './AaveClient';\nimport { chain as fetchChain } from './actions';\nimport type {\n ERC20PermitHandler,\n ExecutionPlanHandler,\n SwapSignatureHandler,\n TransactionResult,\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\nconst devnetChain: ViemChain = defineChain({\n id: Number.parseInt(import.meta.env.ETHEREUM_TENDERLY_FORK_ID, 10),\n name: 'Devnet',\n network: 'ethereum-fork',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [import.meta.env.ETHEREUM_TENDERLY_PUBLIC_RPC] },\n },\n blockExplorers: {\n default: {\n name: 'Devnet Explorer',\n url: import.meta.env.ETHEREUM_TENDERLY_BLOCKEXPLORER,\n },\n },\n});\n\n/**\n * @internal\n * @deprecated\n */\nexport const supportedChains: Record<ChainId, ViemChain> = {\n [chainId(devnetChain.id)]: devnetChain,\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 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\nfunction signERC20Permit(\n walletClient: WalletClient,\n result: PermitTypedDataResponse,\n): ReturnType<ERC20PermitHandler> {\n invariant(walletClient.account, 'Wallet account is required');\n\n return ResultAsync.fromPromise(\n signTypedData(walletClient, {\n account: walletClient.account,\n domain: result.domain as TypedDataDomain,\n types: result.types as TypedData,\n primaryType: result.primaryType as keyof typeof result.types,\n message: result.message,\n }),\n (err) => SigningError.from(err),\n ).map((hex) => ({\n deadline: result.message.deadline,\n value: signatureFrom(hex),\n }));\n}\n\n/**\n * Creates an ERC20 permit handler that signs ERC20 permits using the provided wallet client.\n */\nexport function signERC20PermitWith(\n walletClient: WalletClient,\n): ERC20PermitHandler {\n return signERC20Permit.bind(null, walletClient);\n}\n\nfunction signSwapTypedData(\n walletClient: WalletClient,\n result: SwapByIntentTypedData | CancelSwapTypedData,\n): ReturnType<SwapSignatureHandler> {\n invariant(walletClient.account, 'Wallet account is required');\n\n return ResultAsync.fromPromise(\n signTypedData(walletClient, {\n account: walletClient.account,\n domain: result.domain as TypedDataDomain,\n types: result.types as TypedData,\n primaryType: result.primaryType,\n message: JSON.parse(result.message),\n }),\n (err) => SigningError.from(err),\n ).map((hex) => ({\n deadline: JSON.parse(result.message).deadline,\n value: signatureFrom(hex),\n }));\n}\n\n/**\n * @internal\n * Creates a swap signature handler that signs swap typed data using the provided wallet client.\n */\nexport function signSwapTypedDataWith(\n walletClient: WalletClient,\n): SwapSignatureHandler;\n/**\n * @internal\n * Signs swap typed data using the provided wallet client.\n */\nexport function signSwapTypedDataWith(\n walletClient: WalletClient,\n result: SwapByIntentTypedData | CancelSwapTypedData,\n): ReturnType<SwapSignatureHandler>;\nexport function signSwapTypedDataWith(\n walletClient: WalletClient,\n result?: SwapByIntentTypedData | CancelSwapTypedData,\n): SwapSignatureHandler | ReturnType<SwapSignatureHandler> {\n return result\n ? signSwapTypedData(walletClient, result)\n : signSwapTypedData.bind(null, walletClient);\n}\n","import {\n SigningError,\n type TransactionError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\n ExecutionPlan,\n PermitTypedDataResponse,\n SwapByIntentTypedData,\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, http } from 'viem';\nimport { waitForTransactionReceipt } from 'viem/actions';\nimport type {\n ERC20PermitHandler,\n ExecutionPlanHandler,\n SwapSignatureHandler,\n TransactionResult,\n} from './types';\nimport { supportedChains, transactionError } from './viem';\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<TransactionResult, SigningError | TransactionError> {\n // TODO: verify it's on the correct chain, ask to switch if possible\n // TODO: verify if wallet account is correct, switch if possible\n const publicClient = createPublicClient({\n chain: supportedChains[request.chainId],\n transport: http(),\n });\n\n return ResultAsync.fromPromise(\n sendTransaction(privy, request, walletId),\n (err) => SigningError.from(err),\n )\n .map(async (hash) =>\n waitForTransactionReceipt(publicClient, {\n hash,\n pollingInterval: 100,\n retryCount: 20,\n retryDelay: 50,\n }),\n )\n .andThen((receipt) => {\n const hash = txHash(receipt.transactionHash);\n\n if (receipt.status === 'reverted') {\n return errAsync(\n transactionError(supportedChains[request.chainId], hash, request),\n );\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 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\nfunction signERC20Permit(\n privy: PrivyClient,\n walletId: string,\n result: PermitTypedDataResponse,\n): ReturnType<ERC20PermitHandler> {\n return ResultAsync.fromPromise(\n privy.walletApi.ethereum.signTypedData({\n walletId,\n typedData: {\n domain: result.domain,\n types: result.types,\n message: result.message,\n primaryType: result.primaryType,\n },\n }),\n (err) => SigningError.from(err),\n ).map((response) => ({\n deadline: result.message.deadline,\n value: signatureFrom(response.signature),\n }));\n}\n\n/**\n * Creates an ERC20 permit handler that signs ERC20 permits using the specified Privy wallet.\n */\nexport function signERC20PermitWith(\n privy: PrivyClient,\n walletId: string,\n): ERC20PermitHandler {\n return signERC20Permit.bind(null, privy, walletId);\n}\n\nfunction signSwapTypedData(\n privy: PrivyClient,\n walletId: string,\n result: SwapByIntentTypedData | CancelSwapTypedData,\n): ReturnType<SwapSignatureHandler> {\n const message = JSON.parse(result.message);\n return ResultAsync.fromPromise(\n privy.walletApi.ethereum.signTypedData({\n walletId,\n typedData: {\n domain: result.domain,\n types: result.types,\n message,\n primaryType: result.primaryType,\n },\n }),\n (err) => SigningError.from(err),\n ).map((response) => ({\n deadline: message.deadline,\n value: signatureFrom(response.signature),\n }));\n}\n\n/**\n * @internal\n * Creates a swap signature handler that signs swap typed data using the specified Privy wallet.\n */\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n): SwapSignatureHandler;\n/**\n * @internal\n * Signs swap typed data using the specified Privy wallet.\n */\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n result: SwapByIntentTypedData | CancelSwapTypedData,\n): ReturnType<SwapSignatureHandler>;\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n result?: SwapByIntentTypedData | CancelSwapTypedData,\n): SwapSignatureHandler | ReturnType<SwapSignatureHandler> {\n return result\n ? signSwapTypedData(privy, walletId, result)\n : signSwapTypedData.bind(null, privy, walletId);\n}\n"]}
1
+ {"version":3,"sources":["../src/viem.ts","../src/privy.ts"],"names":["devnetChain","defineChain","supportedChains","chainId","transactionError","chain","txHash","request","baseUrl","link","TransactionError","sendTransaction","privy","walletId","hash","sendTransactionAndWait","publicClient","createPublicClient","http","ResultAsync","err","SigningError","waitForTransactionReceipt","receipt","errAsync","okAsync","executePlan","result","ValidationError","sendWith","signERC20Permit","response","signatureFrom","signERC20PermitWith","signSwapTypedData","signature","signSwapTypedDataWith"],"mappings":"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","file":"privy.cjs","sourcesContent":["import {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n Chain,\n ExecutionPlan,\n PermitTypedDataResponse,\n SwapTypedData,\n TransactionRequest,\n} from '@aave/graphql';\nimport {\n type ChainId,\n chainId,\n errAsync,\n invariant,\n isObject,\n okAsync,\n ResultAsync,\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 type TypedData,\n type TypedDataDomain,\n UserRejectedRequestError,\n type Chain as ViemChain,\n type WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n signTypedData,\n waitForTransactionReceipt,\n} from 'viem/actions';\nimport { mainnet, sepolia } from 'viem/chains';\nimport type { AaveClient } from './AaveClient';\nimport { chain as fetchChain } from './actions';\nimport type {\n ERC20PermitHandler,\n ExecutionPlanHandler,\n SwapSignatureHandler,\n TransactionResult,\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\nconst devnetChain: ViemChain = defineChain({\n id: Number.parseInt(import.meta.env.ETHEREUM_TENDERLY_FORK_ID, 10),\n name: 'Devnet',\n network: 'ethereum-fork',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [import.meta.env.ETHEREUM_TENDERLY_PUBLIC_RPC] },\n },\n blockExplorers: {\n default: {\n name: 'Devnet Explorer',\n url: import.meta.env.ETHEREUM_TENDERLY_BLOCKEXPLORER,\n },\n },\n});\n\n/**\n * @internal\n * @deprecated\n */\nexport const supportedChains: Record<ChainId, ViemChain> = {\n [chainId(devnetChain.id)]: devnetChain,\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 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\nfunction signERC20Permit(\n walletClient: WalletClient,\n result: PermitTypedDataResponse,\n): ReturnType<ERC20PermitHandler> {\n invariant(walletClient.account, 'Wallet account is required');\n\n return ResultAsync.fromPromise(\n signTypedData(walletClient, {\n account: walletClient.account,\n domain: result.domain as TypedDataDomain,\n types: result.types as TypedData,\n primaryType: result.primaryType as keyof typeof result.types,\n message: result.message,\n }),\n (err) => SigningError.from(err),\n ).map((hex) => ({\n deadline: result.message.deadline,\n value: signatureFrom(hex),\n }));\n}\n\n/**\n * Creates an ERC20 permit handler that signs ERC20 permits using the provided wallet client.\n */\nexport function signERC20PermitWith(\n walletClient: WalletClient,\n): ERC20PermitHandler {\n return signERC20Permit.bind(null, walletClient);\n}\n\nfunction signSwapTypedData(\n walletClient: WalletClient,\n result: SwapTypedData,\n): ReturnType<SwapSignatureHandler> {\n invariant(walletClient.account, 'Wallet account is required');\n\n return ResultAsync.fromPromise(\n signTypedData(walletClient, {\n account: walletClient.account,\n domain: result.domain as TypedDataDomain,\n types: result.types as TypedData,\n primaryType: result.primaryType,\n message: result.message,\n }),\n (err) => SigningError.from(err),\n ).map(signatureFrom);\n}\n\n/**\n * @internal\n * Creates a swap signature handler that signs swap typed data using the provided wallet client.\n */\nexport function signSwapTypedDataWith(\n walletClient: WalletClient,\n): SwapSignatureHandler;\n/**\n * @internal\n * Signs swap typed data using the provided wallet client.\n */\nexport function signSwapTypedDataWith(\n walletClient: WalletClient,\n result: SwapTypedData,\n): ReturnType<SwapSignatureHandler>;\nexport function signSwapTypedDataWith(\n walletClient: WalletClient,\n result?: SwapTypedData,\n): SwapSignatureHandler | ReturnType<SwapSignatureHandler> {\n return result\n ? signSwapTypedData(walletClient, result)\n : signSwapTypedData.bind(null, walletClient);\n}\n","import {\n SigningError,\n type TransactionError,\n ValidationError,\n} from '@aave/core';\nimport type {\n ExecutionPlan,\n PermitTypedDataResponse,\n SwapTypedData,\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, http } from 'viem';\nimport { waitForTransactionReceipt } from 'viem/actions';\nimport type {\n ERC20PermitHandler,\n ExecutionPlanHandler,\n SwapSignatureHandler,\n TransactionResult,\n} from './types';\nimport { supportedChains, transactionError } from './viem';\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<TransactionResult, SigningError | TransactionError> {\n // TODO: verify it's on the correct chain, ask to switch if possible\n // TODO: verify if wallet account is correct, switch if possible\n const publicClient = createPublicClient({\n chain: supportedChains[request.chainId],\n transport: http(),\n });\n\n return ResultAsync.fromPromise(\n sendTransaction(privy, request, walletId),\n (err) => SigningError.from(err),\n )\n .map(async (hash) =>\n waitForTransactionReceipt(publicClient, {\n hash,\n pollingInterval: 100,\n retryCount: 20,\n retryDelay: 50,\n }),\n )\n .andThen((receipt) => {\n const hash = txHash(receipt.transactionHash);\n\n if (receipt.status === 'reverted') {\n return errAsync(\n transactionError(supportedChains[request.chainId], hash, request),\n );\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 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\nfunction signERC20Permit(\n privy: PrivyClient,\n walletId: string,\n result: PermitTypedDataResponse,\n): ReturnType<ERC20PermitHandler> {\n return ResultAsync.fromPromise(\n privy.walletApi.ethereum.signTypedData({\n walletId,\n typedData: {\n domain: result.domain,\n types: result.types,\n message: result.message,\n primaryType: result.primaryType,\n },\n }),\n (err) => SigningError.from(err),\n ).map((response) => ({\n deadline: result.message.deadline,\n value: signatureFrom(response.signature),\n }));\n}\n\n/**\n * Creates an ERC20 permit handler that signs ERC20 permits using the specified Privy wallet.\n */\nexport function signERC20PermitWith(\n privy: PrivyClient,\n walletId: string,\n): ERC20PermitHandler {\n return signERC20Permit.bind(null, privy, walletId);\n}\n\nfunction signSwapTypedData(\n privy: PrivyClient,\n walletId: string,\n result: SwapTypedData,\n): ReturnType<SwapSignatureHandler> {\n return ResultAsync.fromPromise(\n privy.walletApi.ethereum.signTypedData({\n walletId,\n typedData: {\n domain: result.domain,\n types: result.types,\n message: result.message,\n primaryType: result.primaryType,\n },\n }),\n (err) => SigningError.from(err),\n ).map(({ signature }) => signatureFrom(signature));\n}\n\n/**\n * @internal\n * Creates a swap signature handler that signs swap typed data using the specified Privy wallet.\n */\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n): SwapSignatureHandler;\n/**\n * @internal\n * Signs swap typed data using the specified Privy wallet.\n */\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n result: SwapTypedData,\n): ReturnType<SwapSignatureHandler>;\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n result?: SwapTypedData,\n): SwapSignatureHandler | ReturnType<SwapSignatureHandler> {\n return result\n ? signSwapTypedData(privy, walletId, result)\n : signSwapTypedData.bind(null, privy, walletId);\n}\n"]}
package/dist/privy.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- import { ExecutionPlan, SwapByIntentTypedData, CancelSwapTypedData } from '@aave/graphql';
1
+ import { ExecutionPlan, SwapTypedData } from '@aave/graphql';
2
2
  import { PrivyClient } from '@privy-io/server-auth';
3
- import { E as ExecutionPlanHandler, a as ERC20PermitHandler, S as SwapSignatureHandler } from './types-Bu63z0x6.cjs';
3
+ import { E as ExecutionPlanHandler, a as ERC20PermitHandler, S as SwapSignatureHandler } from './types-BQNpCzsV.cjs';
4
4
  import '@aave/core';
5
5
  import '@aave/types';
6
6
 
@@ -25,6 +25,6 @@ declare function signSwapTypedDataWith(privy: PrivyClient, walletId: string): Sw
25
25
  * @internal
26
26
  * Signs swap typed data using the specified Privy wallet.
27
27
  */
28
- declare function signSwapTypedDataWith(privy: PrivyClient, walletId: string, result: SwapByIntentTypedData | CancelSwapTypedData): ReturnType<SwapSignatureHandler>;
28
+ declare function signSwapTypedDataWith(privy: PrivyClient, walletId: string, result: SwapTypedData): ReturnType<SwapSignatureHandler>;
29
29
 
30
30
  export { sendWith, signERC20PermitWith, signSwapTypedDataWith };
package/dist/privy.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { ExecutionPlan, SwapByIntentTypedData, CancelSwapTypedData } from '@aave/graphql';
1
+ import { ExecutionPlan, SwapTypedData } from '@aave/graphql';
2
2
  import { PrivyClient } from '@privy-io/server-auth';
3
- import { E as ExecutionPlanHandler, a as ERC20PermitHandler, S as SwapSignatureHandler } from './types-Bu63z0x6.js';
3
+ import { E as ExecutionPlanHandler, a as ERC20PermitHandler, S as SwapSignatureHandler } from './types-BQNpCzsV.js';
4
4
  import '@aave/core';
5
5
  import '@aave/types';
6
6
 
@@ -25,6 +25,6 @@ declare function signSwapTypedDataWith(privy: PrivyClient, walletId: string): Sw
25
25
  * @internal
26
26
  * Signs swap typed data using the specified Privy wallet.
27
27
  */
28
- declare function signSwapTypedDataWith(privy: PrivyClient, walletId: string, result: SwapByIntentTypedData | CancelSwapTypedData): ReturnType<SwapSignatureHandler>;
28
+ declare function signSwapTypedDataWith(privy: PrivyClient, walletId: string, result: SwapTypedData): ReturnType<SwapSignatureHandler>;
29
29
 
30
30
  export { sendWith, signERC20PermitWith, signSwapTypedDataWith };
package/dist/privy.js CHANGED
@@ -1,2 +1,2 @@
1
- import {a,f}from'./chunk-SRVGACO7.js';import'./chunk-HH3XCL5T.js';import {ValidationError,SigningError}from'@aave/core';import {errAsync,ResultAsync,signatureFrom,txHash,okAsync}from'@aave/types';import {createPublicClient,http}from'viem';import {waitForTransactionReceipt}from'viem/actions';async function S(e,n,a){let{hash:t}=await e.walletApi.ethereum.sendTransaction({walletId:a,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(t)}function o(e,n,a$1){let t=createPublicClient({chain:a[n.chainId],transport:http()});return ResultAsync.fromPromise(S(e,n,a$1),r=>SigningError.from(r)).map(async r=>waitForTransactionReceipt(t,{hash:r,pollingInterval:100,retryCount:20,retryDelay:50})).andThen(r=>{let c=txHash(r.transactionHash);return r.status==="reverted"?errAsync(f(a[n.chainId],c,n)):okAsync({txHash:c,operations:n.operations})})}function d(e,n,a){switch(a.__typename){case "TransactionRequest":return o(e,a,n);case "Erc20ApprovalRequired":case "PreContractActionRequired":return o(e,a.transaction,n).andThen(()=>o(e,a.originalTransaction,n));case "InsufficientBalanceError":return errAsync(ValidationError.fromGqlNode(a))}}function D(e,n,a){return a?d(e,n,a):d.bind(null,e,n)}function C(e,n,a){return ResultAsync.fromPromise(e.walletApi.ethereum.signTypedData({walletId:n,typedData:{domain:a.domain,types:a.types,message:a.message,primaryType:a.primaryType}}),t=>SigningError.from(t)).map(t=>({deadline:a.message.deadline,value:signatureFrom(t.signature)}))}function I(e,n){return C.bind(null,e,n)}function y(e,n,a){let t=JSON.parse(a.message);return ResultAsync.fromPromise(e.walletApi.ethereum.signTypedData({walletId:n,typedData:{domain:a.domain,types:a.types,message:t,primaryType:a.primaryType}}),r=>SigningError.from(r)).map(r=>({deadline:t.deadline,value:signatureFrom(r.signature)}))}function A(e,n,a){return a?y(e,n,a):y.bind(null,e,n)}export{D as sendWith,I as signERC20PermitWith,A as signSwapTypedDataWith};//# sourceMappingURL=privy.js.map
1
+ import {a,f}from'./chunk-Y2VUAIEB.js';import'./chunk-SE3G6F7Q.js';import {ValidationError,SigningError}from'@aave/core';import {errAsync,ResultAsync,signatureFrom,txHash,okAsync}from'@aave/types';import {createPublicClient,http}from'viem';import {waitForTransactionReceipt}from'viem/actions';async function E(a,n,t){let{hash:e}=await a.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(e)}function o(a$1,n,t){let e=createPublicClient({chain:a[n.chainId],transport:http()});return ResultAsync.fromPromise(E(a$1,n,t),r=>SigningError.from(r)).map(async r=>waitForTransactionReceipt(e,{hash:r,pollingInterval:100,retryCount:20,retryDelay:50})).andThen(r=>{let c=txHash(r.transactionHash);return r.status==="reverted"?errAsync(f(a[n.chainId],c,n)):okAsync({txHash:c,operations:n.operations})})}function d(a,n,t){switch(t.__typename){case "TransactionRequest":return o(a,t,n);case "Erc20ApprovalRequired":case "PreContractActionRequired":return o(a,t.transaction,n).andThen(()=>o(a,t.originalTransaction,n));case "InsufficientBalanceError":return errAsync(ValidationError.fromGqlNode(t))}}function D(a,n,t){return t?d(a,n,t):d.bind(null,a,n)}function R(a,n,t){return ResultAsync.fromPromise(a.walletApi.ethereum.signTypedData({walletId:n,typedData:{domain:t.domain,types:t.types,message:t.message,primaryType:t.primaryType}}),e=>SigningError.from(e)).map(e=>({deadline:t.message.deadline,value:signatureFrom(e.signature)}))}function A(a,n){return R.bind(null,a,n)}function y(a,n,t){return ResultAsync.fromPromise(a.walletApi.ethereum.signTypedData({walletId:n,typedData:{domain:t.domain,types:t.types,message:t.message,primaryType:t.primaryType}}),e=>SigningError.from(e)).map(({signature:e})=>signatureFrom(e))}function I(a,n,t){return t?y(a,n,t):y.bind(null,a,n)}export{D as sendWith,A as signERC20PermitWith,I as signSwapTypedDataWith};//# sourceMappingURL=privy.js.map
2
2
  //# sourceMappingURL=privy.js.map
package/dist/privy.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/privy.ts"],"names":["sendTransaction","privy","request","walletId","hash","txHash","sendTransactionAndWait","publicClient","createPublicClient","supportedChains","http","ResultAsync","err","SigningError","waitForTransactionReceipt","receipt","errAsync","transactionError","okAsync","executePlan","result","ValidationError","sendWith","signERC20Permit","response","signatureFrom","signERC20PermitWith","signSwapTypedData","message","signSwapTypedDataWith"],"mappings":"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","file":"privy.js","sourcesContent":["import {\n SigningError,\n type TransactionError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\n ExecutionPlan,\n PermitTypedDataResponse,\n SwapByIntentTypedData,\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, http } from 'viem';\nimport { waitForTransactionReceipt } from 'viem/actions';\nimport type {\n ERC20PermitHandler,\n ExecutionPlanHandler,\n SwapSignatureHandler,\n TransactionResult,\n} from './types';\nimport { supportedChains, transactionError } from './viem';\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<TransactionResult, SigningError | TransactionError> {\n // TODO: verify it's on the correct chain, ask to switch if possible\n // TODO: verify if wallet account is correct, switch if possible\n const publicClient = createPublicClient({\n chain: supportedChains[request.chainId],\n transport: http(),\n });\n\n return ResultAsync.fromPromise(\n sendTransaction(privy, request, walletId),\n (err) => SigningError.from(err),\n )\n .map(async (hash) =>\n waitForTransactionReceipt(publicClient, {\n hash,\n pollingInterval: 100,\n retryCount: 20,\n retryDelay: 50,\n }),\n )\n .andThen((receipt) => {\n const hash = txHash(receipt.transactionHash);\n\n if (receipt.status === 'reverted') {\n return errAsync(\n transactionError(supportedChains[request.chainId], hash, request),\n );\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 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\nfunction signERC20Permit(\n privy: PrivyClient,\n walletId: string,\n result: PermitTypedDataResponse,\n): ReturnType<ERC20PermitHandler> {\n return ResultAsync.fromPromise(\n privy.walletApi.ethereum.signTypedData({\n walletId,\n typedData: {\n domain: result.domain,\n types: result.types,\n message: result.message,\n primaryType: result.primaryType,\n },\n }),\n (err) => SigningError.from(err),\n ).map((response) => ({\n deadline: result.message.deadline,\n value: signatureFrom(response.signature),\n }));\n}\n\n/**\n * Creates an ERC20 permit handler that signs ERC20 permits using the specified Privy wallet.\n */\nexport function signERC20PermitWith(\n privy: PrivyClient,\n walletId: string,\n): ERC20PermitHandler {\n return signERC20Permit.bind(null, privy, walletId);\n}\n\nfunction signSwapTypedData(\n privy: PrivyClient,\n walletId: string,\n result: SwapByIntentTypedData | CancelSwapTypedData,\n): ReturnType<SwapSignatureHandler> {\n const message = JSON.parse(result.message);\n return ResultAsync.fromPromise(\n privy.walletApi.ethereum.signTypedData({\n walletId,\n typedData: {\n domain: result.domain,\n types: result.types,\n message,\n primaryType: result.primaryType,\n },\n }),\n (err) => SigningError.from(err),\n ).map((response) => ({\n deadline: message.deadline,\n value: signatureFrom(response.signature),\n }));\n}\n\n/**\n * @internal\n * Creates a swap signature handler that signs swap typed data using the specified Privy wallet.\n */\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n): SwapSignatureHandler;\n/**\n * @internal\n * Signs swap typed data using the specified Privy wallet.\n */\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n result: SwapByIntentTypedData | CancelSwapTypedData,\n): ReturnType<SwapSignatureHandler>;\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n result?: SwapByIntentTypedData | CancelSwapTypedData,\n): SwapSignatureHandler | ReturnType<SwapSignatureHandler> {\n return result\n ? signSwapTypedData(privy, walletId, result)\n : signSwapTypedData.bind(null, privy, walletId);\n}\n"]}
1
+ {"version":3,"sources":["../src/privy.ts"],"names":["sendTransaction","privy","request","walletId","hash","txHash","sendTransactionAndWait","publicClient","createPublicClient","supportedChains","http","ResultAsync","err","SigningError","waitForTransactionReceipt","receipt","errAsync","transactionError","okAsync","executePlan","result","ValidationError","sendWith","signERC20Permit","response","signatureFrom","signERC20PermitWith","signSwapTypedData","signature","signSwapTypedDataWith"],"mappings":"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","file":"privy.js","sourcesContent":["import {\n SigningError,\n type TransactionError,\n ValidationError,\n} from '@aave/core';\nimport type {\n ExecutionPlan,\n PermitTypedDataResponse,\n SwapTypedData,\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, http } from 'viem';\nimport { waitForTransactionReceipt } from 'viem/actions';\nimport type {\n ERC20PermitHandler,\n ExecutionPlanHandler,\n SwapSignatureHandler,\n TransactionResult,\n} from './types';\nimport { supportedChains, transactionError } from './viem';\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<TransactionResult, SigningError | TransactionError> {\n // TODO: verify it's on the correct chain, ask to switch if possible\n // TODO: verify if wallet account is correct, switch if possible\n const publicClient = createPublicClient({\n chain: supportedChains[request.chainId],\n transport: http(),\n });\n\n return ResultAsync.fromPromise(\n sendTransaction(privy, request, walletId),\n (err) => SigningError.from(err),\n )\n .map(async (hash) =>\n waitForTransactionReceipt(publicClient, {\n hash,\n pollingInterval: 100,\n retryCount: 20,\n retryDelay: 50,\n }),\n )\n .andThen((receipt) => {\n const hash = txHash(receipt.transactionHash);\n\n if (receipt.status === 'reverted') {\n return errAsync(\n transactionError(supportedChains[request.chainId], hash, request),\n );\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 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\nfunction signERC20Permit(\n privy: PrivyClient,\n walletId: string,\n result: PermitTypedDataResponse,\n): ReturnType<ERC20PermitHandler> {\n return ResultAsync.fromPromise(\n privy.walletApi.ethereum.signTypedData({\n walletId,\n typedData: {\n domain: result.domain,\n types: result.types,\n message: result.message,\n primaryType: result.primaryType,\n },\n }),\n (err) => SigningError.from(err),\n ).map((response) => ({\n deadline: result.message.deadline,\n value: signatureFrom(response.signature),\n }));\n}\n\n/**\n * Creates an ERC20 permit handler that signs ERC20 permits using the specified Privy wallet.\n */\nexport function signERC20PermitWith(\n privy: PrivyClient,\n walletId: string,\n): ERC20PermitHandler {\n return signERC20Permit.bind(null, privy, walletId);\n}\n\nfunction signSwapTypedData(\n privy: PrivyClient,\n walletId: string,\n result: SwapTypedData,\n): ReturnType<SwapSignatureHandler> {\n return ResultAsync.fromPromise(\n privy.walletApi.ethereum.signTypedData({\n walletId,\n typedData: {\n domain: result.domain,\n types: result.types,\n message: result.message,\n primaryType: result.primaryType,\n },\n }),\n (err) => SigningError.from(err),\n ).map(({ signature }) => signatureFrom(signature));\n}\n\n/**\n * @internal\n * Creates a swap signature handler that signs swap typed data using the specified Privy wallet.\n */\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n): SwapSignatureHandler;\n/**\n * @internal\n * Signs swap typed data using the specified Privy wallet.\n */\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n result: SwapTypedData,\n): ReturnType<SwapSignatureHandler>;\nexport function signSwapTypedDataWith(\n privy: PrivyClient,\n walletId: string,\n result?: SwapTypedData,\n): SwapSignatureHandler | ReturnType<SwapSignatureHandler> {\n return result\n ? signSwapTypedData(privy, walletId, result)\n : signSwapTypedData.bind(null, privy, walletId);\n}\n"]}