@pooflabs/web 0.0.80 → 0.0.81-rc1

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.
Files changed (82) hide show
  1. package/dist/auth/providers/phantom-wallet-provider.d.ts +20 -0
  2. package/dist/{index-BhfNMrC0.js → index-BSL3D7PC.js} +25 -883
  3. package/dist/index-BSL3D7PC.js.map +1 -0
  4. package/dist/{index-BNyxZ82q.js → index-BU6puWaY.js} +279 -275
  5. package/dist/index-BU6puWaY.js.map +1 -0
  6. package/dist/index-Bdcc5821.js +2375 -0
  7. package/dist/index-Bdcc5821.js.map +1 -0
  8. package/dist/{index-Db0NqU8R.esm.js → index-Cpw11-0x.esm.js} +279 -276
  9. package/dist/index-Cpw11-0x.esm.js.map +1 -0
  10. package/dist/index-CrOVJFX9.esm.js +2373 -0
  11. package/dist/index-CrOVJFX9.esm.js.map +1 -0
  12. package/dist/{index-COIUWugk.esm.js → index-CtwdL0-L.esm.js} +23 -881
  13. package/dist/index-CtwdL0-L.esm.js.map +1 -0
  14. package/dist/{index-BbtYb8sE.esm.js → index-DLfRKZI7.esm.js} +24 -882
  15. package/dist/index-DLfRKZI7.esm.js.map +1 -0
  16. package/dist/{index-BVi7fTm2.js → index-Fo9o33oZ.js} +24 -882
  17. package/dist/index-Fo9o33oZ.js.map +1 -0
  18. package/dist/index.browser-9JJy5Y7o.esm.js +119 -0
  19. package/dist/index.browser-9JJy5Y7o.esm.js.map +1 -0
  20. package/dist/index.browser-B4RzFwu2.js +1253 -0
  21. package/dist/index.browser-B4RzFwu2.js.map +1 -0
  22. package/dist/index.browser-C-_FEr5M.esm.js +1134 -0
  23. package/dist/index.browser-C-_FEr5M.esm.js.map +1 -0
  24. package/dist/{index.browser-8hyi2LOX.js → index.browser-CGfTdDXe.js} +1367 -1697
  25. package/dist/index.browser-CGfTdDXe.js.map +1 -0
  26. package/dist/index.browser-CQUvzkLr.js +122 -0
  27. package/dist/index.browser-CQUvzkLr.js.map +1 -0
  28. package/dist/index.browser-DjEZSiqI.js +1137 -0
  29. package/dist/index.browser-DjEZSiqI.js.map +1 -0
  30. package/dist/index.browser-Dzo4A2XB.esm.js +1250 -0
  31. package/dist/index.browser-Dzo4A2XB.esm.js.map +1 -0
  32. package/dist/{index.browser-BuHl80dp.esm.js → index.browser-HEDpODB5.esm.js} +1367 -1697
  33. package/dist/index.browser-HEDpODB5.esm.js.map +1 -0
  34. package/dist/index.esm.js +1 -1
  35. package/dist/index.js +1 -1
  36. package/dist/{index.native-DUnE51Mx.js → index.native-DYI4vw0X.js} +186 -2669
  37. package/dist/index.native-DYI4vw0X.js.map +1 -0
  38. package/dist/{index.native-DuKhZcus.esm.js → index.native-UxpBL0TA.esm.js} +187 -2669
  39. package/dist/index.native-UxpBL0TA.esm.js.map +1 -0
  40. package/dist/index.native.esm.js +1 -1
  41. package/dist/index.native.js +1 -1
  42. package/dist/{phantom-wallet-provider-Cg-srwP4.js → phantom-wallet-provider-BPSAXPZ6.js} +127 -11
  43. package/dist/{phantom-wallet-provider-Cg-srwP4.js.map → phantom-wallet-provider-BPSAXPZ6.js.map} +1 -1
  44. package/dist/{phantom-wallet-provider--BJjVUA1.esm.js → phantom-wallet-provider-DcMJW18_.esm.js} +127 -11
  45. package/dist/{phantom-wallet-provider--BJjVUA1.esm.js.map → phantom-wallet-provider-DcMJW18_.esm.js.map} +1 -1
  46. package/dist/{privy-wallet-provider-BLcur3Ue.esm.js → privy-wallet-provider-CtIl8FgH.esm.js} +3 -3
  47. package/dist/privy-wallet-provider-CtIl8FgH.esm.js.map +1 -0
  48. package/dist/{privy-wallet-provider-DpNVyaXa.js → privy-wallet-provider-Zu5K_vNN.js} +3 -3
  49. package/dist/privy-wallet-provider-Zu5K_vNN.js.map +1 -0
  50. package/dist/{solana-mobile-wallet-provider-CFaubssb.esm.js → solana-mobile-wallet-provider-C31APzEp.esm.js} +4 -4
  51. package/dist/{solana-mobile-wallet-provider-CFaubssb.esm.js.map → solana-mobile-wallet-provider-C31APzEp.esm.js.map} +1 -1
  52. package/dist/{solana-mobile-wallet-provider-zXAk2tfS.js → solana-mobile-wallet-provider-Dg9_h3QI.js} +4 -4
  53. package/dist/{solana-mobile-wallet-provider-zXAk2tfS.js.map → solana-mobile-wallet-provider-Dg9_h3QI.js.map} +1 -1
  54. package/package.json +1 -1
  55. package/dist/index-BNyxZ82q.js.map +0 -1
  56. package/dist/index-BVi7fTm2.js.map +0 -1
  57. package/dist/index-BbtYb8sE.esm.js.map +0 -1
  58. package/dist/index-BhfNMrC0.js.map +0 -1
  59. package/dist/index-CKIoDkjJ.esm.js +0 -6
  60. package/dist/index-CKIoDkjJ.esm.js.map +0 -1
  61. package/dist/index-COIUWugk.esm.js.map +0 -1
  62. package/dist/index-CSraUgD6.js +0 -8
  63. package/dist/index-CSraUgD6.js.map +0 -1
  64. package/dist/index-Db0NqU8R.esm.js.map +0 -1
  65. package/dist/index.browser-8hyi2LOX.js.map +0 -1
  66. package/dist/index.browser-B4zXnffD.esm.js +0 -225
  67. package/dist/index.browser-B4zXnffD.esm.js.map +0 -1
  68. package/dist/index.browser-BJ_TdUVA.js +0 -228
  69. package/dist/index.browser-BJ_TdUVA.js.map +0 -1
  70. package/dist/index.browser-BkNaRRVe.js +0 -1222
  71. package/dist/index.browser-BkNaRRVe.js.map +0 -1
  72. package/dist/index.browser-BuHl80dp.esm.js.map +0 -1
  73. package/dist/index.browser-CnbxBj3-.esm.js +0 -1219
  74. package/dist/index.browser-CnbxBj3-.esm.js.map +0 -1
  75. package/dist/index.browser-OvGNsMPu.esm.js +0 -1002
  76. package/dist/index.browser-OvGNsMPu.esm.js.map +0 -1
  77. package/dist/index.browser-vuTr40so.js +0 -1008
  78. package/dist/index.browser-vuTr40so.js.map +0 -1
  79. package/dist/index.native-DUnE51Mx.js.map +0 -1
  80. package/dist/index.native-DuKhZcus.esm.js.map +0 -1
  81. package/dist/privy-wallet-provider-BLcur3Ue.esm.js.map +0 -1
  82. package/dist/privy-wallet-provider-DpNVyaXa.js.map +0 -1
