@aave/client 4.0.0-next.2 → 4.0.0-next.3

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.
@@ -0,0 +1,3 @@
1
+ import {TransactionError,UnexpectedError,CancelError,SigningError,ValidationError}from'@aave/core';import {chainId,invariant,ResultAsync,txHash,okAsync,errAsync,signatureFrom,isObject}from'@aave/types';import {defineChain,SwitchChainError,UserRejectedRequestError,TransactionExecutionError}from'viem';import {waitForTransactionReceipt,sendTransaction,signTypedData,estimateGas}from'viem/actions';function p(n){return isObject(n)&&"code"in n&&"message"in n}function U(n){return isObject(n)&&"name"in n&&"message"in n&&"originalError"in n?p(n.originalError)&&"code"in n.originalError:true}var m=defineChain({id:Number.parseInt("123456789",10),name:"Devnet",network:"ethereum-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"]}},blockExplorers:{default:{name:"Devnet Explorer",url:"https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"}}}),T={[chainId(m.id)]:m};function _(n,e){return ResultAsync.fromPromise(n.getChainId(),a=>SigningError.from(a)).andThen(a=>a===e.chainId?okAsync():ResultAsync.fromPromise(n.switchChain({id:e.chainId}),r=>SigningError.from(r)).orElse(r=>(p(r.cause)?r.cause.code:U(r.cause)?r.cause.data?.originalError?.code:void 0)===SwitchChainError.code&&e.chainId in T?ResultAsync.fromPromise(n.addChain({chain:T[e.chainId]}),c=>p(c)&&c.code===UserRejectedRequestError.code?CancelError.from(c):SigningError.from(c)):r.asResultAsync()))}function k(n,e){return ResultAsync.fromPromise(estimateGas(n,{account:n.account,data:e.data,to:e.to,value:BigInt(e.value)}),a=>SigningError.from(a)).map(a=>a*115n/100n)}function B(n,e){return k(n,e).andThen(a=>ResultAsync.fromPromise(sendTransaction(n,{account:n.account,data:e.data,to:e.to,value:BigInt(e.value),chain:n.chain,gas:a}),r=>{if(r instanceof TransactionExecutionError){let t=r.walk(c=>c instanceof UserRejectedRequestError);if(t)return CancelError.from(t)}return SigningError.from(r)})).map(txHash)}function L(n){return n.account!==void 0}function N(n,e){return invariant(L(n),"Wallet client with account is required"),_(n,e).andThen(a=>B(n,e))}function q(n,e,a){let r=n?.blockExplorers?.default?.url,t=r&&new URL(`/tx/${e}`,r).toString();return TransactionError.new({txHash:e,request:a,link:t})}function O(n,e,a){return ResultAsync.fromPromise(waitForTransactionReceipt(n,{hash:a,pollingInterval:100,retryCount:20,retryDelay:50}),r=>UnexpectedError.from(r)).andThen(r=>{let t=txHash(r.transactionHash);switch(r.status){case "reverted":return a!==t?errAsync(CancelError.from(`Transaction replaced by ${t}`)):errAsync(q(n.chain,t,e));case "success":return okAsync({txHash:t,operations:e.operations})}})}function s(n,e){return N(n,e).andThen(a=>O(n,e,a))}function y(n,e){switch(e.__typename){case "TransactionRequest":return s(n,e);case "Erc20ApprovalRequired":case "PreContractActionRequired":return s(n,e.transaction).andThen(()=>s(n,e.originalTransaction));case "InsufficientBalanceError":return errAsync(ValidationError.fromGqlNode(e))}}function Y(n,e){return e?y(n,e):y.bind(null,n)}function F(n,e){return invariant(n.account,"Wallet account is required"),ResultAsync.fromPromise(signTypedData(n,{account:n.account,domain:e.domain,types:e.types,primaryType:e.primaryType,message:e.message}),a=>SigningError.from(a)).map(a=>({deadline:e.message.deadline,value:signatureFrom(a)}))}function J(n){return F.bind(null,n)}function E(n,e){return invariant(n.account,"Wallet account is required"),ResultAsync.fromPromise(signTypedData(n,{account:n.account,domain:e.domain,types:e.types,primaryType:e.primaryType,message:JSON.parse(e.message)}),a=>SigningError.from(a)).map(a=>({deadline:JSON.parse(e.message).deadline,value:signatureFrom(a)}))}function K(n,e){return e?E(n,e):E.bind(null,n)}
2
+ export{m as a,T as b,N as c,q as d,O as e,Y as f,J as g,K as h};//# sourceMappingURL=chunk-2URLJFKP.js.map
3
+ //# sourceMappingURL=chunk-2URLJFKP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/viem.ts"],"names":["isRpcError","err","isObject","isProviderRpcError","devnetChain","defineChain","supportedChains","chainId","ensureChain","walletClient","request","ResultAsync","SigningError","okAsync","SwitchChainError","UserRejectedRequestError","CancelError","estimateGas","estimateGasWithViem","gas","sendEip1559Transaction","sendTransactionWithViem","TransactionExecutionError","rejected","txHash","isWalletClientWithAccount","sendTransaction","invariant","_","transactionError","chain","baseUrl","link","TransactionError","waitForTransactionResult","initialTxHash","waitForTransactionReceipt","UnexpectedError","receipt","hash","errAsync","sendTransactionAndWait","executePlan","result","ValidationError","sendWith","signERC20Permit","signTypedData","hex","signatureFrom","signERC20PermitWith","signSwapTypedData","signSwapTypedDataWith"],"mappings":"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","file":"chunk-2TNQ52OQ.js","sourcesContent":["import {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\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 type Chain,\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 WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n signTypedData,\n waitForTransactionReceipt,\n} from 'viem/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\n/**\n * @internal\n */\nexport const devnetChain: Chain = 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 */\nexport const supportedChains: Record<\n ChainId,\n ReturnType<typeof defineChain>\n> = {\n // TODO add them back when deployed on these chains\n // [chainId(mainnet.id)]: mainnet,\n // [chainId(sepolia.id)]: sepolia,\n [chainId(devnetChain.id)]: devnetChain,\n};\n\nfunction ensureChain(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<void, CancelError | SigningError> {\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 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 (\n code === SwitchChainError.code &&\n request.chainId in supportedChains\n ) {\n return ResultAsync.fromPromise(\n walletClient.addChain({ chain: supportedChains[request.chainId] }),\n (err) => {\n if (isRpcError(err) && err.code === UserRejectedRequestError.code) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n );\n }\n\n return err.asResultAsync();\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, Chain, 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, Chain, 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 ensureChain(walletClient, request).andThen((_) =>\n sendEip1559Transaction(walletClient, request),\n );\n}\n\n/**\n * @internal\n */\nexport function transactionError(\n chain: Chain | 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"]}
1
+ {"version":3,"sources":["../src/viem.ts"],"names":["isRpcError","err","isObject","isProviderRpcError","devnetChain","defineChain","supportedChains","chainId","ensureChain","walletClient","request","ResultAsync","SigningError","okAsync","SwitchChainError","UserRejectedRequestError","CancelError","estimateGas","estimateGasWithViem","gas","sendEip1559Transaction","sendTransactionWithViem","TransactionExecutionError","rejected","txHash","isWalletClientWithAccount","sendTransaction","invariant","_","transactionError","chain","baseUrl","link","TransactionError","waitForTransactionResult","initialTxHash","waitForTransactionReceipt","UnexpectedError","receipt","hash","errAsync","sendTransactionAndWait","executePlan","result","ValidationError","sendWith","signERC20Permit","signTypedData","hex","signatureFrom","signERC20PermitWith","signSwapTypedData","signSwapTypedDataWith"],"mappings":"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","file":"chunk-2URLJFKP.js","sourcesContent":["import {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\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 type Chain,\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 WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n signTypedData,\n waitForTransactionReceipt,\n} from 'viem/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\n/**\n * @internal\n */\nexport const devnetChain: Chain = 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 */\nexport const supportedChains: Record<\n ChainId,\n ReturnType<typeof defineChain>\n> = {\n // TODO add them back when deployed on these chains\n // [chainId(mainnet.id)]: mainnet,\n // [chainId(sepolia.id)]: sepolia,\n [chainId(devnetChain.id)]: devnetChain,\n};\n\nfunction ensureChain(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<void, CancelError | SigningError> {\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 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 (\n code === SwitchChainError.code &&\n request.chainId in supportedChains\n ) {\n return ResultAsync.fromPromise(\n walletClient.addChain({ chain: supportedChains[request.chainId] }),\n (err) => {\n if (isRpcError(err) && err.code === UserRejectedRequestError.code) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n );\n }\n\n return err.asResultAsync();\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, Chain, 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, Chain, 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 ensureChain(walletClient, request).andThen((_) =>\n sendEip1559Transaction(walletClient, request),\n );\n}\n\n/**\n * @internal\n */\nexport function transactionError(\n chain: Chain | 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"]}
package/dist/privy.cjs CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';var core=require('@aave/core'),types=require('@aave/types'),viem=require('viem'),actions=require('viem/actions');var d=viem.defineChain({id:Number.parseInt("123456789",10),name:"Devnet",network:"ethereum-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"]}},blockExplorers:{default:{name:"Devnet Explorer",url:"https://dashboard.tenderly.co/explorer/vnet/dbaa58ab-597b-4bcd-ae6a-b8e50f716146/"}}}),i={[types.chainId(d.id)]:d};function u(a,n,e){let t=a?.blockExplorers?.default?.url,r=t&&new URL(`/tx/${n}`,t).toString();return core.TransactionError.new({txHash:n,request:e,link:r})}async function D(a,n,e){let{hash:t}=await a.walletApi.ethereum.sendTransaction({walletId:e,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 types.txHash(t)}function o(a,n,e){let t=viem.createPublicClient({chain:i[n.chainId],transport:viem.http()});return types.ResultAsync.fromPromise(D(a,n,e),r=>core.SigningError.from(r)).map(async r=>actions.waitForTransactionReceipt(t,{hash:r,pollingInterval:100,retryCount:20,retryDelay:50})).andThen(r=>{let p=types.txHash(r.transactionHash);return r.status==="reverted"?types.errAsync(u(i[n.chainId],p,n)):types.okAsync({txHash:p,operations:n.operations})})}function l(a,n,e){switch(e.__typename){case "TransactionRequest":return o(a,e,n);case "Erc20ApprovalRequired":case "PreContractActionRequired":return o(a,e.transaction,n).andThen(()=>o(a,e.originalTransaction,n));case "InsufficientBalanceError":return types.errAsync(core.ValidationError.fromGqlNode(e))}}function en(a,n,e){return e?l(a,n,e):l.bind(null,a,n)}function v(a,n,e){return types.ResultAsync.fromPromise(a.walletApi.ethereum.signTypedData({walletId:n,typedData:{domain:e.domain,types:e.types,message:e.message,primaryType:e.primaryType}}),t=>core.SigningError.from(t)).map(t=>({deadline:e.message.deadline,value:types.signatureFrom(t.signature)}))}function an(a,n){return v.bind(null,a,n)}function y(a,n,e){let t=JSON.parse(e.message);return types.ResultAsync.fromPromise(a.walletApi.ethereum.signTypedData({walletId:n,typedData:{domain:e.domain,types:e.types,message:t,primaryType:e.primaryType}}),r=>core.SigningError.from(r)).map(r=>({deadline:t.deadline,value:types.signatureFrom(r.signature)}))}function tn(a,n,e){return e?y(a,n,e):y.bind(null,a,n)}
1
+ 'use strict';var core=require('@aave/core'),types=require('@aave/types'),viem=require('viem'),actions=require('viem/actions');var d=viem.defineChain({id:Number.parseInt("123456789",10),name:"Devnet",network:"ethereum-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"]}},blockExplorers:{default:{name:"Devnet Explorer",url:"https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"}}}),i={[types.chainId(d.id)]:d};function u(a,n,e){let t=a?.blockExplorers?.default?.url,r=t&&new URL(`/tx/${n}`,t).toString();return core.TransactionError.new({txHash:n,request:e,link:r})}async function D(a,n,e){let{hash:t}=await a.walletApi.ethereum.sendTransaction({walletId:e,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 types.txHash(t)}function o(a,n,e){let t=viem.createPublicClient({chain:i[n.chainId],transport:viem.http()});return types.ResultAsync.fromPromise(D(a,n,e),r=>core.SigningError.from(r)).map(async r=>actions.waitForTransactionReceipt(t,{hash:r,pollingInterval:100,retryCount:20,retryDelay:50})).andThen(r=>{let p=types.txHash(r.transactionHash);return r.status==="reverted"?types.errAsync(u(i[n.chainId],p,n)):types.okAsync({txHash:p,operations:n.operations})})}function l(a,n,e){switch(e.__typename){case "TransactionRequest":return o(a,e,n);case "Erc20ApprovalRequired":case "PreContractActionRequired":return o(a,e.transaction,n).andThen(()=>o(a,e.originalTransaction,n));case "InsufficientBalanceError":return types.errAsync(core.ValidationError.fromGqlNode(e))}}function en(a,n,e){return e?l(a,n,e):l.bind(null,a,n)}function v(a,n,e){return types.ResultAsync.fromPromise(a.walletApi.ethereum.signTypedData({walletId:n,typedData:{domain:e.domain,types:e.types,message:e.message,primaryType:e.primaryType}}),t=>core.SigningError.from(t)).map(t=>({deadline:e.message.deadline,value:types.signatureFrom(t.signature)}))}function an(a,n){return v.bind(null,a,n)}function y(a,n,e){let t=JSON.parse(e.message);return types.ResultAsync.fromPromise(a.walletApi.ethereum.signTypedData({walletId:n,typedData:{domain:e.domain,types:e.types,message:t,primaryType:e.primaryType}}),r=>core.SigningError.from(r)).map(r=>({deadline:t.deadline,value:types.signatureFrom(r.signature)}))}function tn(a,n,e){return e?y(a,n,e):y.bind(null,a,n)}
2
2
  exports.sendWith=en;exports.signERC20PermitWith=an;exports.signSwapTypedDataWith=tn;//# sourceMappingURL=privy.cjs.map
3
3
  //# sourceMappingURL=privy.cjs.map
@@ -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 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 type Chain,\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 WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n signTypedData,\n waitForTransactionReceipt,\n} from 'viem/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\n/**\n * @internal\n */\nexport const devnetChain: Chain = 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 */\nexport const supportedChains: Record<\n ChainId,\n ReturnType<typeof defineChain>\n> = {\n // TODO add them back when deployed on these chains\n // [chainId(mainnet.id)]: mainnet,\n // [chainId(sepolia.id)]: sepolia,\n [chainId(devnetChain.id)]: devnetChain,\n};\n\nfunction ensureChain(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<void, CancelError | SigningError> {\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 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 (\n code === SwitchChainError.code &&\n request.chainId in supportedChains\n ) {\n return ResultAsync.fromPromise(\n walletClient.addChain({ chain: supportedChains[request.chainId] }),\n (err) => {\n if (isRpcError(err) && err.code === UserRejectedRequestError.code) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n );\n }\n\n return err.asResultAsync();\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, Chain, 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, Chain, 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 ensureChain(walletClient, request).andThen((_) =>\n sendEip1559Transaction(walletClient, request),\n );\n}\n\n/**\n * @internal\n */\nexport function transactionError(\n chain: Chain | 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","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 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 type Chain,\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 WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n signTypedData,\n waitForTransactionReceipt,\n} from 'viem/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\n/**\n * @internal\n */\nexport const devnetChain: Chain = 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 */\nexport const supportedChains: Record<\n ChainId,\n ReturnType<typeof defineChain>\n> = {\n // TODO add them back when deployed on these chains\n // [chainId(mainnet.id)]: mainnet,\n // [chainId(sepolia.id)]: sepolia,\n [chainId(devnetChain.id)]: devnetChain,\n};\n\nfunction ensureChain(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<void, CancelError | SigningError> {\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 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 (\n code === SwitchChainError.code &&\n request.chainId in supportedChains\n ) {\n return ResultAsync.fromPromise(\n walletClient.addChain({ chain: supportedChains[request.chainId] }),\n (err) => {\n if (isRpcError(err) && err.code === UserRejectedRequestError.code) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n );\n }\n\n return err.asResultAsync();\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, Chain, 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, Chain, 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 ensureChain(walletClient, request).andThen((_) =>\n sendEip1559Transaction(walletClient, request),\n );\n}\n\n/**\n * @internal\n */\nexport function transactionError(\n chain: Chain | 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"]}
package/dist/privy.js CHANGED
@@ -1,2 +1,2 @@
1
- import {b,d as d$1}from'./chunk-2TNQ52OQ.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){let t=createPublicClient({chain:b[n.chainId],transport:http()});return ResultAsync.fromPromise(S(e,n,a),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(d$1(b[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 {b,d as d$1}from'./chunk-2URLJFKP.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){let t=createPublicClient({chain:b[n.chainId],transport:http()});return ResultAsync.fromPromise(S(e,n,a),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(d$1(b[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
2
2
  //# sourceMappingURL=privy.js.map
@@ -1,3 +1,3 @@
1
- 'use strict';var core=require('@aave/core'),graphql=require('@aave/graphql'),types=require('@aave/types'),viem=require('viem'),accounts=require('viem/accounts'),L=require('@aave/graphql/schema'),exchangeGraphcache=require('@urql/exchange-graphcache');require('viem/actions');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var L__default=/*#__PURE__*/_interopDefault(L);function C(e,t){return e.query(graphql.HasProcessedKnownTransactionQuery,{request:t},"network-only")}var A=(e,t,n,r)=>BigInt(e[r.fieldName]),c=(e,t,n,r)=>types.BigDecimal.new(e[r.fieldName]),p=(e,t,n,r)=>{let i=e[r.fieldName];return i==null?null:c(e,t,n,r)},a=(e,t,n,r)=>new Date(e[r.fieldName]),Y=(e,t,n,r)=>{let i=e[r.fieldName];return i==null?null:a(e,t,n,r)},x=exchangeGraphcache.cacheExchange({schema:L__default.default,resolvers:{PercentNumber:{onChainValue:A,value:c,normalized:c},DecimalNumber:{onChainValue:A,value:c},FiatAmount:{value:c},AssetPriceSample:{price:c,date:a},HubSummary:{utilizationRate:c},Reserve:{borrowCap:c,supplyCap:c},HealthFactorError:{current:p,after:p},HealthFactorVariation:{current:p,after:p},HealthFactorWithChange:{current:p},UserSummary:{lowestHealthFactor:p},UserSummaryHistoryItem:{healthFactor:p,date:a},TransactionRequest:{value:A},APYSample:{date:a},AssetBorrowSample:{date:a},AssetSupplySample:{date:a},BorrowActivity:{timestamp:a},LiquidatedActivity:{timestamp:a},RepayActivity:{timestamp:a},SupplyActivity:{timestamp:a},WithdrawActivity:{timestamp:a},UsingAsCollateralActivity:{timestamp:a},SpokeUserPositionManager:{approvedOn:a},SwapCancelled:{createdAt:a,cancelledAt:Y},SwapExpired:{createdAt:a,expiredAt:a},SwapFulfilled:{createdAt:a,fulfilledAt:a},SwapOpen:{createdAt:a,deadline:a},SwapPendingSignature:{createdAt:a,deadline:a},SwapReceipt:{createdAt:a},Query:{hub:(e,{request:t})=>graphql.isHubInputVariant(t.query)?{__typename:"Hub",id:graphql.encodeHubId(t.query.hubInput)}:{__typename:"Hub",id:t.query.hubId},activities:(e,t,n)=>{if(!graphql.isTxHashInputVariant(t.request.query))return n.resolve("Query","activities",t);let{txHash:r,chainId:i}=t.request.query.txHash,l=n.inspectFields("Query").filter(s=>s.fieldName==="activities").reduce((s,T)=>{let u=n.resolve("Query",T.fieldKey);if(!u)return s;let m=n.resolve(u,"items");if(!m)return s;for(let R of m)s.add(R);return s},new Set).values().toArray().filter(s=>{if(n.resolve(s,"txHash")!==r)return false;let u=n.resolve(s,"spoke");if(u){let m=n.resolve(u,"chain"),R=m?n.resolve(m,"chainId"):void 0;if(typeof R=="number")return R===i}return true}).sort((s,T)=>{let u=n.resolve(s,"id");return n.resolve(T,"id")<=u?1:-1});if(l.length!==0)return {__typename:"PaginatedActivitiesResult",items:l,pageInfo:{__typename:"PaginatedResultInfo",prev:null,next:null}}}}},keys:{Hub:e=>e.id,HubAsset:e=>e.id,Reserve:e=>e.id,ReserveInfo:e=>e.id,Spoke:e=>e.id,BorrowActivity:e=>e.id,LiquidatedActivity:e=>e.id,SupplyActivity:e=>e.id,SwapByIntent:e=>e.quote.quoteId,SwapByIntentWithApprovalRequired:e=>e.quote.quoteId,SwapByTransaction:e=>e.quote.quoteId,UserPosition:e=>e.id,UsingAsCollateralActivity:e=>e.id,WithdrawActivity:e=>e.id,RepayActivity:e=>e.id,Erc20Token:e=>e.address,Chain:e=>e.chainId.toString(),NativeToken:e=>e.chain.chainId.toString(),PaginatedActivitiesResult:()=>null,PaginatedResultInfo:()=>null,PaginatedSpokePositionManagerResult:()=>null,PaginatedSpokeUserPositionManagerResult:()=>null,PaginatedUserSwapsResult:()=>null,SpokePositionManger:()=>null,SpokeUserPositionManager:()=>null,SwapReceipt:()=>null,SwapTransactionRequest:()=>null,APYSample:()=>null,Asset:()=>null,AssetBorrowSample:()=>null,AssetPriceSample:()=>null,AssetSummary:()=>null,AssetSupplySample:()=>null,CancelSwapTypedData:()=>null,CancelSwapTypeDefinition:()=>null,DecimalNumber:()=>null,DecimalNumberWithChange:()=>null,DomainData:()=>null,Erc20Amount:()=>null,Erc20ApprovalRequired:()=>null,FiatAmount:()=>null,FiatAmountValueVariation:()=>null,FiatAmountWithChange:()=>null,ForkTopUpResponse:()=>null,HealthFactorError:()=>null,HealthFactorVariation:()=>null,HealthFactorWithChange:()=>null,HubAssetSettings:()=>null,HubAssetSummary:()=>null,HubAssetUserState:()=>null,HubSummary:()=>null,InsufficientBalanceError:()=>null,NativeAmount:()=>null,PercentNumber:()=>null,PercentNumberVariation:()=>null,PercentNumberWithChange:()=>null,PermitMessageData:()=>null,PermitTypedDataResponse:()=>null,PreContractActionRequired:()=>null,PrepareSwapCancelResult:()=>null,PreviewUserPosition:()=>null,ReserveSettings:()=>null,ReserveStatus:()=>null,ReserveSummary:()=>null,ReserveUserState:()=>null,SwapApprovalRequired:()=>null,SwapByIntentTypedData:()=>null,SwapByIntentTypeDefinition:()=>null,SwapCancelled:()=>null,SwapExpired:()=>null,SwapFulfilled:()=>null,SwapOpen:()=>null,SwapPendingSignature:()=>null,SwapQuote:()=>null,SwapQuoteCosts:()=>null,TokenInfo:()=>null,TransactionRequest:()=>null,TypeDefinition:()=>null,TypeField:()=>null,UserBalance:()=>null,UserBorrowItem:()=>null,UserSummary:()=>null,UserSummaryHistoryItem:()=>null,UserSupplyItem:()=>null}});var D={name:"production",backend:"https://api.v4.aave.com/graphql",indexingTimeout:6e4,pollingInterval:100,exchangeRateInterval:1e4},P={name:"staging",backend:"https://api.v4.staging.aave.com/graphql",indexingTimeout:6e4,pollingInterval:500,exchangeRateInterval:1e4},H={name:"local",backend:"http://localhost:3007/graphql",indexingTimeout:6e4,pollingInterval:1e3,exchangeRateInterval:1e4};function w({environment:e=D,headers:t,cache:n=true,debug:r=false,fragments:i=[]}){return {displayName:"AaveClient",environment:e,headers:t,cache:n?x:null,debug:r,fragments:i}}function b(e){return e.operations!==null&&e.operations.length>0}var h=class e extends core.GqlClient{static create(t){return new e(w(t??{}))}waitForTransaction=t=>(types.invariant(b(t),"Received a transaction result for an untracked operation. Make sure you're following the instructions in the docs."),types.ResultAsync.fromPromise(this.pollTransactionStatus(t),n=>n instanceof core.TimeoutError||n instanceof core.UnexpectedError?n:core.UnexpectedError.from(n)));async refreshQueryWhere(t,n){await this.refreshWhere(async r=>{if(r.query===t){let i=await this.query(t,r.variables,"cache-only");return i.isErr()?false:n(r.variables,i.value)}return false});}async pollTransactionStatus(t){let n=Date.now();for(;Date.now()-n<this.context.environment.indexingTimeout;){if(await C(this,t).match(i=>i,i=>{throw i}))return t.txHash;await core.delay(this.context.environment.pollingInterval);}throw core.TimeoutError.from(`Timeout waiting for transaction ${t.txHash} to be processed.`)}};var d=viem.defineChain({id:Number.parseInt("123456789",10),name:"Devnet",network:"ethereum-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"]}},blockExplorers:{default:{name:"Devnet Explorer",url:"https://dashboard.tenderly.co/explorer/vnet/dbaa58ab-597b-4bcd-ae6a-b8e50f716146/"}}});({[types.chainId(d.id)]:d});var ie=undefined.ENVIRONMENT==="local"?H:P,f=types.chainId(Number.parseInt("123456789",10)),dt=types.evmAddress("0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f"),mt=types.evmAddress("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),yt=types.evmAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"),Et=types.evmAddress("0xdC035D45d973E3EC169d2276DDab16f1e407384F"),ft=types.evmAddress("0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0"),Tt=types.evmAddress("0x111111111117dC0aa78b770fA6A738034120C302"),oe=types.evmAddress("0xBa97c5E52cd5BC3D7950Ae70779F8FfE92d40CdC"),Rt=graphql.encodeSpokeId({chainId:f,address:oe}),ht=types.evmAddress("0x2559E4E04F2cA7180e5f20C2872d22EC89601b56"),gt=types.evmAddress("0x5738d9cB82d6a1617973C257D05A387bF5568F47"),se=types.evmAddress("0x4D4a7b3Ce709b4362D7095a4A0105bDFDb5dA2a7"),St=graphql.encodeSpokeId({chainId:f,address:se}),le=types.evmAddress("0xaD905aD5EA5B98cD50AE40Cfe368344686a21366"),At=graphql.encodeHubId({chainId:f,address:le}),F="https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146",g=undefined.ETHEREUM_TENDERLY_ADMIN_RPC,vt=h.create({environment:ie,headers:{"x-e2e-tests":undefined.API_X_E2E_TESTS_HEADER}});async function Ct(e){if(!e){let t=accounts.generatePrivateKey(),n=viem.createWalletClient({account:accounts.privateKeyToAccount(t),chain:d,transport:viem.http()});return await ce(types.evmAddress(n.account.address)),n}return viem.createWalletClient({account:accounts.privateKeyToAccount(e),chain:d,transport:viem.http()})}function ce(e,t=types.bigDecimal("1.0")){let n=viem.createPublicClient({chain:{id:f,name:"Tenderly Fork",network:"tenderly-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:[g]}}},transport:viem.http(g)}),i=`0x${viem.parseEther(t.toString()).toString(16)}`;return types.ResultAsync.fromPromise(n.request({method:"tenderly_setBalance",params:[[e],i]}).then(async l=>(await k(500),l)),l=>core.UnexpectedError.from(l))}function xt(e,t){let n=viem.createPublicClient({chain:{id:f,name:"Tenderly Fork",network:"tenderly-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:[g]}}},transport:viem.http(g)}),i=`0x${viem.parseUnits(t.amount.toString(),t.decimals??18).toString(16)}`;return types.ResultAsync.fromPromise(n.request({method:"tenderly_setErc20Balance",params:[t.address,e,i]}).then(async l=>(await k(500),l)),l=>core.UnexpectedError.from(l))}var ue={[core.GraphQLErrorCode.UNAUTHENTICATED]:"Unauthenticated - Authentication is required to access '<operation>'",[core.GraphQLErrorCode.FORBIDDEN]:"Forbidden - You are not authorized to access '<operation>'",[core.GraphQLErrorCode.INTERNAL_SERVER_ERROR]:"Internal server error - Please try again later",[core.GraphQLErrorCode.BAD_USER_INPUT]:"Bad user input - Please check the input and try again",[core.GraphQLErrorCode.BAD_REQUEST]:"Bad request - Please check the request and try again"};function Dt(e){return {message:ue[e],locations:[],path:[],extensions:{code:e}}}function k(e){return new Promise(t=>setTimeout(t,e))}async function Pt(e,t){let n=viem.createPublicClient({chain:d,transport:viem.http(F)}),[r,i]=await Promise.all([n.readContract({address:t,abi:[{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"}],functionName:"balanceOf",args:[e]}),n.readContract({address:t,abi:[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"}],functionName:"decimals"})]);return types.bigDecimal(r).rescale(-i)}async function Ht(e){let n=await viem.createPublicClient({chain:d,transport:viem.http(F)}).getBalance({address:e});return types.bigDecimal(n).rescale(-18)}
2
- exports.ETHEREUM_1INCH_ADDRESS=Tt;exports.ETHEREUM_FORK_ID=f;exports.ETHEREUM_FORK_RPC_URL=F;exports.ETHEREUM_FORK_RPC_URL_ADMIN=g;exports.ETHEREUM_GHO_ADDRESS=dt;exports.ETHEREUM_HUB_CORE_ADDRESS=le;exports.ETHEREUM_HUB_CORE_ID=At;exports.ETHEREUM_SPOKE_CORE_ADDRESS=oe;exports.ETHEREUM_SPOKE_CORE_ID=Rt;exports.ETHEREUM_SPOKE_ETHENA_ADDRESS=ht;exports.ETHEREUM_SPOKE_FRONTIER_ADDRESS=gt;exports.ETHEREUM_SPOKE_ISO_STABLE_ID=St;exports.ETHEREUM_SPOKE_LST_ADDRESS=se;exports.ETHEREUM_USDC_ADDRESS=yt;exports.ETHEREUM_USDS_ADDRESS=Et;exports.ETHEREUM_WETH_ADDRESS=mt;exports.ETHEREUM_WSTETH_ADDRESS=ft;exports.client=vt;exports.createGraphQLErrorObject=Dt;exports.createNewWallet=Ct;exports.environment=ie;exports.fundErc20Address=xt;exports.fundNativeAddress=ce;exports.getBalance=Pt;exports.getNativeBalance=Ht;exports.wait=k;//# sourceMappingURL=test-utils.cjs.map
1
+ 'use strict';var core=require('@aave/core'),graphql=require('@aave/graphql'),types=require('@aave/types'),viem=require('viem'),accounts=require('viem/accounts'),L=require('@aave/graphql/schema'),exchangeGraphcache=require('@urql/exchange-graphcache');require('viem/actions');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var L__default=/*#__PURE__*/_interopDefault(L);function x(e,t){return e.query(graphql.HasProcessedKnownTransactionQuery,{request:t},"network-only")}var A=(e,t,n,r)=>BigInt(e[r.fieldName]),c=(e,t,n,r)=>types.BigDecimal.new(e[r.fieldName]),p=(e,t,n,r)=>{let i=e[r.fieldName];return i==null?null:c(e,t,n,r)},a=(e,t,n,r)=>new Date(e[r.fieldName]),Y=(e,t,n,r)=>{let i=e[r.fieldName];return i==null?null:a(e,t,n,r)},D=exchangeGraphcache.cacheExchange({schema:L__default.default,resolvers:{PercentNumber:{onChainValue:A,value:c,normalized:c},DecimalNumber:{onChainValue:A,value:c},FiatAmount:{value:c},AssetPriceSample:{price:c,date:a},HubSummary:{utilizationRate:c},Reserve:{borrowCap:c,supplyCap:c},HealthFactorError:{current:p,after:p},HealthFactorVariation:{current:p,after:p},HealthFactorWithChange:{current:p},UserSummary:{lowestHealthFactor:p},UserSummaryHistoryItem:{healthFactor:p,date:a},TransactionRequest:{value:A},APYSample:{date:a},AssetBorrowSample:{date:a},AssetSupplySample:{date:a},BorrowActivity:{timestamp:a},LiquidatedActivity:{timestamp:a},RepayActivity:{timestamp:a},SupplyActivity:{timestamp:a},WithdrawActivity:{timestamp:a},UsingAsCollateralActivity:{timestamp:a},SpokeUserPositionManager:{approvedOn:a},SwapCancelled:{createdAt:a,cancelledAt:Y},SwapExpired:{createdAt:a,expiredAt:a},SwapFulfilled:{createdAt:a,fulfilledAt:a},SwapOpen:{createdAt:a,deadline:a},SwapPendingSignature:{createdAt:a,deadline:a},SwapReceipt:{createdAt:a},Query:{hub:(e,{request:t})=>graphql.isHubInputVariant(t.query)?{__typename:"Hub",id:graphql.encodeHubId(t.query.hubInput)}:{__typename:"Hub",id:t.query.hubId},activities:(e,t,n)=>{if(!graphql.isTxHashInputVariant(t.request.query))return n.resolve("Query","activities",t);let{txHash:r,chainId:i}=t.request.query.txHash,l=n.inspectFields("Query").filter(s=>s.fieldName==="activities").reduce((s,T)=>{let u=n.resolve("Query",T.fieldKey);if(!u)return s;let m=n.resolve(u,"items");if(!m)return s;for(let R of m)s.add(R);return s},new Set).values().toArray().filter(s=>{if(n.resolve(s,"txHash")!==r)return false;let u=n.resolve(s,"spoke");if(u){let m=n.resolve(u,"chain"),R=m?n.resolve(m,"chainId"):void 0;if(typeof R=="number")return R===i}return true}).sort((s,T)=>{let u=n.resolve(s,"id");return n.resolve(T,"id")<=u?1:-1});if(l.length!==0)return {__typename:"PaginatedActivitiesResult",items:l,pageInfo:{__typename:"PaginatedResultInfo",prev:null,next:null}}}}},keys:{Hub:e=>e.id,HubAsset:e=>e.id,Reserve:e=>e.id,ReserveInfo:e=>e.id,Spoke:e=>e.id,BorrowActivity:e=>e.id,LiquidatedActivity:e=>e.id,SupplyActivity:e=>e.id,SwapByIntent:e=>e.quote.quoteId,SwapByIntentWithApprovalRequired:e=>e.quote.quoteId,SwapByTransaction:e=>e.quote.quoteId,UserPosition:e=>e.id,UsingAsCollateralActivity:e=>e.id,WithdrawActivity:e=>e.id,RepayActivity:e=>e.id,Erc20Token:e=>e.address,Chain:e=>e.chainId.toString(),NativeToken:e=>e.chain.chainId.toString(),PaginatedActivitiesResult:()=>null,PaginatedResultInfo:()=>null,PaginatedSpokePositionManagerResult:()=>null,PaginatedSpokeUserPositionManagerResult:()=>null,PaginatedUserSwapsResult:()=>null,SpokePositionManger:()=>null,SpokeUserPositionManager:()=>null,SwapReceipt:()=>null,SwapTransactionRequest:()=>null,APYSample:()=>null,Asset:()=>null,AssetBorrowSample:()=>null,AssetPriceSample:()=>null,AssetSummary:()=>null,AssetSupplySample:()=>null,CancelSwapTypedData:()=>null,CancelSwapTypeDefinition:()=>null,DecimalNumber:()=>null,DecimalNumberWithChange:()=>null,DomainData:()=>null,Erc20Amount:()=>null,Erc20ApprovalRequired:()=>null,FiatAmount:()=>null,FiatAmountValueVariation:()=>null,FiatAmountWithChange:()=>null,ForkTopUpResponse:()=>null,HealthFactorError:()=>null,HealthFactorVariation:()=>null,HealthFactorWithChange:()=>null,HubAssetSettings:()=>null,HubAssetSummary:()=>null,HubAssetUserState:()=>null,HubSummary:()=>null,InsufficientBalanceError:()=>null,NativeAmount:()=>null,PercentNumber:()=>null,PercentNumberVariation:()=>null,PercentNumberWithChange:()=>null,PermitMessageData:()=>null,PermitTypedDataResponse:()=>null,PreContractActionRequired:()=>null,PrepareSwapCancelResult:()=>null,PreviewUserPosition:()=>null,ReserveSettings:()=>null,ReserveStatus:()=>null,ReserveSummary:()=>null,ReserveUserState:()=>null,SwapApprovalRequired:()=>null,SwapByIntentTypedData:()=>null,SwapByIntentTypeDefinition:()=>null,SwapCancelled:()=>null,SwapExpired:()=>null,SwapFulfilled:()=>null,SwapOpen:()=>null,SwapPendingSignature:()=>null,SwapQuote:()=>null,SwapQuoteCosts:()=>null,TokenInfo:()=>null,TransactionRequest:()=>null,TypeDefinition:()=>null,TypeField:()=>null,UserBalance:()=>null,UserBorrowItem:()=>null,UserSummary:()=>null,UserSummaryHistoryItem:()=>null,UserSupplyItem:()=>null}});var h={name:"production",backend:"https://api.v4.aave.com/graphql",indexingTimeout:6e4,pollingInterval:100,exchangeRateInterval:1e4},P={name:"staging",backend:"https://api.v4.staging.aave.com/graphql",indexingTimeout:6e4,pollingInterval:500,exchangeRateInterval:1e4},H={name:"local",backend:"http://localhost:3007/graphql",indexingTimeout:6e4,pollingInterval:1e3,exchangeRateInterval:1e4};function w({environment:e=h,headers:t,cache:n=true,debug:r=false,fragments:i=[]}){return {displayName:"AaveClient",environment:e,headers:t,cache:n?D:null,debug:r,fragments:i}}function b(e){return e.operations!==null&&e.operations.length>0}var g=class e extends core.GqlClient{static create(t){return new e(w(t??{}))}waitForTransaction=t=>(types.invariant(b(t),"Received a transaction result for an untracked operation. Make sure you're following the instructions in the docs."),types.ResultAsync.fromPromise(this.pollTransactionStatus(t),n=>n instanceof core.TimeoutError||n instanceof core.UnexpectedError?n:core.UnexpectedError.from(n)));async refreshQueryWhere(t,n){await this.refreshWhere(async r=>{if(r.query===t){let i=await this.query(t,r.variables,"cache-only");return i.isErr()?false:n(r.variables,i.value)}return false});}async pollTransactionStatus(t){let n=Date.now();for(;Date.now()-n<this.context.environment.indexingTimeout;){if(await x(this,t).match(i=>i,i=>{throw i}))return t.txHash;await core.delay(this.context.environment.pollingInterval);}throw core.TimeoutError.from(`Timeout waiting for transaction ${t.txHash} to be processed.`)}};var d=viem.defineChain({id:Number.parseInt("123456789",10),name:"Devnet",network:"ethereum-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"]}},blockExplorers:{default:{name:"Devnet Explorer",url:"https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"}}});({[types.chainId(d.id)]:d});var ie=undefined.ENVIRONMENT==="local"?H:undefined.ENVIRONMENT==="production"?h:P,f=types.chainId(Number.parseInt("123456789",10)),dt=types.evmAddress("0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f"),mt=types.evmAddress("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),yt=types.evmAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"),Et=types.evmAddress("0xdC035D45d973E3EC169d2276DDab16f1e407384F"),ft=types.evmAddress("0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0"),Tt=types.evmAddress("0x111111111117dC0aa78b770fA6A738034120C302"),oe=types.evmAddress("0xBa97c5E52cd5BC3D7950Ae70779F8FfE92d40CdC"),Rt=graphql.encodeSpokeId({chainId:f,address:oe}),ht=types.evmAddress("0x2559E4E04F2cA7180e5f20C2872d22EC89601b56"),gt=types.evmAddress("0x5738d9cB82d6a1617973C257D05A387bF5568F47"),se=types.evmAddress("0x4D4a7b3Ce709b4362D7095a4A0105bDFDb5dA2a7"),St=graphql.encodeSpokeId({chainId:f,address:se}),le=types.evmAddress("0xaD905aD5EA5B98cD50AE40Cfe368344686a21366"),vt=graphql.encodeHubId({chainId:f,address:le}),F="https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146",S=undefined.ETHEREUM_TENDERLY_ADMIN_RPC,At=g.create({environment:ie,headers:{"x-e2e-tests":undefined.API_X_E2E_TESTS_HEADER}});async function Ct(e){if(!e){let t=accounts.generatePrivateKey(),n=viem.createWalletClient({account:accounts.privateKeyToAccount(t),chain:d,transport:viem.http()});return await ce(types.evmAddress(n.account.address)),n}return viem.createWalletClient({account:accounts.privateKeyToAccount(e),chain:d,transport:viem.http()})}function ce(e,t=types.bigDecimal("1.0")){let n=viem.createPublicClient({chain:{id:f,name:"Tenderly Fork",network:"tenderly-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:[S]}}},transport:viem.http(S)}),i=`0x${viem.parseEther(t.toString()).toString(16)}`;return types.ResultAsync.fromPromise(n.request({method:"tenderly_setBalance",params:[[e],i]}).then(async l=>(await k(500),l)),l=>core.UnexpectedError.from(l))}function xt(e,t){let n=viem.createPublicClient({chain:{id:f,name:"Tenderly Fork",network:"tenderly-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:[S]}}},transport:viem.http(S)}),i=`0x${viem.parseUnits(t.amount.toString(),t.decimals??18).toString(16)}`;return types.ResultAsync.fromPromise(n.request({method:"tenderly_setErc20Balance",params:[t.address,e,i]}).then(async l=>(await k(500),l)),l=>core.UnexpectedError.from(l))}var ue={[core.GraphQLErrorCode.UNAUTHENTICATED]:"Unauthenticated - Authentication is required to access '<operation>'",[core.GraphQLErrorCode.FORBIDDEN]:"Forbidden - You are not authorized to access '<operation>'",[core.GraphQLErrorCode.INTERNAL_SERVER_ERROR]:"Internal server error - Please try again later",[core.GraphQLErrorCode.BAD_USER_INPUT]:"Bad user input - Please check the input and try again",[core.GraphQLErrorCode.BAD_REQUEST]:"Bad request - Please check the request and try again"};function Dt(e){return {message:ue[e],locations:[],path:[],extensions:{code:e}}}function k(e){return new Promise(t=>setTimeout(t,e))}async function Pt(e,t){let n=viem.createPublicClient({chain:d,transport:viem.http(F)}),[r,i]=await Promise.all([n.readContract({address:t,abi:[{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"}],functionName:"balanceOf",args:[e]}),n.readContract({address:t,abi:[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"}],functionName:"decimals"})]);return types.bigDecimal(r).rescale(-i)}async function Ht(e){let n=await viem.createPublicClient({chain:d,transport:viem.http(F)}).getBalance({address:e});return types.bigDecimal(n).rescale(-18)}
2
+ exports.ETHEREUM_1INCH_ADDRESS=Tt;exports.ETHEREUM_FORK_ID=f;exports.ETHEREUM_FORK_RPC_URL=F;exports.ETHEREUM_FORK_RPC_URL_ADMIN=S;exports.ETHEREUM_GHO_ADDRESS=dt;exports.ETHEREUM_HUB_CORE_ADDRESS=le;exports.ETHEREUM_HUB_CORE_ID=vt;exports.ETHEREUM_SPOKE_CORE_ADDRESS=oe;exports.ETHEREUM_SPOKE_CORE_ID=Rt;exports.ETHEREUM_SPOKE_ETHENA_ADDRESS=ht;exports.ETHEREUM_SPOKE_FRONTIER_ADDRESS=gt;exports.ETHEREUM_SPOKE_ISO_STABLE_ID=St;exports.ETHEREUM_SPOKE_LST_ADDRESS=se;exports.ETHEREUM_USDC_ADDRESS=yt;exports.ETHEREUM_USDS_ADDRESS=Et;exports.ETHEREUM_WETH_ADDRESS=mt;exports.ETHEREUM_WSTETH_ADDRESS=ft;exports.client=At;exports.createGraphQLErrorObject=Dt;exports.createNewWallet=Ct;exports.environment=ie;exports.fundErc20Address=xt;exports.fundNativeAddress=ce;exports.getBalance=Pt;exports.getNativeBalance=Ht;exports.wait=k;//# sourceMappingURL=test-utils.cjs.map
3
3
  //# sourceMappingURL=test-utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/actions/misc.ts","../src/cache.ts","../src/environments.ts","../src/config.ts","../src/types.ts","../src/AaveClient.ts","../src/viem.ts","../src/test-utils.ts"],"names":["hasProcessedKnownTransaction","client","request","HasProcessedKnownTransactionQuery","transformToBigInt","parent","_args","_cache","info","transformToBigDecimal","BigDecimal","transformToNullableBigDecimal","value","transformToDate","transformToNullableDate","exchange","cacheExchange","introspectedSchema","_","isHubInputVariant","encodeHubId","_parent","args","cache","isTxHashInputVariant","txHash","chainId","matches","f","set","pageRef","itemRefs","ref","spokeRef","chainRef","itemChainId","a","b","ida","data","production","staging","local","configureContext","environment","headers","debug","fragments","isHasProcessedKnownTransactionRequest","result","AaveClient","_AaveClient","GqlClient","options","invariant","ResultAsync","err","TimeoutError","UnexpectedError","document","predicate","op","startedAt","ok","delay","devnetChain","defineChain","ETHEREUM_FORK_ID","ETHEREUM_GHO_ADDRESS","evmAddress","ETHEREUM_WETH_ADDRESS","ETHEREUM_USDC_ADDRESS","ETHEREUM_USDS_ADDRESS","ETHEREUM_WSTETH_ADDRESS","ETHEREUM_1INCH_ADDRESS","ETHEREUM_SPOKE_CORE_ADDRESS","ETHEREUM_SPOKE_CORE_ID","encodeSpokeId","ETHEREUM_SPOKE_ETHENA_ADDRESS","ETHEREUM_SPOKE_FRONTIER_ADDRESS","ETHEREUM_SPOKE_LST_ADDRESS","ETHEREUM_SPOKE_ISO_STABLE_ID","ETHEREUM_HUB_CORE_ADDRESS","ETHEREUM_HUB_CORE_ID","ETHEREUM_FORK_RPC_URL","ETHEREUM_FORK_RPC_URL_ADMIN","createNewWallet","privateKey","generatePrivateKey","wallet","createWalletClient","privateKeyToAccount","http","fundNativeAddress","address","amount","bigDecimal","publicClient","createPublicClient","amountHex","parseEther","res","wait","fundErc20Address","token","parseUnits","messages","GraphQLErrorCode","createGraphQLErrorObject","code","ms","resolve","getBalance","tokenAddress","balance","decimals","getNativeBalance"],"mappings":"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","file":"test-utils.cjs","sourcesContent":["import type { UnexpectedError } from '@aave/core';\nimport {\n type Chain,\n ChainQuery,\n type ChainRequest,\n ChainsFilter,\n ChainsQuery,\n ExchangeRateQuery,\n type ExchangeRateRequest,\n type FiatAmount,\n HasProcessedKnownTransactionQuery,\n type HasProcessedKnownTransactionRequest,\n} from '@aave/graphql';\nimport type { ResultAsync } from '@aave/types';\nimport type { AaveClient } from '../AaveClient';\n\n/**\n * Fetches a specific chain by chain ID.\n *\n * ```ts\n * const result = await chain(client, {\n * chainId: chainId(1),\n * });\n * ```\n *\n * @param client - Aave client.\n * @param request - The chain request parameters.\n * @returns The chain data, or null if not found.\n */\nexport function chain(\n client: AaveClient,\n request: ChainRequest,\n): ResultAsync<Chain | null, UnexpectedError> {\n return client.query(ChainQuery, { request });\n}\n\n/**\n * Fetches the list of supported chains.\n *\n * ```ts\n * const chains = await chains(client, { filter: ChainsFilter.ALL });\n * ```\n *\n * @param client - Aave client.\n * @param filter - The filter for chains.\n * @returns Array of supported chains.\n */\nexport function chains(\n client: AaveClient,\n filter: ChainsFilter = ChainsFilter.ALL,\n): ResultAsync<Chain[], UnexpectedError> {\n return client.query(ChainsQuery, { filter });\n}\n\n/**\n * Check if a transaction has been processed by the Aave API.\n *\n * @param client - Aave client.\n * @param request - The request containing transaction hash and operations to check.\n * @returns True if the transaction has been processed, false otherwise.\n */\nexport function hasProcessedKnownTransaction(\n client: AaveClient,\n request: HasProcessedKnownTransactionRequest,\n): ResultAsync<boolean, UnexpectedError> {\n return client.query(\n HasProcessedKnownTransactionQuery,\n { request },\n 'network-only',\n );\n}\n\n/**\n * Fetches the exchange rate between tokens and fiat currencies.\n *\n * ```ts\n * const result = await exchangeRate(client, {\n * from: { erc20: { chainId: chainId(1), address: evmAddress('0xA0b86a33E6...') } },\n * to: Currency.Usd,\n * });\n * ```\n *\n * @param client - Aave client.\n * @param request - The exchange rate request parameters.\n * @returns The exchange rate information as a fiat amount.\n */\nexport function exchangeRate(\n client: AaveClient,\n request: ExchangeRateRequest,\n): ResultAsync<FiatAmount, UnexpectedError> {\n return client.query(ExchangeRateQuery, { request });\n}\n","import {\n type ActivitiesQuery,\n type BorrowActivity,\n type Chain,\n type Erc20Token,\n encodeHubId,\n type Hub,\n type HubAsset,\n type HubQuery,\n type ID,\n isHubInputVariant,\n isTxHashInputVariant,\n type LiquidatedActivity,\n type NativeToken,\n type RepayActivity,\n type Reserve,\n type ReserveInfo,\n type Spoke,\n type SupplyActivity,\n type SwapByIntent,\n type SwapByIntentWithApprovalRequired,\n type SwapByTransaction,\n type UserPosition,\n type UsingAsCollateralActivity,\n type VariablesOf,\n type WithdrawActivity,\n} from '@aave/graphql';\nimport introspectedSchema from '@aave/graphql/schema';\nimport { BigDecimal, type TxHash } from '@aave/types';\nimport {\n cacheExchange,\n type Resolver,\n type Scalar,\n} from '@urql/exchange-graphcache';\n\nconst transformToBigInt: Resolver = (parent, _args, _cache, info) => {\n return BigInt(parent[info.fieldName] as string) as unknown as Scalar;\n};\n\nconst transformToBigDecimal: Resolver = (parent, _args, _cache, info) => {\n return BigDecimal.new(parent[info.fieldName] as string);\n};\n\nconst transformToNullableBigDecimal: Resolver = (\n parent,\n _args,\n _cache,\n info,\n) => {\n const value = parent[info.fieldName];\n if (value === null || value === undefined) {\n return null;\n }\n return transformToBigDecimal(parent, _args, _cache, info);\n};\n\nconst transformToDate: Resolver = (parent, _args, _cache, info) => {\n return new Date(parent[info.fieldName] as string);\n};\n\nconst transformToNullableDate: Resolver = (parent, _args, _cache, info) => {\n const value = parent[info.fieldName];\n if (value === null || value === undefined) {\n return null;\n }\n return transformToDate(parent, _args, _cache, info);\n};\n\nexport const exchange = cacheExchange({\n schema: introspectedSchema,\n resolvers: {\n PercentNumber: {\n onChainValue: transformToBigInt,\n value: transformToBigDecimal,\n normalized: transformToBigDecimal,\n },\n DecimalNumber: {\n onChainValue: transformToBigInt,\n value: transformToBigDecimal,\n },\n FiatAmount: {\n value: transformToBigDecimal,\n },\n AssetPriceSample: {\n price: transformToBigDecimal,\n date: transformToDate,\n },\n HubSummary: {\n utilizationRate: transformToBigDecimal,\n },\n Reserve: {\n borrowCap: transformToBigDecimal,\n supplyCap: transformToBigDecimal,\n },\n HealthFactorError: {\n current: transformToNullableBigDecimal,\n after: transformToNullableBigDecimal,\n },\n HealthFactorVariation: {\n current: transformToNullableBigDecimal,\n after: transformToNullableBigDecimal,\n },\n HealthFactorWithChange: {\n current: transformToNullableBigDecimal,\n },\n UserSummary: {\n lowestHealthFactor: transformToNullableBigDecimal,\n },\n UserSummaryHistoryItem: {\n healthFactor: transformToNullableBigDecimal,\n date: transformToDate,\n },\n TransactionRequest: {\n value: transformToBigInt,\n },\n APYSample: {\n date: transformToDate,\n },\n AssetBorrowSample: {\n date: transformToDate,\n },\n AssetSupplySample: {\n date: transformToDate,\n },\n BorrowActivity: {\n timestamp: transformToDate,\n },\n LiquidatedActivity: {\n timestamp: transformToDate,\n },\n RepayActivity: {\n timestamp: transformToDate,\n },\n SupplyActivity: {\n timestamp: transformToDate,\n },\n WithdrawActivity: {\n timestamp: transformToDate,\n },\n UsingAsCollateralActivity: {\n timestamp: transformToDate,\n },\n SpokeUserPositionManager: {\n approvedOn: transformToDate,\n },\n SwapCancelled: {\n createdAt: transformToDate,\n cancelledAt: transformToNullableDate,\n },\n SwapExpired: {\n createdAt: transformToDate,\n expiredAt: transformToDate,\n },\n SwapFulfilled: {\n createdAt: transformToDate,\n fulfilledAt: transformToDate,\n },\n SwapOpen: {\n createdAt: transformToDate,\n deadline: transformToDate,\n },\n SwapPendingSignature: {\n createdAt: transformToDate,\n deadline: transformToDate,\n },\n SwapReceipt: {\n createdAt: transformToDate,\n },\n // Intentionally omitted to keep it as BigIntString\n // PermitMessageData: {\n // value: transformToBigInt,\n // nonce: transformToBigInt,\n // },\n\n Query: {\n hub: (_, { request }: VariablesOf<typeof HubQuery>) => {\n if (isHubInputVariant(request.query)) {\n return {\n __typename: 'Hub',\n id: encodeHubId(request.query.hubInput),\n };\n }\n return {\n __typename: 'Hub',\n id: request.query.hubId,\n };\n },\n\n activities: (\n _parent,\n args: VariablesOf<typeof ActivitiesQuery>,\n cache,\n ) => {\n // Bail out if not a txHash filter lookup\n if (!isTxHashInputVariant(args.request.query)) {\n return cache.resolve('Query', 'activities', args);\n }\n\n const { txHash, chainId } = args.request.query.txHash;\n\n // Collect all cached activities matching txHash\n const matches = cache\n .inspectFields('Query')\n .filter((f) => f.fieldName === 'activities')\n .reduce((set, f) => {\n const pageRef = cache.resolve('Query', f.fieldKey) as string | null;\n if (!pageRef) return set;\n\n const itemRefs = cache.resolve(pageRef, 'items') as string[] | null;\n if (!itemRefs) return set;\n\n for (const ref of itemRefs) {\n set.add(ref);\n }\n return set;\n }, new Set<string>())\n .values()\n .toArray()\n .filter((ref) => {\n const itemTxHash = cache.resolve(ref, 'txHash') as TxHash;\n if (itemTxHash !== txHash) return false;\n\n // Verify chainId via spoke.chain.chainId if present\n const spokeRef = cache.resolve(ref, 'spoke') as string | null;\n if (spokeRef) {\n const chainRef = cache.resolve(spokeRef, 'chain') as\n | string\n | null;\n const itemChainId = chainRef\n ? (cache.resolve(chainRef, 'chainId') as number | undefined)\n : undefined;\n if (typeof itemChainId === 'number') {\n return itemChainId === chainId;\n }\n }\n return true;\n })\n .sort((a, b) => {\n const ida = cache.resolve(a, 'id') as ID;\n const idb = cache.resolve(b, 'id') as ID;\n return idb <= ida ? 1 : -1;\n });\n\n if (matches.length === 0) return undefined;\n\n return {\n __typename: 'PaginatedActivitiesResult',\n items: matches,\n pageInfo: {\n __typename: 'PaginatedResultInfo',\n prev: null,\n next: null,\n },\n };\n },\n },\n },\n keys: {\n // Entitied with composite key\n Hub: (data: Hub) => data.id,\n HubAsset: (data: HubAsset) => data.id,\n Reserve: (data: Reserve) => data.id,\n ReserveInfo: (data: ReserveInfo) => data.id,\n Spoke: (data: Spoke) => data.id,\n\n // Entities with id field as key\n BorrowActivity: (data: BorrowActivity) => data.id,\n LiquidatedActivity: (data: LiquidatedActivity) => data.id,\n SupplyActivity: (data: SupplyActivity) => data.id,\n SwapByIntent: (data: SwapByIntent) => data.quote.quoteId,\n SwapByIntentWithApprovalRequired: (\n data: SwapByIntentWithApprovalRequired,\n ) => data.quote.quoteId,\n SwapByTransaction: (data: SwapByTransaction) => data.quote.quoteId,\n UserPosition: (data: UserPosition) => data.id,\n UsingAsCollateralActivity: (data: UsingAsCollateralActivity) => data.id,\n WithdrawActivity: (data: WithdrawActivity) => data.id,\n RepayActivity: (data: RepayActivity) => data.id,\n\n // Entities with address field as key\n Erc20Token: (data: Erc20Token) => data.address,\n\n // Entities with other fields as key\n Chain: (data: Chain) => data.chainId.toString(),\n NativeToken: (data: NativeToken) => data.chain.chainId.toString(),\n\n // Entities without keys will be embedded directly on the parent entity\n PaginatedActivitiesResult: () => null,\n PaginatedResultInfo: () => null,\n PaginatedSpokePositionManagerResult: () => null,\n PaginatedSpokeUserPositionManagerResult: () => null,\n PaginatedUserSwapsResult: () => null,\n SpokePositionManger: () => null,\n SpokeUserPositionManager: () => null,\n SwapReceipt: () => null,\n SwapTransactionRequest: () => null,\n\n // Value objects and result types\n APYSample: () => null,\n Asset: () => null,\n AssetBorrowSample: () => null,\n AssetPriceSample: () => null,\n AssetSummary: () => null,\n AssetSupplySample: () => null,\n CancelSwapTypedData: () => null,\n CancelSwapTypeDefinition: () => null,\n DecimalNumber: () => null,\n DecimalNumberWithChange: () => null,\n DomainData: () => null,\n Erc20Amount: () => null,\n Erc20ApprovalRequired: () => null,\n FiatAmount: () => null,\n FiatAmountValueVariation: () => null,\n FiatAmountWithChange: () => null,\n ForkTopUpResponse: () => null,\n HealthFactorError: () => null,\n HealthFactorVariation: () => null,\n HealthFactorWithChange: () => null,\n HubAssetSettings: () => null,\n HubAssetSummary: () => null,\n HubAssetUserState: () => null,\n HubSummary: () => null,\n InsufficientBalanceError: () => null,\n NativeAmount: () => null,\n PercentNumber: () => null,\n PercentNumberVariation: () => null,\n PercentNumberWithChange: () => null,\n PermitMessageData: () => null,\n PermitTypedDataResponse: () => null,\n PreContractActionRequired: () => null,\n PrepareSwapCancelResult: () => null,\n PreviewUserPosition: () => null,\n ReserveSettings: () => null,\n ReserveStatus: () => null,\n ReserveSummary: () => null,\n ReserveUserState: () => null,\n SwapApprovalRequired: () => null,\n SwapByIntentTypedData: () => null,\n SwapByIntentTypeDefinition: () => null,\n SwapCancelled: () => null,\n SwapExpired: () => null,\n SwapFulfilled: () => null,\n SwapOpen: () => null,\n SwapPendingSignature: () => null,\n SwapQuote: () => null,\n SwapQuoteCosts: () => null,\n TokenInfo: () => null,\n TransactionRequest: () => null,\n TypeDefinition: () => null,\n TypeField: () => null,\n UserBalance: () => null,\n UserBorrowItem: () => null,\n UserSummary: () => null,\n UserSummaryHistoryItem: () => null,\n UserSupplyItem: () => null,\n },\n});\n","import type { EnvironmentConfig } from '@aave/core';\n\n/**\n * The production environment configuration.\n */\nexport const production: EnvironmentConfig = {\n name: 'production',\n backend: 'https://api.v4.aave.com/graphql',\n indexingTimeout: 60_000,\n pollingInterval: 100,\n exchangeRateInterval: 10000,\n};\n\n/**\n * @internal\n */\nexport const staging: EnvironmentConfig = {\n name: 'staging',\n backend: 'https://api.v4.staging.aave.com/graphql',\n indexingTimeout: 60_000,\n pollingInterval: 500,\n exchangeRateInterval: 10000,\n};\n\n/**\n * @internal\n */\nexport const local: EnvironmentConfig = {\n name: 'local',\n backend: 'http://localhost:3007/graphql',\n indexingTimeout: 60_000,\n pollingInterval: 1000,\n exchangeRateInterval: 10000,\n};\n","import type { Context } from '@aave/core';\nimport type { TypedDocumentNode } from '@urql/core';\nimport type { EnvironmentConfig } from '../../core/src/types';\nimport { exchange } from './cache';\nimport { production } from './environments';\n\n/**\n * The client configuration.\n */\nexport type ClientConfig = {\n /**\n * @internal\n * @defaultValue `production`\n */\n environment?: EnvironmentConfig;\n /**\n * @internal\n */\n headers?: Record<string, string>;\n /**\n * Whether to enable caching.\n *\n * @defaultValue `true`\n */\n cache?: boolean;\n /**\n * Whether to enable debug mode.\n *\n * @defaultValue `false`\n */\n debug?: boolean;\n /**\n * The custom fragments to use.\n *\n * @experimental This is an experimental API and may be subject to breaking changes.\n */\n fragments?: TypedDocumentNode[];\n};\n\n/**\n * @internal\n */\nexport function configureContext({\n environment = production,\n headers,\n cache = true,\n debug = false,\n fragments = [],\n}: ClientConfig): Context {\n return {\n displayName: 'AaveClient',\n environment,\n headers,\n cache: cache ? exchange : null,\n debug,\n fragments,\n };\n}\n","import type {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\n ERC20PermitSignature,\n ExecutionPlan,\n HasProcessedKnownTransactionRequest,\n InsufficientBalanceError,\n OperationType,\n PermitTypedDataResponse,\n SwapByIntentTypedData,\n} from '@aave/graphql';\nimport type { ResultAsync, TxHash } from '@aave/types';\n\n/**\n * @internal\n */\nexport type TransactionResult = {\n txHash: TxHash;\n operations: OperationType[] | null;\n};\n\n/**\n * @internal\n */\nexport function isHasProcessedKnownTransactionRequest(\n result: TransactionResult,\n): result is HasProcessedKnownTransactionRequest {\n return result.operations !== null && result.operations.length > 0;\n}\n\nexport type SendWithError =\n | CancelError\n | SigningError\n | TransactionError\n | ValidationError<InsufficientBalanceError>\n | UnexpectedError;\n\nexport type ExecutionPlanHandler<T extends ExecutionPlan = ExecutionPlan> = (\n result: T,\n) => ResultAsync<TransactionResult, SendWithError>;\n\nexport type ERC20PermitHandler = (\n result: PermitTypedDataResponse,\n) => ResultAsync<ERC20PermitSignature, SigningError>;\n\nexport type SwapSignatureHandler = (\n result: CancelSwapTypedData | SwapByIntentTypedData,\n) => ResultAsync<ERC20PermitSignature, SigningError>;\n","import {\n delay,\n GqlClient,\n type StandardData,\n TimeoutError,\n UnexpectedError,\n} from '@aave/core';\nimport type { HasProcessedKnownTransactionRequest } from '@aave/graphql';\nimport {\n type AnyVariables,\n invariant,\n ResultAsync,\n type TxHash,\n} from '@aave/types';\nimport type { TypedDocumentNode } from '@urql/core';\nimport { hasProcessedKnownTransaction } from './actions';\nimport { type ClientConfig, configureContext } from './config';\nimport {\n isHasProcessedKnownTransactionRequest,\n type TransactionResult,\n} from './types';\n\nexport class AaveClient extends GqlClient {\n /**\n * Create a new instance of the {@link AaveClient}.\n *\n * ```ts\n * const client = AaveClient.create({\n * environment: production,\n * });\n * ```\n *\n * @param options - The options to configure the client.\n * @returns The new instance of the client.\n */\n static create(options?: ClientConfig): AaveClient {\n return new AaveClient(configureContext(options ?? {}));\n }\n\n /**\n * Given the transaction hash of an Aave protocol transaction, wait for the transaction to be\n * processed by the Aave v4 API.\n *\n * Returns a {@link TimeoutError} if the transaction is not processed within the expected timeout period.\n *\n * @param result - The transaction execution result to wait for.\n * @returns The transaction hash or a TimeoutError\n */\n readonly waitForTransaction = (\n result: TransactionResult,\n ): ResultAsync<TxHash, TimeoutError | UnexpectedError> => {\n invariant(\n isHasProcessedKnownTransactionRequest(result),\n `Received a transaction result for an untracked operation. Make sure you're following the instructions in the docs.`,\n );\n\n return ResultAsync.fromPromise(\n this.pollTransactionStatus(result),\n (err) => {\n if (err instanceof TimeoutError || err instanceof UnexpectedError) {\n return err;\n }\n return UnexpectedError.from(err);\n },\n );\n };\n\n /**\n * @internal\n */\n async refreshQueryWhere<TValue, TVariables extends AnyVariables>(\n document: TypedDocumentNode<StandardData<TValue>, TVariables>,\n predicate: (\n variables: TVariables,\n data: TValue,\n ) => boolean | Promise<boolean>,\n ): Promise<void> {\n await this.refreshWhere(async (op) => {\n if (op.query === document) {\n const result = await this.query(\n document,\n op.variables as TVariables,\n 'cache-only',\n );\n\n if (result.isErr()) {\n return false;\n }\n\n return predicate(op.variables as TVariables, result.value as TValue);\n }\n return false;\n });\n }\n\n protected async pollTransactionStatus(\n request: HasProcessedKnownTransactionRequest,\n ): Promise<TxHash> {\n const startedAt = Date.now();\n\n while (Date.now() - startedAt < this.context.environment.indexingTimeout) {\n const processed = await hasProcessedKnownTransaction(this, request).match(\n (ok) => ok,\n (err) => {\n throw err;\n },\n );\n\n if (processed) {\n return request.txHash;\n }\n\n await delay(this.context.environment.pollingInterval);\n }\n throw TimeoutError.from(\n `Timeout waiting for transaction ${request.txHash} to be processed.`,\n );\n }\n}\n","import {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\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 type Chain,\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 WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n signTypedData,\n waitForTransactionReceipt,\n} from 'viem/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\n/**\n * @internal\n */\nexport const devnetChain: Chain = 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 */\nexport const supportedChains: Record<\n ChainId,\n ReturnType<typeof defineChain>\n> = {\n // TODO add them back when deployed on these chains\n // [chainId(mainnet.id)]: mainnet,\n // [chainId(sepolia.id)]: sepolia,\n [chainId(devnetChain.id)]: devnetChain,\n};\n\nfunction ensureChain(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<void, CancelError | SigningError> {\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 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 (\n code === SwitchChainError.code &&\n request.chainId in supportedChains\n ) {\n return ResultAsync.fromPromise(\n walletClient.addChain({ chain: supportedChains[request.chainId] }),\n (err) => {\n if (isRpcError(err) && err.code === UserRejectedRequestError.code) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n );\n }\n\n return err.asResultAsync();\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, Chain, 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, Chain, 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 ensureChain(walletClient, request).andThen((_) =>\n sendEip1559Transaction(walletClient, request),\n );\n}\n\n/**\n * @internal\n */\nexport function transactionError(\n chain: Chain | 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","/// <reference path=\"../../../vite-env.d.ts\" />\n\nimport { GraphQLErrorCode, UnexpectedError } from '@aave/core';\nimport { encodeHubId, encodeSpokeId } from '@aave/graphql';\nimport {\n type BigDecimal,\n bigDecimal,\n chainId,\n type EvmAddress,\n evmAddress,\n ResultAsync,\n} from '@aave/types';\nimport {\n type Account,\n type Chain,\n createPublicClient,\n createWalletClient,\n http,\n parseEther,\n parseUnits,\n type Transport,\n type WalletClient,\n} from 'viem';\nimport { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';\nimport { AaveClient } from './AaveClient';\nimport { local, staging } from './environments';\nimport { devnetChain } from './viem';\n\nexport const environment =\n import.meta.env.ENVIRONMENT === 'local' ? local : staging;\n\nexport const ETHEREUM_FORK_ID = chainId(\n Number.parseInt(import.meta.env.ETHEREUM_TENDERLY_FORK_ID, 10),\n);\n\n// Token addresses\nexport const ETHEREUM_GHO_ADDRESS = evmAddress(\n '0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f',\n);\nexport const ETHEREUM_WETH_ADDRESS = evmAddress(\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n);\nexport const ETHEREUM_USDC_ADDRESS = evmAddress(\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n);\nexport const ETHEREUM_USDS_ADDRESS = evmAddress(\n '0xdC035D45d973E3EC169d2276DDab16f1e407384F',\n);\nexport const ETHEREUM_WSTETH_ADDRESS = evmAddress(\n '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0',\n);\nexport const ETHEREUM_1INCH_ADDRESS = evmAddress(\n '0x111111111117dC0aa78b770fA6A738034120C302',\n);\n\n// Spoke addresses and ids\nexport const ETHEREUM_SPOKE_CORE_ADDRESS = evmAddress(\n '0xBa97c5E52cd5BC3D7950Ae70779F8FfE92d40CdC',\n);\nexport const ETHEREUM_SPOKE_CORE_ID = encodeSpokeId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_SPOKE_CORE_ADDRESS,\n});\n\nexport const ETHEREUM_SPOKE_ETHENA_ADDRESS = evmAddress(\n '0x2559E4E04F2cA7180e5f20C2872d22EC89601b56',\n);\n\nexport const ETHEREUM_SPOKE_FRONTIER_ADDRESS = evmAddress(\n '0x5738d9cB82d6a1617973C257D05A387bF5568F47',\n);\n\nexport const ETHEREUM_SPOKE_LST_ADDRESS = evmAddress(\n '0x4D4a7b3Ce709b4362D7095a4A0105bDFDb5dA2a7',\n);\nexport const ETHEREUM_SPOKE_ISO_STABLE_ID = encodeSpokeId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_SPOKE_LST_ADDRESS,\n});\n\n// Hub addresses\nexport const ETHEREUM_HUB_CORE_ADDRESS = evmAddress(\n '0xaD905aD5EA5B98cD50AE40Cfe368344686a21366',\n);\nexport const ETHEREUM_HUB_CORE_ID = encodeHubId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_HUB_CORE_ADDRESS,\n});\n\nexport const ETHEREUM_FORK_RPC_URL = import.meta.env\n .ETHEREUM_TENDERLY_PUBLIC_RPC;\n\nexport const ETHEREUM_FORK_RPC_URL_ADMIN = import.meta.env\n .ETHEREUM_TENDERLY_ADMIN_RPC;\n\nexport const client = AaveClient.create({\n environment,\n headers: {\n 'x-e2e-tests': import.meta.env.API_X_E2E_TESTS_HEADER,\n },\n});\n\nexport async function createNewWallet(\n privateKey?: `0x${string}`,\n): Promise<WalletClient<Transport, Chain, Account>> {\n if (!privateKey) {\n const privateKey = generatePrivateKey();\n const wallet = createWalletClient({\n account: privateKeyToAccount(privateKey),\n chain: devnetChain,\n transport: http(),\n });\n\n await fundNativeAddress(evmAddress(wallet.account.address));\n\n return wallet;\n }\n return createWalletClient({\n account: privateKeyToAccount(privateKey),\n chain: devnetChain,\n transport: http(),\n });\n}\n\n// Tenderly RPC type for setBalance\ntype TSetBalanceRpc = {\n Method: 'tenderly_setBalance';\n Parameters: [addresses: string[], amount: string];\n ReturnType: string;\n};\n\n// Tenderly RPC type for set ERC20 balance\ntype TSetErc20BalanceRpc = {\n Method: 'tenderly_setErc20Balance';\n Parameters: [tokenAddress: string, address: string, amount: string];\n ReturnType: string;\n};\n\nexport function fundNativeAddress(\n address: EvmAddress,\n amount: BigDecimal = bigDecimal('1.0'), // 1 ETH\n): ResultAsync<string, UnexpectedError> {\n // Create client with fork chain - you'll need to replace this with your actual fork chain config\n const publicClient = createPublicClient({\n chain: {\n id: ETHEREUM_FORK_ID,\n name: 'Tenderly Fork',\n network: 'tenderly-fork',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [ETHEREUM_FORK_RPC_URL_ADMIN] },\n },\n },\n transport: http(ETHEREUM_FORK_RPC_URL_ADMIN),\n });\n\n const amountInWei = parseEther(amount.toString());\n const amountHex = `0x${amountInWei.toString(16)}`;\n\n return ResultAsync.fromPromise(\n publicClient\n .request<TSetBalanceRpc>({\n method: 'tenderly_setBalance',\n params: [[address], amountHex],\n })\n .then(async (res) => {\n await wait(500); // Temporal fix to avoid tenderly issues with the balance not being set\n return res;\n }),\n (err) => UnexpectedError.from(err),\n );\n}\n\nexport function fundErc20Address(\n address: EvmAddress,\n token: {\n address: EvmAddress;\n amount: BigDecimal;\n decimals?: number;\n },\n): ResultAsync<string, Error> {\n const publicClient = createPublicClient({\n chain: {\n id: ETHEREUM_FORK_ID,\n name: 'Tenderly Fork',\n network: 'tenderly-fork',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [ETHEREUM_FORK_RPC_URL_ADMIN] },\n },\n },\n transport: http(ETHEREUM_FORK_RPC_URL_ADMIN),\n });\n\n // Convert amount to the smallest unit (e.g., wei for 18 decimals)\n const amountInSmallestUnit = parseUnits(\n token.amount.toString(),\n token.decimals ?? 18,\n );\n const amountHex = `0x${amountInSmallestUnit.toString(16)}`;\n\n return ResultAsync.fromPromise(\n publicClient\n .request<TSetErc20BalanceRpc>({\n method: 'tenderly_setErc20Balance',\n params: [token.address, address, amountHex],\n })\n .then(async (res) => {\n await wait(500); // Temporal fix to avoid tenderly issues with the balance not being set\n return res;\n }),\n (err) => UnexpectedError.from(err),\n );\n}\n\nconst messages: Record<GraphQLErrorCode, string> = {\n [GraphQLErrorCode.UNAUTHENTICATED]:\n \"Unauthenticated - Authentication is required to access '<operation>'\",\n [GraphQLErrorCode.FORBIDDEN]:\n \"Forbidden - You are not authorized to access '<operation>'\",\n [GraphQLErrorCode.INTERNAL_SERVER_ERROR]:\n 'Internal server error - Please try again later',\n [GraphQLErrorCode.BAD_USER_INPUT]:\n 'Bad user input - Please check the input and try again',\n [GraphQLErrorCode.BAD_REQUEST]:\n 'Bad request - Please check the request and try again',\n};\n\nexport function createGraphQLErrorObject(code: GraphQLErrorCode) {\n return {\n message: messages[code],\n locations: [],\n path: [],\n extensions: {\n code: code,\n },\n };\n}\n\nexport function wait(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Function to get balance ERC20 token\nexport async function getBalance(\n address: EvmAddress,\n tokenAddress: EvmAddress,\n): Promise<BigDecimal> {\n const publicClient = createPublicClient({\n chain: devnetChain,\n transport: http(ETHEREUM_FORK_RPC_URL),\n });\n\n const [balance, decimals] = await Promise.all([\n publicClient.readContract({\n address: tokenAddress,\n abi: [\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'balanceOf',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n ] as const,\n functionName: 'balanceOf',\n args: [address],\n }),\n publicClient.readContract({\n address: tokenAddress,\n abi: [\n {\n inputs: [],\n name: 'decimals',\n outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }],\n stateMutability: 'pure',\n type: 'function',\n },\n ] as const,\n functionName: 'decimals',\n }),\n ]);\n\n return bigDecimal(balance).rescale(-decimals);\n}\n\n// Function to get native token (ETH) balance\nexport async function getNativeBalance(\n address: EvmAddress,\n): Promise<BigDecimal> {\n const publicClient = createPublicClient({\n chain: devnetChain,\n transport: http(ETHEREUM_FORK_RPC_URL),\n });\n\n const balance = await publicClient.getBalance({\n address: address,\n });\n\n // Convert from wei to ETH (18 decimals)\n return bigDecimal(balance).rescale(-18);\n}\n"]}
