UNPKG

@abstract-foundation/agw-client

Version:
244 lines 10.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.transformEIP1193Provider = transformEIP1193Provider; const viem_1 = require("viem"); const accounts_1 = require("viem/accounts"); const abstractClient_js_1 = require("./clients/abstractClient.js"); const eip5792_js_1 = require("./eip5792.js"); const index_js_1 = require("./exports/index.js"); const utils_js_1 = require("./utils.js"); async function getAgwAddressFromInitialSigner(chain, transport, signer) { const publicClient = (0, viem_1.createPublicClient)({ chain, transport, }); return await (0, utils_js_1.getSmartAccountAddressFromInitialSigner)(signer, publicClient); } async function getAgwSigner(provider, method = "eth_accounts") { const accounts = await provider.request({ method }); return accounts?.[0]; } async function getAgwClient(account, chain, transport, isPrivyCrossApp, overrideTransport, customPaymasterHandler) { const wallet = (0, viem_1.createWalletClient)({ account, transport, }); const signer = (0, accounts_1.toAccount)({ address: account, signMessage: wallet.signMessage, signTransaction: wallet.signTransaction, signTypedData: wallet.signTypedData, }); const abstractClient = await (0, abstractClient_js_1.createAbstractClient)({ chain, signer, transport, isPrivyCrossApp, publicTransport: overrideTransport, customPaymasterHandler, }); return abstractClient; } function transformEIP1193Provider(options) { const { provider, chain, transport: overrideTransport, isPrivyCrossApp = false, customPaymasterHandler, } = options; const transport = (0, viem_1.custom)(provider); const handler = async (e) => { const { method, params } = e; switch (method) { case "eth_requestAccounts": { const signer = await getAgwSigner(provider, method); if (!signer) { return []; } const smartAccount = await getAgwAddressFromInitialSigner(chain, transport, signer); return [smartAccount, signer]; } case "eth_accounts": { const signer = await getAgwSigner(provider); if (!signer) { return []; } const smartAccount = await getAgwAddressFromInitialSigner(chain, transport, signer); return [smartAccount, signer]; } case "eth_signTypedData_v4": { const account = await getAgwSigner(provider); if (!account) { throw new Error("Account not found"); } if (params[0] === account) { return provider.request(e); } const abstractClient = await getAgwClient(account, chain, transport, isPrivyCrossApp, overrideTransport, customPaymasterHandler); return abstractClient.signTypedData(JSON.parse(params[1])); } case "personal_sign": { const account = await getAgwSigner(provider); if (!account) { throw new Error("Account not found"); } if (params[1] === account) { return provider.request(e); } const abstractClient = await getAgwClient(account, chain, transport, isPrivyCrossApp, overrideTransport, customPaymasterHandler); return await abstractClient.signMessage({ message: { raw: params[0], }, }); } case "eth_signTransaction": case "eth_sendTransaction": { const account = await getAgwSigner(provider); if (!account) { throw new Error("Account not found"); } const transaction = params[0]; if (transaction.from === account) { return await provider.request(e); } const abstractClient = await getAgwClient(account, chain, transport, isPrivyCrossApp, overrideTransport, customPaymasterHandler); if (transaction.eip712Meta?.paymasterParams) { transaction.paymaster = transaction.eip712Meta.paymasterParams.paymaster; transaction.paymasterInput = (0, viem_1.toHex)(transaction.eip712Meta.paymasterParams.paymasterInput); } if (method === "eth_signTransaction") { return (await abstractClient.signTransaction(transaction)); } else if (method === "eth_sendTransaction") { return await abstractClient.sendTransaction(transaction); } throw new Error("Should not have reached this point"); } case "wallet_sendCalls": { const account = await getAgwSigner(provider); if (!account) { throw new Error("Account not found"); } const sendCallsParams = params[0]; if (sendCallsParams.from === account) { return await provider.request(e); } if (sendCallsParams.version === "1.0" || sendCallsParams.version === undefined) { sendCallsParams.calls.forEach((call) => { if (call.chainId) { (0, viem_1.assertCurrentChain)({ chain, currentChainId: (0, viem_1.fromHex)(call.chainId, "number"), }); } }); } if (sendCallsParams.version === "2.0.0") { if ((0, viem_1.fromHex)(sendCallsParams.chainId, "number") !== chain.id) { return { code: 5710, message: "Chain not supported", }; } } const abstractClient = await getAgwClient(account, chain, transport, isPrivyCrossApp, overrideTransport, customPaymasterHandler); if (sendCallsParams.from !== (0, accounts_1.parseAccount)(abstractClient.account).address) { return { code: 4001, message: "Unauthorized", }; } const calls = []; for (const call of sendCallsParams.calls) { if (!call.to) { return { code: -32602, message: "Invalid call to unspecified address", }; } calls.push({ to: call.to, value: call.value ? (0, viem_1.hexToBigInt)(call.value) : 0n, data: call.data ?? "0x", }); } const txHash = await abstractClient.sendTransactionBatch({ calls, }); if (sendCallsParams.version === undefined || sendCallsParams.version === "1.0") { return txHash; } return { id: txHash, }; } case "wallet_getCallsStatus": { const receipt = await provider.request({ method: "eth_getTransactionReceipt", params, }); return { version: "2.0.0", id: params[0], chainId: (0, viem_1.toHex)(chain.id), status: (0, eip5792_js_1.getReceiptStatus)(receipt ?? undefined), atomic: true, receipts: receipt != null ? [receipt] : undefined, }; } case "wallet_addEthereumChain": case "wallet_switchEthereumChain": { const request = params[0]; const chainIdHex = request.chainId; if (!chainIdHex) { throw new Error("Chain ID is required"); } const chainId = (0, viem_1.isHex)(chainIdHex) ? (0, viem_1.hexToNumber)(chainIdHex) : chainIdHex; const chain = Object.values(index_js_1.validChains).find((c) => c.id === chainId); if (!chain) { throw new Error(`Chain ${chainId} not supported`); } return await provider.request(e); } case "wallet_showCallsStatus": { return undefined; } case "wallet_getCapabilities": { const account = await getAgwSigner(provider); if (!account) { throw new Error("Account not found"); } if (params[0] === account) { return await provider.request(e); } const chainIds = params[1]; if (chainIds) { const filteredCapabilities = {}; for (const chainId of chainIds) { if (utils_js_1.VALID_CHAINS[(0, viem_1.fromHex)(chainId, "number")]) { filteredCapabilities[chainId] = eip5792_js_1.agwCapabilities; } } return filteredCapabilities; } else { return Object.keys(utils_js_1.VALID_CHAINS).reduce((acc, chainId) => { acc[(0, viem_1.toHex)(Number(chainId))] = eip5792_js_1.agwCapabilities; return acc; }, {}); } } default: { return await provider.request(e); } } }; return { ...provider, on: provider.on, removeListener: provider.removeListener, request: handler, }; } //# sourceMappingURL=transformEIP1193Provider.js.map