@@ -1,1222 +0,0 @@
1
- 'use strict';
2
-
3
- var web3_js = require('@solana/web3.js');
4
-
5
- function createDecoder(decoder) {
6
- return Object.freeze({
7
- ...decoder,
8
- decode: (bytes, offset = 0) => decoder.read(bytes, offset)[0]
9
- });
10
- }
11
-
12
- var getBaseXDecoder = (alphabet4) => {
13
- return createDecoder({
14
- read(rawBytes, offset) {
15
- const bytes = offset === 0 || offset <= -rawBytes.byteLength ? rawBytes : rawBytes.slice(offset);
16
- if (bytes.length === 0) return ["", 0];
17
- let trailIndex = bytes.findIndex((n) => n !== 0);
18
- trailIndex = trailIndex === -1 ? bytes.length : trailIndex;
19
- const leadingZeroes = alphabet4[0].repeat(trailIndex);
20
- if (trailIndex === bytes.length) return [leadingZeroes, rawBytes.length];
21
- const base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);
22
- const tailChars = getBaseXFromBigInt(base10Number, alphabet4);
23
- return [leadingZeroes + tailChars, rawBytes.length];
24
- }
25
- });
26
- };
27
- function getBaseXFromBigInt(value, alphabet4) {
28
- const base = BigInt(alphabet4.length);
29
- const tailChars = [];
30
- while (value > 0n) {
31
- tailChars.unshift(alphabet4[Number(value % base)]);
32
- value /= base;
33
- }
34
- return tailChars.join("");
35
- }
36
-
37
- // src/base58.ts
38
- var alphabet2 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
39
- var getBase58Decoder = () => getBaseXDecoder(alphabet2);
40
-
41
- /**
42
- * TODO: docs
43
- */
44
- function createSignInMessageText(input) {
45
- // ${domain} wants you to sign in with your Solana account:
46
- // ${address}
47
- //
48
- // ${statement}
49
- //
50
- // URI: ${uri}
51
- // Version: ${version}
52
- // Chain ID: ${chain}
53
- // Nonce: ${nonce}
54
- // Issued At: ${issued-at}
55
- // Expiration Time: ${expiration-time}
56
- // Not Before: ${not-before}
57
- // Request ID: ${request-id}
58
- // Resources:
59
- // - ${resources[0]}
60
- // - ${resources[1]}
61
- // ...
62
- // - ${resources[n]}
63
- let message = `${input.domain} wants you to sign in with your Solana account:\n`;
64
- message += `${input.address}`;
65
- if (input.statement) {
66
- message += `\n\n${input.statement}`;
67
- }
68
- const fields = [];
69
- if (input.uri) {
70
- fields.push(`URI: ${input.uri}`);
71
- }
72
- if (input.version) {
73
- fields.push(`Version: ${input.version}`);
74
- }
75
- if (input.chainId) {
76
- fields.push(`Chain ID: ${input.chainId}`);
77
- }
78
- if (input.nonce) {
79
- fields.push(`Nonce: ${input.nonce}`);
80
- }
81
- if (input.issuedAt) {
82
- fields.push(`Issued At: ${input.issuedAt}`);
83
- }
84
- if (input.expirationTime) {
85
- fields.push(`Expiration Time: ${input.expirationTime}`);
86
- }
87
- if (input.notBefore) {
88
- fields.push(`Not Before: ${input.notBefore}`);
89
- }
90
- if (input.requestId) {
91
- fields.push(`Request ID: ${input.requestId}`);
92
- }
93
- if (input.resources) {
94
- fields.push(`Resources:`);
95
- for (const resource of input.resources) {
96
- fields.push(`- ${resource}`);
97
- }
98
- }
99
- if (fields.length) {
100
- message += `\n\n${fields.join('\n')}`;
101
- }
102
- return message;
103
- }
104
-
105
- //#region src/errors.ts
106
- const SolanaMobileWalletAdapterErrorCode = {
107
- ERROR_ASSOCIATION_PORT_OUT_OF_RANGE: "ERROR_ASSOCIATION_PORT_OUT_OF_RANGE",
108
- ERROR_FORBIDDEN_WALLET_BASE_URL: "ERROR_FORBIDDEN_WALLET_BASE_URL",
109
- ERROR_SECURE_CONTEXT_REQUIRED: "ERROR_SECURE_CONTEXT_REQUIRED",
110
- ERROR_SESSION_CLOSED: "ERROR_SESSION_CLOSED",
111
- ERROR_SESSION_TIMEOUT: "ERROR_SESSION_TIMEOUT",
112
- ERROR_WALLET_NOT_FOUND: "ERROR_WALLET_NOT_FOUND",
113
- ERROR_INVALID_PROTOCOL_VERSION: "ERROR_INVALID_PROTOCOL_VERSION"};
114
- var SolanaMobileWalletAdapterError = class extends Error {
115
- data;
116
- code;
117
- constructor(...args) {
118
- const [code, message, data] = args;
119
- super(message);
120
- this.code = code;
121
- this.data = data;
122
- this.name = "SolanaMobileWalletAdapterError";
123
- }
124
- };
125
- var SolanaMobileWalletAdapterProtocolError = class extends Error {
126
- data;
127
- code;
128
- jsonRpcMessageId;
129
- constructor(...args) {
130
- const [jsonRpcMessageId, code, message, data] = args;
131
- super(message);
132
- this.code = code;
133
- this.data = data;
134
- this.jsonRpcMessageId = jsonRpcMessageId;
135
- this.name = "SolanaMobileWalletAdapterProtocolError";
136
- }
137
- };
138
- //#endregion
139
- //#region src/base64Utils.ts
140
- function encode(input) {
141
- return window.btoa(input);
142
- }
143
- function fromUint8Array$1(byteArray, urlsafe) {
144
- const base64 = window.btoa(String.fromCharCode.call(null, ...byteArray));
145
- if (urlsafe) return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
146
- else return base64;
147
- }
148
- function toUint8Array$1(base64EncodedByteArray) {
149
- return new Uint8Array(window.atob(base64EncodedByteArray).split("").map((c) => c.charCodeAt(0)));
150
- }
151
- //#endregion
152
- //#region src/createHelloReq.ts
153
- async function createHelloReq(ecdhPublicKey, associationKeypairPrivateKey) {
154
- const publicKeyBuffer = await crypto.subtle.exportKey("raw", ecdhPublicKey);
155
- const signatureBuffer = await crypto.subtle.sign({
156
- hash: "SHA-256",
157
- name: "ECDSA"
158
- }, associationKeypairPrivateKey, publicKeyBuffer);
159
- const response = new Uint8Array(publicKeyBuffer.byteLength + signatureBuffer.byteLength);
160
- response.set(new Uint8Array(publicKeyBuffer), 0);
161
- response.set(new Uint8Array(signatureBuffer), publicKeyBuffer.byteLength);
162
- return response;
163
- }
164
- //#endregion
165
- //#region src/base58Utils.ts
166
- function fromUint8Array$2(byteArray) {
167
- return getBase58Decoder().decode(byteArray);
168
- }
169
- function base64ToBase58(base64EncodedString) {
170
- return fromUint8Array$2(toUint8Array$1(base64EncodedString));
171
- }
172
- //#endregion
173
- //#region src/createSIWSMessage.ts
174
- function createSIWSMessage(payload) {
175
- return createSignInMessageText(payload);
176
- }
177
- function createSIWSMessageBase64Url(payload) {
178
- return encode(createSIWSMessage(payload)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
179
- }
180
- //#endregion
181
- //#region src/types.ts
182
- const SolanaSignTransactions = "solana:signTransactions";
183
- const SolanaCloneAuthorization = "solana:cloneAuthorization";
184
- //#endregion
185
- //#region src/createMobileWalletProxy.ts
186
- /**
187
- * Creates a {@link MobileWallet} proxy that handles backwards compatibility and API to RPC conversion.
188
- *
189
- * @param protocolVersion the protocol version in use for this session/request
190
- * @param protocolRequestHandler callback function that handles sending the RPC request to the wallet endpoint.
191
- * @returns a {@link MobileWallet} proxy
192
- */
193
- function createMobileWalletProxy(protocolVersion, protocolRequestHandler) {
194
- return new Proxy({}, {
195
- get(target, p) {
196
- if (p === "then") return null;
197
- if (target[p] == null) target[p] = async function(inputParams) {
198
- const { method, params } = handleMobileWalletRequest(p, inputParams, protocolVersion);
199
- const result = await protocolRequestHandler(method, params);
200
- if (method === "authorize" && params.sign_in_payload && !result.sign_in_result) result.sign_in_result = await signInFallback(params.sign_in_payload, result, protocolRequestHandler);
201
- return handleMobileWalletResponse(p, result, protocolVersion);
202
- };
203
- return target[p];
204
- },
205
- defineProperty() {
206
- return false;
207
- },
208
- deleteProperty() {
209
- return false;
210
- }
211
- });
212
- }
213
- /**
214
- * Handles all {@link MobileWallet} API requests and determines the correct MWA RPC method and params to call.
215
- * This handles backwards compatibility, based on the provided @protocolVersion.
216
- *
217
- * @param methodName the name of {@link MobileWallet} method that was called
218
- * @param methodParams the parameters that were passed to the method
219
- * @param protocolVersion the protocol version in use for this session/request
220
- * @returns the RPC request method and params that should be sent to the wallet endpoint
221
- */
222
- function handleMobileWalletRequest(methodName, methodParams, protocolVersion) {
223
- let params = methodParams;
224
- let method = methodName.toString().replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`).toLowerCase();
225
- switch (methodName) {
226
- case "authorize": {
227
- const authorizeParams = params;
228
- let { chain } = authorizeParams;
229
- if (protocolVersion === "legacy") {
230
- switch (chain) {
231
- case "solana:testnet":
232
- chain = "testnet";
233
- break;
234
- case "solana:devnet":
235
- chain = "devnet";
236
- break;
237
- case "solana:mainnet":
238
- chain = "mainnet-beta";
239
- break;
240
- default: chain = authorizeParams.cluster;
241
- }
242
- authorizeParams.cluster = chain;
243
- params = authorizeParams;
244
- } else {
245
- switch (chain) {
246
- case "testnet":
247
- case "devnet":
248
- chain = `solana:${chain}`;
249
- break;
250
- case "mainnet-beta":
251
- chain = "solana:mainnet";
252
- break;
253
- }
254
- authorizeParams.chain = chain;
255
- params = authorizeParams;
256
- }
257
- }
258
- case "reauthorize": {
259
- const { auth_token, identity } = params;
260
- if (auth_token) switch (protocolVersion) {
261
- case "legacy":
262
- method = "reauthorize";
263
- params = {
264
- auth_token,
265
- identity
266
- };
267
- break;
268
- default:
269
- method = "authorize";
270
- break;
271
- }
272
- break;
273
- }
274
- }
275
- return {
276
- method,
277
- params
278
- };
279
- }
280
- /**
281
- * Handles all {@link MobileWallet} API responses and modifies the response for backwards compatibility, if needed
282
- *
283
- * @param method the {@link MobileWallet} method that was called
284
- * @param response the original response that was returned by the method call
285
- * @param protocolVersion the protocol version in use for this session/request
286
- * @returns the possibly modified response
287
- */
288
- function handleMobileWalletResponse(method, response, protocolVersion) {
289
- switch (method) {
290
- case "getCapabilities": {
291
- const capabilities = response;
292
- switch (protocolVersion) {
293
- case "legacy": {
294
- const features = [SolanaSignTransactions];
295
- if (capabilities.supports_clone_authorization === true) features.push(SolanaCloneAuthorization);
296
- return {
297
- ...capabilities,
298
- features
299
- };
300
- }
301
- case "v1": return {
302
- ...capabilities,
303
- supports_sign_and_send_transactions: true,
304
- supports_clone_authorization: capabilities.features.includes(SolanaCloneAuthorization)
305
- };
306
- }
307
- }
308
- }
309
- return response;
310
- }
311
- async function signInFallback(signInPayload, authorizationResult, protocolRequestHandler) {
312
- const domain = signInPayload.domain ?? window.location.host;
313
- const address = authorizationResult.accounts[0].address;
314
- const siwsMessage = createSIWSMessageBase64Url({
315
- ...signInPayload,
316
- domain,
317
- address: base64ToBase58(address)
318
- });
319
- const signedPayload = toUint8Array$1((await protocolRequestHandler("sign_messages", {
320
- addresses: [address],
321
- payloads: [siwsMessage]
322
- })).signed_payloads[0]);
323
- const signedMessage = fromUint8Array$1(signedPayload.slice(0, signedPayload.length - 64));
324
- const signature = fromUint8Array$1(signedPayload.slice(signedPayload.length - 64));
325
- return {
326
- address,
327
- signed_message: signedMessage.length == 0 ? siwsMessage : signedMessage,
328
- signature
329
- };
330
- }
331
- function createSequenceNumberVector(sequenceNumber) {
332
- if (sequenceNumber >= 4294967296) throw new Error("Outbound sequence number overflow. The maximum sequence number is 32-bytes.");
333
- const byteArray = /* @__PURE__ */ new ArrayBuffer(4);
334
- new DataView(byteArray).setUint32(0, sequenceNumber, false);
335
- return new Uint8Array(byteArray);
336
- }
337
- //#endregion
338
- //#region src/encryptedMessage.ts
339
- const INITIALIZATION_VECTOR_BYTES = 12;
340
- async function encryptMessage(plaintext, sequenceNumber, sharedSecret) {
341
- const sequenceNumberVector = createSequenceNumberVector(sequenceNumber);
342
- const initializationVector = new Uint8Array(INITIALIZATION_VECTOR_BYTES);
343
- crypto.getRandomValues(initializationVector);
344
- const ciphertext = await crypto.subtle.encrypt(getAlgorithmParams(sequenceNumberVector, initializationVector), sharedSecret, new TextEncoder().encode(plaintext));
345
- const response = new Uint8Array(sequenceNumberVector.byteLength + initializationVector.byteLength + ciphertext.byteLength);
346
- response.set(new Uint8Array(sequenceNumberVector), 0);
347
- response.set(new Uint8Array(initializationVector), sequenceNumberVector.byteLength);
348
- response.set(new Uint8Array(ciphertext), sequenceNumberVector.byteLength + initializationVector.byteLength);
349
- return response;
350
- }
351
- async function decryptMessage(message, sharedSecret) {
352
- const sequenceNumberVector = message.slice(0, 4);
353
- const initializationVector = message.slice(4, 4 + INITIALIZATION_VECTOR_BYTES);
354
- const ciphertext = message.slice(4 + INITIALIZATION_VECTOR_BYTES);
355
- const plaintextBuffer = await crypto.subtle.decrypt(getAlgorithmParams(sequenceNumberVector, initializationVector), sharedSecret, ciphertext);
356
- return getUtf8Decoder().decode(plaintextBuffer);
357
- }
358
- function getAlgorithmParams(sequenceNumber, initializationVector) {
359
- return {
360
- additionalData: sequenceNumber,
361
- iv: initializationVector,
362
- name: "AES-GCM",
363
- tagLength: 128
364
- };
365
- }
366
- let _utf8Decoder;
367
- function getUtf8Decoder() {
368
- if (_utf8Decoder === void 0) _utf8Decoder = new TextDecoder("utf-8");
369
- return _utf8Decoder;
370
- }
371
- //#endregion
372
- //#region src/generateAssociationKeypair.ts
373
- async function generateAssociationKeypair() {
374
- return await crypto.subtle.generateKey({
375
- name: "ECDSA",
376
- namedCurve: "P-256"
377
- }, false, ["sign"]);
378
- }
379
- //#endregion
380
- //#region src/generateECDHKeypair.ts
381
- async function generateECDHKeypair() {
382
- return await crypto.subtle.generateKey({
383
- name: "ECDH",
384
- namedCurve: "P-256"
385
- }, false, ["deriveKey", "deriveBits"]);
386
- }
387
- //#endregion
388
- //#region src/arrayBufferToBase64String.ts
389
- function arrayBufferToBase64String(buffer) {
390
- let binary = "";
391
- const bytes = new Uint8Array(buffer);
392
- const len = bytes.byteLength;
393
- for (let ii = 0; ii < len; ii++) binary += String.fromCharCode(bytes[ii]);
394
- return window.btoa(binary);
395
- }
396
- //#endregion
397
- //#region src/associationPort.ts
398
- function getRandomAssociationPort() {
399
- return assertAssociationPort(49152 + Math.floor(Math.random() * 16384));
400
- }
401
- function assertAssociationPort(port) {
402
- if (port < 49152 || port > 65535) throw new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_ASSOCIATION_PORT_OUT_OF_RANGE, `Association port number must be between 49152 and 65535. ${port} given.`, { port });
403
- return port;
404
- }
405
- //#endregion
406
- //#region src/getStringWithURLUnsafeBase64CharactersReplaced.ts
407
- function getStringWithURLUnsafeCharactersReplaced(unsafeBase64EncodedString) {
408
- return unsafeBase64EncodedString.replace(/[/+=]/g, (m) => ({
409
- "/": "_",
410
- "+": "-",
411
- "=": "."
412
- })[m]);
413
- }
414
- //#endregion
415
- //#region src/getAssociateAndroidIntentURL.ts
416
- const INTENT_NAME = "solana-wallet";
417
- function getPathParts(pathString) {
418
- return pathString.replace(/(^\/+|\/+$)/g, "").split("/");
419
- }
420
- function getIntentURL(methodPathname, intentUrlBase) {
421
- let baseUrl = null;
422
- if (intentUrlBase) {
423
- try {
424
- baseUrl = new URL(intentUrlBase);
425
- } catch {}
426
- if (baseUrl?.protocol !== "https:") throw new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_FORBIDDEN_WALLET_BASE_URL, "Base URLs supplied by wallets must be valid `https` URLs");
427
- }
428
- baseUrl ||= new URL(`${INTENT_NAME}:/`);
429
- const pathname = methodPathname.startsWith("/") ? methodPathname : [...getPathParts(baseUrl.pathname), ...getPathParts(methodPathname)].join("/");
430
- return new URL(pathname, baseUrl);
431
- }
432
- async function getAssociateAndroidIntentURL(associationPublicKey, putativePort, associationURLBase, protocolVersions = ["v1"]) {
433
- const associationPort = assertAssociationPort(putativePort);
434
- const encodedKey = arrayBufferToBase64String(await crypto.subtle.exportKey("raw", associationPublicKey));
435
- const url = getIntentURL("v1/associate/local", associationURLBase);
436
- url.searchParams.set("association", getStringWithURLUnsafeCharactersReplaced(encodedKey));
437
- url.searchParams.set("port", `${associationPort}`);
438
- protocolVersions.forEach((version) => {
439
- url.searchParams.set("v", version);
440
- });
441
- return url;
442
- }
443
- async function getRemoteAssociateAndroidIntentURL(associationPublicKey, hostAuthority, reflectorId, associationURLBase, protocolVersions = ["v1"]) {
444
- const encodedKey = arrayBufferToBase64String(await crypto.subtle.exportKey("raw", associationPublicKey));
445
- const url = getIntentURL("v1/associate/remote", associationURLBase);
446
- url.searchParams.set("association", getStringWithURLUnsafeCharactersReplaced(encodedKey));
447
- url.searchParams.set("reflector", `${hostAuthority}`);
448
- url.searchParams.set("id", `${fromUint8Array$1(reflectorId, true)}`);
449
- protocolVersions.forEach((version) => {
450
- url.searchParams.set("v", version);
451
- });
452
- return url;
453
- }
454
- //#endregion
455
- //#region src/jsonRpcMessage.ts
456
- async function encryptJsonRpcMessage(jsonRpcMessage, sharedSecret) {
457
- const plaintext = JSON.stringify(jsonRpcMessage);
458
- const sequenceNumber = jsonRpcMessage.id;
459
- return encryptMessage(plaintext, sequenceNumber, sharedSecret);
460
- }
461
- async function decryptJsonRpcMessage(message, sharedSecret) {
462
- const plaintext = await decryptMessage(message, sharedSecret);
463
- const jsonRpcMessage = JSON.parse(plaintext);
464
- if (Object.hasOwnProperty.call(jsonRpcMessage, "error")) throw new SolanaMobileWalletAdapterProtocolError(jsonRpcMessage.id, jsonRpcMessage.error.code, jsonRpcMessage.error.message);
465
- return jsonRpcMessage;
466
- }
467
- //#endregion
468
- //#region src/parseHelloRsp.ts
469
- async function parseHelloRsp(payloadBuffer, associationPublicKey, ecdhPrivateKey) {
470
- const [associationPublicKeyBuffer, walletPublicKey] = await Promise.all([crypto.subtle.exportKey("raw", associationPublicKey), crypto.subtle.importKey("raw", payloadBuffer.slice(0, 65), {
471
- name: "ECDH",
472
- namedCurve: "P-256"
473
- }, false, [])]);
474
- const sharedSecret = await crypto.subtle.deriveBits({
475
- name: "ECDH",
476
- public: walletPublicKey
477
- }, ecdhPrivateKey, 256);
478
- const ecdhSecretKey = await crypto.subtle.importKey("raw", sharedSecret, "HKDF", false, ["deriveKey"]);
479
- return await crypto.subtle.deriveKey({
480
- name: "HKDF",
481
- hash: "SHA-256",
482
- salt: new Uint8Array(associationPublicKeyBuffer),
483
- info: new Uint8Array()
484
- }, ecdhSecretKey, {
485
- name: "AES-GCM",
486
- length: 128
487
- }, false, ["encrypt", "decrypt"]);
488
- }
489
- //#endregion
490
- //#region src/parseSessionProps.ts
491
- async function parseSessionProps(message, sharedSecret) {
492
- const plaintext = await decryptMessage(message, sharedSecret);
493
- const jsonProperties = JSON.parse(plaintext);
494
- let protocolVersion = "legacy";
495
- if (Object.hasOwnProperty.call(jsonProperties, "v")) switch (jsonProperties.v) {
496
- case 1:
497
- case "1":
498
- case "v1":
499
- protocolVersion = "v1";
500
- break;
501
- case "legacy":
502
- protocolVersion = "legacy";
503
- break;
504
- default: throw new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_INVALID_PROTOCOL_VERSION, `Unknown/unsupported protocol version: ${jsonProperties.v}`);
505
- }
506
- return { protocol_version: protocolVersion };
507
- }
508
- //#endregion
509
- //#region src/startSession.ts
510
- const Browser = {
511
- Firefox: 0,
512
- Other: 1
513
- };
514
- function assertUnreachable(x) {
515
- return x;
516
- }
517
- function getBrowser() {
518
- return navigator.userAgent.indexOf("Firefox/") !== -1 ? Browser.Firefox : Browser.Other;
519
- }
520
- function getDetectionPromise() {
521
- return new Promise((resolve, reject) => {
522
- function cleanup() {
523
- clearTimeout(timeoutId);
524
- window.removeEventListener("blur", handleBlur);
525
- }
526
- function handleBlur() {
527
- cleanup();
528
- resolve();
529
- }
530
- window.addEventListener("blur", handleBlur);
531
- const timeoutId = setTimeout(() => {
532
- cleanup();
533
- reject();
534
- }, 3e3);
535
- });
536
- }
537
- let _frame = null;
538
- function launchUrlThroughHiddenFrame(url) {
539
- if (_frame == null) {
540
- _frame = document.createElement("iframe");
541
- _frame.style.display = "none";
542
- document.body.appendChild(_frame);
543
- }
544
- _frame.contentWindow.location.href = url.toString();
545
- }
546
- async function launchAssociation(associationUrl) {
547
- if (associationUrl.protocol === "https:") window.location.assign(associationUrl);
548
- else try {
549
- const browser = getBrowser();
550
- switch (browser) {
551
- case Browser.Firefox:
552
- launchUrlThroughHiddenFrame(associationUrl);
553
- break;
554
- case Browser.Other: {
555
- const detectionPromise = getDetectionPromise();
556
- window.location.assign(associationUrl);
557
- await detectionPromise;
558
- break;
559
- }
560
- default: assertUnreachable(browser);
561
- }
562
- } catch {
563
- throw new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_WALLET_NOT_FOUND, "Found no installed wallet that supports the mobile wallet protocol.");
564
- }
565
- }
566
- async function startSession(associationPublicKey, associationURLBase) {
567
- const randomAssociationPort = getRandomAssociationPort();
568
- await launchAssociation(await getAssociateAndroidIntentURL(associationPublicKey, randomAssociationPort, associationURLBase));
569
- return randomAssociationPort;
570
- }
571
- //#endregion
572
- //#region src/transact.ts
573
- const WEBSOCKET_CONNECTION_CONFIG = {
574
- retryDelayScheduleMs: [
575
- 150,
576
- 150,
577
- 200,
578
- 500,
579
- 500,
580
- 750,
581
- 750,
582
- 1e3
583
- ],
584
- timeoutMs: 3e4
585
- };
586
- const WEBSOCKET_PROTOCOL_BINARY = "com.solana.mobilewalletadapter.v1";
587
- const WEBSOCKET_PROTOCOL_BASE64 = "com.solana.mobilewalletadapter.v1.base64";
588
- function assertSecureContext() {
589
- if (typeof window === "undefined" || window.isSecureContext !== true) throw new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_SECURE_CONTEXT_REQUIRED, "The mobile wallet adapter protocol must be used in a secure context (`https`).");
590
- }
591
- function assertSecureEndpointSpecificURI(walletUriBase) {
592
- let url;
593
- try {
594
- url = new URL(walletUriBase);
595
- } catch {
596
- throw new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_FORBIDDEN_WALLET_BASE_URL, "Invalid base URL supplied by wallet");
597
- }
598
- if (url.protocol !== "https:") throw new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_FORBIDDEN_WALLET_BASE_URL, "Base URLs supplied by wallets must be valid `https` URLs");
599
- }
600
- function getSequenceNumberFromByteArray(byteArray) {
601
- return new DataView(byteArray).getUint32(0, false);
602
- }
603
- function decodeVarLong(byteArray) {
604
- const bytes = new Uint8Array(byteArray);
605
- const l = byteArray.byteLength;
606
- const limit = 10;
607
- let value = 0, offset = 0, b;
608
- do {
609
- if (offset >= l || offset > limit) throw new RangeError("Failed to decode varint");
610
- b = bytes[offset++];
611
- value |= (b & 127) << 7 * offset;
612
- } while (b >= 128);
613
- return {
614
- value,
615
- offset
616
- };
617
- }
618
- function getReflectorIdFromByteArray(byteArray) {
619
- const { value: length, offset } = decodeVarLong(byteArray);
620
- return new Uint8Array(byteArray.slice(offset, offset + length));
621
- }
622
- async function transact$1(callback, config) {
623
- const { wallet, close } = await startScenario(config);
624
- try {
625
- return await callback(await wallet);
626
- } finally {
627
- close();
628
- }
629
- }
630
- async function startScenario(config) {
631
- assertSecureContext();
632
- const associationKeypair = await generateAssociationKeypair();
633
- const websocketURL = `ws://localhost:${await startSession(associationKeypair.publicKey, config?.baseUri)}/solana-wallet`;
634
- let connectionStartTime;
635
- const getNextRetryDelayMs = (() => {
636
- const schedule = [...WEBSOCKET_CONNECTION_CONFIG.retryDelayScheduleMs];
637
- return () => schedule.length > 1 ? schedule.shift() : schedule[0];
638
- })();
639
- let nextJsonRpcMessageId = 1;
640
- let lastKnownInboundSequenceNumber = 0;
641
- let state = { __type: "disconnected" };
642
- let socket;
643
- let sessionEstablished = false;
644
- let handleForceClose;
645
- return {
646
- close: () => {
647
- socket.close();
648
- handleForceClose();
649
- },
650
- wallet: new Promise((resolve, reject) => {
651
- const jsonRpcResponsePromises = {};
652
- const handleOpen = async () => {
653
- if (state.__type !== "connecting") {
654
- console.warn(`Expected adapter state to be \`connecting\` at the moment the websocket opens. Got \`${state.__type}\`.`);
655
- return;
656
- }
657
- socket.removeEventListener("open", handleOpen);
658
- const { associationKeypair } = state;
659
- const ecdhKeypair = await generateECDHKeypair();
660
- socket.send(await createHelloReq(ecdhKeypair.publicKey, associationKeypair.privateKey));
661
- state = {
662
- __type: "hello_req_sent",
663
- associationPublicKey: associationKeypair.publicKey,
664
- ecdhPrivateKey: ecdhKeypair.privateKey
665
- };
666
- };
667
- const handleClose = (evt) => {
668
- if (evt.wasClean) state = { __type: "disconnected" };
669
- else reject(new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_SESSION_CLOSED, `The wallet session dropped unexpectedly (${evt.code}: ${evt.reason}).`, { closeEvent: evt }));
670
- disposeSocket();
671
- };
672
- const handleError = async (_evt) => {
673
- disposeSocket();
674
- if (Date.now() - connectionStartTime >= WEBSOCKET_CONNECTION_CONFIG.timeoutMs) reject(new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_SESSION_TIMEOUT, `Failed to connect to the wallet websocket at ${websocketURL}.`));
675
- else {
676
- await new Promise((resolve) => {
677
- const retryDelayMs = getNextRetryDelayMs();
678
- retryWaitTimeoutId = window.setTimeout(resolve, retryDelayMs);
679
- });
680
- attemptSocketConnection();
681
- }
682
- };
683
- const handleMessage = async (evt) => {
684
- const responseBuffer = await evt.data.arrayBuffer();
685
- switch (state.__type) {
686
- case "connecting": {
687
- if (responseBuffer.byteLength !== 0) throw new Error("Encountered unexpected message while connecting");
688
- const ecdhKeypair = await generateECDHKeypair();
689
- socket.send(await createHelloReq(ecdhKeypair.publicKey, associationKeypair.privateKey));
690
- state = {
691
- __type: "hello_req_sent",
692
- associationPublicKey: associationKeypair.publicKey,
693
- ecdhPrivateKey: ecdhKeypair.privateKey
694
- };
695
- break;
696
- }
697
- case "connected":
698
- try {
699
- const sequenceNumber = getSequenceNumberFromByteArray(responseBuffer.slice(0, 4));
700
- if (sequenceNumber !== lastKnownInboundSequenceNumber + 1) throw new Error("Encrypted message has invalid sequence number");
701
- lastKnownInboundSequenceNumber = sequenceNumber;
702
- const jsonRpcMessage = await decryptJsonRpcMessage(responseBuffer, state.sharedSecret);
703
- const responsePromise = jsonRpcResponsePromises[jsonRpcMessage.id];
704
- delete jsonRpcResponsePromises[jsonRpcMessage.id];
705
- responsePromise.resolve(jsonRpcMessage.result);
706
- } catch (e) {
707
- if (e instanceof SolanaMobileWalletAdapterProtocolError) {
708
- const responsePromise = jsonRpcResponsePromises[e.jsonRpcMessageId];
709
- delete jsonRpcResponsePromises[e.jsonRpcMessageId];
710
- responsePromise.reject(e);
711
- } else throw e;
712
- }
713
- break;
714
- case "hello_req_sent": {
715
- if (responseBuffer.byteLength === 0) {
716
- const ecdhKeypair = await generateECDHKeypair();
717
- socket.send(await createHelloReq(ecdhKeypair.publicKey, associationKeypair.privateKey));
718
- state = {
719
- __type: "hello_req_sent",
720
- associationPublicKey: associationKeypair.publicKey,
721
- ecdhPrivateKey: ecdhKeypair.privateKey
722
- };
723
- break;
724
- }
725
- const sharedSecret = await parseHelloRsp(responseBuffer, state.associationPublicKey, state.ecdhPrivateKey);
726
- const sessionPropertiesBuffer = responseBuffer.slice(65);
727
- const sessionProperties = sessionPropertiesBuffer.byteLength !== 0 ? await (async () => {
728
- const sequenceNumber = getSequenceNumberFromByteArray(sessionPropertiesBuffer.slice(0, 4));
729
- if (sequenceNumber !== lastKnownInboundSequenceNumber + 1) throw new Error("Encrypted message has invalid sequence number");
730
- lastKnownInboundSequenceNumber = sequenceNumber;
731
- return parseSessionProps(sessionPropertiesBuffer, sharedSecret);
732
- })() : { protocol_version: "legacy" };
733
- state = {
734
- __type: "connected",
735
- sharedSecret,
736
- sessionProperties
737
- };
738
- const wallet = createMobileWalletProxy(sessionProperties.protocol_version, async (method, params) => {
739
- const id = nextJsonRpcMessageId++;
740
- socket.send(await encryptJsonRpcMessage({
741
- id,
742
- jsonrpc: "2.0",
743
- method,
744
- params: params ?? {}
745
- }, sharedSecret));
746
- return new Promise((resolve, reject) => {
747
- jsonRpcResponsePromises[id] = {
748
- resolve(result) {
749
- switch (method) {
750
- case "authorize":
751
- case "reauthorize": {
752
- const { wallet_uri_base } = result;
753
- if (wallet_uri_base != null) try {
754
- assertSecureEndpointSpecificURI(wallet_uri_base);
755
- } catch (e) {
756
- reject(e);
757
- return;
758
- }
759
- break;
760
- }
761
- }
762
- resolve(result);
763
- },
764
- reject
765
- };
766
- });
767
- });
768
- sessionEstablished = true;
769
- try {
770
- resolve(wallet);
771
- } catch (e) {
772
- reject(e);
773
- }
774
- break;
775
- }
776
- }
777
- };
778
- handleForceClose = () => {
779
- socket.removeEventListener("message", handleMessage);
780
- disposeSocket();
781
- if (!sessionEstablished) reject(new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_SESSION_CLOSED, `The wallet session was closed before connection.`, { closeEvent: new CloseEvent("socket was closed before connection") }));
782
- };
783
- let disposeSocket;
784
- let retryWaitTimeoutId;
785
- const attemptSocketConnection = () => {
786
- if (disposeSocket) disposeSocket();
787
- state = {
788
- __type: "connecting",
789
- associationKeypair
790
- };
791
- if (connectionStartTime === void 0) connectionStartTime = Date.now();
792
- socket = new WebSocket(websocketURL, [WEBSOCKET_PROTOCOL_BINARY]);
793
- socket.addEventListener("open", handleOpen);
794
- socket.addEventListener("close", handleClose);
795
- socket.addEventListener("error", handleError);
796
- socket.addEventListener("message", handleMessage);
797
- disposeSocket = () => {
798
- window.clearTimeout(retryWaitTimeoutId);
799
- socket.removeEventListener("open", handleOpen);
800
- socket.removeEventListener("close", handleClose);
801
- socket.removeEventListener("error", handleError);
802
- socket.removeEventListener("message", handleMessage);
803
- };
804
- };
805
- attemptSocketConnection();
806
- })
807
- };
808
- }
809
- async function startRemoteScenario$1(config) {
810
- assertSecureContext();
811
- const associationKeypair = await generateAssociationKeypair();
812
- const websocketURL = `wss://${config?.remoteHostAuthority}/reflect`;
813
- let connectionStartTime;
814
- const getNextRetryDelayMs = (() => {
815
- const schedule = [...WEBSOCKET_CONNECTION_CONFIG.retryDelayScheduleMs];
816
- return () => schedule.length > 1 ? schedule.shift() : schedule[0];
817
- })();
818
- let nextJsonRpcMessageId = 1;
819
- let lastKnownInboundSequenceNumber = 0;
820
- let encoding;
821
- let state = { __type: "disconnected" };
822
- let socket;
823
- let disposeSocket;
824
- const decodeBytes = async (evt) => {
825
- if (encoding == "base64") return toUint8Array$1(await evt.data).buffer;
826
- else return await evt.data.arrayBuffer();
827
- };
828
- const associationUrl = await new Promise((resolve, reject) => {
829
- const handleOpen = async () => {
830
- if (state.__type !== "connecting") {
831
- console.warn(`Expected adapter state to be \`connecting\` at the moment the websocket opens. Got \`${state.__type}\`.`);
832
- return;
833
- }
834
- if (socket.protocol.includes(WEBSOCKET_PROTOCOL_BASE64)) encoding = "base64";
835
- else encoding = "binary";
836
- socket.removeEventListener("open", handleOpen);
837
- };
838
- const handleClose = (evt) => {
839
- if (evt.wasClean) state = { __type: "disconnected" };
840
- else reject(new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_SESSION_CLOSED, `The wallet session dropped unexpectedly (${evt.code}: ${evt.reason}).`, { closeEvent: evt }));
841
- disposeSocket();
842
- };
843
- const handleError = async (_evt) => {
844
- disposeSocket();
845
- if (Date.now() - connectionStartTime >= WEBSOCKET_CONNECTION_CONFIG.timeoutMs) reject(new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_SESSION_TIMEOUT, `Failed to connect to the wallet websocket at ${websocketURL}.`));
846
- else {
847
- await new Promise((resolve) => {
848
- const retryDelayMs = getNextRetryDelayMs();
849
- retryWaitTimeoutId = window.setTimeout(resolve, retryDelayMs);
850
- });
851
- attemptSocketConnection();
852
- }
853
- };
854
- const handleReflectorIdMessage = async (evt) => {
855
- const responseBuffer = await decodeBytes(evt);
856
- if (state.__type === "connecting") {
857
- if (responseBuffer.byteLength == 0) throw new Error("Encountered unexpected message while connecting");
858
- const reflectorId = getReflectorIdFromByteArray(responseBuffer);
859
- state = {
860
- __type: "reflector_id_received",
861
- reflectorId
862
- };
863
- const associationUrl = await getRemoteAssociateAndroidIntentURL(associationKeypair.publicKey, config.remoteHostAuthority, reflectorId, config?.baseUri);
864
- socket.removeEventListener("message", handleReflectorIdMessage);
865
- resolve(associationUrl);
866
- }
867
- };
868
- let retryWaitTimeoutId;
869
- const attemptSocketConnection = () => {
870
- if (disposeSocket) disposeSocket();
871
- state = {
872
- __type: "connecting",
873
- associationKeypair
874
- };
875
- if (connectionStartTime === void 0) connectionStartTime = Date.now();
876
- socket = new WebSocket(websocketURL, [WEBSOCKET_PROTOCOL_BINARY, WEBSOCKET_PROTOCOL_BASE64]);
877
- socket.addEventListener("open", handleOpen);
878
- socket.addEventListener("close", handleClose);
879
- socket.addEventListener("error", handleError);
880
- socket.addEventListener("message", handleReflectorIdMessage);
881
- disposeSocket = () => {
882
- window.clearTimeout(retryWaitTimeoutId);
883
- socket.removeEventListener("open", handleOpen);
884
- socket.removeEventListener("close", handleClose);
885
- socket.removeEventListener("error", handleError);
886
- socket.removeEventListener("message", handleReflectorIdMessage);
887
- };
888
- };
889
- attemptSocketConnection();
890
- });
891
- let sessionEstablished = false;
892
- let handleClose;
893
- return {
894
- associationUrl,
895
- close: () => {
896
- socket.close();
897
- handleClose();
898
- },
899
- wallet: new Promise((resolve, reject) => {
900
- const jsonRpcResponsePromises = {};
901
- const handleMessage = async (evt) => {
902
- const responseBuffer = await decodeBytes(evt);
903
- switch (state.__type) {
904
- case "reflector_id_received": {
905
- if (responseBuffer.byteLength !== 0) throw new Error("Encountered unexpected message while awaiting reflection");
906
- const ecdhKeypair = await generateECDHKeypair();
907
- const binaryMsg = await createHelloReq(ecdhKeypair.publicKey, associationKeypair.privateKey);
908
- if (encoding == "base64") socket.send(fromUint8Array$1(binaryMsg));
909
- else socket.send(binaryMsg);
910
- state = {
911
- __type: "hello_req_sent",
912
- associationPublicKey: associationKeypair.publicKey,
913
- ecdhPrivateKey: ecdhKeypair.privateKey
914
- };
915
- break;
916
- }
917
- case "connected":
918
- try {
919
- const sequenceNumber = getSequenceNumberFromByteArray(responseBuffer.slice(0, 4));
920
- if (sequenceNumber !== lastKnownInboundSequenceNumber + 1) throw new Error("Encrypted message has invalid sequence number");
921
- lastKnownInboundSequenceNumber = sequenceNumber;
922
- const jsonRpcMessage = await decryptJsonRpcMessage(responseBuffer, state.sharedSecret);
923
- const responsePromise = jsonRpcResponsePromises[jsonRpcMessage.id];
924
- delete jsonRpcResponsePromises[jsonRpcMessage.id];
925
- responsePromise.resolve(jsonRpcMessage.result);
926
- } catch (e) {
927
- if (e instanceof SolanaMobileWalletAdapterProtocolError) {
928
- const responsePromise = jsonRpcResponsePromises[e.jsonRpcMessageId];
929
- delete jsonRpcResponsePromises[e.jsonRpcMessageId];
930
- responsePromise.reject(e);
931
- } else throw e;
932
- }
933
- break;
934
- case "hello_req_sent": {
935
- const sharedSecret = await parseHelloRsp(responseBuffer, state.associationPublicKey, state.ecdhPrivateKey);
936
- const sessionPropertiesBuffer = responseBuffer.slice(65);
937
- const sessionProperties = sessionPropertiesBuffer.byteLength !== 0 ? await (async () => {
938
- const sequenceNumber = getSequenceNumberFromByteArray(sessionPropertiesBuffer.slice(0, 4));
939
- if (sequenceNumber !== lastKnownInboundSequenceNumber + 1) throw new Error("Encrypted message has invalid sequence number");
940
- lastKnownInboundSequenceNumber = sequenceNumber;
941
- return parseSessionProps(sessionPropertiesBuffer, sharedSecret);
942
- })() : { protocol_version: "legacy" };
943
- state = {
944
- __type: "connected",
945
- sharedSecret,
946
- sessionProperties
947
- };
948
- const wallet = createMobileWalletProxy(sessionProperties.protocol_version, async (method, params) => {
949
- const id = nextJsonRpcMessageId++;
950
- const binaryMsg = await encryptJsonRpcMessage({
951
- id,
952
- jsonrpc: "2.0",
953
- method,
954
- params: params ?? {}
955
- }, sharedSecret);
956
- if (encoding == "base64") socket.send(fromUint8Array$1(binaryMsg));
957
- else socket.send(binaryMsg);
958
- return new Promise((resolve, reject) => {
959
- jsonRpcResponsePromises[id] = {
960
- resolve(result) {
961
- switch (method) {
962
- case "authorize":
963
- case "reauthorize": {
964
- const { wallet_uri_base } = result;
965
- if (wallet_uri_base != null) try {
966
- assertSecureEndpointSpecificURI(wallet_uri_base);
967
- } catch (e) {
968
- reject(e);
969
- return;
970
- }
971
- break;
972
- }
973
- }
974
- resolve(result);
975
- },
976
- reject
977
- };
978
- });
979
- });
980
- sessionEstablished = true;
981
- try {
982
- resolve(wallet);
983
- } catch (e) {
984
- reject(e);
985
- }
986
- break;
987
- }
988
- }
989
- };
990
- socket.addEventListener("message", handleMessage);
991
- handleClose = () => {
992
- socket.removeEventListener("message", handleMessage);
993
- disposeSocket();
994
- if (!sessionEstablished) reject(new SolanaMobileWalletAdapterError(SolanaMobileWalletAdapterErrorCode.ERROR_SESSION_CLOSED, `The wallet session was closed before connection.`, { closeEvent: new CloseEvent("socket was closed before connection") }));
995
- };
996
- })
997
- };
998
- }
999
-
1000
- // base-x encoding / decoding
1001
- // Copyright (c) 2018 base-x contributors
1002
- // Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)
1003
- // Distributed under the MIT software license, see the accompanying
1004
- // file LICENSE or http://www.opensource.org/licenses/mit-license.php.
1005
- function base (ALPHABET) {
1006
- if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }
1007
- const BASE_MAP = new Uint8Array(256);
1008
- for (let j = 0; j < BASE_MAP.length; j++) {
1009
- BASE_MAP[j] = 255;
1010
- }
1011
- for (let i = 0; i < ALPHABET.length; i++) {
1012
- const x = ALPHABET.charAt(i);
1013
- const xc = x.charCodeAt(0);
1014
- if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }
1015
- BASE_MAP[xc] = i;
1016
- }
1017
- const BASE = ALPHABET.length;
1018
- const LEADER = ALPHABET.charAt(0);
1019
- const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up
1020
- const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up
1021
- function encode (source) {
1022
- // eslint-disable-next-line no-empty
1023
- if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {
1024
- source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
1025
- } else if (Array.isArray(source)) {
1026
- source = Uint8Array.from(source);
1027
- }
1028
- if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }
1029
- if (source.length === 0) { return '' }
1030
- // Skip & count leading zeroes.
1031
- let zeroes = 0;
1032
- let length = 0;
1033
- let pbegin = 0;
1034
- const pend = source.length;
1035
- while (pbegin !== pend && source[pbegin] === 0) {
1036
- pbegin++;
1037
- zeroes++;
1038
- }
1039
- // Allocate enough space in big-endian base58 representation.
1040
- const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;
1041
- const b58 = new Uint8Array(size);
1042
- // Process the bytes.
1043
- while (pbegin !== pend) {
1044
- let carry = source[pbegin];
1045
- // Apply "b58 = b58 * 256 + ch".
1046
- let i = 0;
1047
- for (let it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {
1048
- carry += (256 * b58[it1]) >>> 0;
1049
- b58[it1] = (carry % BASE) >>> 0;
1050
- carry = (carry / BASE) >>> 0;
1051
- }
1052
- if (carry !== 0) { throw new Error('Non-zero carry') }
1053
- length = i;
1054
- pbegin++;
1055
- }
1056
- // Skip leading zeroes in base58 result.
1057
- let it2 = size - length;
1058
- while (it2 !== size && b58[it2] === 0) {
1059
- it2++;
1060
- }
1061
- // Translate the result into a string.
1062
- let str = LEADER.repeat(zeroes);
1063
- for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }
1064
- return str
1065
- }
1066
- function decodeUnsafe (source) {
1067
- if (typeof source !== 'string') { throw new TypeError('Expected String') }
1068
- if (source.length === 0) { return new Uint8Array() }
1069
- let psz = 0;
1070
- // Skip and count leading '1's.
1071
- let zeroes = 0;
1072
- let length = 0;
1073
- while (source[psz] === LEADER) {
1074
- zeroes++;
1075
- psz++;
1076
- }
1077
- // Allocate enough space in big-endian base256 representation.
1078
- const size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.
1079
- const b256 = new Uint8Array(size);
1080
- // Process the characters.
1081
- while (psz < source.length) {
1082
- // Find code of next character
1083
- const charCode = source.charCodeAt(psz);
1084
- // Base map can not be indexed using char code
1085
- if (charCode > 255) { return }
1086
- // Decode character
1087
- let carry = BASE_MAP[charCode];
1088
- // Invalid character
1089
- if (carry === 255) { return }
1090
- let i = 0;
1091
- for (let it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {
1092
- carry += (BASE * b256[it3]) >>> 0;
1093
- b256[it3] = (carry % 256) >>> 0;
1094
- carry = (carry / 256) >>> 0;
1095
- }
1096
- if (carry !== 0) { throw new Error('Non-zero carry') }
1097
- length = i;
1098
- psz++;
1099
- }
1100
- // Skip leading zeroes in b256.
1101
- let it4 = size - length;
1102
- while (it4 !== size && b256[it4] === 0) {
1103
- it4++;
1104
- }
1105
- const vch = new Uint8Array(zeroes + (size - it4));
1106
- let j = zeroes;
1107
- while (it4 !== size) {
1108
- vch[j++] = b256[it4++];
1109
- }
1110
- return vch
1111
- }
1112
- function decode (string) {
1113
- const buffer = decodeUnsafe(string);
1114
- if (buffer) { return buffer }
1115
- throw new Error('Non-base' + BASE + ' character')
1116
- }
1117
- return {
1118
- encode,
1119
- decodeUnsafe,
1120
- decode
1121
- }
1122
- }
1123
-
1124
- var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
1125
- var bs58 = base(ALPHABET);
1126
-
1127
- //#region src/base64Utils.ts
1128
- function fromUint8Array(byteArray) {
1129
- return window.btoa(String.fromCharCode.call(null, ...byteArray));
1130
- }
1131
- function toUint8Array(base64EncodedByteArray) {
1132
- return new Uint8Array(window.atob(base64EncodedByteArray).split("").map((c) => c.charCodeAt(0)));
1133
- }
1134
- //#endregion
1135
- //#region src/transact.ts
1136
- function getPayloadFromTransaction(transaction) {
1137
- return fromUint8Array("version" in transaction ? transaction.serialize() : transaction.serialize({
1138
- requireAllSignatures: false,
1139
- verifySignatures: false
1140
- }));
1141
- }
1142
- function getTransactionFromWireMessage(byteArray) {
1143
- const messageOffset = byteArray[0] * web3_js.SIGNATURE_LENGTH_IN_BYTES + 1;
1144
- if (web3_js.VersionedMessage.deserializeMessageVersion(byteArray.slice(messageOffset, byteArray.length)) === "legacy") return web3_js.Transaction.from(byteArray);
1145
- else return web3_js.VersionedTransaction.deserialize(byteArray);
1146
- }
1147
- async function transact(callback, config) {
1148
- const augmentedCallback = (wallet) => {
1149
- return callback(augmentWalletAPI(wallet));
1150
- };
1151
- return await transact$1(augmentedCallback, config);
1152
- }
1153
- async function startRemoteScenario(config) {
1154
- const { wallet, close, associationUrl } = await startRemoteScenario$1(config);
1155
- return {
1156
- wallet: wallet.then((wallet) => {
1157
- return augmentWalletAPI(wallet);
1158
- }),
1159
- close,
1160
- associationUrl
1161
- };
1162
- }
1163
- function augmentWalletAPI(wallet) {
1164
- return new Proxy({}, {
1165
- get(target, p) {
1166
- if (target[p] == null) switch (p) {
1167
- case "signAndSendTransactions":
1168
- target[p] = async function({ minContextSlot, commitment, skipPreflight, maxRetries, waitForCommitmentToSendNextTransaction, transactions, ...rest }) {
1169
- const payloads = transactions.map(getPayloadFromTransaction);
1170
- const options = {
1171
- min_context_slot: minContextSlot,
1172
- commitment,
1173
- skip_preflight: skipPreflight,
1174
- max_retries: maxRetries,
1175
- wait_for_commitment_to_send_next_transaction: waitForCommitmentToSendNextTransaction
1176
- };
1177
- const { signatures: base64EncodedSignatures } = await wallet.signAndSendTransactions({
1178
- ...rest,
1179
- ...Object.values(options).some((element) => element != null) ? { options } : null,
1180
- payloads
1181
- });
1182
- return base64EncodedSignatures.map(toUint8Array).map(bs58.encode);
1183
- };
1184
- break;
1185
- case "signMessages":
1186
- target[p] = async function({ payloads, ...rest }) {
1187
- const base64EncodedPayloads = payloads.map(fromUint8Array);
1188
- const { signed_payloads: base64EncodedSignedMessages } = await wallet.signMessages({
1189
- ...rest,
1190
- payloads: base64EncodedPayloads
1191
- });
1192
- return base64EncodedSignedMessages.map(toUint8Array);
1193
- };
1194
- break;
1195
- case "signTransactions":
1196
- target[p] = async function({ transactions, ...rest }) {
1197
- const payloads = transactions.map(getPayloadFromTransaction);
1198
- const { signed_payloads: base64EncodedCompiledTransactions } = await wallet.signTransactions({
1199
- ...rest,
1200
- payloads
1201
- });
1202
- return base64EncodedCompiledTransactions.map(toUint8Array).map(getTransactionFromWireMessage);
1203
- };
1204
- break;
1205
- default:
1206
- target[p] = wallet[p];
1207
- break;
1208
- }
1209
- return target[p];
1210
- },
1211
- defineProperty() {
1212
- return false;
1213
- },
1214
- deleteProperty() {
1215
- return false;
1216
- }
1217
- });
1218
- }
1219
-
1220
- exports.startRemoteScenario = startRemoteScenario;
1221
- exports.transact = transact;
1222
- //# sourceMappingURL=index.browser-BkNaRRVe.js.map