1
+ {"version":3,"sources":["../src/actions/misc.ts","../src/cache.ts","../src/environments.ts","../src/config.ts","../src/types.ts","../src/AaveClient.ts","../src/viem.ts","../src/test-utils.ts"],"names":["hasProcessedKnownTransaction","client","request","HasProcessedKnownTransactionQuery","transformToBigInt","parent","_args","_cache","info","transformToBigDecimal","BigDecimal","transformToNullableBigDecimal","value","transformToDate","transformToNullableDate","exchange","cacheExchange","introspectedSchema","_","isHubInputVariant","encodeHubId","_parent","args","cache","isTxHashInputVariant","txHash","chainId","matches","f","set","pageRef","itemRefs","ref","spokeRef","chainRef","itemChainId","a","b","ida","data","production","staging","local","configureContext","environment","headers","debug","fragments","isHasProcessedKnownTransactionRequest","result","AaveClient","_AaveClient","GqlClient","options","invariant","ResultAsync","err","TimeoutError","UnexpectedError","document","predicate","op","startedAt","ok","delay","devnetChain","defineChain","ETHEREUM_FORK_ID","ETHEREUM_GHO_ADDRESS","evmAddress","ETHEREUM_WETH_ADDRESS","ETHEREUM_USDC_ADDRESS","ETHEREUM_USDS_ADDRESS","ETHEREUM_WSTETH_ADDRESS","ETHEREUM_1INCH_ADDRESS","ETHEREUM_SPOKE_CORE_ADDRESS","ETHEREUM_SPOKE_CORE_ID","encodeSpokeId","ETHEREUM_SPOKE_ETHENA_ADDRESS","ETHEREUM_SPOKE_FRONTIER_ADDRESS","ETHEREUM_SPOKE_LST_ADDRESS","ETHEREUM_SPOKE_ISO_STABLE_ID","ETHEREUM_HUB_CORE_ADDRESS","ETHEREUM_HUB_CORE_ID","ETHEREUM_FORK_RPC_URL","ETHEREUM_FORK_RPC_URL_ADMIN","createNewWallet","privateKey","generatePrivateKey","wallet","createWalletClient","privateKeyToAccount","http","fundNativeAddress","address","amount","bigDecimal","publicClient","createPublicClient","amountHex","parseEther","res","wait","fundErc20Address","token","parseUnits","messages","GraphQLErrorCode","createGraphQLErrorObject","code","ms","resolve","getBalance","tokenAddress","balance","decimals","getNativeBalance"],"mappings":"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","file":"test-utils.cjs","sourcesContent":["import type { UnexpectedError } from '@aave/core';\nimport {\n type Chain,\n ChainQuery,\n type ChainRequest,\n ChainsFilter,\n ChainsQuery,\n ExchangeRateQuery,\n type ExchangeRateRequest,\n type FiatAmount,\n HasProcessedKnownTransactionQuery,\n type HasProcessedKnownTransactionRequest,\n} from '@aave/graphql';\nimport type { ResultAsync } from '@aave/types';\nimport type { AaveClient } from '../AaveClient';\n\n/**\n * Fetches a specific chain by chain ID.\n *\n * ```ts\n * const result = await chain(client, {\n * chainId: chainId(1),\n * });\n * ```\n *\n * @param client - Aave client.\n * @param request - The chain request parameters.\n * @returns The chain data, or null if not found.\n */\nexport function chain(\n client: AaveClient,\n request: ChainRequest,\n): ResultAsync<Chain | null, UnexpectedError> {\n return client.query(ChainQuery, { request });\n}\n\n/**\n * Fetches the list of supported chains.\n *\n * ```ts\n * const chains = await chains(client, { filter: ChainsFilter.ALL });\n * ```\n *\n * @param client - Aave client.\n * @param filter - The filter for chains.\n * @returns Array of supported chains.\n */\nexport function chains(\n client: AaveClient,\n filter: ChainsFilter = ChainsFilter.ALL,\n): ResultAsync<Chain[], UnexpectedError> {\n return client.query(ChainsQuery, { filter });\n}\n\n/**\n * Check if a transaction has been processed by the Aave API.\n *\n * @param client - Aave client.\n * @param request - The request containing transaction hash and operations to check.\n * @returns True if the transaction has been processed, false otherwise.\n */\nexport function hasProcessedKnownTransaction(\n client: AaveClient,\n request: HasProcessedKnownTransactionRequest,\n): ResultAsync<boolean, UnexpectedError> {\n return client.query(\n HasProcessedKnownTransactionQuery,\n { request },\n 'network-only',\n );\n}\n\n/**\n * Fetches the exchange rate between tokens and fiat currencies.\n *\n * ```ts\n * const result = await exchangeRate(client, {\n * from: { erc20: { chainId: chainId(1), address: evmAddress('0xA0b86a33E6...') } },\n * to: Currency.Usd,\n * });\n * ```\n *\n * @param client - Aave client.\n * @param request - The exchange rate request parameters.\n * @returns The exchange rate information as a fiat amount.\n */\nexport function exchangeRate(\n client: AaveClient,\n request: ExchangeRateRequest,\n): ResultAsync<FiatAmount, UnexpectedError> {\n return client.query(ExchangeRateQuery, { request });\n}\n","import {\n type ActivitiesQuery,\n type BorrowActivity,\n type Chain,\n type Erc20Token,\n encodeHubId,\n type Hub,\n type HubAsset,\n type HubQuery,\n type ID,\n isHubInputVariant,\n isTxHashInputVariant,\n type LiquidatedActivity,\n type NativeToken,\n type RepayActivity,\n type Reserve,\n type ReserveInfo,\n type Spoke,\n type SupplyActivity,\n type SwapByIntent,\n type SwapByIntentWithApprovalRequired,\n type SwapByTransaction,\n type UserPosition,\n type UsingAsCollateralActivity,\n type VariablesOf,\n type WithdrawActivity,\n} from '@aave/graphql';\nimport introspectedSchema from '@aave/graphql/schema';\nimport { BigDecimal, type TxHash } from '@aave/types';\nimport {\n cacheExchange,\n type Resolver,\n type Scalar,\n} from '@urql/exchange-graphcache';\n\nconst transformToBigInt: Resolver = (parent, _args, _cache, info) => {\n return BigInt(parent[info.fieldName] as string) as unknown as Scalar;\n};\n\nconst transformToBigDecimal: Resolver = (parent, _args, _cache, info) => {\n return BigDecimal.new(parent[info.fieldName] as string);\n};\n\nconst transformToNullableBigDecimal: Resolver = (\n parent,\n _args,\n _cache,\n info,\n) => {\n const value = parent[info.fieldName];\n if (value === null || value === undefined) {\n return null;\n }\n return transformToBigDecimal(parent, _args, _cache, info);\n};\n\nconst transformToDate: Resolver = (parent, _args, _cache, info) => {\n return new Date(parent[info.fieldName] as string);\n};\n\nconst transformToNullableDate: Resolver = (parent, _args, _cache, info) => {\n const value = parent[info.fieldName];\n if (value === null || value === undefined) {\n return null;\n }\n return transformToDate(parent, _args, _cache, info);\n};\n\nexport const exchange = cacheExchange({\n schema: introspectedSchema,\n resolvers: {\n PercentNumber: {\n onChainValue: transformToBigInt,\n value: transformToBigDecimal,\n normalized: transformToBigDecimal,\n },\n DecimalNumber: {\n onChainValue: transformToBigInt,\n value: transformToBigDecimal,\n },\n FiatAmount: {\n value: transformToBigDecimal,\n },\n AssetPriceSample: {\n price: transformToBigDecimal,\n date: transformToDate,\n },\n HubSummary: {\n utilizationRate: transformToBigDecimal,\n },\n Reserve: {\n borrowCap: transformToBigDecimal,\n supplyCap: transformToBigDecimal,\n },\n HealthFactorError: {\n current: transformToNullableBigDecimal,\n after: transformToNullableBigDecimal,\n },\n HealthFactorVariation: {\n current: transformToNullableBigDecimal,\n after: transformToNullableBigDecimal,\n },\n HealthFactorWithChange: {\n current: transformToNullableBigDecimal,\n },\n UserSummary: {\n lowestHealthFactor: transformToNullableBigDecimal,\n },\n UserSummaryHistoryItem: {\n healthFactor: transformToNullableBigDecimal,\n date: transformToDate,\n },\n TransactionRequest: {\n value: transformToBigInt,\n },\n APYSample: {\n date: transformToDate,\n },\n AssetBorrowSample: {\n date: transformToDate,\n },\n AssetSupplySample: {\n date: transformToDate,\n },\n BorrowActivity: {\n timestamp: transformToDate,\n },\n LiquidatedActivity: {\n timestamp: transformToDate,\n },\n RepayActivity: {\n timestamp: transformToDate,\n },\n SupplyActivity: {\n timestamp: transformToDate,\n },\n WithdrawActivity: {\n timestamp: transformToDate,\n },\n UsingAsCollateralActivity: {\n timestamp: transformToDate,\n },\n SpokeUserPositionManager: {\n approvedOn: transformToDate,\n },\n SwapCancelled: {\n createdAt: transformToDate,\n cancelledAt: transformToNullableDate,\n },\n SwapExpired: {\n createdAt: transformToDate,\n expiredAt: transformToDate,\n },\n SwapFulfilled: {\n createdAt: transformToDate,\n fulfilledAt: transformToDate,\n },\n SwapOpen: {\n createdAt: transformToDate,\n deadline: transformToDate,\n },\n SwapPendingSignature: {\n createdAt: transformToDate,\n deadline: transformToDate,\n },\n SwapReceipt: {\n createdAt: transformToDate,\n },\n // Intentionally omitted to keep it as BigIntString\n // PermitMessageData: {\n // value: transformToBigInt,\n // nonce: transformToBigInt,\n // },\n\n Query: {\n hub: (_, { request }: VariablesOf<typeof HubQuery>) => {\n if (isHubInputVariant(request.query)) {\n return {\n __typename: 'Hub',\n id: encodeHubId(request.query.hubInput),\n };\n }\n return {\n __typename: 'Hub',\n id: request.query.hubId,\n };\n },\n\n activities: (\n _parent,\n args: VariablesOf<typeof ActivitiesQuery>,\n cache,\n ) => {\n // Bail out if not a txHash filter lookup\n if (!isTxHashInputVariant(args.request.query)) {\n return cache.resolve('Query', 'activities', args);\n }\n\n const { txHash, chainId } = args.request.query.txHash;\n\n // Collect all cached activities matching txHash\n const matches = cache\n .inspectFields('Query')\n .filter((f) => f.fieldName === 'activities')\n .reduce((set, f) => {\n const pageRef = cache.resolve('Query', f.fieldKey) as string | null;\n if (!pageRef) return set;\n\n const itemRefs = cache.resolve(pageRef, 'items') as string[] | null;\n if (!itemRefs) return set;\n\n for (const ref of itemRefs) {\n set.add(ref);\n }\n return set;\n }, new Set<string>())\n .values()\n .toArray()\n .filter((ref) => {\n const itemTxHash = cache.resolve(ref, 'txHash') as TxHash;\n if (itemTxHash !== txHash) return false;\n\n // Verify chainId via spoke.chain.chainId if present\n const spokeRef = cache.resolve(ref, 'spoke') as string | null;\n if (spokeRef) {\n const chainRef = cache.resolve(spokeRef, 'chain') as\n | string\n | null;\n const itemChainId = chainRef\n ? (cache.resolve(chainRef, 'chainId') as number | undefined)\n : undefined;\n if (typeof itemChainId === 'number') {\n return itemChainId === chainId;\n }\n }\n return true;\n })\n .sort((a, b) => {\n const ida = cache.resolve(a, 'id') as ID;\n const idb = cache.resolve(b, 'id') as ID;\n return idb <= ida ? 1 : -1;\n });\n\n if (matches.length === 0) return undefined;\n\n return {\n __typename: 'PaginatedActivitiesResult',\n items: matches,\n pageInfo: {\n __typename: 'PaginatedResultInfo',\n prev: null,\n next: null,\n },\n };\n },\n },\n },\n keys: {\n // Entitied with composite key\n Hub: (data: Hub) => data.id,\n HubAsset: (data: HubAsset) => data.id,\n Reserve: (data: Reserve) => data.id,\n ReserveInfo: (data: ReserveInfo) => data.id,\n Spoke: (data: Spoke) => data.id,\n\n // Entities with id field as key\n BorrowActivity: (data: BorrowActivity) => data.id,\n LiquidatedActivity: (data: LiquidatedActivity) => data.id,\n SupplyActivity: (data: SupplyActivity) => data.id,\n SwapByIntent: (data: SwapByIntent) => data.quote.quoteId,\n SwapByIntentWithApprovalRequired: (\n data: SwapByIntentWithApprovalRequired,\n ) => data.quote.quoteId,\n SwapByTransaction: (data: SwapByTransaction) => data.quote.quoteId,\n UserPosition: (data: UserPosition) => data.id,\n UsingAsCollateralActivity: (data: UsingAsCollateralActivity) => data.id,\n WithdrawActivity: (data: WithdrawActivity) => data.id,\n RepayActivity: (data: RepayActivity) => data.id,\n\n // Entities with address field as key\n Erc20Token: (data: Erc20Token) => data.address,\n\n // Entities with other fields as key\n Chain: (data: Chain) => data.chainId.toString(),\n NativeToken: (data: NativeToken) => data.chain.chainId.toString(),\n\n // Entities without keys will be embedded directly on the parent entity\n PaginatedActivitiesResult: () => null,\n PaginatedResultInfo: () => null,\n PaginatedSpokePositionManagerResult: () => null,\n PaginatedSpokeUserPositionManagerResult: () => null,\n PaginatedUserSwapsResult: () => null,\n SpokePositionManger: () => null,\n SpokeUserPositionManager: () => null,\n SwapReceipt: () => null,\n SwapTransactionRequest: () => null,\n\n // Value objects and result types\n APYSample: () => null,\n Asset: () => null,\n AssetBorrowSample: () => null,\n AssetPriceSample: () => null,\n AssetSummary: () => null,\n AssetSupplySample: () => null,\n CancelSwapTypedData: () => null,\n CancelSwapTypeDefinition: () => null,\n DecimalNumber: () => null,\n DecimalNumberWithChange: () => null,\n DomainData: () => null,\n Erc20Amount: () => null,\n Erc20ApprovalRequired: () => null,\n FiatAmount: () => null,\n FiatAmountValueVariation: () => null,\n FiatAmountWithChange: () => null,\n ForkTopUpResponse: () => null,\n HealthFactorError: () => null,\n HealthFactorVariation: () => null,\n HealthFactorWithChange: () => null,\n HubAssetSettings: () => null,\n HubAssetSummary: () => null,\n HubAssetUserState: () => null,\n HubSummary: () => null,\n InsufficientBalanceError: () => null,\n NativeAmount: () => null,\n PercentNumber: () => null,\n PercentNumberVariation: () => null,\n PercentNumberWithChange: () => null,\n PermitMessageData: () => null,\n PermitTypedDataResponse: () => null,\n PreContractActionRequired: () => null,\n PrepareSwapCancelResult: () => null,\n PreviewUserPosition: () => null,\n ReserveSettings: () => null,\n ReserveStatus: () => null,\n ReserveSummary: () => null,\n ReserveUserState: () => null,\n SwapApprovalRequired: () => null,\n SwapByIntentTypedData: () => null,\n SwapByIntentTypeDefinition: () => null,\n SwapCancelled: () => null,\n SwapExpired: () => null,\n SwapFulfilled: () => null,\n SwapOpen: () => null,\n SwapPendingSignature: () => null,\n SwapQuote: () => null,\n SwapQuoteCosts: () => null,\n TokenInfo: () => null,\n TransactionRequest: () => null,\n TypeDefinition: () => null,\n TypeField: () => null,\n UserBalance: () => null,\n UserBorrowItem: () => null,\n UserSummary: () => null,\n UserSummaryHistoryItem: () => null,\n UserSupplyItem: () => null,\n },\n});\n","import type { EnvironmentConfig } from '@aave/core';\n\n/**\n * The production environment configuration.\n */\nexport const production: EnvironmentConfig = {\n name: 'production',\n backend: 'https://api.v4.aave.com/graphql',\n indexingTimeout: 60_000,\n pollingInterval: 100,\n exchangeRateInterval: 10000,\n};\n\n/**\n * @internal\n */\nexport const staging: EnvironmentConfig = {\n name: 'staging',\n backend: 'https://api.v4.staging.aave.com/graphql',\n indexingTimeout: 60_000,\n pollingInterval: 500,\n exchangeRateInterval: 10000,\n};\n\n/**\n * @internal\n */\nexport const local: EnvironmentConfig = {\n name: 'local',\n backend: 'http://localhost:3007/graphql',\n indexingTimeout: 60_000,\n pollingInterval: 1000,\n exchangeRateInterval: 10000,\n};\n","import type { Context } from '@aave/core';\nimport type { TypedDocumentNode } from '@urql/core';\nimport type { EnvironmentConfig } from '../../core/src/types';\nimport { exchange } from './cache';\nimport { production } from './environments';\n\n/**\n * The client configuration.\n */\nexport type ClientConfig = {\n /**\n * @internal\n * @defaultValue `production`\n */\n environment?: EnvironmentConfig;\n /**\n * @internal\n */\n headers?: Record<string, string>;\n /**\n * Whether to enable caching.\n *\n * @defaultValue `true`\n */\n cache?: boolean;\n /**\n * Whether to enable debug mode.\n *\n * @defaultValue `false`\n */\n debug?: boolean;\n /**\n * The custom fragments to use.\n *\n * @experimental This is an experimental API and may be subject to breaking changes.\n */\n fragments?: TypedDocumentNode[];\n};\n\n/**\n * @internal\n */\nexport function configureContext({\n environment = production,\n headers,\n cache = true,\n debug = false,\n fragments = [],\n}: ClientConfig): Context {\n return {\n displayName: 'AaveClient',\n environment,\n headers,\n cache: cache ? exchange : null,\n debug,\n fragments,\n };\n}\n","import type {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\n ERC20PermitSignature,\n ExecutionPlan,\n HasProcessedKnownTransactionRequest,\n InsufficientBalanceError,\n OperationType,\n PermitTypedDataResponse,\n SwapByIntentTypedData,\n} from '@aave/graphql';\nimport type { ResultAsync, TxHash } from '@aave/types';\n\n/**\n * @internal\n */\nexport type TransactionResult = {\n txHash: TxHash;\n operations: OperationType[] | null;\n};\n\n/**\n * @internal\n */\nexport function isHasProcessedKnownTransactionRequest(\n result: TransactionResult,\n): result is HasProcessedKnownTransactionRequest {\n return result.operations !== null && result.operations.length > 0;\n}\n\nexport type SendWithError =\n | CancelError\n | SigningError\n | TransactionError\n | ValidationError<InsufficientBalanceError>\n | UnexpectedError;\n\nexport type ExecutionPlanHandler<T extends ExecutionPlan = ExecutionPlan> = (\n result: T,\n) => ResultAsync<TransactionResult, SendWithError>;\n\nexport type ERC20PermitHandler = (\n result: PermitTypedDataResponse,\n) => ResultAsync<ERC20PermitSignature, SigningError>;\n\nexport type SwapSignatureHandler = (\n result: CancelSwapTypedData | SwapByIntentTypedData,\n) => ResultAsync<ERC20PermitSignature, SigningError>;\n","import {\n delay,\n GqlClient,\n type StandardData,\n TimeoutError,\n UnexpectedError,\n} from '@aave/core';\nimport type { HasProcessedKnownTransactionRequest } from '@aave/graphql';\nimport {\n type AnyVariables,\n invariant,\n ResultAsync,\n type TxHash,\n} from '@aave/types';\nimport type { TypedDocumentNode } from '@urql/core';\nimport { hasProcessedKnownTransaction } from './actions';\nimport { type ClientConfig, configureContext } from './config';\nimport {\n isHasProcessedKnownTransactionRequest,\n type TransactionResult,\n} from './types';\n\nexport class AaveClient extends GqlClient {\n /**\n * Create a new instance of the {@link AaveClient}.\n *\n * ```ts\n * const client = AaveClient.create({\n * environment: production,\n * });\n * ```\n *\n * @param options - The options to configure the client.\n * @returns The new instance of the client.\n */\n static create(options?: ClientConfig): AaveClient {\n return new AaveClient(configureContext(options ?? {}));\n }\n\n /**\n * Given the transaction hash of an Aave protocol transaction, wait for the transaction to be\n * processed by the Aave v4 API.\n *\n * Returns a {@link TimeoutError} if the transaction is not processed within the expected timeout period.\n *\n * @param result - The transaction execution result to wait for.\n * @returns The transaction hash or a TimeoutError\n */\n readonly waitForTransaction = (\n result: TransactionResult,\n ): ResultAsync<TxHash, TimeoutError | UnexpectedError> => {\n invariant(\n isHasProcessedKnownTransactionRequest(result),\n `Received a transaction result for an untracked operation. Make sure you're following the instructions in the docs.`,\n );\n\n return ResultAsync.fromPromise(\n this.pollTransactionStatus(result),\n (err) => {\n if (err instanceof TimeoutError || err instanceof UnexpectedError) {\n return err;\n }\n return UnexpectedError.from(err);\n },\n );\n };\n\n /**\n * @internal\n */\n async refreshQueryWhere<TValue, TVariables extends AnyVariables>(\n document: TypedDocumentNode<StandardData<TValue>, TVariables>,\n predicate: (\n variables: TVariables,\n data: TValue,\n ) => boolean | Promise<boolean>,\n ): Promise<void> {\n await this.refreshWhere(async (op) => {\n if (op.query === document) {\n const result = await this.query(\n document,\n op.variables as TVariables,\n 'cache-only',\n );\n\n if (result.isErr()) {\n return false;\n }\n\n return predicate(op.variables as TVariables, result.value as TValue);\n }\n return false;\n });\n }\n\n protected async pollTransactionStatus(\n request: HasProcessedKnownTransactionRequest,\n ): Promise<TxHash> {\n const startedAt = Date.now();\n\n while (Date.now() - startedAt < this.context.environment.indexingTimeout) {\n const processed = await hasProcessedKnownTransaction(this, request).match(\n (ok) => ok,\n (err) => {\n throw err;\n },\n );\n\n if (processed) {\n return request.txHash;\n }\n\n await delay(this.context.environment.pollingInterval);\n }\n throw TimeoutError.from(\n `Timeout waiting for transaction ${request.txHash} to be processed.`,\n );\n }\n}\n","import {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\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 type Chain,\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 WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n signTypedData,\n waitForTransactionReceipt,\n} from 'viem/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\n/**\n * @internal\n */\nexport const devnetChain: Chain = 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 */\nexport const supportedChains: Record<\n ChainId,\n ReturnType<typeof defineChain>\n> = {\n // TODO add them back when deployed on these chains\n // [chainId(mainnet.id)]: mainnet,\n // [chainId(sepolia.id)]: sepolia,\n [chainId(devnetChain.id)]: devnetChain,\n};\n\nfunction ensureChain(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<void, CancelError | SigningError> {\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 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 (\n code === SwitchChainError.code &&\n request.chainId in supportedChains\n ) {\n return ResultAsync.fromPromise(\n walletClient.addChain({ chain: supportedChains[request.chainId] }),\n (err) => {\n if (isRpcError(err) && err.code === UserRejectedRequestError.code) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n );\n }\n\n return err.asResultAsync();\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, Chain, 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, Chain, 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 ensureChain(walletClient, request).andThen((_) =>\n sendEip1559Transaction(walletClient, request),\n );\n}\n\n/**\n * @internal\n */\nexport function transactionError(\n chain: Chain | 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","/// <reference path=\"../../../vite-env.d.ts\" />\n\nimport { GraphQLErrorCode, UnexpectedError } from '@aave/core';\nimport { encodeHubId, encodeSpokeId } from '@aave/graphql';\nimport {\n type BigDecimal,\n bigDecimal,\n chainId,\n type EvmAddress,\n evmAddress,\n ResultAsync,\n} from '@aave/types';\nimport {\n type Account,\n type Chain,\n createPublicClient,\n createWalletClient,\n http,\n parseEther,\n parseUnits,\n type Transport,\n type WalletClient,\n} from 'viem';\nimport { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';\nimport { AaveClient } from './AaveClient';\nimport { local, production, staging } from './environments';\nimport { devnetChain } from './viem';\n\nexport const environment =\n import.meta.env.ENVIRONMENT === 'local'\n ? local\n : import.meta.env.ENVIRONMENT === 'production'\n ? production\n : staging;\n\nexport const ETHEREUM_FORK_ID = chainId(\n Number.parseInt(import.meta.env.ETHEREUM_TENDERLY_FORK_ID, 10),\n);\n\n// Token addresses\nexport const ETHEREUM_GHO_ADDRESS = evmAddress(\n '0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f',\n);\nexport const ETHEREUM_WETH_ADDRESS = evmAddress(\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n);\nexport const ETHEREUM_USDC_ADDRESS = evmAddress(\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n);\nexport const ETHEREUM_USDS_ADDRESS = evmAddress(\n '0xdC035D45d973E3EC169d2276DDab16f1e407384F',\n);\nexport const ETHEREUM_WSTETH_ADDRESS = evmAddress(\n '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0',\n);\nexport const ETHEREUM_1INCH_ADDRESS = evmAddress(\n '0x111111111117dC0aa78b770fA6A738034120C302',\n);\n\n// Spoke addresses and ids\nexport const ETHEREUM_SPOKE_CORE_ADDRESS = evmAddress(\n '0xBa97c5E52cd5BC3D7950Ae70779F8FfE92d40CdC',\n);\nexport const ETHEREUM_SPOKE_CORE_ID = encodeSpokeId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_SPOKE_CORE_ADDRESS,\n});\n\nexport const ETHEREUM_SPOKE_ETHENA_ADDRESS = evmAddress(\n '0x2559E4E04F2cA7180e5f20C2872d22EC89601b56',\n);\n\nexport const ETHEREUM_SPOKE_FRONTIER_ADDRESS = evmAddress(\n '0x5738d9cB82d6a1617973C257D05A387bF5568F47',\n);\n\nexport const ETHEREUM_SPOKE_LST_ADDRESS = evmAddress(\n '0x4D4a7b3Ce709b4362D7095a4A0105bDFDb5dA2a7',\n);\nexport const ETHEREUM_SPOKE_ISO_STABLE_ID = encodeSpokeId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_SPOKE_LST_ADDRESS,\n});\n\n// Hub addresses\nexport const ETHEREUM_HUB_CORE_ADDRESS = evmAddress(\n '0xaD905aD5EA5B98cD50AE40Cfe368344686a21366',\n);\nexport const ETHEREUM_HUB_CORE_ID = encodeHubId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_HUB_CORE_ADDRESS,\n});\n\nexport const ETHEREUM_FORK_RPC_URL = import.meta.env\n .ETHEREUM_TENDERLY_PUBLIC_RPC;\n\nexport const ETHEREUM_FORK_RPC_URL_ADMIN = import.meta.env\n .ETHEREUM_TENDERLY_ADMIN_RPC;\n\nexport const client = AaveClient.create({\n environment,\n headers: {\n 'x-e2e-tests': import.meta.env.API_X_E2E_TESTS_HEADER,\n },\n});\n\nexport async function createNewWallet(\n privateKey?: `0x${string}`,\n): Promise<WalletClient<Transport, Chain, Account>> {\n if (!privateKey) {\n const privateKey = generatePrivateKey();\n const wallet = createWalletClient({\n account: privateKeyToAccount(privateKey),\n chain: devnetChain,\n transport: http(),\n });\n\n await fundNativeAddress(evmAddress(wallet.account.address));\n\n return wallet;\n }\n return createWalletClient({\n account: privateKeyToAccount(privateKey),\n chain: devnetChain,\n transport: http(),\n });\n}\n\n// Tenderly RPC type for setBalance\ntype TSetBalanceRpc = {\n Method: 'tenderly_setBalance';\n Parameters: [addresses: string[], amount: string];\n ReturnType: string;\n};\n\n// Tenderly RPC type for set ERC20 balance\ntype TSetErc20BalanceRpc = {\n Method: 'tenderly_setErc20Balance';\n Parameters: [tokenAddress: string, address: string, amount: string];\n ReturnType: string;\n};\n\nexport function fundNativeAddress(\n address: EvmAddress,\n amount: BigDecimal = bigDecimal('1.0'), // 1 ETH\n): ResultAsync<string, UnexpectedError> {\n // Create client with fork chain - you'll need to replace this with your actual fork chain config\n const publicClient = createPublicClient({\n chain: {\n id: ETHEREUM_FORK_ID,\n name: 'Tenderly Fork',\n network: 'tenderly-fork',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [ETHEREUM_FORK_RPC_URL_ADMIN] },\n },\n },\n transport: http(ETHEREUM_FORK_RPC_URL_ADMIN),\n });\n\n const amountInWei = parseEther(amount.toString());\n const amountHex = `0x${amountInWei.toString(16)}`;\n\n return ResultAsync.fromPromise(\n publicClient\n .request<TSetBalanceRpc>({\n method: 'tenderly_setBalance',\n params: [[address], amountHex],\n })\n .then(async (res) => {\n await wait(500); // Temporal fix to avoid tenderly issues with the balance not being set\n return res;\n }),\n (err) => UnexpectedError.from(err),\n );\n}\n\nexport function fundErc20Address(\n address: EvmAddress,\n token: {\n address: EvmAddress;\n amount: BigDecimal;\n decimals?: number;\n },\n): ResultAsync<string, Error> {\n const publicClient = createPublicClient({\n chain: {\n id: ETHEREUM_FORK_ID,\n name: 'Tenderly Fork',\n network: 'tenderly-fork',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [ETHEREUM_FORK_RPC_URL_ADMIN] },\n },\n },\n transport: http(ETHEREUM_FORK_RPC_URL_ADMIN),\n });\n\n // Convert amount to the smallest unit (e.g., wei for 18 decimals)\n const amountInSmallestUnit = parseUnits(\n token.amount.toString(),\n token.decimals ?? 18,\n );\n const amountHex = `0x${amountInSmallestUnit.toString(16)}`;\n\n return ResultAsync.fromPromise(\n publicClient\n .request<TSetErc20BalanceRpc>({\n method: 'tenderly_setErc20Balance',\n params: [token.address, address, amountHex],\n })\n .then(async (res) => {\n await wait(500); // Temporal fix to avoid tenderly issues with the balance not being set\n return res;\n }),\n (err) => UnexpectedError.from(err),\n );\n}\n\nconst messages: Record<GraphQLErrorCode, string> = {\n [GraphQLErrorCode.UNAUTHENTICATED]:\n \"Unauthenticated - Authentication is required to access '<operation>'\",\n [GraphQLErrorCode.FORBIDDEN]:\n \"Forbidden - You are not authorized to access '<operation>'\",\n [GraphQLErrorCode.INTERNAL_SERVER_ERROR]:\n 'Internal server error - Please try again later',\n [GraphQLErrorCode.BAD_USER_INPUT]:\n 'Bad user input - Please check the input and try again',\n [GraphQLErrorCode.BAD_REQUEST]:\n 'Bad request - Please check the request and try again',\n};\n\nexport function createGraphQLErrorObject(code: GraphQLErrorCode) {\n return {\n message: messages[code],\n locations: [],\n path: [],\n extensions: {\n code: code,\n },\n };\n}\n\nexport function wait(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Function to get balance ERC20 token\nexport async function getBalance(\n address: EvmAddress,\n tokenAddress: EvmAddress,\n): Promise<BigDecimal> {\n const publicClient = createPublicClient({\n chain: devnetChain,\n transport: http(ETHEREUM_FORK_RPC_URL),\n });\n\n const [balance, decimals] = await Promise.all([\n publicClient.readContract({\n address: tokenAddress,\n abi: [\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'balanceOf',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n ] as const,\n functionName: 'balanceOf',\n args: [address],\n }),\n publicClient.readContract({\n address: tokenAddress,\n abi: [\n {\n inputs: [],\n name: 'decimals',\n outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }],\n stateMutability: 'pure',\n type: 'function',\n },\n ] as const,\n functionName: 'decimals',\n }),\n ]);\n\n return bigDecimal(balance).rescale(-decimals);\n}\n\n// Function to get native token (ETH) balance\nexport async function getNativeBalance(\n address: EvmAddress,\n): Promise<BigDecimal> {\n const publicClient = createPublicClient({\n chain: devnetChain,\n transport: http(ETHEREUM_FORK_RPC_URL),\n });\n\n const balance = await publicClient.getBalance({\n address: address,\n });\n\n // Convert from wei to ETH (18 decimals)\n return bigDecimal(balance).rescale(-18);\n}\n"]}
@@ -1,3 +1,3 @@
1
- import {c,b,d as d$1}from'./chunk-BQNVAUS6.js';import {a}from'./chunk-2TNQ52OQ.js';import'./chunk-BQFM5RT3.js';import {GraphQLErrorCode,UnexpectedError}from'@aave/core';import {encodeSpokeId,encodeHubId}from'@aave/graphql';import {chainId,evmAddress,bigDecimal,ResultAsync}from'@aave/types';import {createWalletClient,http,createPublicClient,parseEther,parseUnits}from'viem';import {generatePrivateKey,privateKeyToAccount}from'viem/accounts';var g=import.meta.env.ENVIRONMENT==="local"?c:b,E=chainId(Number.parseInt("123456789",10)),q=evmAddress("0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f"),G=evmAddress("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),Q=evmAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"),Y=evmAddress("0xdC035D45d973E3EC169d2276DDab16f1e407384F"),$=evmAddress("0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0"),V=evmAddress("0x111111111117dC0aa78b770fA6A738034120C302"),B=evmAddress("0xBa97c5E52cd5BC3D7950Ae70779F8FfE92d40CdC"),j=encodeSpokeId({chainId:E,address:B}),z=evmAddress("0x2559E4E04F2cA7180e5f20C2872d22EC89601b56"),X=evmAddress("0x5738d9cB82d6a1617973C257D05A387bF5568F47"),I=evmAddress("0x4D4a7b3Ce709b4362D7095a4A0105bDFDb5dA2a7"),J=encodeSpokeId({chainId:E,address:I}),M=evmAddress("0xaD905aD5EA5B98cD50AE40Cfe368344686a21366"),Z=encodeHubId({chainId:E,address:M}),x="https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146",d=import.meta.env.ETHEREUM_TENDERLY_ADMIN_RPC,ee=d$1.create({environment:g,headers:{"x-e2e-tests":import.meta.env.API_X_E2E_TESTS_HEADER}});async function te(e){if(!e){let t=generatePrivateKey(),n=createWalletClient({account:privateKeyToAccount(t),chain:a,transport:http()});return await P(evmAddress(n.account.address)),n}return createWalletClient({account:privateKeyToAccount(e),chain:a,transport:http()})}function P(e,t=bigDecimal("1.0")){let n=createPublicClient({chain:{id:E,name:"Tenderly Fork",network:"tenderly-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:[d]}}},transport:http(d)}),o=`0x${parseEther(t.toString()).toString(16)}`;return ResultAsync.fromPromise(n.request({method:"tenderly_setBalance",params:[[e],o]}).then(async a=>(await y(500),a)),a=>UnexpectedError.from(a))}function re(e,t){let n=createPublicClient({chain:{id:E,name:"Tenderly Fork",network:"tenderly-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:[d]}}},transport:http(d)}),o=`0x${parseUnits(t.amount.toString(),t.decimals??18).toString(16)}`;return ResultAsync.fromPromise(n.request({method:"tenderly_setErc20Balance",params:[t.address,e,o]}).then(async a=>(await y(500),a)),a=>UnexpectedError.from(a))}var v={[GraphQLErrorCode.UNAUTHENTICATED]:"Unauthenticated - Authentication is required to access '<operation>'",[GraphQLErrorCode.FORBIDDEN]:"Forbidden - You are not authorized to access '<operation>'",[GraphQLErrorCode.INTERNAL_SERVER_ERROR]:"Internal server error - Please try again later",[GraphQLErrorCode.BAD_USER_INPUT]:"Bad user input - Please check the input and try again",[GraphQLErrorCode.BAD_REQUEST]:"Bad request - Please check the request and try again"};function ne(e){return {message:v[e],locations:[],path:[],extensions:{code:e}}}function y(e){return new Promise(t=>setTimeout(t,e))}async function ae(e,t){let n=createPublicClient({chain:a,transport:http(x)}),[m,o]=await Promise.all([n.readContract({address:t,abi:[{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"}],functionName:"balanceOf",args:[e]}),n.readContract({address:t,abi:[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"}],functionName:"decimals"})]);return bigDecimal(m).rescale(-o)}async function se(e){let n=await createPublicClient({chain:a,transport:http(x)}).getBalance({address:e});return bigDecimal(n).rescale(-18)}
2
- export{V as ETHEREUM_1INCH_ADDRESS,E as ETHEREUM_FORK_ID,x as ETHEREUM_FORK_RPC_URL,d as ETHEREUM_FORK_RPC_URL_ADMIN,q as ETHEREUM_GHO_ADDRESS,M as ETHEREUM_HUB_CORE_ADDRESS,Z as ETHEREUM_HUB_CORE_ID,B as ETHEREUM_SPOKE_CORE_ADDRESS,j as ETHEREUM_SPOKE_CORE_ID,z as ETHEREUM_SPOKE_ETHENA_ADDRESS,X as ETHEREUM_SPOKE_FRONTIER_ADDRESS,J as ETHEREUM_SPOKE_ISO_STABLE_ID,I as ETHEREUM_SPOKE_LST_ADDRESS,Q as ETHEREUM_USDC_ADDRESS,Y as ETHEREUM_USDS_ADDRESS,G as ETHEREUM_WETH_ADDRESS,$ as ETHEREUM_WSTETH_ADDRESS,ee as client,ne as createGraphQLErrorObject,te as createNewWallet,g as environment,re as fundErc20Address,P as fundNativeAddress,ae as getBalance,se as getNativeBalance,y as wait};//# sourceMappingURL=test-utils.js.map
1
+ import {c,a,b,d as d$1}from'./chunk-BQNVAUS6.js';import {a as a$1}from'./chunk-2URLJFKP.js';import'./chunk-BQFM5RT3.js';import {GraphQLErrorCode,UnexpectedError}from'@aave/core';import {encodeSpokeId,encodeHubId}from'@aave/graphql';import {chainId,evmAddress,bigDecimal,ResultAsync}from'@aave/types';import {createWalletClient,http,createPublicClient,parseEther,parseUnits}from'viem';import {generatePrivateKey,privateKeyToAccount}from'viem/accounts';var B=import.meta.env.ENVIRONMENT==="local"?c:import.meta.env.ENVIRONMENT==="production"?a:b,E=chainId(Number.parseInt("123456789",10)),G=evmAddress("0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f"),Q=evmAddress("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),Y=evmAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"),V=evmAddress("0xdC035D45d973E3EC169d2276DDab16f1e407384F"),$=evmAddress("0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0"),j=evmAddress("0x111111111117dC0aa78b770fA6A738034120C302"),I=evmAddress("0xBa97c5E52cd5BC3D7950Ae70779F8FfE92d40CdC"),z=encodeSpokeId({chainId:E,address:I}),X=evmAddress("0x2559E4E04F2cA7180e5f20C2872d22EC89601b56"),J=evmAddress("0x5738d9cB82d6a1617973C257D05A387bF5568F47"),M=evmAddress("0x4D4a7b3Ce709b4362D7095a4A0105bDFDb5dA2a7"),Z=encodeSpokeId({chainId:E,address:M}),P=evmAddress("0xaD905aD5EA5B98cD50AE40Cfe368344686a21366"),ee=encodeHubId({chainId:E,address:P}),y="https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146",d=import.meta.env.ETHEREUM_TENDERLY_ADMIN_RPC,te=d$1.create({environment:B,headers:{"x-e2e-tests":import.meta.env.API_X_E2E_TESTS_HEADER}});async function re(e){if(!e){let t=generatePrivateKey(),n=createWalletClient({account:privateKeyToAccount(t),chain:a$1,transport:http()});return await N(evmAddress(n.account.address)),n}return createWalletClient({account:privateKeyToAccount(e),chain:a$1,transport:http()})}function N(e,t=bigDecimal("1.0")){let n=createPublicClient({chain:{id:E,name:"Tenderly Fork",network:"tenderly-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:[d]}}},transport:http(d)}),s=`0x${parseEther(t.toString()).toString(16)}`;return ResultAsync.fromPromise(n.request({method:"tenderly_setBalance",params:[[e],s]}).then(async a=>(await f(500),a)),a=>UnexpectedError.from(a))}function ne(e,t){let n=createPublicClient({chain:{id:E,name:"Tenderly Fork",network:"tenderly-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:[d]}}},transport:http(d)}),s=`0x${parseUnits(t.amount.toString(),t.decimals??18).toString(16)}`;return ResultAsync.fromPromise(n.request({method:"tenderly_setErc20Balance",params:[t.address,e,s]}).then(async a=>(await f(500),a)),a=>UnexpectedError.from(a))}var v={[GraphQLErrorCode.UNAUTHENTICATED]:"Unauthenticated - Authentication is required to access '<operation>'",[GraphQLErrorCode.FORBIDDEN]:"Forbidden - You are not authorized to access '<operation>'",[GraphQLErrorCode.INTERNAL_SERVER_ERROR]:"Internal server error - Please try again later",[GraphQLErrorCode.BAD_USER_INPUT]:"Bad user input - Please check the input and try again",[GraphQLErrorCode.BAD_REQUEST]:"Bad request - Please check the request and try again"};function ae(e){return {message:v[e],locations:[],path:[],extensions:{code:e}}}function f(e){return new Promise(t=>setTimeout(t,e))}async function oe(e,t){let n=createPublicClient({chain:a$1,transport:http(y)}),[m,s]=await Promise.all([n.readContract({address:t,abi:[{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"}],functionName:"balanceOf",args:[e]}),n.readContract({address:t,abi:[{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"}],functionName:"decimals"})]);return bigDecimal(m).rescale(-s)}async function se(e){let n=await createPublicClient({chain:a$1,transport:http(y)}).getBalance({address:e});return bigDecimal(n).rescale(-18)}
2
+ export{j as ETHEREUM_1INCH_ADDRESS,E as ETHEREUM_FORK_ID,y as ETHEREUM_FORK_RPC_URL,d as ETHEREUM_FORK_RPC_URL_ADMIN,G as ETHEREUM_GHO_ADDRESS,P as ETHEREUM_HUB_CORE_ADDRESS,ee as ETHEREUM_HUB_CORE_ID,I as ETHEREUM_SPOKE_CORE_ADDRESS,z as ETHEREUM_SPOKE_CORE_ID,X as ETHEREUM_SPOKE_ETHENA_ADDRESS,J as ETHEREUM_SPOKE_FRONTIER_ADDRESS,Z as ETHEREUM_SPOKE_ISO_STABLE_ID,M as ETHEREUM_SPOKE_LST_ADDRESS,Y as ETHEREUM_USDC_ADDRESS,V as ETHEREUM_USDS_ADDRESS,Q as ETHEREUM_WETH_ADDRESS,$ as ETHEREUM_WSTETH_ADDRESS,te as client,ae as createGraphQLErrorObject,re as createNewWallet,B as environment,ne as fundErc20Address,N as fundNativeAddress,oe as getBalance,se as getNativeBalance,f as wait};//# sourceMappingURL=test-utils.js.map
3
3
  //# sourceMappingURL=test-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/test-utils.ts"],"names":["environment","local","staging","ETHEREUM_FORK_ID","chainId","ETHEREUM_GHO_ADDRESS","evmAddress","ETHEREUM_WETH_ADDRESS","ETHEREUM_USDC_ADDRESS","ETHEREUM_USDS_ADDRESS","ETHEREUM_WSTETH_ADDRESS","ETHEREUM_1INCH_ADDRESS","ETHEREUM_SPOKE_CORE_ADDRESS","ETHEREUM_SPOKE_CORE_ID","encodeSpokeId","ETHEREUM_SPOKE_ETHENA_ADDRESS","ETHEREUM_SPOKE_FRONTIER_ADDRESS","ETHEREUM_SPOKE_LST_ADDRESS","ETHEREUM_SPOKE_ISO_STABLE_ID","ETHEREUM_HUB_CORE_ADDRESS","ETHEREUM_HUB_CORE_ID","encodeHubId","ETHEREUM_FORK_RPC_URL","ETHEREUM_FORK_RPC_URL_ADMIN","client","AaveClient","createNewWallet","privateKey","generatePrivateKey","wallet","createWalletClient","privateKeyToAccount","devnetChain","http","fundNativeAddress","address","amount","bigDecimal","publicClient","createPublicClient","amountHex","parseEther","ResultAsync","res","wait","err","UnexpectedError","fundErc20Address","token","parseUnits","messages","GraphQLErrorCode","createGraphQLErrorObject","code","ms","resolve","getBalance","tokenAddress","balance","decimals","getNativeBalance"],"mappings":"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","file":"test-utils.js","sourcesContent":["/// <reference path=\"../../../vite-env.d.ts\" />\n\nimport { GraphQLErrorCode, UnexpectedError } from '@aave/core';\nimport { encodeHubId, encodeSpokeId } from '@aave/graphql';\nimport {\n type BigDecimal,\n bigDecimal,\n chainId,\n type EvmAddress,\n evmAddress,\n ResultAsync,\n} from '@aave/types';\nimport {\n type Account,\n type Chain,\n createPublicClient,\n createWalletClient,\n http,\n parseEther,\n parseUnits,\n type Transport,\n type WalletClient,\n} from 'viem';\nimport { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';\nimport { AaveClient } from './AaveClient';\nimport { local, staging } from './environments';\nimport { devnetChain } from './viem';\n\nexport const environment =\n import.meta.env.ENVIRONMENT === 'local' ? local : staging;\n\nexport const ETHEREUM_FORK_ID = chainId(\n Number.parseInt(import.meta.env.ETHEREUM_TENDERLY_FORK_ID, 10),\n);\n\n// Token addresses\nexport const ETHEREUM_GHO_ADDRESS = evmAddress(\n '0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f',\n);\nexport const ETHEREUM_WETH_ADDRESS = evmAddress(\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n);\nexport const ETHEREUM_USDC_ADDRESS = evmAddress(\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n);\nexport const ETHEREUM_USDS_ADDRESS = evmAddress(\n '0xdC035D45d973E3EC169d2276DDab16f1e407384F',\n);\nexport const ETHEREUM_WSTETH_ADDRESS = evmAddress(\n '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0',\n);\nexport const ETHEREUM_1INCH_ADDRESS = evmAddress(\n '0x111111111117dC0aa78b770fA6A738034120C302',\n);\n\n// Spoke addresses and ids\nexport const ETHEREUM_SPOKE_CORE_ADDRESS = evmAddress(\n '0xBa97c5E52cd5BC3D7950Ae70779F8FfE92d40CdC',\n);\nexport const ETHEREUM_SPOKE_CORE_ID = encodeSpokeId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_SPOKE_CORE_ADDRESS,\n});\n\nexport const ETHEREUM_SPOKE_ETHENA_ADDRESS = evmAddress(\n '0x2559E4E04F2cA7180e5f20C2872d22EC89601b56',\n);\n\nexport const ETHEREUM_SPOKE_FRONTIER_ADDRESS = evmAddress(\n '0x5738d9cB82d6a1617973C257D05A387bF5568F47',\n);\n\nexport const ETHEREUM_SPOKE_LST_ADDRESS = evmAddress(\n '0x4D4a7b3Ce709b4362D7095a4A0105bDFDb5dA2a7',\n);\nexport const ETHEREUM_SPOKE_ISO_STABLE_ID = encodeSpokeId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_SPOKE_LST_ADDRESS,\n});\n\n// Hub addresses\nexport const ETHEREUM_HUB_CORE_ADDRESS = evmAddress(\n '0xaD905aD5EA5B98cD50AE40Cfe368344686a21366',\n);\nexport const ETHEREUM_HUB_CORE_ID = encodeHubId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_HUB_CORE_ADDRESS,\n});\n\nexport const ETHEREUM_FORK_RPC_URL = import.meta.env\n .ETHEREUM_TENDERLY_PUBLIC_RPC;\n\nexport const ETHEREUM_FORK_RPC_URL_ADMIN = import.meta.env\n .ETHEREUM_TENDERLY_ADMIN_RPC;\n\nexport const client = AaveClient.create({\n environment,\n headers: {\n 'x-e2e-tests': import.meta.env.API_X_E2E_TESTS_HEADER,\n },\n});\n\nexport async function createNewWallet(\n privateKey?: `0x${string}`,\n): Promise<WalletClient<Transport, Chain, Account>> {\n if (!privateKey) {\n const privateKey = generatePrivateKey();\n const wallet = createWalletClient({\n account: privateKeyToAccount(privateKey),\n chain: devnetChain,\n transport: http(),\n });\n\n await fundNativeAddress(evmAddress(wallet.account.address));\n\n return wallet;\n }\n return createWalletClient({\n account: privateKeyToAccount(privateKey),\n chain: devnetChain,\n transport: http(),\n });\n}\n\n// Tenderly RPC type for setBalance\ntype TSetBalanceRpc = {\n Method: 'tenderly_setBalance';\n Parameters: [addresses: string[], amount: string];\n ReturnType: string;\n};\n\n// Tenderly RPC type for set ERC20 balance\ntype TSetErc20BalanceRpc = {\n Method: 'tenderly_setErc20Balance';\n Parameters: [tokenAddress: string, address: string, amount: string];\n ReturnType: string;\n};\n\nexport function fundNativeAddress(\n address: EvmAddress,\n amount: BigDecimal = bigDecimal('1.0'), // 1 ETH\n): ResultAsync<string, UnexpectedError> {\n // Create client with fork chain - you'll need to replace this with your actual fork chain config\n const publicClient = createPublicClient({\n chain: {\n id: ETHEREUM_FORK_ID,\n name: 'Tenderly Fork',\n network: 'tenderly-fork',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [ETHEREUM_FORK_RPC_URL_ADMIN] },\n },\n },\n transport: http(ETHEREUM_FORK_RPC_URL_ADMIN),\n });\n\n const amountInWei = parseEther(amount.toString());\n const amountHex = `0x${amountInWei.toString(16)}`;\n\n return ResultAsync.fromPromise(\n publicClient\n .request<TSetBalanceRpc>({\n method: 'tenderly_setBalance',\n params: [[address], amountHex],\n })\n .then(async (res) => {\n await wait(500); // Temporal fix to avoid tenderly issues with the balance not being set\n return res;\n }),\n (err) => UnexpectedError.from(err),\n );\n}\n\nexport function fundErc20Address(\n address: EvmAddress,\n token: {\n address: EvmAddress;\n amount: BigDecimal;\n decimals?: number;\n },\n): ResultAsync<string, Error> {\n const publicClient = createPublicClient({\n chain: {\n id: ETHEREUM_FORK_ID,\n name: 'Tenderly Fork',\n network: 'tenderly-fork',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [ETHEREUM_FORK_RPC_URL_ADMIN] },\n },\n },\n transport: http(ETHEREUM_FORK_RPC_URL_ADMIN),\n });\n\n // Convert amount to the smallest unit (e.g., wei for 18 decimals)\n const amountInSmallestUnit = parseUnits(\n token.amount.toString(),\n token.decimals ?? 18,\n );\n const amountHex = `0x${amountInSmallestUnit.toString(16)}`;\n\n return ResultAsync.fromPromise(\n publicClient\n .request<TSetErc20BalanceRpc>({\n method: 'tenderly_setErc20Balance',\n params: [token.address, address, amountHex],\n })\n .then(async (res) => {\n await wait(500); // Temporal fix to avoid tenderly issues with the balance not being set\n return res;\n }),\n (err) => UnexpectedError.from(err),\n );\n}\n\nconst messages: Record<GraphQLErrorCode, string> = {\n [GraphQLErrorCode.UNAUTHENTICATED]:\n \"Unauthenticated - Authentication is required to access '<operation>'\",\n [GraphQLErrorCode.FORBIDDEN]:\n \"Forbidden - You are not authorized to access '<operation>'\",\n [GraphQLErrorCode.INTERNAL_SERVER_ERROR]:\n 'Internal server error - Please try again later',\n [GraphQLErrorCode.BAD_USER_INPUT]:\n 'Bad user input - Please check the input and try again',\n [GraphQLErrorCode.BAD_REQUEST]:\n 'Bad request - Please check the request and try again',\n};\n\nexport function createGraphQLErrorObject(code: GraphQLErrorCode) {\n return {\n message: messages[code],\n locations: [],\n path: [],\n extensions: {\n code: code,\n },\n };\n}\n\nexport function wait(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Function to get balance ERC20 token\nexport async function getBalance(\n address: EvmAddress,\n tokenAddress: EvmAddress,\n): Promise<BigDecimal> {\n const publicClient = createPublicClient({\n chain: devnetChain,\n transport: http(ETHEREUM_FORK_RPC_URL),\n });\n\n const [balance, decimals] = await Promise.all([\n publicClient.readContract({\n address: tokenAddress,\n abi: [\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'balanceOf',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n ] as const,\n functionName: 'balanceOf',\n args: [address],\n }),\n publicClient.readContract({\n address: tokenAddress,\n abi: [\n {\n inputs: [],\n name: 'decimals',\n outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }],\n stateMutability: 'pure',\n type: 'function',\n },\n ] as const,\n functionName: 'decimals',\n }),\n ]);\n\n return bigDecimal(balance).rescale(-decimals);\n}\n\n// Function to get native token (ETH) balance\nexport async function getNativeBalance(\n address: EvmAddress,\n): Promise<BigDecimal> {\n const publicClient = createPublicClient({\n chain: devnetChain,\n transport: http(ETHEREUM_FORK_RPC_URL),\n });\n\n const balance = await publicClient.getBalance({\n address: address,\n });\n\n // Convert from wei to ETH (18 decimals)\n return bigDecimal(balance).rescale(-18);\n}\n"]}
