@solana-mobile/mobile-wallet-adapter-protocol 2.2.8 → 2.3.0

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.
@@ -1,7 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_base58Utils = require("./chunks/base58Utils.js");
3
+ let _noble_curves_secp256k1_js = require("@noble/curves/secp256k1.js");
4
+ let _noble_hashes_sha2_js = require("@noble/hashes/sha2.js");
5
+ let _noble_hashes_utils_js = require("@noble/hashes/utils.js");
2
6
  let react_native = require("react-native");
3
- let _solana_codecs_strings = require("@solana/codecs-strings");
4
- let js_base64 = require("js-base64");
5
7
  let _solana_wallet_standard_util = require("@solana/wallet-standard-util");
6
8
  //#region src/errors.ts
7
9
  const SolanaMobileWalletAdapterErrorCode = {
@@ -15,7 +17,8 @@ const SolanaMobileWalletAdapterErrorCode = {
15
17
  ERROR_INVALID_PROTOCOL_VERSION: "ERROR_INVALID_PROTOCOL_VERSION",
16
18
  ERROR_BROWSER_NOT_SUPPORTED: "ERROR_BROWSER_NOT_SUPPORTED",
17
19
  ERROR_LOOPBACK_ACCESS_BLOCKED: "ERROR_LOOPBACK_ACCESS_BLOCKED",
18
- ERROR_ASSOCIATION_CANCELLED: "ERROR_ASSOCIATION_CANCELLED"
20
+ ERROR_ASSOCIATION_CANCELLED: "ERROR_ASSOCIATION_CANCELLED",
21
+ ERROR_ILLEGAL_TRANSPORT_STATE: "ERROR_ILLEGAL_TRANSPORT_STATE"
19
22
  };
20
23
  var SolanaMobileWalletAdapterError = class extends Error {
21
24
  data;
@@ -50,23 +53,66 @@ var SolanaMobileWalletAdapterProtocolError = class extends Error {
50
53
  }
51
54
  };
52
55
  //#endregion
53
- //#region src/codegenSpec/NativeSolanaMobileWalletAdapter.ts
54
- var NativeSolanaMobileWalletAdapter_default = react_native.TurboModuleRegistry.getEnforcing("SolanaMobileWalletAdapter");
55
- //#endregion
56
- //#region src/base58Utils.ts
57
- function fromUint8Array(byteArray) {
58
- return (0, _solana_codecs_strings.getBase58Decoder)().decode(byteArray);
56
+ //#region src/nostr.ts
57
+ const NOSTR_EVENT_KIND_MWA = 20012;
58
+ function generateNostrKeypair() {
59
+ const privateKey = _noble_curves_secp256k1_js.schnorr.utils.randomSecretKey();
60
+ return {
61
+ privateKey,
62
+ publicKey: (0, _noble_hashes_utils_js.bytesToHex)(_noble_curves_secp256k1_js.schnorr.getPublicKey(privateKey))
63
+ };
59
64
  }
60
- function base64ToBase58(base64EncodedString) {
61
- return fromUint8Array((0, js_base64.toUint8Array)(base64EncodedString));
65
+ async function deriveSessionIdentifier(associationPublicKey) {
66
+ const rawKey = await crypto.subtle.exportKey("raw", associationPublicKey);
67
+ const hash = (0, _noble_hashes_sha2_js.sha256)(new Uint8Array(rawKey));
68
+ return (0, _noble_hashes_utils_js.bytesToHex)(hash);
69
+ }
70
+ function serializeEvent(pubkey, createdAt, kind, tags, content) {
71
+ return JSON.stringify([
72
+ 0,
73
+ pubkey,
74
+ createdAt,
75
+ kind,
76
+ tags,
77
+ content
78
+ ]);
79
+ }
80
+ function computeEventId(pubkey, createdAt, kind, tags, content) {
81
+ const serialized = serializeEvent(pubkey, createdAt, kind, tags, content);
82
+ return (0, _noble_hashes_utils_js.bytesToHex)((0, _noble_hashes_sha2_js.sha256)(new TextEncoder().encode(serialized)));
83
+ }
84
+ function createNostrEvent(kind, content, tags, privateKey) {
85
+ const pubkey = (0, _noble_hashes_utils_js.bytesToHex)(_noble_curves_secp256k1_js.schnorr.getPublicKey(privateKey));
86
+ const createdAt = Math.floor(Date.now() / 1e3);
87
+ const id = computeEventId(pubkey, createdAt, kind, tags, content);
88
+ return {
89
+ id,
90
+ pubkey,
91
+ created_at: createdAt,
92
+ kind,
93
+ tags,
94
+ content,
95
+ sig: (0, _noble_hashes_utils_js.bytesToHex)(_noble_curves_secp256k1_js.schnorr.sign((0, _noble_hashes_utils_js.hexToBytes)(id), privateKey))
96
+ };
97
+ }
98
+ function verifyNostrEvent(event) {
99
+ if (computeEventId(event.pubkey, event.created_at, event.kind, event.tags, event.content) !== event.id) return false;
100
+ try {
101
+ return _noble_curves_secp256k1_js.schnorr.verify((0, _noble_hashes_utils_js.hexToBytes)(event.sig), (0, _noble_hashes_utils_js.hexToBytes)(event.id), (0, _noble_hashes_utils_js.hexToBytes)(event.pubkey));
102
+ } catch {
103
+ return false;
104
+ }
62
105
  }
63
106
  //#endregion
107
+ //#region src/codegenSpec/NativeSolanaMobileWalletAdapter.ts
108
+ var NativeSolanaMobileWalletAdapter_default = react_native.TurboModuleRegistry.getEnforcing("SolanaMobileWalletAdapter");
109
+ //#endregion
64
110
  //#region src/createSIWSMessage.ts
65
111
  function createSIWSMessage(payload) {
66
112
  return (0, _solana_wallet_standard_util.createSignInMessageText)(payload);
67
113
  }
68
114
  function createSIWSMessageBase64Url(payload) {
69
- return (0, js_base64.encode)(createSIWSMessage(payload)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
115
+ return require_base58Utils.encode(createSIWSMessage(payload)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
70
116
  }
71
117
  //#endregion
72
118
  //#region src/types.ts
@@ -139,9 +185,7 @@ function handleMobileWalletRequest(methodName, methodParams, protocolVersion) {
139
185
  case "devnet":
140
186
  chain = `solana:${chain}`;
141
187
  break;
142
- case "mainnet-beta":
143
- chain = "solana:mainnet";
144
- break;
188
+ case "mainnet-beta": chain = "solana:mainnet";
145
189
  }
146
190
  authorizeParams.chain = chain;
147
191
  params = authorizeParams;
@@ -157,9 +201,7 @@ function handleMobileWalletRequest(methodName, methodParams, protocolVersion) {
157
201
  identity
158
202
  };
159
203
  break;
160
- default:
161
- method = "authorize";
162
- break;
204
+ default: method = "authorize";
163
205
  }
164
206
  break;
165
207
  }
@@ -206,14 +248,15 @@ async function signInFallback(signInPayload, authorizationResult, protocolReques
206
248
  const siwsMessage = createSIWSMessageBase64Url({
207
249
  ...signInPayload,
208
250
  domain,
209
- address: base64ToBase58(address)
251
+ address: require_base58Utils.base64ToBase58(address)
210
252
  });
211
- const signedPayload = (0, js_base64.toUint8Array)((await protocolRequestHandler("sign_messages", {
253
+ const signMessageResult = await protocolRequestHandler("sign_messages", {
212
254
  addresses: [address],
213
255
  payloads: [siwsMessage]
214
- })).signed_payloads[0]);
215
- const signedMessage = (0, js_base64.fromUint8Array)(signedPayload.slice(0, signedPayload.length - 64));
216
- const signature = (0, js_base64.fromUint8Array)(signedPayload.slice(signedPayload.length - 64));
256
+ });
257
+ const signedPayload = require_base58Utils.toUint8Array$1(signMessageResult.signed_payloads[0]);
258
+ const signedMessage = require_base58Utils.fromUint8Array$1(signedPayload.slice(0, signedPayload.length - 64));
259
+ const signature = require_base58Utils.fromUint8Array$1(signedPayload.slice(signedPayload.length - 64));
217
260
  return {
218
261
  address,
219
262
  signed_message: signedMessage.length == 0 ? siwsMessage : signedMessage,
@@ -268,6 +311,7 @@ async function transact(callback, config) {
268
311
  }
269
312
  }
270
313
  //#endregion
314
+ exports.NOSTR_EVENT_KIND_MWA = NOSTR_EVENT_KIND_MWA;
271
315
  exports.SolanaCloneAuthorization = SolanaCloneAuthorization;
272
316
  exports.SolanaMobileWalletAdapterError = SolanaMobileWalletAdapterError;
273
317
  exports.SolanaMobileWalletAdapterErrorCode = SolanaMobileWalletAdapterErrorCode;
@@ -275,6 +319,10 @@ exports.SolanaMobileWalletAdapterProtocolError = SolanaMobileWalletAdapterProtoc
275
319
  exports.SolanaMobileWalletAdapterProtocolErrorCode = SolanaMobileWalletAdapterProtocolErrorCode;
276
320
  exports.SolanaSignInWithSolana = SolanaSignInWithSolana;
277
321
  exports.SolanaSignTransactions = SolanaSignTransactions;
322
+ exports.createNostrEvent = createNostrEvent;
323
+ exports.deriveSessionIdentifier = deriveSessionIdentifier;
324
+ exports.generateNostrKeypair = generateNostrKeypair;
278
325
  exports.transact = transact;
326
+ exports.verifyNostrEvent = verifyNostrEvent;
279
327
 
280
328
  //# sourceMappingURL=index.native.js.map
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"index.native.js","names":["schnorr","bytesToHex","sha256","hexToBytes","TurboModuleRegistry","createSignInMessageText","encode","base64ToBase58","toUint8Array","fromUint8Array","AppRegistry","Platform","NativeSolanaMobileWalletAdapter"],"sources":["../../src/errors.ts","../../src/nostr.ts","../../src/codegenSpec/NativeSolanaMobileWalletAdapter.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 ERROR_ILLEGAL_TRANSPORT_STATE: 'ERROR_ILLEGAL_TRANSPORT_STATE',\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 [SolanaMobileWalletAdapterErrorCode.ERROR_ILLEGAL_TRANSPORT_STATE]: undefined;\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 { schnorr } from '@noble/curves/secp256k1.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js';\n\nexport const NOSTR_EVENT_KIND_MWA = 20012;\n\nexport interface NostrEvent {\n id: string;\n pubkey: string;\n created_at: number;\n kind: number;\n tags: string[][];\n content: string;\n sig: string;\n}\n\nexport function generateNostrKeypair(): { privateKey: Uint8Array; publicKey: string } {\n const privateKey = schnorr.utils.randomSecretKey();\n const publicKey = bytesToHex(schnorr.getPublicKey(privateKey));\n return { privateKey, publicKey };\n}\n\nexport async function deriveSessionIdentifier(associationPublicKey: CryptoKey): Promise<string> {\n const rawKey = await crypto.subtle.exportKey('raw', associationPublicKey);\n const hash = sha256(new Uint8Array(rawKey));\n return bytesToHex(hash);\n}\n\nfunction serializeEvent(pubkey: string, createdAt: number, kind: number, tags: string[][], content: string): string {\n return JSON.stringify([0, pubkey, createdAt, kind, tags, content]);\n}\n\nfunction computeEventId(pubkey: string, createdAt: number, kind: number, tags: string[][], content: string): string {\n const serialized = serializeEvent(pubkey, createdAt, kind, tags, content);\n return bytesToHex(sha256(new TextEncoder().encode(serialized)));\n}\n\nexport function createNostrEvent(kind: number, content: string, tags: string[][], privateKey: Uint8Array): NostrEvent {\n const pubkey = bytesToHex(schnorr.getPublicKey(privateKey));\n const createdAt = Math.floor(Date.now() / 1000);\n const id = computeEventId(pubkey, createdAt, kind, tags, content);\n const sig = bytesToHex(schnorr.sign(hexToBytes(id), privateKey));\n return { id, pubkey, created_at: createdAt, kind, tags, content, sig };\n}\n\nexport function verifyNostrEvent(event: NostrEvent): boolean {\n const expectedId = computeEventId(event.pubkey, event.created_at, event.kind, event.tags, event.content);\n if (expectedId !== event.id) {\n return false;\n }\n try {\n return schnorr.verify(hexToBytes(event.sig), hexToBytes(event.id), hexToBytes(event.pubkey));\n } catch {\n return false;\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 { 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 type NostrWalletAssociationConfig = WalletAssociationConfig &\n Readonly<{\n connectionType: 'local' | 'remote';\n relayDomain: 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 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 * @deprecated Use {@link createMobileWalletProxy} instead.\n */\nexport default createMobileWalletProxy;\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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"}
@@ -0,0 +1,62 @@
1
+ import { getBase58Decoder, getBase58Encoder, getBase64Decoder, getBase64Encoder, getUtf8Decoder, getUtf8Encoder } from "@solana/kit";
2
+ //#region src/base64Utils.ts
3
+ function encode(input) {
4
+ return getBase64Decoder().decode(getUtf8Encoder().encode(input));
5
+ }
6
+ function fromUint8Array$1(byteArray, urlsafe) {
7
+ const base64 = getBase64Decoder().decode(byteArray);
8
+ if (urlsafe) return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
9
+ else return base64;
10
+ }
11
+ function toUint8Array$1(base64EncodedByteArray) {
12
+ return getBase64Encoder().encode(base64EncodedByteArray);
13
+ }
14
+ //#endregion
15
+ //#region src/base58Utils.ts
16
+ function fromUint8Array(byteArray) {
17
+ return getBase58Decoder().decode(byteArray);
18
+ }
19
+ function toUint8Array(base58EncodedByteArray) {
20
+ return getBase58Encoder().encode(base58EncodedByteArray);
21
+ }
22
+ function base64ToBase58$1(base64EncodedString) {
23
+ return fromUint8Array(toUint8Array$1(base64EncodedString));
24
+ }
25
+ //#endregion
26
+ //#region src/arrayBufferToBase64String.ts
27
+ function arrayBufferToBase64String(buffer) {
28
+ return fromUint8Array$1(new Uint8Array(buffer));
29
+ }
30
+ //#endregion
31
+ //#region src/encoding.ts
32
+ function base58FromUint8Array(byteArray) {
33
+ return fromUint8Array(byteArray);
34
+ }
35
+ function base58ToUint8Array(base58EncodedByteArray) {
36
+ return toUint8Array(base58EncodedByteArray);
37
+ }
38
+ function base64EncodeString(input) {
39
+ return encode(input);
40
+ }
41
+ function base64FromUint8Array(byteArray) {
42
+ return fromUint8Array$1(byteArray);
43
+ }
44
+ function base64ToBase58(base64EncodedString) {
45
+ return base64ToBase58$1(base64EncodedString);
46
+ }
47
+ function base64ToUint8Array(base64EncodedByteArray) {
48
+ return toUint8Array$1(base64EncodedByteArray);
49
+ }
50
+ function base64UrlFromUint8Array(byteArray) {
51
+ return fromUint8Array$1(byteArray, true);
52
+ }
53
+ function utf8FromUint8Array(byteArray) {
54
+ return getUtf8Decoder().decode(byteArray);
55
+ }
56
+ function utf8ToUint8Array(input) {
57
+ return getUtf8Encoder().encode(input);
58
+ }
59
+ //#endregion
60
+ export { base64ToBase58 as a, utf8FromUint8Array as c, base64ToBase58$1 as d, encode as f, base64FromUint8Array as i, utf8ToUint8Array as l, toUint8Array$1 as m, base58ToUint8Array as n, base64ToUint8Array as o, fromUint8Array$1 as p, base64EncodeString as r, base64UrlFromUint8Array as s, base58FromUint8Array as t, arrayBufferToBase64String as u };
61
+
62
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","names":["fromUint8Array","toUint8Array","base64ToBase58","base64ToUint8Array","fromUint8Array","internalBase58FromUint8Array","internalBase58ToUint8Array","internalBase64EncodeString","internalBase64FromUint8Array","internalBase64ToBase58","internalBase64ToUint8Array"],"sources":["../../../src/base64Utils.ts","../../../src/base58Utils.ts","../../../src/arrayBufferToBase64String.ts","../../../src/encoding.ts"],"sourcesContent":["import { getBase64Decoder, getBase64Encoder, getUtf8Encoder } from '@solana/kit';\n\nexport function encode(input: string): string {\n return getBase64Decoder().decode(getUtf8Encoder().encode(input));\n}\n\nexport function fromUint8Array(byteArray: Uint8Array, urlsafe?: boolean): string {\n const base64 = getBase64Decoder().decode(byteArray);\n if (urlsafe) {\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n } else return base64;\n}\n\nexport function toUint8Array(base64EncodedByteArray: string): Uint8Array {\n return getBase64Encoder().encode(base64EncodedByteArray) as Uint8Array;\n}\n","import { getBase58Decoder, getBase58Encoder } from '@solana/kit';\n\nimport { toUint8Array as base64ToUint8Array } from './base64Utils.js';\n\nexport function fromUint8Array(byteArray: Uint8Array): string {\n return getBase58Decoder().decode(byteArray);\n}\n\nexport function toUint8Array(base58EncodedByteArray: string): Uint8Array {\n return getBase58Encoder().encode(base58EncodedByteArray) as Uint8Array;\n}\n\nexport function base64ToBase58(base64EncodedString: string): string {\n return fromUint8Array(base64ToUint8Array(base64EncodedString));\n}\n","import { fromUint8Array } from './base64Utils.js';\n\nexport function arrayBufferToBase64String(buffer: ArrayBuffer): string {\n return fromUint8Array(new Uint8Array(buffer));\n}\n\n/**\n * @deprecated Use {@link arrayBufferToBase64String} instead.\n */\nexport default arrayBufferToBase64String;\n","import { getUtf8Decoder, getUtf8Encoder } from '@solana/kit';\n\nimport {\n base64ToBase58 as internalBase64ToBase58,\n fromUint8Array as internalBase58FromUint8Array,\n toUint8Array as internalBase58ToUint8Array,\n} from './base58Utils.js';\nimport {\n encode as internalBase64EncodeString,\n fromUint8Array as internalBase64FromUint8Array,\n toUint8Array as internalBase64ToUint8Array,\n} from './base64Utils.js';\n\nexport { arrayBufferToBase64String } from './arrayBufferToBase64String.js';\n\nexport function base58FromUint8Array(byteArray: Uint8Array): string {\n return internalBase58FromUint8Array(byteArray);\n}\n\nexport function base58ToUint8Array(base58EncodedByteArray: string): Uint8Array {\n return internalBase58ToUint8Array(base58EncodedByteArray);\n}\n\nexport function base64EncodeString(input: string): string {\n return internalBase64EncodeString(input);\n}\n\nexport function base64FromUint8Array(byteArray: Uint8Array): string {\n return internalBase64FromUint8Array(byteArray);\n}\n\nexport function base64ToBase58(base64EncodedString: string): string {\n return internalBase64ToBase58(base64EncodedString);\n}\n\nexport function base64ToUint8Array(base64EncodedByteArray: string): Uint8Array {\n return internalBase64ToUint8Array(base64EncodedByteArray);\n}\n\nexport function base64UrlFromUint8Array(byteArray: Uint8Array): string {\n return internalBase64FromUint8Array(byteArray, true);\n}\n\nexport function utf8FromUint8Array(byteArray: Uint8Array): string {\n return getUtf8Decoder().decode(byteArray);\n}\n\nexport function utf8ToUint8Array(input: string): Uint8Array {\n return getUtf8Encoder().encode(input) as Uint8Array;\n}\n"],"mappings":";;AAEA,SAAgB,OAAO,OAAuB;CAC1C,OAAO,iBAAiB,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,OAAO,KAAK,CAAC;AACnE;AAEA,SAAgBA,iBAAe,WAAuB,SAA2B;CAC7E,MAAM,SAAS,iBAAiB,CAAC,CAAC,OAAO,SAAS;CAClD,IAAI,SACA,OAAO,OAAO,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,OAAO,EAAE;MACpE,OAAO;AAClB;AAEA,SAAgBC,eAAa,wBAA4C;CACrE,OAAO,iBAAiB,CAAC,CAAC,OAAO,sBAAsB;AAC3D;;;ACXA,SAAgB,eAAe,WAA+B;CAC1D,OAAO,iBAAiB,CAAC,CAAC,OAAO,SAAS;AAC9C;AAEA,SAAgB,aAAa,wBAA4C;CACrE,OAAO,iBAAiB,CAAC,CAAC,OAAO,sBAAsB;AAC3D;AAEA,SAAgBC,iBAAe,qBAAqC;CAChE,OAAO,eAAeC,eAAmB,mBAAmB,CAAC;AACjE;;;ACZA,SAAgB,0BAA0B,QAA6B;CACnE,OAAOC,iBAAe,IAAI,WAAW,MAAM,CAAC;AAChD;;;ACWA,SAAgB,qBAAqB,WAA+B;CAChE,OAAOC,eAA6B,SAAS;AACjD;AAEA,SAAgB,mBAAmB,wBAA4C;CAC3E,OAAOC,aAA2B,sBAAsB;AAC5D;AAEA,SAAgB,mBAAmB,OAAuB;CACtD,OAAOC,OAA2B,KAAK;AAC3C;AAEA,SAAgB,qBAAqB,WAA+B;CAChE,OAAOC,iBAA6B,SAAS;AACjD;AAEA,SAAgB,eAAe,qBAAqC;CAChE,OAAOC,iBAAuB,mBAAmB;AACrD;AAEA,SAAgB,mBAAmB,wBAA4C;CAC3E,OAAOC,eAA2B,sBAAsB;AAC5D;AAEA,SAAgB,wBAAwB,WAA+B;CACnE,OAAOF,iBAA6B,WAAW,IAAI;AACvD;AAEA,SAAgB,mBAAmB,WAA+B;CAC9D,OAAO,eAAe,CAAC,CAAC,OAAO,SAAS;AAC5C;AAEA,SAAgB,iBAAiB,OAA2B;CACxD,OAAO,eAAe,CAAC,CAAC,OAAO,KAAK;AACxC"}
@@ -0,0 +1,2 @@
1
+ import { a as base64ToBase58, c as utf8FromUint8Array, i as base64FromUint8Array, l as utf8ToUint8Array, n as base58ToUint8Array, o as base64ToUint8Array, r as base64EncodeString, s as base64UrlFromUint8Array, t as base58FromUint8Array, u as arrayBufferToBase64String } from "./chunks/encoding.js";
2
+ export { arrayBufferToBase64String, base58FromUint8Array, base58ToUint8Array, base64EncodeString, base64FromUint8Array, base64ToBase58, base64ToUint8Array, base64UrlFromUint8Array, utf8FromUint8Array, utf8ToUint8Array };
@@ -0,0 +1,2 @@
1
+ import { a as base64ToBase58, c as utf8FromUint8Array, i as base64FromUint8Array, l as utf8ToUint8Array, n as base58ToUint8Array, o as base64ToUint8Array, r as base64EncodeString, s as base64UrlFromUint8Array, t as base58FromUint8Array, u as arrayBufferToBase64String } from "./chunks/encoding.js";
2
+ export { arrayBufferToBase64String, base58FromUint8Array, base58ToUint8Array, base64EncodeString, base64FromUint8Array, base64ToBase58, base64ToUint8Array, base64UrlFromUint8Array, utf8FromUint8Array, utf8ToUint8Array };