@phantom/browser-injected-sdk 0.0.9

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.
@@ -0,0 +1,413 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var __accessCheck = (obj, member, msg) => {
20
+ if (!member.has(obj))
21
+ throw TypeError("Cannot " + msg);
22
+ };
23
+ var __privateAdd = (obj, member, value) => {
24
+ if (member.has(obj))
25
+ throw TypeError("Cannot add the same private member more than once");
26
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
27
+ };
28
+ var __privateMethod = (obj, member, method) => {
29
+ __accessCheck(obj, member, "access private method");
30
+ return method;
31
+ };
32
+
33
+ // src/solana/index.ts
34
+ var solana_exports = {};
35
+ __export(solana_exports, {
36
+ createSolanaPlugin: () => createSolanaPlugin
37
+ });
38
+ module.exports = __toCommonJS(solana_exports);
39
+
40
+ // src/solana/utils/transactionToVersionedTransaction.ts
41
+ var import_transactions = require("@solana/transactions");
42
+ function transactionToVersionedTransaction(transaction) {
43
+ const serialized = (0, import_transactions.getTransactionEncoder)().encode(transaction);
44
+ const fakeVersioned = {
45
+ serialize() {
46
+ return new Uint8Array(serialized);
47
+ }
48
+ };
49
+ return fakeVersioned;
50
+ }
51
+
52
+ // src/solana/strategies/injected.ts
53
+ var import_compat = require("@solana/compat");
54
+ var MAX_RETRIES = 4;
55
+ var BASE_DELAY = 100;
56
+ var _getProvider, getProvider_fn;
57
+ var InjectedSolanaStrategy = class {
58
+ constructor() {
59
+ __privateAdd(this, _getProvider);
60
+ this.type = "injected" /* INJECTED */;
61
+ }
62
+ load() {
63
+ let retryCount = 0;
64
+ const scheduleRetry = (resolve, reject) => {
65
+ const delay = BASE_DELAY * Math.pow(2, Math.min(retryCount, 5));
66
+ setTimeout(() => {
67
+ if (__privateMethod(this, _getProvider, getProvider_fn).call(this)) {
68
+ resolve();
69
+ return;
70
+ }
71
+ retryCount++;
72
+ if (retryCount >= MAX_RETRIES) {
73
+ reject();
74
+ } else {
75
+ scheduleRetry(resolve, reject);
76
+ }
77
+ }, delay);
78
+ };
79
+ return new Promise((resolve, reject) => {
80
+ scheduleRetry(() => resolve(this), reject);
81
+ });
82
+ }
83
+ get isConnected() {
84
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
85
+ return provider?.isConnected && provider.publicKey ? true : false;
86
+ }
87
+ async connect({ onlyIfTrusted }) {
88
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
89
+ if (!provider) {
90
+ throw new Error("Provider not found.");
91
+ }
92
+ if (provider.isConnected && provider.publicKey) {
93
+ return this.getAccount() ?? void 0;
94
+ }
95
+ try {
96
+ const result = await provider.connect({ onlyIfTrusted });
97
+ return result.publicKey.toString();
98
+ } catch (_) {
99
+ return void 0;
100
+ }
101
+ }
102
+ async disconnect() {
103
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
104
+ if (!provider) {
105
+ throw new Error("Provider not found.");
106
+ }
107
+ await provider.disconnect();
108
+ }
109
+ async getAccount() {
110
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
111
+ if (provider && provider.isConnected && provider.publicKey) {
112
+ return Promise.resolve(provider.publicKey.toString());
113
+ }
114
+ return Promise.resolve(void 0);
115
+ }
116
+ async signMessage(message, display) {
117
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
118
+ if (!provider) {
119
+ throw new Error("Provider not found.");
120
+ }
121
+ if (!provider.isConnected) {
122
+ throw new Error("Provider is not connected.");
123
+ }
124
+ const result = await provider.signMessage(message, display);
125
+ return {
126
+ signature: result.signature,
127
+ address: result.publicKey.toString()
128
+ };
129
+ }
130
+ async signIn(signInData) {
131
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
132
+ if (!provider) {
133
+ throw new Error("Provider not found.");
134
+ }
135
+ const result = await provider.signIn(signInData);
136
+ return {
137
+ address: result.address.toString(),
138
+ signature: result.signature,
139
+ signedMessage: result.signedMessage
140
+ };
141
+ }
142
+ async signAndSendTransaction(transaction) {
143
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
144
+ if (!provider) {
145
+ throw new Error("Provider not found.");
146
+ }
147
+ if (!provider.isConnected) {
148
+ throw new Error("Provider is not connected.");
149
+ }
150
+ const versionedTransaction = transactionToVersionedTransaction(transaction);
151
+ const result = await provider.signAndSendTransaction(versionedTransaction);
152
+ return {
153
+ signature: result.signature,
154
+ address: result.publicKey
155
+ };
156
+ }
157
+ async signTransaction(transaction) {
158
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
159
+ if (!provider) {
160
+ throw new Error("Provider not found.");
161
+ }
162
+ if (!provider.isConnected) {
163
+ throw new Error("Provider is not connected.");
164
+ }
165
+ const versionedTransaction = transactionToVersionedTransaction(transaction);
166
+ const result = await provider.signTransaction(versionedTransaction);
167
+ const responseTransaction = (0, import_compat.fromVersionedTransaction)(result);
168
+ return responseTransaction;
169
+ }
170
+ async signAllTransactions(transactions) {
171
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
172
+ if (!provider) {
173
+ throw new Error("Provider not found.");
174
+ }
175
+ if (!provider.isConnected) {
176
+ throw new Error("Provider is not connected.");
177
+ }
178
+ const versionedTransactions = transactions.map(
179
+ (transaction) => transactionToVersionedTransaction(transaction)
180
+ );
181
+ const result = await provider.signAllTransactions(versionedTransactions);
182
+ const responseTransactions = result.map((transaction) => (0, import_compat.fromVersionedTransaction)(transaction));
183
+ return responseTransactions;
184
+ }
185
+ };
186
+ _getProvider = new WeakSet();
187
+ getProvider_fn = function() {
188
+ return window?.phantom?.solana;
189
+ };
190
+
191
+ // src/solana/strategies/deeplinks.ts
192
+ var DeepLinkSolanaStrategy = class {
193
+ constructor() {
194
+ this.type = "deeplink" /* DEEPLINK */;
195
+ }
196
+ load() {
197
+ return Promise.resolve(this);
198
+ }
199
+ get isConnected() {
200
+ return true;
201
+ }
202
+ async connect({ onlyIfTrusted }) {
203
+ const deeplink = `phantom://connect?onlyIfTrusted=${onlyIfTrusted}`;
204
+ window.location.href = deeplink;
205
+ return Promise.resolve(void 0);
206
+ }
207
+ async disconnect() {
208
+ const deeplink = `phantom://disconnect`;
209
+ window.location.href = deeplink;
210
+ return Promise.resolve();
211
+ }
212
+ async getAccount() {
213
+ const deeplink = `phantom://account`;
214
+ window.location.href = deeplink;
215
+ return Promise.resolve(void 0);
216
+ }
217
+ async signMessage(message, display) {
218
+ const messageEncoded = Buffer.from(message).toString("base64");
219
+ const deeplink = `phantom://sign-message?message=${messageEncoded}&display=${display}`;
220
+ window.location.href = deeplink;
221
+ return Promise.resolve({
222
+ signature: new Uint8Array(),
223
+ address: ""
224
+ });
225
+ }
226
+ async signIn(signInData) {
227
+ const deeplink = `phantom://sign-in?signInData=${encodeURIComponent(JSON.stringify(signInData))}`;
228
+ window.location.href = deeplink;
229
+ return Promise.resolve({
230
+ address: "",
231
+ signature: new Uint8Array(),
232
+ signedMessage: new Uint8Array()
233
+ });
234
+ }
235
+ async signAndSendTransaction(transaction) {
236
+ const deeplink = `phantom://sign-and-send-transaction?transaction=${transaction}`;
237
+ window.location.href = deeplink;
238
+ return Promise.resolve({
239
+ signature: "",
240
+ address: ""
241
+ });
242
+ }
243
+ async signTransaction(transaction) {
244
+ const deeplink = `phantom://sign-transaction?transaction=${transaction}`;
245
+ window.location.href = deeplink;
246
+ return Promise.resolve(transaction);
247
+ }
248
+ async signAllTransactions(transactions) {
249
+ const deeplink = `phantom://sign-all-transactions?transactions=${transactions}`;
250
+ window.location.href = deeplink;
251
+ return Promise.resolve(transactions);
252
+ }
253
+ };
254
+
255
+ // src/solana/getProvider.ts
256
+ async function getProvider(strategy = "injected" /* INJECTED */) {
257
+ if (strategy === "injected") {
258
+ const provider = new InjectedSolanaStrategy();
259
+ try {
260
+ await provider.load();
261
+ return provider;
262
+ } catch (error) {
263
+ throw new Error("Provider not found.");
264
+ }
265
+ } else if (strategy === "deeplink") {
266
+ return new DeepLinkSolanaStrategy();
267
+ } else {
268
+ throw new Error("Invalid provider type.");
269
+ }
270
+ }
271
+
272
+ // src/solana/eventListeners.ts
273
+ var eventCallbacks = /* @__PURE__ */ new Map();
274
+ function addEventListener(event, callback) {
275
+ if (!eventCallbacks.has(event)) {
276
+ eventCallbacks.set(event, /* @__PURE__ */ new Set());
277
+ }
278
+ eventCallbacks.get(event).add(callback);
279
+ return () => {
280
+ removeEventListener(event, callback);
281
+ };
282
+ }
283
+ function removeEventListener(event, callback) {
284
+ if (eventCallbacks.has(event)) {
285
+ eventCallbacks.get(event).delete(callback);
286
+ if (eventCallbacks.get(event).size === 0) {
287
+ eventCallbacks.delete(event);
288
+ }
289
+ }
290
+ }
291
+ function triggerEvent(event, ...args) {
292
+ if (eventCallbacks.has(event)) {
293
+ eventCallbacks.get(event).forEach((cb) => {
294
+ if (event === "connect" && args[0] && typeof args[0] === "string") {
295
+ cb(args[0]);
296
+ } else if (event === "disconnect") {
297
+ cb();
298
+ } else if (event === "accountChanged" && args[0] && typeof args[0] === "string") {
299
+ cb(args[0]);
300
+ }
301
+ });
302
+ }
303
+ }
304
+
305
+ // src/solana/connect.ts
306
+ async function connect() {
307
+ const provider = await getProvider();
308
+ if (!provider) {
309
+ throw new Error("Provider not found.");
310
+ }
311
+ if (provider.isConnected) {
312
+ return provider.getAccount();
313
+ }
314
+ try {
315
+ const address = await provider.connect({ onlyIfTrusted: true });
316
+ if (address) {
317
+ triggerEvent("connect", address);
318
+ return address;
319
+ }
320
+ } catch (error) {
321
+ }
322
+ try {
323
+ const address = await provider.connect({ onlyIfTrusted: false });
324
+ if (address) {
325
+ triggerEvent("connect", address);
326
+ return address;
327
+ }
328
+ } catch (error) {
329
+ }
330
+ throw new Error("Failed to connect to Phantom.");
331
+ }
332
+
333
+ // src/solana/disconnect.ts
334
+ async function disconnect() {
335
+ const provider = await getProvider();
336
+ if (!provider) {
337
+ throw new Error("Provider not found.");
338
+ }
339
+ await provider.disconnect();
340
+ triggerEvent("disconnect");
341
+ }
342
+
343
+ // src/solana/getAccount.ts
344
+ async function getAccount() {
345
+ const provider = await getProvider();
346
+ return provider.getAccount();
347
+ }
348
+
349
+ // src/solana/signAndSendTransaction.ts
350
+ var import_compat2 = require("@solana/compat");
351
+ async function signAndSendTransaction(transaction) {
352
+ const provider = await getProvider();
353
+ if (!provider) {
354
+ throw new Error("Provider not found.");
355
+ }
356
+ if (!provider.isConnected) {
357
+ await provider.connect({ onlyIfTrusted: false });
358
+ }
359
+ let kitTransaction;
360
+ if (transaction?.messageBytes == null) {
361
+ kitTransaction = (0, import_compat2.fromVersionedTransaction)(transaction);
362
+ } else {
363
+ kitTransaction = transaction;
364
+ }
365
+ return provider.signAndSendTransaction(kitTransaction);
366
+ }
367
+
368
+ // src/solana/signIn.ts
369
+ async function signIn(signInData) {
370
+ const provider = await getProvider();
371
+ if (!provider) {
372
+ throw new Error("Provider not found.");
373
+ }
374
+ const result = await provider.signIn(signInData);
375
+ if (result.address) {
376
+ triggerEvent("connect", result.address);
377
+ }
378
+ return result;
379
+ }
380
+
381
+ // src/solana/signMessage.ts
382
+ async function signMessage(message, display) {
383
+ const provider = await getProvider();
384
+ if (!provider) {
385
+ throw new Error("Provider not found.");
386
+ }
387
+ if (!provider.isConnected) {
388
+ await provider.connect({ onlyIfTrusted: false });
389
+ }
390
+ return provider.signMessage(message, display);
391
+ }
392
+
393
+ // src/solana/plugin.ts
394
+ var solana = {
395
+ connect,
396
+ disconnect,
397
+ getAccount,
398
+ signMessage,
399
+ signIn,
400
+ signAndSendTransaction,
401
+ addEventListener,
402
+ removeEventListener
403
+ };
404
+ function createSolanaPlugin() {
405
+ return {
406
+ name: "solana",
407
+ create: () => solana
408
+ };
409
+ }
410
+ // Annotate the CommonJS export names for ESM import in node:
411
+ 0 && (module.exports = {
412
+ createSolanaPlugin
413
+ });