1
+ {"version":3,"sources":["../src/test-utils.ts"],"names":["environment","local","production","staging","ETHEREUM_FORK_ID","chainId","ETHEREUM_GHO_ADDRESS","evmAddress","ETHEREUM_WETH_ADDRESS","ETHEREUM_USDC_ADDRESS","ETHEREUM_USDS_ADDRESS","ETHEREUM_WSTETH_ADDRESS","ETHEREUM_1INCH_ADDRESS","ETHEREUM_SPOKE_CORE_ADDRESS","ETHEREUM_SPOKE_CORE_ID","encodeSpokeId","ETHEREUM_SPOKE_ETHENA_ADDRESS","ETHEREUM_SPOKE_FRONTIER_ADDRESS","ETHEREUM_SPOKE_LST_ADDRESS","ETHEREUM_SPOKE_ISO_STABLE_ID","ETHEREUM_HUB_CORE_ADDRESS","ETHEREUM_HUB_CORE_ID","encodeHubId","ETHEREUM_FORK_RPC_URL","ETHEREUM_FORK_RPC_URL_ADMIN","client","AaveClient","createNewWallet","privateKey","generatePrivateKey","wallet","createWalletClient","privateKeyToAccount","devnetChain","http","fundNativeAddress","address","amount","bigDecimal","publicClient","createPublicClient","amountHex","parseEther","ResultAsync","res","wait","err","UnexpectedError","fundErc20Address","token","parseUnits","messages","GraphQLErrorCode","createGraphQLErrorObject","code","ms","resolve","getBalance","tokenAddress","balance","decimals","getNativeBalance"],"mappings":"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","file":"test-utils.js","sourcesContent":["/// <reference path=\"../../../vite-env.d.ts\" />\n\nimport { GraphQLErrorCode, UnexpectedError } from '@aave/core';\nimport { encodeHubId, encodeSpokeId } from '@aave/graphql';\nimport {\n type BigDecimal,\n bigDecimal,\n chainId,\n type EvmAddress,\n evmAddress,\n ResultAsync,\n} from '@aave/types';\nimport {\n type Account,\n type Chain,\n createPublicClient,\n createWalletClient,\n http,\n parseEther,\n parseUnits,\n type Transport,\n type WalletClient,\n} from 'viem';\nimport { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';\nimport { AaveClient } from './AaveClient';\nimport { local, production, staging } from './environments';\nimport { devnetChain } from './viem';\n\nexport const environment =\n import.meta.env.ENVIRONMENT === 'local'\n ? local\n : import.meta.env.ENVIRONMENT === 'production'\n ? production\n : staging;\n\nexport const ETHEREUM_FORK_ID = chainId(\n Number.parseInt(import.meta.env.ETHEREUM_TENDERLY_FORK_ID, 10),\n);\n\n// Token addresses\nexport const ETHEREUM_GHO_ADDRESS = evmAddress(\n '0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f',\n);\nexport const ETHEREUM_WETH_ADDRESS = evmAddress(\n '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n);\nexport const ETHEREUM_USDC_ADDRESS = evmAddress(\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n);\nexport const ETHEREUM_USDS_ADDRESS = evmAddress(\n '0xdC035D45d973E3EC169d2276DDab16f1e407384F',\n);\nexport const ETHEREUM_WSTETH_ADDRESS = evmAddress(\n '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0',\n);\nexport const ETHEREUM_1INCH_ADDRESS = evmAddress(\n '0x111111111117dC0aa78b770fA6A738034120C302',\n);\n\n// Spoke addresses and ids\nexport const ETHEREUM_SPOKE_CORE_ADDRESS = evmAddress(\n '0xBa97c5E52cd5BC3D7950Ae70779F8FfE92d40CdC',\n);\nexport const ETHEREUM_SPOKE_CORE_ID = encodeSpokeId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_SPOKE_CORE_ADDRESS,\n});\n\nexport const ETHEREUM_SPOKE_ETHENA_ADDRESS = evmAddress(\n '0x2559E4E04F2cA7180e5f20C2872d22EC89601b56',\n);\n\nexport const ETHEREUM_SPOKE_FRONTIER_ADDRESS = evmAddress(\n '0x5738d9cB82d6a1617973C257D05A387bF5568F47',\n);\n\nexport const ETHEREUM_SPOKE_LST_ADDRESS = evmAddress(\n '0x4D4a7b3Ce709b4362D7095a4A0105bDFDb5dA2a7',\n);\nexport const ETHEREUM_SPOKE_ISO_STABLE_ID = encodeSpokeId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_SPOKE_LST_ADDRESS,\n});\n\n// Hub addresses\nexport const ETHEREUM_HUB_CORE_ADDRESS = evmAddress(\n '0xaD905aD5EA5B98cD50AE40Cfe368344686a21366',\n);\nexport const ETHEREUM_HUB_CORE_ID = encodeHubId({\n chainId: ETHEREUM_FORK_ID,\n address: ETHEREUM_HUB_CORE_ADDRESS,\n});\n\nexport const ETHEREUM_FORK_RPC_URL = import.meta.env\n .ETHEREUM_TENDERLY_PUBLIC_RPC;\n\nexport const ETHEREUM_FORK_RPC_URL_ADMIN = import.meta.env\n .ETHEREUM_TENDERLY_ADMIN_RPC;\n\nexport const client = AaveClient.create({\n environment,\n headers: {\n 'x-e2e-tests': import.meta.env.API_X_E2E_TESTS_HEADER,\n },\n});\n\nexport async function createNewWallet(\n privateKey?: `0x${string}`,\n): Promise<WalletClient<Transport, Chain, Account>> {\n if (!privateKey) {\n const privateKey = generatePrivateKey();\n const wallet = createWalletClient({\n account: privateKeyToAccount(privateKey),\n chain: devnetChain,\n transport: http(),\n });\n\n await fundNativeAddress(evmAddress(wallet.account.address));\n\n return wallet;\n }\n return createWalletClient({\n account: privateKeyToAccount(privateKey),\n chain: devnetChain,\n transport: http(),\n });\n}\n\n// Tenderly RPC type for setBalance\ntype TSetBalanceRpc = {\n Method: 'tenderly_setBalance';\n Parameters: [addresses: string[], amount: string];\n ReturnType: string;\n};\n\n// Tenderly RPC type for set ERC20 balance\ntype TSetErc20BalanceRpc = {\n Method: 'tenderly_setErc20Balance';\n Parameters: [tokenAddress: string, address: string, amount: string];\n ReturnType: string;\n};\n\nexport function fundNativeAddress(\n address: EvmAddress,\n amount: BigDecimal = bigDecimal('1.0'), // 1 ETH\n): ResultAsync<string, UnexpectedError> {\n // Create client with fork chain - you'll need to replace this with your actual fork chain config\n const publicClient = createPublicClient({\n chain: {\n id: ETHEREUM_FORK_ID,\n name: 'Tenderly Fork',\n network: 'tenderly-fork',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [ETHEREUM_FORK_RPC_URL_ADMIN] },\n },\n },\n transport: http(ETHEREUM_FORK_RPC_URL_ADMIN),\n });\n\n const amountInWei = parseEther(amount.toString());\n const amountHex = `0x${amountInWei.toString(16)}`;\n\n return ResultAsync.fromPromise(\n publicClient\n .request<TSetBalanceRpc>({\n method: 'tenderly_setBalance',\n params: [[address], amountHex],\n })\n .then(async (res) => {\n await wait(500); // Temporal fix to avoid tenderly issues with the balance not being set\n return res;\n }),\n (err) => UnexpectedError.from(err),\n );\n}\n\nexport function fundErc20Address(\n address: EvmAddress,\n token: {\n address: EvmAddress;\n amount: BigDecimal;\n decimals?: number;\n },\n): ResultAsync<string, Error> {\n const publicClient = createPublicClient({\n chain: {\n id: ETHEREUM_FORK_ID,\n name: 'Tenderly Fork',\n network: 'tenderly-fork',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [ETHEREUM_FORK_RPC_URL_ADMIN] },\n },\n },\n transport: http(ETHEREUM_FORK_RPC_URL_ADMIN),\n });\n\n // Convert amount to the smallest unit (e.g., wei for 18 decimals)\n const amountInSmallestUnit = parseUnits(\n token.amount.toString(),\n token.decimals ?? 18,\n );\n const amountHex = `0x${amountInSmallestUnit.toString(16)}`;\n\n return ResultAsync.fromPromise(\n publicClient\n .request<TSetErc20BalanceRpc>({\n method: 'tenderly_setErc20Balance',\n params: [token.address, address, amountHex],\n })\n .then(async (res) => {\n await wait(500); // Temporal fix to avoid tenderly issues with the balance not being set\n return res;\n }),\n (err) => UnexpectedError.from(err),\n );\n}\n\nconst messages: Record<GraphQLErrorCode, string> = {\n [GraphQLErrorCode.UNAUTHENTICATED]:\n \"Unauthenticated - Authentication is required to access '<operation>'\",\n [GraphQLErrorCode.FORBIDDEN]:\n \"Forbidden - You are not authorized to access '<operation>'\",\n [GraphQLErrorCode.INTERNAL_SERVER_ERROR]:\n 'Internal server error - Please try again later',\n [GraphQLErrorCode.BAD_USER_INPUT]:\n 'Bad user input - Please check the input and try again',\n [GraphQLErrorCode.BAD_REQUEST]:\n 'Bad request - Please check the request and try again',\n};\n\nexport function createGraphQLErrorObject(code: GraphQLErrorCode) {\n return {\n message: messages[code],\n locations: [],\n path: [],\n extensions: {\n code: code,\n },\n };\n}\n\nexport function wait(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Function to get balance ERC20 token\nexport async function getBalance(\n address: EvmAddress,\n tokenAddress: EvmAddress,\n): Promise<BigDecimal> {\n const publicClient = createPublicClient({\n chain: devnetChain,\n transport: http(ETHEREUM_FORK_RPC_URL),\n });\n\n const [balance, decimals] = await Promise.all([\n publicClient.readContract({\n address: tokenAddress,\n abi: [\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'balanceOf',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n ] as const,\n functionName: 'balanceOf',\n args: [address],\n }),\n publicClient.readContract({\n address: tokenAddress,\n abi: [\n {\n inputs: [],\n name: 'decimals',\n outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }],\n stateMutability: 'pure',\n type: 'function',\n },\n ] as const,\n functionName: 'decimals',\n }),\n ]);\n\n return bigDecimal(balance).rescale(-decimals);\n}\n\n// Function to get native token (ETH) balance\nexport async function getNativeBalance(\n address: EvmAddress,\n): Promise<BigDecimal> {\n const publicClient = createPublicClient({\n chain: devnetChain,\n transport: http(ETHEREUM_FORK_RPC_URL),\n });\n\n const balance = await publicClient.getBalance({\n address: address,\n });\n\n // Convert from wei to ETH (18 decimals)\n return bigDecimal(balance).rescale(-18);\n}\n"]}
package/dist/viem.cjs CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';var core=require('@aave/core'),types=require('@aave/types'),viem=require('viem'),actions=require('viem/actions');function p(n){return types.isObject(n)&&"code"in n&&"message"in n}function U(n){return types.isObject(n)&&"name"in n&&"message"in n&&"originalError"in n?p(n.originalError)&&"code"in n.originalError:true}var m=viem.defineChain({id:Number.parseInt("123456789",10),name:"Devnet",network:"ethereum-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"]}},blockExplorers:{default:{name:"Devnet Explorer",url:"https://dashboard.tenderly.co/explorer/vnet/dbaa58ab-597b-4bcd-ae6a-b8e50f716146/"}}}),T={[types.chainId(m.id)]:m};function _(n,e){return types.ResultAsync.fromPromise(n.getChainId(),a=>core.SigningError.from(a)).andThen(a=>a===e.chainId?types.okAsync():types.ResultAsync.fromPromise(n.switchChain({id:e.chainId}),r=>core.SigningError.from(r)).orElse(r=>(p(r.cause)?r.cause.code:U(r.cause)?r.cause.data?.originalError?.code:void 0)===viem.SwitchChainError.code&&e.chainId in T?types.ResultAsync.fromPromise(n.addChain({chain:T[e.chainId]}),c=>p(c)&&c.code===viem.UserRejectedRequestError.code?core.CancelError.from(c):core.SigningError.from(c)):r.asResultAsync()))}function k(n,e){return types.ResultAsync.fromPromise(actions.estimateGas(n,{account:n.account,data:e.data,to:e.to,value:BigInt(e.value)}),a=>core.SigningError.from(a)).map(a=>a*115n/100n)}function B(n,e){return k(n,e).andThen(a=>types.ResultAsync.fromPromise(actions.sendTransaction(n,{account:n.account,data:e.data,to:e.to,value:BigInt(e.value),chain:n.chain,gas:a}),r=>{if(r instanceof viem.TransactionExecutionError){let t=r.walk(c=>c instanceof viem.UserRejectedRequestError);if(t)return core.CancelError.from(t)}return core.SigningError.from(r)})).map(types.txHash)}function L(n){return n.account!==void 0}function N(n,e){return types.invariant(L(n),"Wallet client with account is required"),_(n,e).andThen(a=>B(n,e))}function q(n,e,a){let r=n?.blockExplorers?.default?.url,t=r&&new URL(`/tx/${e}`,r).toString();return core.TransactionError.new({txHash:e,request:a,link:t})}function O(n,e,a){return types.ResultAsync.fromPromise(actions.waitForTransactionReceipt(n,{hash:a,pollingInterval:100,retryCount:20,retryDelay:50}),r=>core.UnexpectedError.from(r)).andThen(r=>{let t=types.txHash(r.transactionHash);switch(r.status){case "reverted":return a!==t?types.errAsync(core.CancelError.from(`Transaction replaced by ${t}`)):types.errAsync(q(n.chain,t,e));case "success":return types.okAsync({txHash:t,operations:e.operations})}})}function s(n,e){return N(n,e).andThen(a=>O(n,e,a))}function y(n,e){switch(e.__typename){case "TransactionRequest":return s(n,e);case "Erc20ApprovalRequired":case "PreContractActionRequired":return s(n,e.transaction).andThen(()=>s(n,e.originalTransaction));case "InsufficientBalanceError":return types.errAsync(core.ValidationError.fromGqlNode(e))}}function Y(n,e){return e?y(n,e):y.bind(null,n)}function F(n,e){return types.invariant(n.account,"Wallet account is required"),types.ResultAsync.fromPromise(actions.signTypedData(n,{account:n.account,domain:e.domain,types:e.types,primaryType:e.primaryType,message:e.message}),a=>core.SigningError.from(a)).map(a=>({deadline:e.message.deadline,value:types.signatureFrom(a)}))}function J(n){return F.bind(null,n)}function E(n,e){return types.invariant(n.account,"Wallet account is required"),types.ResultAsync.fromPromise(actions.signTypedData(n,{account:n.account,domain:e.domain,types:e.types,primaryType:e.primaryType,message:JSON.parse(e.message)}),a=>core.SigningError.from(a)).map(a=>({deadline:JSON.parse(e.message).deadline,value:types.signatureFrom(a)}))}function K(n,e){return e?E(n,e):E.bind(null,n)}
1
+ 'use strict';var core=require('@aave/core'),types=require('@aave/types'),viem=require('viem'),actions=require('viem/actions');function p(n){return types.isObject(n)&&"code"in n&&"message"in n}function U(n){return types.isObject(n)&&"name"in n&&"message"in n&&"originalError"in n?p(n.originalError)&&"code"in n.originalError:true}var m=viem.defineChain({id:Number.parseInt("123456789",10),name:"Devnet",network:"ethereum-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"]}},blockExplorers:{default:{name:"Devnet Explorer",url:"https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"}}}),T={[types.chainId(m.id)]:m};function _(n,e){return types.ResultAsync.fromPromise(n.getChainId(),a=>core.SigningError.from(a)).andThen(a=>a===e.chainId?types.okAsync():types.ResultAsync.fromPromise(n.switchChain({id:e.chainId}),r=>core.SigningError.from(r)).orElse(r=>(p(r.cause)?r.cause.code:U(r.cause)?r.cause.data?.originalError?.code:void 0)===viem.SwitchChainError.code&&e.chainId in T?types.ResultAsync.fromPromise(n.addChain({chain:T[e.chainId]}),c=>p(c)&&c.code===viem.UserRejectedRequestError.code?core.CancelError.from(c):core.SigningError.from(c)):r.asResultAsync()))}function k(n,e){return types.ResultAsync.fromPromise(actions.estimateGas(n,{account:n.account,data:e.data,to:e.to,value:BigInt(e.value)}),a=>core.SigningError.from(a)).map(a=>a*115n/100n)}function B(n,e){return k(n,e).andThen(a=>types.ResultAsync.fromPromise(actions.sendTransaction(n,{account:n.account,data:e.data,to:e.to,value:BigInt(e.value),chain:n.chain,gas:a}),r=>{if(r instanceof viem.TransactionExecutionError){let t=r.walk(c=>c instanceof viem.UserRejectedRequestError);if(t)return core.CancelError.from(t)}return core.SigningError.from(r)})).map(types.txHash)}function L(n){return n.account!==void 0}function N(n,e){return types.invariant(L(n),"Wallet client with account is required"),_(n,e).andThen(a=>B(n,e))}function q(n,e,a){let r=n?.blockExplorers?.default?.url,t=r&&new URL(`/tx/${e}`,r).toString();return core.TransactionError.new({txHash:e,request:a,link:t})}function O(n,e,a){return types.ResultAsync.fromPromise(actions.waitForTransactionReceipt(n,{hash:a,pollingInterval:100,retryCount:20,retryDelay:50}),r=>core.UnexpectedError.from(r)).andThen(r=>{let t=types.txHash(r.transactionHash);switch(r.status){case "reverted":return a!==t?types.errAsync(core.CancelError.from(`Transaction replaced by ${t}`)):types.errAsync(q(n.chain,t,e));case "success":return types.okAsync({txHash:t,operations:e.operations})}})}function s(n,e){return N(n,e).andThen(a=>O(n,e,a))}function y(n,e){switch(e.__typename){case "TransactionRequest":return s(n,e);case "Erc20ApprovalRequired":case "PreContractActionRequired":return s(n,e.transaction).andThen(()=>s(n,e.originalTransaction));case "InsufficientBalanceError":return types.errAsync(core.ValidationError.fromGqlNode(e))}}function Y(n,e){return e?y(n,e):y.bind(null,n)}function F(n,e){return types.invariant(n.account,"Wallet account is required"),types.ResultAsync.fromPromise(actions.signTypedData(n,{account:n.account,domain:e.domain,types:e.types,primaryType:e.primaryType,message:e.message}),a=>core.SigningError.from(a)).map(a=>({deadline:e.message.deadline,value:types.signatureFrom(a)}))}function J(n){return F.bind(null,n)}function E(n,e){return types.invariant(n.account,"Wallet account is required"),types.ResultAsync.fromPromise(actions.signTypedData(n,{account:n.account,domain:e.domain,types:e.types,primaryType:e.primaryType,message:JSON.parse(e.message)}),a=>core.SigningError.from(a)).map(a=>({deadline:JSON.parse(e.message).deadline,value:types.signatureFrom(a)}))}function K(n,e){return e?E(n,e):E.bind(null,n)}
2
2
  exports.devnetChain=m;exports.sendTransaction=N;exports.sendWith=Y;exports.signERC20PermitWith=J;exports.signSwapTypedDataWith=K;exports.supportedChains=T;exports.transactionError=q;exports.waitForTransactionResult=O;//# sourceMappingURL=viem.cjs.map
