@fastnear/wallet-adapter
Version:
Wallet adapter implementations for Meteor Wallet and Near Mobile
1 lines • 28.3 kB
Source Map (JSON)
{"version":3,"sources":["../../src/meteor.ts"],"sourcesContent":["import { serialize as borshSerialize } from \"@fastnear/borsh\";\nimport { privateKeyFromRandom, publicKeyFromPrivate, bytesToBase64, mapTransaction, SCHEMA } from \"@fastnear/utils\";\nimport type { PlainTransaction } from \"@fastnear/utils\";\nimport { connectorActionsToFastnearActions } from \"./actions.js\";\nimport { createRpcFactory } from \"./rpc.js\";\nimport { TransportError, UserRejectedError } from \"./errors.js\";\nimport { createDefaultStorage, readJson, writeJson } from \"./storage.js\";\nimport type {\n AdapterStorage,\n ConnectorActionLike,\n MeteorAdapterOptions,\n MeteorExtensionBridge,\n PopupWindowLike,\n SignAndSendTransactionParams,\n SignAndSendTransactionsParams,\n SignInParams,\n SignMessageParams,\n WalletAccount,\n WalletNetwork,\n} from \"./types.js\";\n\nconst METEOR_DEFAULT_WALLET_BASE = \"https://wallet.meteorwallet.app\";\nconst METEOR_CONNECTION_PING_MS = 450;\nconst METEOR_POPUP_WIDTH = 390;\nconst METEOR_POPUP_HEIGHT = 650;\nconst LEGACY_AUTH_KEY_SUFFIX = \"_meteor_wallet_auth_key\";\n\ntype MeteorConnectionStatus =\n | \"initializing\"\n | \"connected\"\n | \"attempting_reconnect\"\n | \"disconnected\"\n | \"closed_success\"\n | \"closed_fail\"\n | \"closed_window\";\n\ntype MeteorActionType = \"login\" | \"logout\" | \"sign\" | \"verify_owner\" | \"sign_message\";\n\ninterface MeteorAuthState {\n accountId?: string;\n allKeys: string[];\n signedInContract?: {\n contract_id?: string;\n public_key: string;\n };\n}\n\ninterface MeteorConnection {\n uid: string;\n network: WalletNetwork;\n actionType: MeteorActionType;\n status: MeteorConnectionStatus;\n inputs?: Record<string, any>;\n popup?: PopupWindowLike;\n extension?: MeteorExtensionBridge;\n walletOrigin: string;\n cleanupFns: Array<() => void>;\n interval?: ReturnType<typeof setInterval>;\n resolve: (payload: any) => void;\n reject: (error: Error) => void;\n}\n\ninterface MeteorActionResponse {\n uid?: string;\n status?: MeteorConnectionStatus;\n payload?: any;\n endTags?: string[];\n message?: string;\n}\n\nconst randomUid = (): string => {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `meteor-${Date.now()}-${Math.floor(Math.random() * 100000)}`;\n};\n\nconst popupFeatures = (): string => {\n if (typeof window === \"undefined\" || window.top == null) {\n return `popup=1,width=${METEOR_POPUP_WIDTH},height=${METEOR_POPUP_HEIGHT}`;\n }\n\n const y = window.top.outerHeight / 2 + window.top.screenY - METEOR_POPUP_HEIGHT / 2;\n const x = window.top.outerWidth / 2 + window.top.screenX - METEOR_POPUP_WIDTH / 2;\n return `popup=1,width=${METEOR_POPUP_WIDTH},height=${METEOR_POPUP_HEIGHT},top=${y},left=${x}`;\n};\n\nconst isUserRejectedTag = (tag?: string): boolean => {\n return tag === \"USER_CANCELLED\" || tag === \"WINDOW_CLOSED\" || tag === \"INCOMPLETE_ACTION\";\n};\n\nconst mapMeteorError = (message: string, endTags?: string[]): Error => {\n const tags = endTags ?? [];\n const lastTag = tags[tags.length - 1];\n\n if (isUserRejectedTag(lastTag)) {\n return new UserRejectedError(lastTag ?? \"USER_REJECTED\", message, { details: { endTags: tags } });\n }\n\n if (lastTag === \"POPUP_WINDOW_OPEN_FAILED\" || lastTag === \"POPUP_WINDOW_REFUSED\") {\n return new TransportError(lastTag, message, { details: { endTags: tags } });\n }\n\n return new TransportError(lastTag ?? \"METEOR_ACTION_FAILED\", message, {\n details: { endTags: tags },\n });\n};\n\nconst ensureNetwork = (network: string): WalletNetwork => {\n if (network !== \"mainnet\" && network !== \"testnet\") {\n throw new TransportError(\"INVALID_NETWORK\", `Unsupported network: ${network}`);\n }\n return network;\n};\n\nconst toMeteorTxPayload = (tx: PlainTransaction): string => {\n const encoded = borshSerialize(SCHEMA.Transaction, mapTransaction(tx));\n return bytesToBase64(new Uint8Array(encoded));\n};\n\nconst normalizeActionError = (error: unknown): Error => {\n if (error instanceof TransportError || error instanceof UserRejectedError) return error;\n if (error instanceof Error) return new TransportError(\"METEOR_ACTION_FAILED\", error.message, { cause: error });\n return new TransportError(\"METEOR_ACTION_FAILED\", \"Meteor action failed\", { details: error });\n};\n\nexport const createMeteorAdapter = (options: MeteorAdapterOptions = {}) => {\n const storage: AdapterStorage = options.storage ?? createDefaultStorage();\n const walletBaseUrl = options.walletBaseUrl ?? METEOR_DEFAULT_WALLET_BASE;\n const appKeyPrefix = options.appKeyPrefix ?? \"near_app\";\n const openWindow =\n options.openWindow ??\n ((url: string, name?: string, features?: string) => {\n if (typeof window === \"undefined\") return null;\n return window.open(url, name ?? \"MeteorWallet\", features ?? popupFeatures()) as any;\n });\n\n const rpcForNetwork = createRpcFactory(options.getNetworkProviders);\n const walletOrigin = new URL(walletBaseUrl).origin;\n const authStorageKey = (network: WalletNetwork) => `${appKeyPrefix}${LEGACY_AUTH_KEY_SUFFIX}:${network}`;\n const legacyAuthKey = `${appKeyPrefix}${LEGACY_AUTH_KEY_SUFFIX}`;\n\n let extensionListenerAttached = false;\n let activeConnection: MeteorConnection | null = null;\n\n const loadAuth = async (network: WalletNetwork): Promise<MeteorAuthState> => {\n const keyed = await readJson<MeteorAuthState>(storage, authStorageKey(network), { allKeys: [] });\n if (keyed.accountId || (keyed.allKeys?.length ?? 0) > 0) return keyed;\n return readJson<MeteorAuthState>(storage, legacyAuthKey, { allKeys: [] });\n };\n\n const saveAuth = async (network: WalletNetwork, state: MeteorAuthState): Promise<void> => {\n await writeJson(storage, authStorageKey(network), state);\n await writeJson(storage, legacyAuthKey, state);\n };\n\n const clearAuth = async (network: WalletNetwork): Promise<void> => {\n await storage.remove(authStorageKey(network));\n };\n\n const cleanupConnection = () => {\n if (activeConnection == null) return;\n if (activeConnection.interval != null) clearInterval(activeConnection.interval);\n activeConnection.cleanupFns.forEach((fn) => fn());\n activeConnection.cleanupFns = [];\n activeConnection.popup?.close?.();\n activeConnection = null;\n };\n\n const sendConnectionMessage = (connection: MeteorConnection): void => {\n const payload: Record<string, any> = {\n uid: connection.uid,\n actionType: connection.actionType,\n status: connection.status,\n network: connection.network,\n endTags: [],\n };\n if (connection.status === \"initializing\") payload.inputs = connection.inputs;\n\n if (connection.extension != null) {\n connection.extension.sendMessageData(payload);\n return;\n }\n\n if (connection.popup?.postMessage == null) return;\n try {\n connection.popup.postMessage(payload, connection.walletOrigin);\n } catch {\n connection.popup.postMessage(payload);\n }\n };\n\n const closeWithError = (error: Error): void => {\n if (activeConnection == null) return;\n const reject = activeConnection.reject;\n cleanupConnection();\n reject(error);\n };\n\n const closeWithSuccess = (payload: any): void => {\n if (activeConnection == null) return;\n const resolve = activeConnection.resolve;\n cleanupConnection();\n resolve(payload);\n };\n\n const handleMeteorResponse = (raw: any) => {\n const data = raw as MeteorActionResponse;\n if (activeConnection == null) return;\n if (data.uid !== activeConnection.uid) return;\n if (data.status == null) return;\n\n if (data.status === \"attempting_reconnect\") {\n activeConnection.status = \"initializing\";\n sendConnectionMessage(activeConnection);\n return;\n }\n\n if (data.status === \"connected\" && activeConnection.status === \"initializing\") {\n activeConnection.status = \"connected\";\n return;\n }\n\n if (data.status === \"closed_success\") {\n closeWithSuccess(data.payload);\n return;\n }\n\n if (data.status === \"closed_fail\") {\n closeWithError(mapMeteorError(data.message ?? \"Meteor action failed\", data.endTags));\n return;\n }\n\n if (data.status === \"closed_window\") {\n closeWithError(\n new UserRejectedError(\n \"WINDOW_CLOSED\",\n data.message ?? \"User closed the wallet window\",\n { details: { endTags: data.endTags ?? [\"WINDOW_CLOSED\"] } },\n ),\n );\n return;\n }\n\n if (data.status === \"disconnected\") {\n closeWithError(new TransportError(\"DISCONNECTED\", \"Meteor wallet transport disconnected\"));\n }\n };\n\n const attachExtensionListenerIfNeeded = (extension?: MeteorExtensionBridge) => {\n if (extension == null || extensionListenerAttached) return;\n extension.addMessageDataListener((message) => handleMeteorResponse(message));\n extensionListenerAttached = true;\n };\n\n const connectAndWaitForResponse = async <T>(\n network: WalletNetwork,\n actionType: MeteorActionType,\n inputs?: Record<string, any>,\n ): Promise<T> => {\n if (activeConnection != null) {\n activeConnection.reject(\n new TransportError(\"NEW_ACTION_STARTED\", \"A new action was started before the previous action completed\"),\n );\n cleanupConnection();\n }\n\n const uid = randomUid();\n const extension = options.getExtensionBridge?.();\n attachExtensionListenerIfNeeded(extension);\n\n let popup: PopupWindowLike | undefined;\n const cleanupFns: Array<() => void> = [];\n\n if (extension == null) {\n const url = new URL(`${walletBaseUrl}/connect/${network}/${actionType}`);\n url.searchParams.set(\"source\", \"wpm\");\n url.searchParams.set(\"connectionUid\", uid);\n\n popup = openWindow(url.toString(), \"MeteorWallet\", popupFeatures()) ?? undefined;\n if (popup == null) {\n throw new TransportError(\"POPUP_WINDOW_OPEN_FAILED\", \"Couldn't open popup window to complete wallet action\");\n }\n\n if (popup.windowIdPromise != null) {\n const popupId = await popup.windowIdPromise;\n if (popupId == null) {\n throw new TransportError(\"POPUP_WINDOW_OPEN_FAILED\", \"Couldn't open popup window to complete wallet action\");\n }\n }\n\n if (typeof window !== \"undefined\") {\n const listener = (event: MessageEvent) => handleMeteorResponse(event.data);\n window.addEventListener(\"message\", listener);\n cleanupFns.push(() => window.removeEventListener(\"message\", listener));\n }\n }\n\n return new Promise<T>((resolve, reject) => {\n const connection: MeteorConnection = {\n uid,\n network,\n actionType,\n status: \"initializing\",\n inputs,\n popup,\n extension,\n walletOrigin,\n cleanupFns,\n resolve,\n reject,\n };\n\n activeConnection = connection;\n sendConnectionMessage(connection);\n connection.interval = setInterval(() => {\n if (activeConnection == null) return;\n if (activeConnection.popup != null && activeConnection.popup.closed) {\n closeWithError(\n new UserRejectedError(\n \"WINDOW_CLOSED\",\n \"User closed the wallet window before completing the action\",\n { details: { endTags: [\"INCOMPLETE_ACTION\", \"WINDOW_CLOSED\"] } },\n ),\n );\n return;\n }\n sendConnectionMessage(activeConnection);\n }, METEOR_CONNECTION_PING_MS);\n });\n };\n\n const findSignerPublicKey = async (network: WalletNetwork, accountId: string, preferredKeys: string[]): Promise<string> => {\n const rpc = rpcForNetwork(network);\n for (const key of preferredKeys) {\n try {\n await rpc.query({\n request_type: \"view_access_key\",\n finality: \"optimistic\",\n account_id: accountId,\n public_key: key,\n });\n return key;\n } catch {\n // Ignore and continue probing candidate keys.\n }\n }\n\n const accessKeyList = await rpc.query<{ keys: Array<{ public_key: string }> }>({\n request_type: \"view_access_key_list\",\n finality: \"optimistic\",\n account_id: accountId,\n });\n\n if (!accessKeyList.keys?.length) {\n throw new TransportError(\"NO_ACCESS_KEYS\", `No access keys found for account ${accountId}`);\n }\n\n return accessKeyList.keys[0].public_key;\n };\n\n const prepareMeteorTransactions = async (\n network: WalletNetwork,\n signerId: string,\n preferredKeys: string[],\n transactions: Array<{ receiverId: string; actions: ConnectorActionLike[] }>,\n ): Promise<PlainTransaction[]> => {\n const rpc = rpcForNetwork(network);\n const block = await rpc.block({ finality: \"final\" });\n const publicKey = await findSignerPublicKey(network, signerId, preferredKeys);\n const accessKey = await rpc.query<{ nonce: number }>({\n request_type: \"view_access_key\",\n finality: \"optimistic\",\n account_id: signerId,\n public_key: publicKey,\n });\n\n return transactions.map((tx, index) => ({\n signerId,\n publicKey,\n nonce: BigInt(accessKey.nonce) + BigInt(index + 1),\n receiverId: tx.receiverId,\n blockHash: block.header.hash,\n actions: connectorActionsToFastnearActions(tx.actions),\n }));\n };\n\n const getAccountsForNetwork = async (network: WalletNetwork): Promise<WalletAccount[]> => {\n const auth = await loadAuth(network);\n if (!auth.accountId) return [];\n const publicKey = auth.signedInContract?.public_key ?? auth.allKeys?.[0] ?? \"\";\n return [{ accountId: auth.accountId, publicKey }];\n };\n\n const signIn = async ({ network, contractId, methodNames }: SignInParams): Promise<WalletAccount[]> => {\n const net = ensureNetwork(network);\n const generatedKey = privateKeyFromRandom();\n const generatedPublicKey = publicKeyFromPrivate(generatedKey);\n\n const inputs: Record<string, any> = {\n type: methodNames && methodNames.length > 0 ? \"SELECTED_METHODS\" : \"ALL_METHODS\",\n contract_id: contractId,\n methods: methodNames ?? [],\n public_key: generatedPublicKey,\n };\n\n const response = await connectAndWaitForResponse<{ accountId?: string; account_id?: string; allKeys?: string[] }>(\n net,\n \"login\",\n inputs,\n ).catch((error) => {\n throw normalizeActionError(error);\n });\n\n const accountId = response.accountId ?? response.account_id;\n if (accountId == null) {\n throw new TransportError(\"INVALID_LOGIN_RESPONSE\", \"Meteor login response did not contain an account id\", { details: response });\n }\n\n await saveAuth(net, {\n accountId,\n allKeys: response.allKeys ?? [],\n signedInContract: contractId ? { contract_id: contractId, public_key: generatedPublicKey } : undefined,\n });\n\n return getAccountsForNetwork(net);\n };\n\n const signOut = async ({ network }: { network: WalletNetwork }): Promise<void> => {\n const net = ensureNetwork(network);\n const auth = await loadAuth(net);\n if (!auth.accountId) return;\n\n if (auth.signedInContract != null) {\n await connectAndWaitForResponse(net, \"logout\", {\n accountId: auth.accountId,\n contractInfo: auth.signedInContract,\n }).catch((error) => {\n throw normalizeActionError(error);\n });\n }\n\n await clearAuth(net);\n await saveAuth(net, { allKeys: [] });\n };\n\n const verifyOwner = async ({ network, message, accountId }: { network: WalletNetwork; message: string; accountId?: string }) => {\n const net = ensureNetwork(network);\n const auth = await loadAuth(net);\n const useAccountId = accountId ?? auth.accountId;\n return connectAndWaitForResponse(net, \"verify_owner\", {\n accountId: useAccountId,\n message,\n }).catch((error) => {\n throw normalizeActionError(error);\n });\n };\n\n const signMessage = async ({\n network,\n message,\n nonce,\n recipient,\n callbackUrl,\n state,\n accountId,\n }: SignMessageParams): Promise<{ accountId: string; publicKey: string; signature: string; state?: string }> => {\n const net = ensureNetwork(network);\n const auth = await loadAuth(net);\n const useAccountId = accountId ?? auth.accountId;\n\n const response = await connectAndWaitForResponse<{ accountId: string; publicKey: string; signature: string }>(\n net,\n \"sign_message\",\n {\n message,\n nonce,\n recipient,\n callbackUrl: callbackUrl ?? options.getLocation?.(),\n state,\n accountId: useAccountId,\n },\n ).catch((error) => {\n throw normalizeActionError(error);\n });\n\n return {\n ...response,\n state,\n };\n };\n\n const signAndSendTransactions = async ({\n network,\n signerId,\n transactions,\n }: SignAndSendTransactionsParams): Promise<any[]> => {\n const net = ensureNetwork(network);\n const auth = await loadAuth(net);\n const useSigner = signerId ?? auth.accountId;\n if (useSigner == null) throw new TransportError(\"NOT_SIGNED_IN\", \"Wallet is not signed in\");\n\n const prepared = await prepareMeteorTransactions(net, useSigner, auth.allKeys ?? [], transactions);\n const serialized = prepared.map(toMeteorTxPayload).join(\",\");\n\n const response = await connectAndWaitForResponse<any>(net, \"sign\", {\n transactions: serialized,\n }).catch((error) => {\n throw normalizeActionError(error);\n });\n\n if (Array.isArray(response?.executionOutcomes)) {\n return response.executionOutcomes;\n }\n\n if (Array.isArray(response)) return response;\n return [response];\n };\n\n const signAndSendTransaction = async ({\n network,\n signerId,\n receiverId,\n actions,\n }: SignAndSendTransactionParams): Promise<any> => {\n const result = await signAndSendTransactions({\n network,\n signerId,\n transactions: [{ receiverId, actions }],\n });\n return result[0];\n };\n\n return {\n signIn,\n signOut,\n getAccounts: ({ network }: { network: WalletNetwork }) => getAccountsForNetwork(ensureNetwork(network)),\n verifyOwner,\n signMessage,\n signAndSendTransaction,\n signAndSendTransactions,\n };\n};\n"],"mappings":"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","names":["borshSerialize"]}