UNPKG

@abstract-foundation/agw-react

Version:
178 lines 6.89 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.usePrivyCrossAppProvider = void 0; const react_auth_1 = require("@privy-io/react-auth"); const react_1 = require("react"); const viem_1 = require("viem"); const constants_js_1 = require("../constants.js"); const usePrivyCrossAppProvider = ({ chain, transport = (0, viem_1.http)(undefined, { batch: true, }), }) => { const { loginWithCrossAppAccount, linkCrossAppAccount, sendTransaction, signMessage, signTypedData, } = (0, react_auth_1.useCrossAppAccounts)(); const { user, authenticated, ready: privyReady } = (0, react_auth_1.usePrivy)(); const passthroughMethods = { web3_clientVersion: true, web3_sha3: true, net_listening: true, net_peerCount: true, net_version: true, eth_blobBaseFee: true, eth_blockNumber: true, eth_call: true, eth_chainId: true, eth_coinbase: true, eth_estimateGas: true, eth_feeHistory: true, eth_gasPrice: true, eth_getBalance: true, eth_getBlockByHash: true, eth_getBlockByNumber: true, eth_getBlockTransactionCountByHash: true, eth_getBlockTransactionCountByNumber: true, eth_getCode: true, eth_getFilterChanges: true, eth_getFilterLogs: true, eth_getLogs: true, eth_getProof: true, eth_getStorageAt: true, eth_getTransactionByBlockHashAndIndex: true, eth_getTransactionByBlockNumberAndIndex: true, eth_getTransactionByHash: true, eth_getTransactionCount: true, eth_getTransactionReceipt: true, eth_getUncleByBlockHashAndIndex: true, eth_getUncleByBlockNumberAndIndex: true, eth_getUncleCountByBlockHash: true, eth_getUncleCountByBlockNumber: true, eth_maxPriorityFeePerGas: true, eth_newBlockFilter: true, eth_newFilter: true, eth_newPendingTransactionFilter: true, eth_protocolVersion: true, eth_sendRawTransaction: true, eth_uninstallFilter: true, }; const passthrough = (method) => !!passthroughMethods[method]; const publicClient = (0, viem_1.createPublicClient)({ chain, transport, }); const getAddressesFromUser = (user) => { if (!user) { return { smartAccount: undefined, signer: undefined, }; } const crossAppAccount = user.linkedAccounts.find((account) => account.type === 'cross_app' && account.providerApp.id === constants_js_1.AGW_APP_ID); const smartAccount = crossAppAccount?.smartWallets?.[0]?.address; const signer = crossAppAccount?.embeddedWallets?.[0]?.address; return { smartAccount: smartAccount ? smartAccount : undefined, signer: signer ? signer : undefined, }; }; const getAccounts = (0, react_1.useCallback)(async (promptLogin) => { if (!ready) { return []; } let contextUser = user; if (promptLogin) { if (!contextUser && !authenticated) { contextUser = await loginWithCrossAppAccount({ appId: constants_js_1.AGW_APP_ID, }); } else if (!contextUser && authenticated) { contextUser = await linkCrossAppAccount({ appId: constants_js_1.AGW_APP_ID }); } } const { signer, smartAccount } = getAddressesFromUser(contextUser); if (signer && smartAccount) { return [smartAccount, signer]; } else { return []; } }, [ user, authenticated, privyReady, loginWithCrossAppAccount, linkCrossAppAccount, ]); const eventListeners = new Map(); const handleRequest = (0, react_1.useCallback)(async (request) => { const { method, params } = request; if (passthrough(method)) { return publicClient.request(request); } switch (method) { case 'eth_requestAccounts': { return await getAccounts(true); } case 'eth_accounts': { return await getAccounts(false); } case 'wallet_switchEthereumChain': return null; case 'wallet_revokePermissions': return null; case 'eth_signTransaction': throw new Error('eth_signTransaction is not supported'); case 'eth_sendTransaction': { const transaction = params[0]; if (transaction.eip712Meta && transaction.eip712Meta.paymasterParams) { transaction.paymaster = transaction.eip712Meta.paymasterParams.paymaster; transaction.paymasterInput = (0, viem_1.toHex)(transaction.eip712Meta.paymasterParams.paymasterInput); } return await sendTransaction({ ...transaction, chainId: chain.id, }, { address: transaction.from, }); } case 'eth_signTypedData_v4': return await signTypedData(JSON.parse(params[1]), { address: params[0], chainId: chain.id }); case 'eth_sign': throw new Error('eth_sign is unsafe and not supported'); case 'personal_sign': { return await signMessage((0, viem_1.fromHex)(params[0], 'string'), { address: params[1], chainId: chain.id, }); } default: throw new Error(`Unsupported request: ${method}`); } }, [passthrough, publicClient, getAccounts, signMessage]); const provider = (0, react_1.useMemo)(() => { return { on: (event, listener) => { eventListeners.set(event, [ ...(eventListeners.get(event) ?? []), listener, ]); }, removeListener: (event, listener) => { eventListeners.set(event, (eventListeners.get(event) ?? []).filter((l) => l !== listener)); }, request: handleRequest, }; }, [handleRequest]); const ready = (0, react_1.useMemo)(() => { return (privyReady && user && authenticated && user.linkedAccounts.some((account) => account.type === 'cross_app' && account.providerApp.id === constants_js_1.AGW_APP_ID)); }, [privyReady, user, authenticated]); return { ready, provider, }; }; exports.usePrivyCrossAppProvider = usePrivyCrossAppProvider; //# sourceMappingURL=usePrivyCrossAppProvider.js.map