3
3
  //# sourceMappingURL=viem.cjs.map
package/dist/viem.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/viem.ts"],"names":["isRpcError","err","isObject","isProviderRpcError","devnetChain","defineChain","supportedChains","chainId","ensureChain","walletClient","request","ResultAsync","SigningError","okAsync","SwitchChainError","UserRejectedRequestError","CancelError","estimateGas","estimateGasWithViem","gas","sendEip1559Transaction","sendTransactionWithViem","TransactionExecutionError","rejected","txHash","isWalletClientWithAccount","sendTransaction","invariant","_","transactionError","chain","baseUrl","link","TransactionError","waitForTransactionResult","initialTxHash","waitForTransactionReceipt","UnexpectedError","receipt","hash","errAsync","sendTransactionAndWait","executePlan","result","ValidationError","sendWith","signERC20Permit","signTypedData","hex","signatureFrom","signERC20PermitWith","signSwapTypedData","signSwapTypedDataWith"],"mappings":"8HAqDA,SAASA,CAAAA,CAAWC,EAA+B,CACjD,OAAOC,cAAAA,CAASD,CAAG,GAAK,MAAA,GAAUA,CAAAA,EAAO,YAAaA,CACxD,CAEA,SAASE,CAAAA,CACPF,CAAAA,CAC+D,CAC/D,OAAOC,eAASD,CAAG,CAAA,EACjB,SAAUA,CAAAA,EACV,SAAA,GAAaA,GACb,eAAA,GAAmBA,CAAAA,CACjBD,EAAWC,CAAAA,CAAI,aAAa,GAAK,MAAA,GAAUA,CAAAA,CAAI,cAC/C,IACN,KAKaG,CAAAA,CAAqBC,gBAAAA,CAAY,CAC5C,EAAA,CAAI,OAAO,QAAA,CAAS,WAAA,CAA2C,EAAE,CAAA,CACjE,IAAA,CAAM,SACN,OAAA,CAAS,eAAA,CACT,cAAA,CAAgB,CAAE,KAAM,OAAA,CAAS,MAAA,CAAQ,MAAO,QAAA,CAAU,EAAG,EAC7D,OAAA,CAAS,CACP,OAAA,CAAS,CAAE,KAAM,CAAC,2FAA4C,CAAE,CAClE,CAAA,CACA,eAAgB,CACd,OAAA,CAAS,CACP,IAAA,CAAM,iBAAA,CACN,IAAK,mFACP,CACF,CACF,CAAC,CAAA,CAKYC,EAGT,CAIF,CAACC,aAAAA,CAAQH,CAAAA,CAAY,EAAE,CAAC,EAAGA,CAC7B,EAEA,SAASI,EACPC,CAAAA,CACAC,CAAAA,CAC+C,CAC/C,OAAOC,kBAAY,WAAA,CAAYF,CAAAA,CAAa,YAAW,CAAIR,CAAAA,EACzDW,kBAAa,IAAA,CAAKX,CAAG,CACvB,CAAA,CAAE,QAASM,CAAAA,EACLA,CAAAA,GAAYG,EAAQ,OAAA,CACfG,aAAAA,GAGFF,iBAAAA,CAAY,WAAA,CACjBF,EAAa,WAAA,CAAY,CAAE,GAAIC,CAAAA,CAAQ,OAAQ,CAAC,CAAA,CAC/CT,CAAAA,EAAQW,kBAAa,IAAA,CAAKX,CAAG,CAChC,CAAA,CAAE,OAAQA,CAAAA,EAAAA,CACKD,CAAAA,CAAWC,EAAI,KAAK,CAAA,CAC7BA,EAAI,KAAA,CAAM,IAAA,CAGVE,CAAAA,CAAmBF,CAAAA,CAAI,KAAK,CAAA,CAC1BA,CAAAA,CAAI,MAAM,IAAA,EAAM,aAAA,EAAe,KAC/B,MAAA,IAGKa,qBAAAA,CAAiB,IAAA,EAC1BJ,CAAAA,CAAQ,WAAWJ,CAAAA,CAEZK,iBAAAA,CAAY,YACjBF,CAAAA,CAAa,QAAA,CAAS,CAAE,KAAA,CAAOH,CAAAA,CAAgBI,EAAQ,OAAO,CAAE,CAAC,CAAA,CAChET,CAAAA,EACKD,EAAWC,CAAG,CAAA,EAAKA,EAAI,IAAA,GAASc,6BAAAA,CAAyB,IAAA,CACpDC,gBAAAA,CAAY,KAAKf,CAAG,CAAA,CAEtBW,kBAAa,IAAA,CAAKX,CAAG,CAEhC,CAAA,CAGKA,CAAAA,CAAI,aAAA,EACZ,CACF,CACH,CAEA,SAASgB,CAAAA,CACPR,CAAAA,CACAC,EACmC,CACnC,OAAOC,iBAAAA,CAAY,WAAA,CACjBO,oBAAoBT,CAAAA,CAAc,CAChC,QAASA,CAAAA,CAAa,OAAA,CACtB,KAAMC,CAAAA,CAAQ,IAAA,CACd,GAAIA,CAAAA,CAAQ,EAAA,CACZ,MAAO,MAAA,CAAOA,CAAAA,CAAQ,KAAK,CAC7B,CAAC,EACAT,CAAAA,EAAQW,iBAAAA,CAAa,IAAA,CAAKX,CAAG,CAChC,CAAA,CAAE,GAAA,CAAKkB,GAASA,CAAAA,CAAM,IAAA,CAAQ,IAAI,CACpC,CAEA,SAASC,CAAAA,CACPX,EACAC,CAAAA,CACiD,CACjD,OAAOO,CAAAA,CAAYR,CAAAA,CAAcC,CAAO,CAAA,CACrC,OAAA,CAASS,CAAAA,EACRR,iBAAAA,CAAY,YACVU,uBAAAA,CAAwBZ,CAAAA,CAAc,CACpC,OAAA,CAASA,CAAAA,CAAa,QACtB,IAAA,CAAMC,CAAAA,CAAQ,KACd,EAAA,CAAIA,CAAAA,CAAQ,GACZ,KAAA,CAAO,MAAA,CAAOA,EAAQ,KAAK,CAAA,CAC3B,MAAOD,CAAAA,CAAa,KAAA,CACpB,GAAA,CAAAU,CACF,CAAC,CAAA,CACAlB,CAAAA,EAAQ,CACP,GAAIA,CAAAA,YAAeqB,+BAA2B,CAC5C,IAAMC,CAAAA,CAAWtB,CAAAA,CAAI,KAClBA,CAAAA,EAAQA,CAAAA,YAAec,6BAC1B,CAAA,CAEA,GAAIQ,EACF,OAAOP,gBAAAA,CAAY,IAAA,CAAKO,CAAQ,CAEpC,CACA,OAAOX,kBAAa,IAAA,CAAKX,CAAG,CAC9B,CACF,CACF,EACC,GAAA,CAAIuB,YAAM,CACf,CAEA,SAASC,EACPhB,CAAAA,CACyD,CACzD,OAAOA,CAAAA,CAAa,OAAA,GAAY,MAClC,CAKO,SAASiB,CAAAA,CACdjB,CAAAA,CACAC,EACiD,CACjD,OAAAiB,gBACEF,CAAAA,CAA0BhB,CAAY,CAAA,CACtC,wCACF,EAEOD,CAAAA,CAAYC,CAAAA,CAAcC,CAAO,CAAA,CAAE,OAAA,CAASkB,GACjDR,CAAAA,CAAuBX,CAAAA,CAAcC,CAAO,CAC9C,CACF,CAKO,SAASmB,EACdC,CAAAA,CACAN,CAAAA,CACAd,EACkB,CAClB,IAAMqB,EAAUD,CAAAA,EAAO,cAAA,EAAgB,SAAS,GAAA,CAC1CE,CAAAA,CAAOD,GAAW,IAAI,GAAA,CAAI,OAAOP,CAAM,CAAA,CAAA,CAAIO,CAAO,CAAA,CAAE,UAAS,CAEnE,OAAOE,sBAAiB,GAAA,CAAI,CAAE,OAAAT,CAAAA,CAAQ,OAAA,CAAAd,CAAAA,CAAS,IAAA,CAAAsB,CAAK,CAAC,CACvD,CAKO,SAASE,CAAAA,CACdzB,EACAC,CAAAA,CACAyB,CAAAA,CAIA,CACA,OAAOxB,kBAAY,WAAA,CACjByB,iCAAAA,CAA0B3B,EAAc,CACtC,IAAA,CAAM0B,EACN,eAAA,CAAiB,GAAA,CACjB,WAAY,EAAA,CACZ,UAAA,CAAY,EACd,CAAC,CAAA,CACAlC,GAAQoC,oBAAAA,CAAgB,IAAA,CAAKpC,CAAG,CACnC,CAAA,CAAE,OAAA,CAASqC,CAAAA,EAAY,CACrB,IAAMC,CAAAA,CAAOf,aAAOc,CAAAA,CAAQ,eAAe,EAE3C,OAAQA,CAAAA,CAAQ,MAAA,EACd,KAAK,UAAA,CACH,OAAIH,IAAkBI,CAAAA,CACbC,cAAAA,CAASxB,iBAAY,IAAA,CAAK,CAAA,wBAAA,EAA2BuB,CAAI,CAAA,CAAE,CAAC,CAAA,CAE9DC,cAAAA,CAASX,EAAiBpB,CAAAA,CAAa,KAAA,CAAO8B,EAAM7B,CAAO,CAAC,EACrE,KAAK,SAAA,CACH,OAAOG,aAAAA,CAAQ,CAGb,OAAQ0B,CAAAA,CACR,UAAA,CAAY7B,EAAQ,UACtB,CAAC,CACL,CACF,CAAC,CACH,CAEA,SAAS+B,CAAAA,CACPhC,CAAAA,CACAC,EAIA,CACA,OAAOgB,CAAAA,CAAgBjB,CAAAA,CAAcC,CAAO,CAAA,CAAE,OAAA,CAAS6B,GACrDL,CAAAA,CAAyBzB,CAAAA,CAAcC,EAAS6B,CAAI,CACtD,CACF,CAEA,SAASG,CAAAA,CACPjC,CAAAA,CACAkC,EACkC,CAClC,OAAQA,EAAO,UAAA,EACb,KAAK,oBAAA,CACH,OAAOF,EAAuBhC,CAAAA,CAAckC,CAAM,EAEpD,KAAK,uBAAA,CACL,KAAK,2BAAA,CACH,OAAOF,CAAAA,CAAuBhC,CAAAA,CAAckC,EAAO,WAAW,CAAA,CAAE,QAC9D,IAAMF,CAAAA,CAAuBhC,EAAckC,CAAAA,CAAO,mBAAmB,CACvE,CAAA,CAEF,KAAK,0BAAA,CACH,OAAOH,eAASI,oBAAAA,CAAgB,WAAA,CAAYD,CAAM,CAAC,CACvD,CACF,CAaO,SAASE,CAAAA,CACdpC,CAAAA,CACAkC,EAC+D,CAC/D,OAAOA,EACHD,CAAAA,CAAYjC,CAAAA,CAAckC,CAAM,CAAA,CAChCD,CAAAA,CAAY,KAAK,IAAA,CAAMjC,CAAY,CACzC,CAEA,SAASqC,EACPrC,CAAAA,CACAkC,CAAAA,CACgC,CAChC,OAAAhB,gBAAUlB,CAAAA,CAAa,OAAA,CAAS,4BAA4B,CAAA,CAErDE,iBAAAA,CAAY,YACjBoC,qBAAAA,CAActC,CAAAA,CAAc,CAC1B,OAAA,CAASA,EAAa,OAAA,CACtB,MAAA,CAAQkC,EAAO,MAAA,CACf,KAAA,CAAOA,EAAO,KAAA,CACd,WAAA,CAAaA,CAAAA,CAAO,WAAA,CACpB,QAASA,CAAAA,CAAO,OAClB,CAAC,CAAA,CACA1C,CAAAA,EAAQW,kBAAa,IAAA,CAAKX,CAAG,CAChC,CAAA,CAAE,GAAA,CAAK+C,IAAS,CACd,QAAA,CAAUL,EAAO,OAAA,CAAQ,QAAA,CACzB,MAAOM,mBAAAA,CAAcD,CAAG,CAC1B,CAAA,CAAE,CACJ,CAKO,SAASE,EACdzC,CAAAA,CACoB,CACpB,OAAOqC,CAAAA,CAAgB,IAAA,CAAK,IAAA,CAAMrC,CAAY,CAChD,CAEA,SAAS0C,EACP1C,CAAAA,CACAkC,CAAAA,CACkC,CAClC,OAAAhB,eAAAA,CAAUlB,CAAAA,CAAa,OAAA,CAAS,4BAA4B,CAAA,CAErDE,iBAAAA,CAAY,YACjBoC,qBAAAA,CAActC,CAAAA,CAAc,CAC1B,OAAA,CAASA,CAAAA,CAAa,QACtB,MAAA,CAAQkC,CAAAA,CAAO,OACf,KAAA,CAAOA,CAAAA,CAAO,MACd,WAAA,CAAaA,CAAAA,CAAO,YACpB,OAAA,CAAS,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAO,OAAO,CACpC,CAAC,EACA1C,CAAAA,EAAQW,iBAAAA,CAAa,KAAKX,CAAG,CAChC,EAAE,GAAA,CAAK+C,CAAAA,GAAS,CACd,QAAA,CAAU,IAAA,CAAK,MAAML,CAAAA,CAAO,OAAO,EAAE,QAAA,CACrC,KAAA,CAAOM,mBAAAA,CAAcD,CAAG,CAC1B,CAAA,CAAE,CACJ,CAiBO,SAASI,CAAAA,CACd3C,EACAkC,CAAAA,CACyD,CACzD,OAAOA,CAAAA,CACHQ,CAAAA,CAAkB1C,EAAckC,CAAM,CAAA,CACtCQ,EAAkB,IAAA,CAAK,IAAA,CAAM1C,CAAY,CAC/C","file":"viem.cjs","sourcesContent":["import {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\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 type Chain,\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 WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n signTypedData,\n waitForTransactionReceipt,\n} from 'viem/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\n/**\n * @internal\n */\nexport const devnetChain: Chain = 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 */\nexport const supportedChains: Record<\n ChainId,\n ReturnType<typeof defineChain>\n> = {\n // TODO add them back when deployed on these chains\n // [chainId(mainnet.id)]: mainnet,\n // [chainId(sepolia.id)]: sepolia,\n [chainId(devnetChain.id)]: devnetChain,\n};\n\nfunction ensureChain(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<void, CancelError | SigningError> {\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 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 (\n code === SwitchChainError.code &&\n request.chainId in supportedChains\n ) {\n return ResultAsync.fromPromise(\n walletClient.addChain({ chain: supportedChains[request.chainId] }),\n (err) => {\n if (isRpcError(err) && err.code === UserRejectedRequestError.code) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n );\n }\n\n return err.asResultAsync();\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, Chain, 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, Chain, 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 ensureChain(walletClient, request).andThen((_) =>\n sendEip1559Transaction(walletClient, request),\n );\n}\n\n/**\n * @internal\n */\nexport function transactionError(\n chain: Chain | 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"]}
1
+ {"version":3,"sources":["../src/viem.ts"],"names":["isRpcError","err","isObject","isProviderRpcError","devnetChain","defineChain","supportedChains","chainId","ensureChain","walletClient","request","ResultAsync","SigningError","okAsync","SwitchChainError","UserRejectedRequestError","CancelError","estimateGas","estimateGasWithViem","gas","sendEip1559Transaction","sendTransactionWithViem","TransactionExecutionError","rejected","txHash","isWalletClientWithAccount","sendTransaction","invariant","_","transactionError","chain","baseUrl","link","TransactionError","waitForTransactionResult","initialTxHash","waitForTransactionReceipt","UnexpectedError","receipt","hash","errAsync","sendTransactionAndWait","executePlan","result","ValidationError","sendWith","signERC20Permit","signTypedData","hex","signatureFrom","signERC20PermitWith","signSwapTypedData","signSwapTypedDataWith"],"mappings":"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","file":"viem.cjs","sourcesContent":["import {\n CancelError,\n SigningError,\n TransactionError,\n UnexpectedError,\n ValidationError,\n} from '@aave/core';\nimport type {\n CancelSwapTypedData,\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 type Chain,\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 WalletClient,\n} from 'viem';\nimport {\n estimateGas as estimateGasWithViem,\n sendTransaction as sendTransactionWithViem,\n signTypedData,\n waitForTransactionReceipt,\n} from 'viem/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\n/**\n * @internal\n */\nexport const devnetChain: Chain = 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 */\nexport const supportedChains: Record<\n ChainId,\n ReturnType<typeof defineChain>\n> = {\n // TODO add them back when deployed on these chains\n // [chainId(mainnet.id)]: mainnet,\n // [chainId(sepolia.id)]: sepolia,\n [chainId(devnetChain.id)]: devnetChain,\n};\n\nfunction ensureChain(\n walletClient: WalletClient,\n request: TransactionRequest,\n): ResultAsync<void, CancelError | SigningError> {\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 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 (\n code === SwitchChainError.code &&\n request.chainId in supportedChains\n ) {\n return ResultAsync.fromPromise(\n walletClient.addChain({ chain: supportedChains[request.chainId] }),\n (err) => {\n if (isRpcError(err) && err.code === UserRejectedRequestError.code) {\n return CancelError.from(err);\n }\n return SigningError.from(err);\n },\n );\n }\n\n return err.asResultAsync();\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, Chain, 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, Chain, 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 ensureChain(walletClient, request).andThen((_) =>\n sendEip1559Transaction(walletClient, request),\n );\n}\n\n/**\n * @internal\n */\nexport function transactionError(\n chain: Chain | 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"]}
package/dist/viem.js CHANGED
@@ -1,2 +1,2 @@
1
- export{a as devnetChain,c as sendTransaction,f as sendWith,g as signERC20PermitWith,h as signSwapTypedDataWith,b as supportedChains,d as transactionError,e as waitForTransactionResult}from'./chunk-2TNQ52OQ.js';//# sourceMappingURL=viem.js.map
1
+ export{a as devnetChain,c as sendTransaction,f as sendWith,g as signERC20PermitWith,h as signSwapTypedDataWith,b as supportedChains,d as transactionError,e as waitForTransactionResult}from'./chunk-2URLJFKP.js';//# sourceMappingURL=viem.js.map
2
2
  //# sourceMappingURL=viem.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aave/client",
