@solana-mobile/mobile-wallet-adapter-protocol 2.2.7 → 2.2.8
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.
- package/lib/cjs/index.browser.js +28 -20
- package/lib/cjs/index.browser.js.map +1 -1
- package/lib/cjs/index.js +28 -20
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/index.native.js +17 -14
- package/lib/cjs/index.native.js.map +1 -1
- package/lib/esm/index.browser.js +28 -20
- package/lib/esm/index.browser.js.map +1 -1
- package/lib/esm/index.js +28 -20
- package/lib/esm/index.js.map +1 -1
- package/lib/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/codegenSpec/NativeSolanaMobileWalletAdapter.ts +2 -0
package/lib/cjs/index.native.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
let react_native = require("react-native");
|
|
3
|
+
let _solana_codecs_strings = require("@solana/codecs-strings");
|
|
3
4
|
let js_base64 = require("js-base64");
|
|
4
5
|
let _solana_wallet_standard_util = require("@solana/wallet-standard-util");
|
|
5
|
-
let _solana_codecs_strings = require("@solana/codecs-strings");
|
|
6
6
|
//#region src/errors.ts
|
|
7
7
|
const SolanaMobileWalletAdapterErrorCode = {
|
|
8
8
|
ERROR_ASSOCIATION_PORT_OUT_OF_RANGE: "ERROR_ASSOCIATION_PORT_OUT_OF_RANGE",
|
|
@@ -53,6 +53,14 @@ var SolanaMobileWalletAdapterProtocolError = class extends Error {
|
|
|
53
53
|
//#region src/codegenSpec/NativeSolanaMobileWalletAdapter.ts
|
|
54
54
|
var NativeSolanaMobileWalletAdapter_default = react_native.TurboModuleRegistry.getEnforcing("SolanaMobileWalletAdapter");
|
|
55
55
|
//#endregion
|
|
56
|
+
//#region src/base58Utils.ts
|
|
57
|
+
function fromUint8Array(byteArray) {
|
|
58
|
+
return (0, _solana_codecs_strings.getBase58Decoder)().decode(byteArray);
|
|
59
|
+
}
|
|
60
|
+
function base64ToBase58(base64EncodedString) {
|
|
61
|
+
return fromUint8Array((0, js_base64.toUint8Array)(base64EncodedString));
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
56
64
|
//#region src/createSIWSMessage.ts
|
|
57
65
|
function createSIWSMessage(payload) {
|
|
58
66
|
return (0, _solana_wallet_standard_util.createSignInMessageText)(payload);
|
|
@@ -66,14 +74,6 @@ const SolanaSignTransactions = "solana:signTransactions";
|
|
|
66
74
|
const SolanaCloneAuthorization = "solana:cloneAuthorization";
|
|
67
75
|
const SolanaSignInWithSolana = "solana:signInWithSolana";
|
|
68
76
|
//#endregion
|
|
69
|
-
//#region src/base58Utils.ts
|
|
70
|
-
function fromUint8Array(byteArray) {
|
|
71
|
-
return (0, _solana_codecs_strings.getBase58Decoder)().decode(byteArray);
|
|
72
|
-
}
|
|
73
|
-
function base64ToBase58(base64EncodedString) {
|
|
74
|
-
return fromUint8Array((0, js_base64.toUint8Array)(base64EncodedString));
|
|
75
|
-
}
|
|
76
|
-
//#endregion
|
|
77
77
|
//#region src/createMobileWalletProxy.ts
|
|
78
78
|
/**
|
|
79
79
|
* Creates a {@link MobileWallet} proxy that handles backwards compatibility and API to RPC conversion.
|
|
@@ -89,7 +89,7 @@ function createMobileWalletProxy(protocolVersion, protocolRequestHandler) {
|
|
|
89
89
|
if (target[p] == null) target[p] = async function(inputParams) {
|
|
90
90
|
const { method, params } = handleMobileWalletRequest(p, inputParams, protocolVersion);
|
|
91
91
|
const result = await protocolRequestHandler(method, params);
|
|
92
|
-
if (method === "authorize" && params.sign_in_payload && !result.sign_in_result) result
|
|
92
|
+
if (method === "authorize" && params.sign_in_payload && !result.sign_in_result) result.sign_in_result = await signInFallback(params.sign_in_payload, result, protocolRequestHandler);
|
|
93
93
|
return handleMobileWalletResponse(p, result, protocolVersion);
|
|
94
94
|
};
|
|
95
95
|
return target[p];
|
|
@@ -116,7 +116,8 @@ function handleMobileWalletRequest(methodName, methodParams, protocolVersion) {
|
|
|
116
116
|
let method = methodName.toString().replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`).toLowerCase();
|
|
117
117
|
switch (methodName) {
|
|
118
118
|
case "authorize": {
|
|
119
|
-
|
|
119
|
+
const authorizeParams = params;
|
|
120
|
+
let { chain } = authorizeParams;
|
|
120
121
|
if (protocolVersion === "legacy") {
|
|
121
122
|
switch (chain) {
|
|
122
123
|
case "solana:testnet":
|
|
@@ -128,9 +129,10 @@ function handleMobileWalletRequest(methodName, methodParams, protocolVersion) {
|
|
|
128
129
|
case "solana:mainnet":
|
|
129
130
|
chain = "mainnet-beta";
|
|
130
131
|
break;
|
|
131
|
-
default: chain =
|
|
132
|
+
default: chain = authorizeParams.cluster;
|
|
132
133
|
}
|
|
133
|
-
|
|
134
|
+
authorizeParams.cluster = chain;
|
|
135
|
+
params = authorizeParams;
|
|
134
136
|
} else {
|
|
135
137
|
switch (chain) {
|
|
136
138
|
case "testnet":
|
|
@@ -141,7 +143,8 @@ function handleMobileWalletRequest(methodName, methodParams, protocolVersion) {
|
|
|
141
143
|
chain = "solana:mainnet";
|
|
142
144
|
break;
|
|
143
145
|
}
|
|
144
|
-
|
|
146
|
+
authorizeParams.chain = chain;
|
|
147
|
+
params = authorizeParams;
|
|
145
148
|
}
|
|
146
149
|
}
|
|
147
150
|
case "reauthorize": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.native.js","names":["TurboModuleRegistry","AppRegistry","Platform","NativeSolanaMobileWalletAdapter"],"sources":["../../src/errors.ts","../../src/codegenSpec/NativeSolanaMobileWalletAdapter.ts","../../src/createSIWSMessage.ts","../../src/types.ts","../../src/base58Utils.ts","../../src/createMobileWalletProxy.ts","../../src/__forks__/react-native/transact.ts"],"sourcesContent":["// Typescript `enums` thwart tree-shaking. See https://bargsten.org/jsts/enums/\nexport const SolanaMobileWalletAdapterErrorCode = {\n ERROR_ASSOCIATION_PORT_OUT_OF_RANGE: 'ERROR_ASSOCIATION_PORT_OUT_OF_RANGE',\n ERROR_REFLECTOR_ID_OUT_OF_RANGE: 'ERROR_REFLECTOR_ID_OUT_OF_RANGE',\n ERROR_FORBIDDEN_WALLET_BASE_URL: 'ERROR_FORBIDDEN_WALLET_BASE_URL',\n ERROR_SECURE_CONTEXT_REQUIRED: 'ERROR_SECURE_CONTEXT_REQUIRED',\n ERROR_SESSION_CLOSED: 'ERROR_SESSION_CLOSED',\n ERROR_SESSION_TIMEOUT: 'ERROR_SESSION_TIMEOUT',\n ERROR_WALLET_NOT_FOUND: 'ERROR_WALLET_NOT_FOUND',\n ERROR_INVALID_PROTOCOL_VERSION: 'ERROR_INVALID_PROTOCOL_VERSION',\n ERROR_BROWSER_NOT_SUPPORTED: 'ERROR_BROWSER_NOT_SUPPORTED',\n ERROR_LOOPBACK_ACCESS_BLOCKED: 'ERROR_LOOPBACK_ACCESS_BLOCKED',\n ERROR_ASSOCIATION_CANCELLED: 'ERROR_ASSOCIATION_CANCELLED',\n} as const;\ntype SolanaMobileWalletAdapterErrorCodeEnum =\n (typeof SolanaMobileWalletAdapterErrorCode)[keyof typeof SolanaMobileWalletAdapterErrorCode];\n\ntype ErrorDataTypeMap = {\n [SolanaMobileWalletAdapterErrorCode.ERROR_ASSOCIATION_PORT_OUT_OF_RANGE]: {\n port: number;\n };\n [SolanaMobileWalletAdapterErrorCode.ERROR_REFLECTOR_ID_OUT_OF_RANGE]: {\n id: number;\n };\n [SolanaMobileWalletAdapterErrorCode.ERROR_FORBIDDEN_WALLET_BASE_URL]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_SECURE_CONTEXT_REQUIRED]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_SESSION_CLOSED]: {\n closeEvent: CloseEvent;\n };\n [SolanaMobileWalletAdapterErrorCode.ERROR_SESSION_TIMEOUT]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_WALLET_NOT_FOUND]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_INVALID_PROTOCOL_VERSION]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_BROWSER_NOT_SUPPORTED]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_LOOPBACK_ACCESS_BLOCKED]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_ASSOCIATION_CANCELLED]: {\n event: Event | undefined;\n };\n};\n\nexport class SolanaMobileWalletAdapterError<TErrorCode extends SolanaMobileWalletAdapterErrorCodeEnum> extends Error {\n data: ErrorDataTypeMap[TErrorCode] | undefined;\n code: TErrorCode;\n constructor(\n ...args: ErrorDataTypeMap[TErrorCode] extends Record<string, unknown>\n ? [code: TErrorCode, message: string, data: ErrorDataTypeMap[TErrorCode]]\n : [code: TErrorCode, message: string]\n ) {\n const [code, message, data] = args;\n super(message);\n this.code = code;\n this.data = data;\n this.name = 'SolanaMobileWalletAdapterError';\n }\n}\n\ntype JSONRPCErrorCode = number;\n\n// Typescript `enums` thwart tree-shaking. See https://bargsten.org/jsts/enums/\nexport const SolanaMobileWalletAdapterProtocolErrorCode = {\n // Keep these in sync with `mobilewalletadapter/common/ProtocolContract.java`.\n ERROR_AUTHORIZATION_FAILED: -1,\n ERROR_INVALID_PAYLOADS: -2,\n ERROR_NOT_SIGNED: -3,\n ERROR_NOT_SUBMITTED: -4,\n ERROR_TOO_MANY_PAYLOADS: -5,\n ERROR_ATTEST_ORIGIN_ANDROID: -100,\n} as const;\ntype SolanaMobileWalletAdapterProtocolErrorCodeEnum =\n (typeof SolanaMobileWalletAdapterProtocolErrorCode)[keyof typeof SolanaMobileWalletAdapterProtocolErrorCode];\n\ntype ProtocolErrorDataTypeMap = {\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED]: undefined;\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_INVALID_PAYLOADS]: undefined;\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_NOT_SIGNED]: undefined;\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_NOT_SUBMITTED]: undefined;\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_TOO_MANY_PAYLOADS]: undefined;\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_ATTEST_ORIGIN_ANDROID]: {\n attest_origin_uri: string;\n challenge: string;\n context: string;\n };\n};\n\nexport class SolanaMobileWalletAdapterProtocolError<\n TErrorCode extends SolanaMobileWalletAdapterProtocolErrorCodeEnum,\n> extends Error {\n data: ProtocolErrorDataTypeMap[TErrorCode] | undefined;\n code: TErrorCode | JSONRPCErrorCode;\n jsonRpcMessageId: number;\n constructor(\n ...args: ProtocolErrorDataTypeMap[TErrorCode] extends Record<string, unknown>\n ? [\n jsonRpcMessageId: number,\n code: TErrorCode | JSONRPCErrorCode,\n message: string,\n data: ProtocolErrorDataTypeMap[TErrorCode],\n ]\n : [jsonRpcMessageId: number, code: TErrorCode | JSONRPCErrorCode, message: string]\n ) {\n const [jsonRpcMessageId, code, message, data] = args;\n super(message);\n this.code = code;\n this.data = data;\n this.jsonRpcMessageId = jsonRpcMessageId;\n this.name = 'SolanaMobileWalletAdapterProtocolError';\n }\n}\n","import { TurboModule, TurboModuleRegistry } from 'react-native';\n\nexport interface Spec extends TurboModule {\n startSession(config?: { baseUri?: string }): Promise<{\n protocol_version: 'legacy' | 'v1';\n }>;\n\n invoke(method: string, params: Object | undefined): Promise<Object>;\n\n endSession(): Promise<boolean>;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>('SolanaMobileWalletAdapter') as Spec;\n","import { SolanaSignInInputWithRequiredFields, createSignInMessageText } from '@solana/wallet-standard-util';\nimport { SignInPayload } from './types';\nimport { encode } from './base64Utils';\n\nexport function createSIWSMessage(payload: SolanaSignInInputWithRequiredFields & SignInPayload): string {\n return createSignInMessageText(payload);\n}\n\nexport function createSIWSMessageBase64Url(payload: SolanaSignInInputWithRequiredFields & SignInPayload): string {\n return encode(createSIWSMessage(payload)).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, ''); // convert to base64url encoding;\n}\n","import type { TransactionVersion } from '@solana/web3.js';\nimport type { SolanaSignInInput } from '@solana/wallet-standard-features';\nimport type { IdentifierArray, IdentifierString, WalletAccount, WalletIcon } from '@wallet-standard/core';\n\nexport type Account =\n | Readonly<{\n address: Base64EncodedAddress;\n label?: string;\n icon?: WalletIcon;\n chains?: IdentifierArray;\n features?: IdentifierArray;\n }>\n | WalletAccount;\n\n/**\n * Properties that wallets may present to users when an app\n * asks for authorization to execute privileged methods (see\n * {@link PrivilegedMethods}).\n */\nexport type AppIdentity = Readonly<{\n uri?: string;\n icon?: string;\n name?: string;\n}>;\n\n/**\n * An ephemeral elliptic-curve keypair on the P-256 curve.\n * This public key is used to create the association token.\n * The private key is used during session establishment.\n */\nexport type AssociationKeypair = CryptoKeyPair;\n\nexport type ProtocolVersion = 'v1' | 'legacy';\n\nexport type SessionProperties = Readonly<{\n protocol_version: ProtocolVersion;\n}>;\n\n/**\n * The context returned from a wallet after having authorized a given\n * account for use with a given application. You can cache this and\n * use it later to invoke privileged methods.\n */\nexport type AuthorizationResult = Readonly<{\n accounts: Account[];\n auth_token: AuthToken;\n wallet_uri_base: string;\n sign_in_result?: SignInResult;\n}>;\n\nexport type AuthToken = string;\n\nexport type Base64EncodedAddress = string;\n\ntype Base64EncodedSignature = string;\n\ntype Base64EncodedMessage = string;\n\ntype Base64EncodedSignedMessage = string;\n\ntype Base64EncodedSignedTransaction = string;\n\nexport type Base64EncodedTransaction = string;\n\n/**\n * @deprecated Replaced by the 'chain' parameter, which adds multi-chain capability as per MWA 2.0 spec.\n */\nexport type Cluster = 'devnet' | 'testnet' | 'mainnet-beta';\n\nexport type Chain = IdentifierString | Cluster;\n\nexport type Finality = 'confirmed' | 'finalized' | 'processed';\n\nexport type WalletAssociationConfig = Readonly<{\n baseUri?: string;\n}>;\n\nexport type RemoteWalletAssociationConfig = WalletAssociationConfig &\n Readonly<{\n remoteHostAuthority: string;\n }>;\n\nexport interface AuthorizeAPI {\n /**\n * @deprecated Replaced by updated authorize() method, which adds MWA 2.0 spec support.\n */\n authorize(params: { cluster: Cluster; identity: AppIdentity }): Promise<AuthorizationResult>;\n\n authorize(params: {\n identity: AppIdentity;\n chain?: Chain;\n features?: IdentifierArray;\n addresses?: string[];\n auth_token?: AuthToken;\n sign_in_payload?: SignInPayload;\n }): Promise<AuthorizationResult>;\n}\nexport interface CloneAuthorizationAPI {\n cloneAuthorization(params: { auth_token: AuthToken }): Promise<Readonly<{ auth_token: AuthToken }>>;\n}\nexport interface DeauthorizeAPI {\n deauthorize(params: { auth_token: AuthToken }): Promise<Readonly<Record<string, never>>>;\n}\n\nexport interface GetCapabilitiesAPI {\n getCapabilities(): Promise<\n Readonly<{\n max_transactions_per_request: number;\n max_messages_per_request: number;\n supported_transaction_versions: ReadonlyArray<TransactionVersion>;\n features: IdentifierArray;\n /**\n * @deprecated Replaced by features array.\n */\n supports_clone_authorization: boolean;\n /**\n * @deprecated Replaced by features array.\n */\n supports_sign_and_send_transactions: boolean;\n }>\n >;\n}\nexport interface ReauthorizeAPI {\n reauthorize(params: { auth_token: AuthToken; identity: AppIdentity }): Promise<AuthorizationResult>;\n}\nexport interface SignMessagesAPI {\n signMessages(params: {\n addresses: Base64EncodedAddress[];\n payloads: Base64EncodedMessage[];\n }): Promise<Readonly<{ signed_payloads: Base64EncodedSignedMessage[] }>>;\n}\nexport interface SignTransactionsAPI {\n signTransactions(params: {\n payloads: Base64EncodedTransaction[];\n }): Promise<Readonly<{ signed_payloads: Base64EncodedSignedTransaction[] }>>;\n}\nexport interface SignAndSendTransactionsAPI {\n signAndSendTransactions(params: {\n options?: Readonly<{\n min_context_slot?: number;\n commitment?: string;\n skip_preflight?: boolean;\n max_retries?: number;\n wait_for_commitment_to_send_next_transaction?: boolean;\n }>;\n payloads: Base64EncodedTransaction[];\n }): Promise<Readonly<{ signatures: Base64EncodedSignature[] }>>;\n}\n\nexport interface MobileWallet\n extends\n AuthorizeAPI,\n CloneAuthorizationAPI,\n DeauthorizeAPI,\n GetCapabilitiesAPI,\n ReauthorizeAPI,\n SignMessagesAPI,\n SignTransactionsAPI,\n SignAndSendTransactionsAPI {}\n\nexport interface TerminateSessionAPI {\n terminateSession(): void;\n}\n\nexport interface RemoteMobileWallet extends MobileWallet, TerminateSessionAPI {}\n\n// optional features\nexport const SolanaSignTransactions = 'solana:signTransactions';\nexport const SolanaCloneAuthorization = 'solana:cloneAuthorization';\nexport const SolanaSignInWithSolana = 'solana:signInWithSolana';\n\nexport type SignInPayload =\n | Readonly<{\n domain?: string;\n address?: string;\n statement?: string;\n uri?: string;\n version?: string;\n chainId?: string;\n nonce?: string;\n issuedAt?: string;\n expirationTime?: string;\n notBefore?: string;\n requestId?: string;\n resources?: readonly string[];\n }>\n | SolanaSignInInput;\n\nexport type SignInPayloadWithRequiredFields = Partial<SignInPayload> &\n Required<Pick<SignInPayload, 'domain' | 'address'>>;\n\nexport type SignInResult = Readonly<{\n address: Base64EncodedAddress;\n signed_message: Base64EncodedSignedMessage;\n signature: Base64EncodedSignature;\n signature_type?: string;\n}>;\n\nexport type Scenario = Readonly<{\n wallet: Promise<MobileWallet>;\n close: () => void;\n}>;\n\nexport type RemoteScenario = Scenario &\n Readonly<{\n associationUrl: URL;\n }>;\n","import { getBase58Decoder } from '@solana/codecs-strings';\nimport { toUint8Array } from './base64Utils';\n\nexport function fromUint8Array(byteArray: Uint8Array): string {\n return getBase58Decoder().decode(byteArray);\n}\n\nexport function base64ToBase58(base64EncodedString: string): string {\n return fromUint8Array(toUint8Array(base64EncodedString));\n}\n","import { fromUint8Array, toUint8Array } from './base64Utils';\nimport { createSIWSMessageBase64Url } from './createSIWSMessage';\nimport {\n AuthorizationResult,\n MobileWallet,\n ProtocolVersion,\n SignInPayload,\n SignInResult,\n SolanaCloneAuthorization,\n SolanaSignTransactions,\n} from './types';\nimport type { IdentifierArray } from '@wallet-standard/core';\nimport { base64ToBase58 } from './base58Utils';\n\n/**\n * Creates a {@link MobileWallet} proxy that handles backwards compatibility and API to RPC conversion.\n *\n * @param protocolVersion the protocol version in use for this session/request\n * @param protocolRequestHandler callback function that handles sending the RPC request to the wallet endpoint.\n * @returns a {@link MobileWallet} proxy\n */\nexport default function createMobileWalletProxy<\n TMethodName extends keyof MobileWallet,\n TReturn extends Awaited<ReturnType<MobileWallet[TMethodName]>>,\n>(\n protocolVersion: ProtocolVersion,\n protocolRequestHandler: (method: string, params: Parameters<MobileWallet[TMethodName]>[0]) => Promise<any>,\n): MobileWallet {\n return new Proxy<MobileWallet>({} as MobileWallet, {\n get<TMethodName extends keyof MobileWallet>(target: MobileWallet, p: TMethodName) {\n // Wrapping a Proxy in a promise results in the Proxy being asked for a 'then' property so must\n // return null if 'then' is called on this proxy to let the 'resolve()' call know this is not a promise.\n // see: https://stackoverflow.com/a/53890904\n //@ts-ignore\n if (p === 'then') {\n return null;\n }\n if (target[p] == null) {\n target[p] = async function (inputParams: Parameters<MobileWallet[TMethodName]>[0]) {\n const { method, params } = handleMobileWalletRequest(p, inputParams, protocolVersion);\n const result = (await protocolRequestHandler(method, params)) as Awaited<\n ReturnType<MobileWallet[TMethodName]>\n >;\n // if the request tried to sign in but the wallet did not return a sign in result, fallback on message signing\n if (method === 'authorize' && (params as any).sign_in_payload && !(result as any).sign_in_result) {\n (result as any)['sign_in_result'] = await signInFallback(\n (params as Parameters<MobileWallet['authorize']>[0]).sign_in_payload as SignInPayload,\n result as Awaited<ReturnType<MobileWallet['authorize']>>,\n protocolRequestHandler,\n );\n }\n return handleMobileWalletResponse(p, result, protocolVersion) as TReturn;\n } as MobileWallet[TMethodName];\n }\n return target[p];\n },\n defineProperty() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n });\n}\n\n/**\n * Handles all {@link MobileWallet} API requests and determines the correct MWA RPC method and params to call.\n * This handles backwards compatibility, based on the provided @protocolVersion.\n *\n * @param methodName the name of {@link MobileWallet} method that was called\n * @param methodParams the parameters that were passed to the method\n * @param protocolVersion the protocol version in use for this session/request\n * @returns the RPC request method and params that should be sent to the wallet endpoint\n */\nfunction handleMobileWalletRequest<TMethodName extends keyof MobileWallet>(\n methodName: TMethodName,\n methodParams: Parameters<MobileWallet[TMethodName]>[0],\n protocolVersion: ProtocolVersion,\n) {\n let params = methodParams;\n let method: string = methodName\n .toString()\n .replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)\n .toLowerCase();\n switch (methodName) {\n case 'authorize': {\n let { chain } = params as Parameters<MobileWallet['authorize']>[0];\n if (protocolVersion === 'legacy') {\n switch (chain) {\n case 'solana:testnet': {\n chain = 'testnet';\n break;\n }\n case 'solana:devnet': {\n chain = 'devnet';\n break;\n }\n case 'solana:mainnet': {\n chain = 'mainnet-beta';\n break;\n }\n default: {\n chain = (params as any).cluster;\n }\n }\n (params as any).cluster = chain;\n } else {\n switch (chain) {\n case 'testnet':\n case 'devnet': {\n chain = `solana:${chain}`;\n break;\n }\n case 'mainnet-beta': {\n chain = 'solana:mainnet';\n break;\n }\n }\n (params as Parameters<MobileWallet['authorize']>[0]).chain = chain;\n }\n }\n case 'reauthorize': {\n const { auth_token, identity } = params as Parameters<MobileWallet['authorize' | 'reauthorize']>[0];\n if (auth_token) {\n switch (protocolVersion) {\n case 'legacy': {\n method = 'reauthorize';\n params = { auth_token: auth_token, identity: identity };\n break;\n }\n default: {\n method = 'authorize';\n break;\n }\n }\n }\n break;\n }\n }\n return { method, params };\n}\n\n/**\n * Handles all {@link MobileWallet} API responses and modifies the response for backwards compatibility, if needed\n *\n * @param method the {@link MobileWallet} method that was called\n * @param response the original response that was returned by the method call\n * @param protocolVersion the protocol version in use for this session/request\n * @returns the possibly modified response\n */\nfunction handleMobileWalletResponse<TMethodName extends keyof MobileWallet>(\n method: TMethodName,\n response: Awaited<ReturnType<MobileWallet[TMethodName]>>,\n protocolVersion: ProtocolVersion,\n): Awaited<ReturnType<MobileWallet[TMethodName]>> {\n switch (method) {\n case 'getCapabilities': {\n const capabilities = response as Awaited<ReturnType<MobileWallet['getCapabilities']>>;\n switch (protocolVersion) {\n case 'legacy': {\n const features: `${string}:${string}`[] = [SolanaSignTransactions];\n if (capabilities.supports_clone_authorization === true) {\n features.push(SolanaCloneAuthorization);\n }\n return {\n ...capabilities,\n features: features as IdentifierArray,\n } as Awaited<ReturnType<MobileWallet[TMethodName]>>;\n }\n case 'v1': {\n return {\n ...capabilities,\n supports_sign_and_send_transactions: true,\n supports_clone_authorization: capabilities.features.includes(SolanaCloneAuthorization),\n } as Awaited<ReturnType<MobileWallet[TMethodName]>>;\n }\n }\n }\n }\n return response;\n}\n\nasync function signInFallback(\n signInPayload: SignInPayload,\n authorizationResult: Awaited<ReturnType<MobileWallet['authorize']>>,\n protocolRequestHandler: (method: string, params: Parameters<MobileWallet['signMessages']>[0]) => Promise<unknown>,\n) {\n const domain = signInPayload.domain ?? window.location.host;\n const address = (authorizationResult as AuthorizationResult).accounts[0].address;\n const siwsMessage = createSIWSMessageBase64Url({ ...signInPayload, domain, address: base64ToBase58(address) });\n const signMessageResult = await (protocolRequestHandler('sign_messages', {\n addresses: [address],\n payloads: [siwsMessage],\n }) as ReturnType<MobileWallet['signMessages']>);\n\n const signedPayload = toUint8Array(signMessageResult.signed_payloads[0]);\n const signedMessage = fromUint8Array(signedPayload.slice(0, signedPayload.length - 64));\n const signature = fromUint8Array(signedPayload.slice(signedPayload.length - 64));\n const signInResult: SignInResult = {\n address: address,\n // Workaround: some wallets have been observed to only reply with the message signature.\n // This is non-compliant with the spec, but in the interest of maximizing compatibility,\n // detect this case and reuse the original message.\n signed_message: signedMessage.length == 0 ? siwsMessage : signedMessage,\n signature,\n };\n return signInResult;\n}\n","import { Platform, AppRegistry } from 'react-native';\n\nimport NativeSolanaMobileWalletAdapter from '../../codegenSpec/NativeSolanaMobileWalletAdapter.js';\nimport createMobileWalletProxy from '../../createMobileWalletProxy.js';\nimport { SolanaMobileWalletAdapterError, SolanaMobileWalletAdapterProtocolError } from '../../errors.js';\nimport { MobileWallet, SessionProperties, WalletAssociationConfig } from '../../types.js';\n\nAppRegistry.registerHeadlessTask('SolanaMobileWalletAdapterSessionBackgroundTask', () => {\n return async () => {\n // This is a no-op task that is used to keep the app alive while the session is active.\n // The actual session management is handled in the native module.\n // This is necessary for the React Native Android implementation to work correctly.\n // The task is started before startActivityResult and stopped when the activity result callback is triggered\n };\n});\n\ntype ReactNativeError = Error & { code?: string; userInfo?: Record<string, unknown> };\n\nconst LINKING_ERROR =\n `The package 'solana-mobile-wallet-adapter-protocol' doesn't seem to be linked. Make sure: \\n\\n` +\n '- You rebuilt the app after installing the package\\n' +\n '- If you are using Lerna workspaces\\n' +\n ' - You have added `@solana-mobile/mobile-wallet-adapter-protocol` as an explicit dependency, and\\n' +\n ' - You have added `@solana-mobile/mobile-wallet-adapter-protocol` to the `nohoist` section of your package.json\\n' +\n '- You are not using Expo managed workflow\\n';\n\nconst SolanaMobileWalletAdapter =\n Platform.OS === 'android' && NativeSolanaMobileWalletAdapter\n ? NativeSolanaMobileWalletAdapter\n : (new Proxy(\n {},\n {\n get() {\n throw new Error(\n Platform.OS !== 'android'\n ? 'The package `solana-mobile-wallet-adapter-protocol` is only compatible with React Native Android'\n : LINKING_ERROR,\n );\n },\n },\n ) as typeof NativeSolanaMobileWalletAdapter);\n\nfunction getErrorMessage(e: ReactNativeError): string {\n switch (e.code) {\n case 'ERROR_WALLET_NOT_FOUND':\n return 'Found no installed wallet that supports the mobile wallet protocol.';\n default:\n return e.message;\n }\n}\n\nfunction handleError(e: any): never {\n if (e instanceof Error) {\n const reactNativeError: ReactNativeError = e;\n switch (reactNativeError.code) {\n case undefined:\n throw e;\n case 'JSON_RPC_ERROR': {\n const details = reactNativeError.userInfo as Readonly<{ jsonRpcErrorCode: number }>;\n throw new SolanaMobileWalletAdapterProtocolError(\n 0 /* jsonRpcMessageId */,\n details.jsonRpcErrorCode,\n e.message,\n );\n }\n default:\n throw new SolanaMobileWalletAdapterError<any>(\n reactNativeError.code,\n getErrorMessage(reactNativeError),\n reactNativeError.userInfo,\n );\n }\n }\n throw e;\n}\n\nexport async function transact<TReturn>(\n callback: (wallet: MobileWallet) => TReturn,\n config?: WalletAssociationConfig,\n): Promise<TReturn> {\n let didSuccessfullyConnect = false;\n try {\n const sessionProperties: SessionProperties = await SolanaMobileWalletAdapter.startSession(config);\n didSuccessfullyConnect = true;\n const wallet = createMobileWalletProxy(sessionProperties.protocol_version, async (method, params) => {\n try {\n return SolanaMobileWalletAdapter.invoke(method, params);\n } catch (e) {\n return handleError(e);\n }\n });\n return await callback(wallet);\n } catch (e) {\n return handleError(e);\n } finally {\n if (didSuccessfullyConnect) {\n await SolanaMobileWalletAdapter.endSession();\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.native.js","names":["TurboModuleRegistry","AppRegistry","Platform","NativeSolanaMobileWalletAdapter"],"sources":["../../src/errors.ts","../../src/codegenSpec/NativeSolanaMobileWalletAdapter.ts","../../src/base58Utils.ts","../../src/createSIWSMessage.ts","../../src/types.ts","../../src/createMobileWalletProxy.ts","../../src/__forks__/react-native/transact.ts"],"sourcesContent":["// Typescript `enums` thwart tree-shaking. See https://bargsten.org/jsts/enums/\nexport const SolanaMobileWalletAdapterErrorCode = {\n ERROR_ASSOCIATION_PORT_OUT_OF_RANGE: 'ERROR_ASSOCIATION_PORT_OUT_OF_RANGE',\n ERROR_REFLECTOR_ID_OUT_OF_RANGE: 'ERROR_REFLECTOR_ID_OUT_OF_RANGE',\n ERROR_FORBIDDEN_WALLET_BASE_URL: 'ERROR_FORBIDDEN_WALLET_BASE_URL',\n ERROR_SECURE_CONTEXT_REQUIRED: 'ERROR_SECURE_CONTEXT_REQUIRED',\n ERROR_SESSION_CLOSED: 'ERROR_SESSION_CLOSED',\n ERROR_SESSION_TIMEOUT: 'ERROR_SESSION_TIMEOUT',\n ERROR_WALLET_NOT_FOUND: 'ERROR_WALLET_NOT_FOUND',\n ERROR_INVALID_PROTOCOL_VERSION: 'ERROR_INVALID_PROTOCOL_VERSION',\n ERROR_BROWSER_NOT_SUPPORTED: 'ERROR_BROWSER_NOT_SUPPORTED',\n ERROR_LOOPBACK_ACCESS_BLOCKED: 'ERROR_LOOPBACK_ACCESS_BLOCKED',\n ERROR_ASSOCIATION_CANCELLED: 'ERROR_ASSOCIATION_CANCELLED',\n} as const;\ntype SolanaMobileWalletAdapterErrorCodeEnum =\n (typeof SolanaMobileWalletAdapterErrorCode)[keyof typeof SolanaMobileWalletAdapterErrorCode];\n\ntype ErrorDataTypeMap = {\n [SolanaMobileWalletAdapterErrorCode.ERROR_ASSOCIATION_PORT_OUT_OF_RANGE]: {\n port: number;\n };\n [SolanaMobileWalletAdapterErrorCode.ERROR_REFLECTOR_ID_OUT_OF_RANGE]: {\n id: number;\n };\n [SolanaMobileWalletAdapterErrorCode.ERROR_FORBIDDEN_WALLET_BASE_URL]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_SECURE_CONTEXT_REQUIRED]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_SESSION_CLOSED]: {\n closeEvent: CloseEvent;\n };\n [SolanaMobileWalletAdapterErrorCode.ERROR_SESSION_TIMEOUT]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_WALLET_NOT_FOUND]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_INVALID_PROTOCOL_VERSION]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_BROWSER_NOT_SUPPORTED]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_LOOPBACK_ACCESS_BLOCKED]: undefined;\n [SolanaMobileWalletAdapterErrorCode.ERROR_ASSOCIATION_CANCELLED]: {\n event: Event | undefined;\n };\n};\n\nexport class SolanaMobileWalletAdapterError<TErrorCode extends SolanaMobileWalletAdapterErrorCodeEnum> extends Error {\n data: ErrorDataTypeMap[TErrorCode] | undefined;\n code: TErrorCode;\n constructor(\n ...args: ErrorDataTypeMap[TErrorCode] extends Record<string, unknown>\n ? [code: TErrorCode, message: string, data: ErrorDataTypeMap[TErrorCode]]\n : [code: TErrorCode, message: string]\n ) {\n const [code, message, data] = args;\n super(message);\n this.code = code;\n this.data = data;\n this.name = 'SolanaMobileWalletAdapterError';\n }\n}\n\ntype JSONRPCErrorCode = number;\n\n// Typescript `enums` thwart tree-shaking. See https://bargsten.org/jsts/enums/\nexport const SolanaMobileWalletAdapterProtocolErrorCode = {\n // Keep these in sync with `mobilewalletadapter/common/ProtocolContract.java`.\n ERROR_AUTHORIZATION_FAILED: -1,\n ERROR_INVALID_PAYLOADS: -2,\n ERROR_NOT_SIGNED: -3,\n ERROR_NOT_SUBMITTED: -4,\n ERROR_TOO_MANY_PAYLOADS: -5,\n ERROR_ATTEST_ORIGIN_ANDROID: -100,\n} as const;\ntype SolanaMobileWalletAdapterProtocolErrorCodeEnum =\n (typeof SolanaMobileWalletAdapterProtocolErrorCode)[keyof typeof SolanaMobileWalletAdapterProtocolErrorCode];\n\ntype ProtocolErrorDataTypeMap = {\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED]: undefined;\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_INVALID_PAYLOADS]: undefined;\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_NOT_SIGNED]: undefined;\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_NOT_SUBMITTED]: undefined;\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_TOO_MANY_PAYLOADS]: undefined;\n [SolanaMobileWalletAdapterProtocolErrorCode.ERROR_ATTEST_ORIGIN_ANDROID]: {\n attest_origin_uri: string;\n challenge: string;\n context: string;\n };\n};\n\nexport class SolanaMobileWalletAdapterProtocolError<\n TErrorCode extends SolanaMobileWalletAdapterProtocolErrorCodeEnum,\n> extends Error {\n data: ProtocolErrorDataTypeMap[TErrorCode] | undefined;\n code: TErrorCode | JSONRPCErrorCode;\n jsonRpcMessageId: number;\n constructor(\n ...args: ProtocolErrorDataTypeMap[TErrorCode] extends Record<string, unknown>\n ? [\n jsonRpcMessageId: number,\n code: TErrorCode | JSONRPCErrorCode,\n message: string,\n data: ProtocolErrorDataTypeMap[TErrorCode],\n ]\n : [jsonRpcMessageId: number, code: TErrorCode | JSONRPCErrorCode, message: string]\n ) {\n const [jsonRpcMessageId, code, message, data] = args;\n super(message);\n this.code = code;\n this.data = data;\n this.jsonRpcMessageId = jsonRpcMessageId;\n this.name = 'SolanaMobileWalletAdapterProtocolError';\n }\n}\n","import { TurboModule, TurboModuleRegistry } from 'react-native';\n\nexport interface Spec extends TurboModule {\n startSession(config?: { baseUri?: string }): Promise<{\n protocol_version: 'legacy' | 'v1';\n }>;\n\n // React Native codegen rejects the primitive `object` type in TurboModule specs.\n // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\n invoke(method: string, params: Object | undefined): Promise<Object>;\n\n endSession(): Promise<boolean>;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>('SolanaMobileWalletAdapter') as Spec;\n","import { getBase58Decoder } from '@solana/codecs-strings';\n\nimport { toUint8Array } from './base64Utils.js';\n\nexport function fromUint8Array(byteArray: Uint8Array): string {\n return getBase58Decoder().decode(byteArray);\n}\n\nexport function base64ToBase58(base64EncodedString: string): string {\n return fromUint8Array(toUint8Array(base64EncodedString));\n}\n","import { createSignInMessageText, SolanaSignInInputWithRequiredFields } from '@solana/wallet-standard-util';\n\nimport { encode } from './base64Utils.js';\nimport { SignInPayload } from './types.js';\n\nexport function createSIWSMessage(payload: SolanaSignInInputWithRequiredFields & SignInPayload): string {\n return createSignInMessageText(payload);\n}\n\nexport function createSIWSMessageBase64Url(payload: SolanaSignInInputWithRequiredFields & SignInPayload): string {\n return encode(createSIWSMessage(payload)).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, ''); // convert to base64url encoding;\n}\n","import type { SolanaSignInInput } from '@solana/wallet-standard-features';\nimport type { TransactionVersion } from '@solana/web3.js';\nimport type { IdentifierArray, IdentifierString, WalletAccount, WalletIcon } from '@wallet-standard/core';\n\nexport type Account =\n | Readonly<{\n address: Base64EncodedAddress;\n label?: string;\n icon?: WalletIcon;\n chains?: IdentifierArray;\n features?: IdentifierArray;\n }>\n | WalletAccount;\n\n/**\n * Properties that wallets may present to users when an app\n * asks for authorization to execute privileged methods (see\n * {@link PrivilegedMethods}).\n */\nexport type AppIdentity = Readonly<{\n uri?: string;\n icon?: string;\n name?: string;\n}>;\n\n/**\n * An ephemeral elliptic-curve keypair on the P-256 curve.\n * This public key is used to create the association token.\n * The private key is used during session establishment.\n */\nexport type AssociationKeypair = CryptoKeyPair;\n\nexport type ProtocolVersion = 'v1' | 'legacy';\n\nexport type SessionProperties = Readonly<{\n protocol_version: ProtocolVersion;\n}>;\n\n/**\n * The context returned from a wallet after having authorized a given\n * account for use with a given application. You can cache this and\n * use it later to invoke privileged methods.\n */\nexport type AuthorizationResult = Readonly<{\n accounts: Account[];\n auth_token: AuthToken;\n wallet_uri_base: string;\n sign_in_result?: SignInResult;\n}>;\n\nexport type AuthToken = string;\n\nexport type Base64EncodedAddress = string;\n\ntype Base64EncodedSignature = string;\n\ntype Base64EncodedMessage = string;\n\ntype Base64EncodedSignedMessage = string;\n\ntype Base64EncodedSignedTransaction = string;\n\nexport type Base64EncodedTransaction = string;\n\n/**\n * @deprecated Replaced by the 'chain' parameter, which adds multi-chain capability as per MWA 2.0 spec.\n */\nexport type Cluster = 'devnet' | 'testnet' | 'mainnet-beta';\n\nexport type Chain = IdentifierString | Cluster;\n\nexport type Finality = 'confirmed' | 'finalized' | 'processed';\n\nexport type WalletAssociationConfig = Readonly<{\n baseUri?: string;\n}>;\n\nexport type RemoteWalletAssociationConfig = WalletAssociationConfig &\n Readonly<{\n remoteHostAuthority: string;\n }>;\n\nexport interface AuthorizeAPI {\n /**\n * @deprecated Replaced by updated authorize() method, which adds MWA 2.0 spec support.\n */\n authorize(params: { cluster: Cluster; identity: AppIdentity }): Promise<AuthorizationResult>;\n\n authorize(params: {\n identity: AppIdentity;\n chain?: Chain;\n features?: IdentifierArray;\n addresses?: string[];\n auth_token?: AuthToken;\n sign_in_payload?: SignInPayload;\n }): Promise<AuthorizationResult>;\n}\nexport interface CloneAuthorizationAPI {\n cloneAuthorization(params: { auth_token: AuthToken }): Promise<Readonly<{ auth_token: AuthToken }>>;\n}\nexport interface DeauthorizeAPI {\n deauthorize(params: { auth_token: AuthToken }): Promise<Readonly<Record<string, never>>>;\n}\n\nexport interface GetCapabilitiesAPI {\n getCapabilities(): Promise<\n Readonly<{\n max_transactions_per_request: number;\n max_messages_per_request: number;\n supported_transaction_versions: ReadonlyArray<TransactionVersion>;\n features: IdentifierArray;\n /**\n * @deprecated Replaced by features array.\n */\n supports_clone_authorization: boolean;\n /**\n * @deprecated Replaced by features array.\n */\n supports_sign_and_send_transactions: boolean;\n }>\n >;\n}\nexport interface ReauthorizeAPI {\n reauthorize(params: { auth_token: AuthToken; identity: AppIdentity }): Promise<AuthorizationResult>;\n}\nexport interface SignMessagesAPI {\n signMessages(params: {\n addresses: Base64EncodedAddress[];\n payloads: Base64EncodedMessage[];\n }): Promise<Readonly<{ signed_payloads: Base64EncodedSignedMessage[] }>>;\n}\nexport interface SignTransactionsAPI {\n signTransactions(params: {\n payloads: Base64EncodedTransaction[];\n }): Promise<Readonly<{ signed_payloads: Base64EncodedSignedTransaction[] }>>;\n}\nexport interface SignAndSendTransactionsAPI {\n signAndSendTransactions(params: {\n options?: Readonly<{\n min_context_slot?: number;\n commitment?: string;\n skip_preflight?: boolean;\n max_retries?: number;\n wait_for_commitment_to_send_next_transaction?: boolean;\n }>;\n payloads: Base64EncodedTransaction[];\n }): Promise<Readonly<{ signatures: Base64EncodedSignature[] }>>;\n}\n\nexport interface MobileWallet\n extends\n AuthorizeAPI,\n CloneAuthorizationAPI,\n DeauthorizeAPI,\n GetCapabilitiesAPI,\n ReauthorizeAPI,\n SignMessagesAPI,\n SignTransactionsAPI,\n SignAndSendTransactionsAPI {}\n\nexport interface TerminateSessionAPI {\n terminateSession(): void;\n}\n\nexport interface RemoteMobileWallet extends MobileWallet, TerminateSessionAPI {}\n\n// optional features\nexport const SolanaSignTransactions = 'solana:signTransactions';\nexport const SolanaCloneAuthorization = 'solana:cloneAuthorization';\nexport const SolanaSignInWithSolana = 'solana:signInWithSolana';\n\nexport type SignInPayload =\n | Readonly<{\n domain?: string;\n address?: string;\n statement?: string;\n uri?: string;\n version?: string;\n chainId?: string;\n nonce?: string;\n issuedAt?: string;\n expirationTime?: string;\n notBefore?: string;\n requestId?: string;\n resources?: readonly string[];\n }>\n | SolanaSignInInput;\n\nexport type SignInPayloadWithRequiredFields = Partial<SignInPayload> &\n Required<Pick<SignInPayload, 'domain' | 'address'>>;\n\nexport type SignInResult = Readonly<{\n address: Base64EncodedAddress;\n signed_message: Base64EncodedSignedMessage;\n signature: Base64EncodedSignature;\n signature_type?: string;\n}>;\n\nexport type Scenario = Readonly<{\n wallet: Promise<MobileWallet>;\n close: () => void;\n}>;\n\nexport type RemoteScenario = Scenario &\n Readonly<{\n associationUrl: URL;\n }>;\n","import type { IdentifierArray } from '@wallet-standard/core';\n\nimport { base64ToBase58 } from './base58Utils.js';\nimport { fromUint8Array, toUint8Array } from './base64Utils.js';\nimport { createSIWSMessageBase64Url } from './createSIWSMessage.js';\nimport {\n AuthorizationResult,\n Cluster,\n MobileWallet,\n ProtocolVersion,\n SignInPayload,\n SignInResult,\n SolanaCloneAuthorization,\n SolanaSignTransactions,\n} from './types.js';\n\n/**\n * Creates a {@link MobileWallet} proxy that handles backwards compatibility and API to RPC conversion.\n *\n * @param protocolVersion the protocol version in use for this session/request\n * @param protocolRequestHandler callback function that handles sending the RPC request to the wallet endpoint.\n * @returns a {@link MobileWallet} proxy\n */\nexport default function createMobileWalletProxy<\n TMethodName extends keyof MobileWallet,\n TReturn extends Awaited<ReturnType<MobileWallet[TMethodName]>>,\n>(\n protocolVersion: ProtocolVersion,\n protocolRequestHandler: (method: string, params: Parameters<MobileWallet[TMethodName]>[0]) => Promise<unknown>,\n): MobileWallet {\n return new Proxy<MobileWallet>({} as MobileWallet, {\n get<TMethodName extends keyof MobileWallet>(target: MobileWallet, p: TMethodName) {\n // Wrapping a Proxy in a promise results in the Proxy being asked for a 'then' property so must\n // return null if 'then' is called on this proxy to let the 'resolve()' call know this is not a promise.\n // see: https://stackoverflow.com/a/53890904\n // @ts-expect-error `then` is not part of the wallet API, but the proxy must explicitly return null.\n if (p === 'then') {\n return null;\n }\n if (target[p] == null) {\n target[p] = async function (inputParams: Parameters<MobileWallet[TMethodName]>[0]) {\n const { method, params } = handleMobileWalletRequest(p, inputParams, protocolVersion);\n const result = (await protocolRequestHandler(method, params)) as Awaited<\n ReturnType<MobileWallet[TMethodName]>\n >;\n // if the request tried to sign in but the wallet did not return a sign in result, fallback on message signing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (method === 'authorize' && (params as any).sign_in_payload && !(result as any).sign_in_result) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (result as any).sign_in_result = await signInFallback(\n (params as Parameters<MobileWallet['authorize']>[0]).sign_in_payload as SignInPayload,\n result as Awaited<ReturnType<MobileWallet['authorize']>>,\n protocolRequestHandler,\n );\n }\n return handleMobileWalletResponse(p, result, protocolVersion) as TReturn;\n } as MobileWallet[TMethodName];\n }\n return target[p];\n },\n defineProperty() {\n return false;\n },\n deleteProperty() {\n return false;\n },\n });\n}\n\n/**\n * Handles all {@link MobileWallet} API requests and determines the correct MWA RPC method and params to call.\n * This handles backwards compatibility, based on the provided @protocolVersion.\n *\n * @param methodName the name of {@link MobileWallet} method that was called\n * @param methodParams the parameters that were passed to the method\n * @param protocolVersion the protocol version in use for this session/request\n * @returns the RPC request method and params that should be sent to the wallet endpoint\n */\nfunction handleMobileWalletRequest<TMethodName extends keyof MobileWallet>(\n methodName: TMethodName,\n methodParams: Parameters<MobileWallet[TMethodName]>[0],\n protocolVersion: ProtocolVersion,\n) {\n let params = methodParams;\n let method: string = methodName\n .toString()\n .replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)\n .toLowerCase();\n switch (methodName) {\n case 'authorize': {\n const authorizeParams = params as Parameters<MobileWallet['authorize']>[0] & { cluster?: Cluster };\n let { chain } = authorizeParams;\n if (protocolVersion === 'legacy') {\n switch (chain) {\n case 'solana:testnet': {\n chain = 'testnet';\n break;\n }\n case 'solana:devnet': {\n chain = 'devnet';\n break;\n }\n case 'solana:mainnet': {\n chain = 'mainnet-beta';\n break;\n }\n default: {\n chain = authorizeParams.cluster;\n }\n }\n authorizeParams.cluster = chain as Cluster | undefined;\n params = authorizeParams;\n } else {\n switch (chain) {\n case 'testnet':\n case 'devnet': {\n chain = `solana:${chain}`;\n break;\n }\n case 'mainnet-beta': {\n chain = 'solana:mainnet';\n break;\n }\n }\n authorizeParams.chain = chain;\n params = authorizeParams;\n }\n }\n // fall through\n case 'reauthorize': {\n const { auth_token, identity } = params as Parameters<MobileWallet['authorize' | 'reauthorize']>[0];\n if (auth_token) {\n switch (protocolVersion) {\n case 'legacy': {\n method = 'reauthorize';\n params = { auth_token: auth_token, identity: identity };\n break;\n }\n default: {\n method = 'authorize';\n break;\n }\n }\n }\n break;\n }\n }\n return { method, params };\n}\n\n/**\n * Handles all {@link MobileWallet} API responses and modifies the response for backwards compatibility, if needed\n *\n * @param method the {@link MobileWallet} method that was called\n * @param response the original response that was returned by the method call\n * @param protocolVersion the protocol version in use for this session/request\n * @returns the possibly modified response\n */\nfunction handleMobileWalletResponse<TMethodName extends keyof MobileWallet>(\n method: TMethodName,\n response: Awaited<ReturnType<MobileWallet[TMethodName]>>,\n protocolVersion: ProtocolVersion,\n): Awaited<ReturnType<MobileWallet[TMethodName]>> {\n switch (method) {\n case 'getCapabilities': {\n const capabilities = response as Awaited<ReturnType<MobileWallet['getCapabilities']>>;\n switch (protocolVersion) {\n case 'legacy': {\n const features: `${string}:${string}`[] = [SolanaSignTransactions];\n if (capabilities.supports_clone_authorization === true) {\n features.push(SolanaCloneAuthorization);\n }\n return {\n ...capabilities,\n features: features as IdentifierArray,\n } as Awaited<ReturnType<MobileWallet[TMethodName]>>;\n }\n case 'v1': {\n return {\n ...capabilities,\n supports_sign_and_send_transactions: true,\n supports_clone_authorization: capabilities.features.includes(SolanaCloneAuthorization),\n } as Awaited<ReturnType<MobileWallet[TMethodName]>>;\n }\n }\n }\n }\n return response;\n}\n\nasync function signInFallback(\n signInPayload: SignInPayload,\n authorizationResult: Awaited<ReturnType<MobileWallet['authorize']>>,\n protocolRequestHandler: (method: string, params: Parameters<MobileWallet['signMessages']>[0]) => Promise<unknown>,\n) {\n const domain = signInPayload.domain ?? window.location.host;\n const address = (authorizationResult as AuthorizationResult).accounts[0].address;\n const siwsMessage = createSIWSMessageBase64Url({ ...signInPayload, domain, address: base64ToBase58(address) });\n const signMessageResult = await (protocolRequestHandler('sign_messages', {\n addresses: [address],\n payloads: [siwsMessage],\n }) as Promise<Awaited<ReturnType<MobileWallet['signMessages']>>>);\n\n const signedPayload = toUint8Array(signMessageResult.signed_payloads[0]);\n const signedMessage = fromUint8Array(signedPayload.slice(0, signedPayload.length - 64));\n const signature = fromUint8Array(signedPayload.slice(signedPayload.length - 64));\n const signInResult: SignInResult = {\n address: address,\n // Workaround: some wallets have been observed to only reply with the message signature.\n // This is non-compliant with the spec, but in the interest of maximizing compatibility,\n // detect this case and reuse the original message.\n signed_message: signedMessage.length == 0 ? siwsMessage : signedMessage,\n signature,\n };\n return signInResult;\n}\n","import { AppRegistry, Platform } from 'react-native';\n\nimport NativeSolanaMobileWalletAdapter from '../../codegenSpec/NativeSolanaMobileWalletAdapter.js';\nimport createMobileWalletProxy from '../../createMobileWalletProxy.js';\nimport { SolanaMobileWalletAdapterError, SolanaMobileWalletAdapterProtocolError } from '../../errors.js';\nimport { MobileWallet, SessionProperties, WalletAssociationConfig } from '../../types.js';\n\nAppRegistry.registerHeadlessTask('SolanaMobileWalletAdapterSessionBackgroundTask', () => {\n return async () => {\n // This is a no-op task that is used to keep the app alive while the session is active.\n // The actual session management is handled in the native module.\n // This is necessary for the React Native Android implementation to work correctly.\n // The task is started before startActivityResult and stopped when the activity result callback is triggered\n };\n});\n\ntype ReactNativeError = Error & { code?: string; userInfo?: Record<string, unknown> };\n\nconst LINKING_ERROR =\n `The package 'solana-mobile-wallet-adapter-protocol' doesn't seem to be linked. Make sure: \\n\\n` +\n '- You rebuilt the app after installing the package\\n' +\n '- If you are using Lerna workspaces\\n' +\n ' - You have added `@solana-mobile/mobile-wallet-adapter-protocol` as an explicit dependency, and\\n' +\n ' - You have added `@solana-mobile/mobile-wallet-adapter-protocol` to the `nohoist` section of your package.json\\n' +\n '- You are not using Expo managed workflow\\n';\n\nconst SolanaMobileWalletAdapter =\n Platform.OS === 'android' && NativeSolanaMobileWalletAdapter\n ? NativeSolanaMobileWalletAdapter\n : (new Proxy(\n {},\n {\n get() {\n throw new Error(\n Platform.OS !== 'android'\n ? 'The package `solana-mobile-wallet-adapter-protocol` is only compatible with React Native Android'\n : LINKING_ERROR,\n );\n },\n },\n ) as typeof NativeSolanaMobileWalletAdapter);\n\nfunction getErrorMessage(e: ReactNativeError): string {\n switch (e.code) {\n case 'ERROR_WALLET_NOT_FOUND':\n return 'Found no installed wallet that supports the mobile wallet protocol.';\n default:\n return e.message;\n }\n}\n\nfunction handleError(e: unknown): never {\n if (e instanceof Error) {\n const reactNativeError: ReactNativeError = e;\n switch (reactNativeError.code) {\n case undefined:\n throw e;\n case 'JSON_RPC_ERROR': {\n const details = reactNativeError.userInfo as Readonly<{ jsonRpcErrorCode: number }>;\n throw new SolanaMobileWalletAdapterProtocolError(\n 0 /* jsonRpcMessageId */,\n details.jsonRpcErrorCode,\n e.message,\n );\n }\n default:\n // The native module forwards string error codes that are validated on the native side.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n throw new SolanaMobileWalletAdapterError<any>(\n reactNativeError.code,\n getErrorMessage(reactNativeError),\n reactNativeError.userInfo,\n );\n }\n }\n throw e;\n}\n\nexport async function transact<TReturn>(\n callback: (wallet: MobileWallet) => TReturn,\n config?: WalletAssociationConfig,\n): Promise<TReturn> {\n let didSuccessfullyConnect = false;\n try {\n const sessionProperties: SessionProperties = await SolanaMobileWalletAdapter.startSession(config);\n didSuccessfullyConnect = true;\n const wallet = createMobileWalletProxy(sessionProperties.protocol_version, async (method, params) => {\n try {\n return SolanaMobileWalletAdapter.invoke(method, params);\n } catch (e) {\n return handleError(e);\n }\n });\n return await callback(wallet);\n } catch (e) {\n return handleError(e);\n } finally {\n if (didSuccessfullyConnect) {\n await SolanaMobileWalletAdapter.endSession();\n }\n }\n}\n"],"mappings":"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"}
|
package/lib/esm/index.browser.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createSignInMessageText } from "@solana/wallet-standard-util";
|
|
2
1
|
import { getBase58Decoder } from "@solana/codecs-strings";
|
|
2
|
+
import { createSignInMessageText } from "@solana/wallet-standard-util";
|
|
3
3
|
//#region src/errors.ts
|
|
4
4
|
const SolanaMobileWalletAdapterErrorCode = {
|
|
5
5
|
ERROR_ASSOCIATION_PORT_OUT_OF_RANGE: "ERROR_ASSOCIATION_PORT_OUT_OF_RANGE",
|
|
@@ -73,6 +73,14 @@ async function createHelloReq(ecdhPublicKey, associationKeypairPrivateKey) {
|
|
|
73
73
|
return response;
|
|
74
74
|
}
|
|
75
75
|
//#endregion
|
|
76
|
+
//#region src/base58Utils.ts
|
|
77
|
+
function fromUint8Array(byteArray) {
|
|
78
|
+
return getBase58Decoder().decode(byteArray);
|
|
79
|
+
}
|
|
80
|
+
function base64ToBase58(base64EncodedString) {
|
|
81
|
+
return fromUint8Array(toUint8Array(base64EncodedString));
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
76
84
|
//#region src/createSIWSMessage.ts
|
|
77
85
|
function createSIWSMessage(payload) {
|
|
78
86
|
return createSignInMessageText(payload);
|
|
@@ -86,14 +94,6 @@ const SolanaSignTransactions = "solana:signTransactions";
|
|
|
86
94
|
const SolanaCloneAuthorization = "solana:cloneAuthorization";
|
|
87
95
|
const SolanaSignInWithSolana = "solana:signInWithSolana";
|
|
88
96
|
//#endregion
|
|
89
|
-
//#region src/base58Utils.ts
|
|
90
|
-
function fromUint8Array(byteArray) {
|
|
91
|
-
return getBase58Decoder().decode(byteArray);
|
|
92
|
-
}
|
|
93
|
-
function base64ToBase58(base64EncodedString) {
|
|
94
|
-
return fromUint8Array(toUint8Array(base64EncodedString));
|
|
95
|
-
}
|
|
96
|
-
//#endregion
|
|
97
97
|
//#region src/createMobileWalletProxy.ts
|
|
98
98
|
/**
|
|
99
99
|
* Creates a {@link MobileWallet} proxy that handles backwards compatibility and API to RPC conversion.
|
|
@@ -109,7 +109,7 @@ function createMobileWalletProxy(protocolVersion, protocolRequestHandler) {
|
|
|
109
109
|
if (target[p] == null) target[p] = async function(inputParams) {
|
|
110
110
|
const { method, params } = handleMobileWalletRequest(p, inputParams, protocolVersion);
|
|
111
111
|
const result = await protocolRequestHandler(method, params);
|
|
112
|
-
if (method === "authorize" && params.sign_in_payload && !result.sign_in_result) result
|
|
112
|
+
if (method === "authorize" && params.sign_in_payload && !result.sign_in_result) result.sign_in_result = await signInFallback(params.sign_in_payload, result, protocolRequestHandler);
|
|
113
113
|
return handleMobileWalletResponse(p, result, protocolVersion);
|
|
114
114
|
};
|
|
115
115
|
return target[p];
|
|
@@ -136,7 +136,8 @@ function handleMobileWalletRequest(methodName, methodParams, protocolVersion) {
|
|
|
136
136
|
let method = methodName.toString().replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`).toLowerCase();
|
|
137
137
|
switch (methodName) {
|
|
138
138
|
case "authorize": {
|
|
139
|
-
|
|
139
|
+
const authorizeParams = params;
|
|
140
|
+
let { chain } = authorizeParams;
|
|
140
141
|
if (protocolVersion === "legacy") {
|
|
141
142
|
switch (chain) {
|
|
142
143
|
case "solana:testnet":
|
|
@@ -148,9 +149,10 @@ function handleMobileWalletRequest(methodName, methodParams, protocolVersion) {
|
|
|
148
149
|
case "solana:mainnet":
|
|
149
150
|
chain = "mainnet-beta";
|
|
150
151
|
break;
|
|
151
|
-
default: chain =
|
|
152
|
+
default: chain = authorizeParams.cluster;
|
|
152
153
|
}
|
|
153
|
-
|
|
154
|
+
authorizeParams.cluster = chain;
|
|
155
|
+
params = authorizeParams;
|
|
154
156
|
} else {
|
|
155
157
|
switch (chain) {
|
|
156
158
|
case "testnet":
|
|
@@ -161,7 +163,8 @@ function handleMobileWalletRequest(methodName, methodParams, protocolVersion) {
|
|
|
161
163
|
chain = "solana:mainnet";
|
|
162
164
|
break;
|
|
163
165
|
}
|
|
164
|
-
|
|
166
|
+
authorizeParams.chain = chain;
|
|
167
|
+
params = authorizeParams;
|
|
165
168
|
}
|
|
166
169
|
}
|
|
167
170
|
case "reauthorize": {
|
|
@@ -468,7 +471,7 @@ async function launchAssociation(associationUrl) {
|
|
|
468
471
|
}
|
|
469
472
|
default: assertUnreachable(browser);
|
|
470
473
|
}
|
|
471
|
-
} catch
|
|
474
|
+
} catch {
|
|
472
475
|
throw new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_WALLET_NOT_FOUND, "Found no installed wallet that supports the mobile wallet protocol.");
|
|
473
476
|
}
|
|
474
477
|
}
|
|
@@ -510,7 +513,10 @@ function getSequenceNumberFromByteArray(byteArray) {
|
|
|
510
513
|
return new DataView(byteArray).getUint32(0, false);
|
|
511
514
|
}
|
|
512
515
|
function decodeVarLong(byteArray) {
|
|
513
|
-
|
|
516
|
+
const bytes = new Uint8Array(byteArray);
|
|
517
|
+
const l = byteArray.byteLength;
|
|
518
|
+
const limit = 10;
|
|
519
|
+
let value = 0, offset = 0, b;
|
|
514
520
|
do {
|
|
515
521
|
if (offset >= l || offset > limit) throw new RangeError("Failed to decode varint");
|
|
516
522
|
b = bytes[offset++];
|
|
@@ -522,7 +528,7 @@ function decodeVarLong(byteArray) {
|
|
|
522
528
|
};
|
|
523
529
|
}
|
|
524
530
|
function getReflectorIdFromByteArray(byteArray) {
|
|
525
|
-
|
|
531
|
+
const { value: length, offset } = decodeVarLong(byteArray);
|
|
526
532
|
return new Uint8Array(byteArray.slice(offset, offset + length));
|
|
527
533
|
}
|
|
528
534
|
async function transact(callback, config) {
|
|
@@ -589,7 +595,7 @@ async function startScenario(config) {
|
|
|
589
595
|
const handleMessage = async (evt) => {
|
|
590
596
|
const responseBuffer = await evt.data.arrayBuffer();
|
|
591
597
|
switch (state.__type) {
|
|
592
|
-
case "connecting":
|
|
598
|
+
case "connecting": {
|
|
593
599
|
if (responseBuffer.byteLength !== 0) throw new Error("Encountered unexpected message while connecting");
|
|
594
600
|
const ecdhKeypair = await generateECDHKeypair();
|
|
595
601
|
socket.send(await createHelloReq(ecdhKeypair.publicKey, associationKeypair.privateKey));
|
|
@@ -599,6 +605,7 @@ async function startScenario(config) {
|
|
|
599
605
|
ecdhPrivateKey: ecdhKeypair.privateKey
|
|
600
606
|
};
|
|
601
607
|
break;
|
|
608
|
+
}
|
|
602
609
|
case "connected":
|
|
603
610
|
try {
|
|
604
611
|
const sequenceNumber = getSequenceNumberFromByteArray(responseBuffer.slice(0, 4));
|
|
@@ -726,7 +733,7 @@ async function startRemoteScenario(config) {
|
|
|
726
733
|
let state = { __type: "disconnected" };
|
|
727
734
|
let socket;
|
|
728
735
|
let disposeSocket;
|
|
729
|
-
|
|
736
|
+
const decodeBytes = async (evt) => {
|
|
730
737
|
if (encoding == "base64") return toUint8Array(await evt.data).buffer;
|
|
731
738
|
else return await evt.data.arrayBuffer();
|
|
732
739
|
};
|
|
@@ -806,7 +813,7 @@ async function startRemoteScenario(config) {
|
|
|
806
813
|
const handleMessage = async (evt) => {
|
|
807
814
|
const responseBuffer = await decodeBytes(evt);
|
|
808
815
|
switch (state.__type) {
|
|
809
|
-
case "reflector_id_received":
|
|
816
|
+
case "reflector_id_received": {
|
|
810
817
|
if (responseBuffer.byteLength !== 0) throw new Error("Encountered unexpected message while awaiting reflection");
|
|
811
818
|
const ecdhKeypair = await generateECDHKeypair();
|
|
812
819
|
const binaryMsg = await createHelloReq(ecdhKeypair.publicKey, associationKeypair.privateKey);
|
|
@@ -818,6 +825,7 @@ async function startRemoteScenario(config) {
|
|
|
818
825
|
ecdhPrivateKey: ecdhKeypair.privateKey
|
|
819
826
|
};
|
|
820
827
|
break;
|
|
828
|
+
}
|
|
821
829
|
case "connected":
|
|
822
830
|
try {
|
|
823
831
|
const sequenceNumber = getSequenceNumberFromByteArray(responseBuffer.slice(0, 4));
|