3
- "version": "4.0.0-next.2",
3
+ "version": "4.0.0-next.3",
4
4
  "description": "The official TypeScript client for the AaveKit API",
5
5
  "keywords": [
6
6
  "aave",
@@ -88,9 +88,9 @@
88
88
  "@urql/core": "^6.0.1",
89
89
  "@urql/exchange-graphcache": "^8.1.0",
90
90
  "graphql": "^16.11.0",
91
- "@aave/types": "1.0.0-next.1",
92
- "@aave/graphql": "1.0.0-next.2",
93
- "@aave/core": "1.0.0-next.1"
91
+ "@aave/graphql": "1.0.0-next.3",
92
+ "@aave/core": "1.0.0-next.2",
93
+ "@aave/types": "1.0.0-next.2"
94
94
  },
95
95
  "devDependencies": {
96
96
  "@bgd-labs/aave-address-book": "^4.25.3",
@@ -126,7 +126,7 @@
126
126
  },
127
127
  "license": "MIT",
128
128
  "publishConfig": {
129
- "access": "restricted"
129
+ "access": "public"
130
130
  },
131
131
  "scripts": {
132
132
  "build": "tsup"
@@ -1,3 +0,0 @@
1
- import {TransactionError,UnexpectedError,CancelError,SigningError,ValidationError}from'@aave/core';import {chainId,invariant,ResultAsync,txHash,okAsync,errAsync,signatureFrom,isObject}from'@aave/types';import {defineChain,SwitchChainError,UserRejectedRequestError,TransactionExecutionError}from'viem';import {waitForTransactionReceipt,sendTransaction,signTypedData,estimateGas}from'viem/actions';function p(n){return isObject(n)&&"code"in n&&"message"in n}function U(n){return isObject(n)&&"name"in n&&"message"in n&&"originalError"in n?p(n.originalError)&&"code"in n.originalError:true}var m=defineChain({id:Number.parseInt("123456789",10),name:"Devnet",network:"ethereum-fork",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://virtual.mainnet-aave.us-east.rpc.tenderly.co/dbaa58ab-597b-4bcd-ae6a-b8e50f716146"]}},blockExplorers:{default:{name:"Devnet Explorer",url:"https://dashboard.tenderly.co/explorer/vnet/dbaa58ab-597b-4bcd-ae6a-b8e50f716146/"}}}),T={[chainId(m.id)]:m};function _(n,e){return ResultAsync.fromPromise(n.getChainId(),a=>SigningError.from(a)).andThen(a=>a===e.chainId?okAsync():ResultAsync.fromPromise(n.switchChain({id:e.chainId}),r=>SigningError.from(r)).orElse(r=>(p(r.cause)?r.cause.code:U(r.cause)?r.cause.data?.originalError?.code:void 0)===SwitchChainError.code&&e.chainId in T?ResultAsync.fromPromise(n.addChain({chain:T[e.chainId]}),c=>p(c)&&c.code===UserRejectedRequestError.code?CancelError.from(c):SigningError.from(c)):r.asResultAsync()))}function k(n,e){return ResultAsync.fromPromise(estimateGas(n,{account:n.account,data:e.data,to:e.to,value:BigInt(e.value)}),a=>SigningError.from(a)).map(a=>a*115n/100n)}function B(n,e){return k(n,e).andThen(a=>ResultAsync.fromPromise(sendTransaction(n,{account:n.account,data:e.data,to:e.to,value:BigInt(e.value),chain:n.chain,gas:a}),r=>{if(r instanceof TransactionExecutionError){let t=r.walk(c=>c instanceof UserRejectedRequestError);if(t)return CancelError.from(t)}return SigningError.from(r)})).map(txHash)}function L(n){return n.account!==void 0}function N(n,e){return invariant(L(n),"Wallet client with account is required"),_(n,e).andThen(a=>B(n,e))}function q(n,e,a){let r=n?.blockExplorers?.default?.url,t=r&&new URL(`/tx/${e}`,r).toString();return TransactionError.new({txHash:e,request:a,link:t})}function O(n,e,a){return ResultAsync.fromPromise(waitForTransactionReceipt(n,{hash:a,pollingInterval:100,retryCount:20,retryDelay:50}),r=>UnexpectedError.from(r)).andThen(r=>{let t=txHash(r.transactionHash);switch(r.status){case "reverted":return a!==t?errAsync(CancelError.from(`Transaction replaced by ${t}`)):errAsync(q(n.chain,t,e));case "success":return okAsync({txHash:t,operations:e.operations})}})}function s(n,e){return N(n,e).andThen(a=>O(n,e,a))}function y(n,e){switch(e.__typename){case "TransactionRequest":return s(n,e);case "Erc20ApprovalRequired":case "PreContractActionRequired":return s(n,e.transaction).andThen(()=>s(n,e.originalTransaction));case "InsufficientBalanceError":return errAsync(ValidationError.fromGqlNode(e))}}function Y(n,e){return e?y(n,e):y.bind(null,n)}function F(n,e){return invariant(n.account,"Wallet account is required"),ResultAsync.fromPromise(signTypedData(n,{account:n.account,domain:e.domain,types:e.types,primaryType:e.primaryType,message:e.message}),a=>SigningError.from(a)).map(a=>({deadline:e.message.deadline,value:signatureFrom(a)}))}function J(n){return F.bind(null,n)}function E(n,e){return invariant(n.account,"Wallet account is required"),ResultAsync.fromPromise(signTypedData(n,{account:n.account,domain:e.domain,types:e.types,primaryType:e.primaryType,message:JSON.parse(e.message)}),a=>SigningError.from(a)).map(a=>({deadline:JSON.parse(e.message).deadline,value:signatureFrom(a)}))}function K(n,e){return e?E(n,e):E.bind(null,n)}
2
- export{m as a,T as b,N as c,q as d,O as e,Y as f,J as g,K as h};//# sourceMappingURL=chunk-2TNQ52OQ.js.map
3
- //# sourceMappingURL=chunk-2TNQ52OQ.js.map