@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.
package/dist/index.js ADDED
@@ -0,0 +1,452 @@
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/index.ts
34
+ var src_exports = {};
35
+ __export(src_exports, {
36
+ createEthereumPlugin: () => createEthereumPlugin,
37
+ createExtensionPlugin: () => createExtensionPlugin,
38
+ createPhantom: () => createPhantom,
39
+ isPhantomExtensionInstalled: () => isInstalled
40
+ });
41
+ module.exports = __toCommonJS(src_exports);
42
+
43
+ // src/extension/isInstalled.ts
44
+ function isInstalled() {
45
+ try {
46
+ const phantom = window.phantom;
47
+ return !!phantom;
48
+ } catch (error) {
49
+ return false;
50
+ }
51
+ }
52
+
53
+ // src/extension/plugin.ts
54
+ var extension = {
55
+ isInstalled
56
+ };
57
+ function createExtensionPlugin() {
58
+ return {
59
+ name: "extension",
60
+ create: () => extension
61
+ };
62
+ }
63
+
64
+ // src/ethereum/strategies/injected.ts
65
+ var MAX_RETRIES = 4;
66
+ var BASE_DELAY = 100;
67
+ var _getProvider, getProvider_fn;
68
+ var InjectedEthereumStrategy = class {
69
+ constructor() {
70
+ __privateAdd(this, _getProvider);
71
+ this.type = "injected" /* INJECTED */;
72
+ }
73
+ load() {
74
+ let retryCount = 0;
75
+ const scheduleRetry = (resolve, reject) => {
76
+ const delay = BASE_DELAY * Math.pow(2, Math.min(retryCount, 5));
77
+ setTimeout(() => {
78
+ if (__privateMethod(this, _getProvider, getProvider_fn).call(this)) {
79
+ resolve();
80
+ return;
81
+ }
82
+ retryCount++;
83
+ if (retryCount >= MAX_RETRIES) {
84
+ reject();
85
+ } else {
86
+ scheduleRetry(resolve, reject);
87
+ }
88
+ }, delay);
89
+ };
90
+ return new Promise((resolve, reject) => {
91
+ scheduleRetry(() => resolve(this), reject);
92
+ });
93
+ }
94
+ get isConnected() {
95
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
96
+ return provider?.isConnected && provider.selectedAddress ? true : false;
97
+ }
98
+ async connect({ onlyIfTrusted }) {
99
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
100
+ if (!provider) {
101
+ throw new Error("Provider not found.");
102
+ }
103
+ if (provider.isConnected && provider.selectedAddress) {
104
+ return this.getAccounts();
105
+ }
106
+ try {
107
+ const accounts = await provider.request({
108
+ method: onlyIfTrusted ? "eth_accounts" : "eth_requestAccounts"
109
+ });
110
+ return accounts;
111
+ } catch (_) {
112
+ return void 0;
113
+ }
114
+ }
115
+ async disconnect() {
116
+ return Promise.resolve();
117
+ }
118
+ async getAccounts() {
119
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
120
+ if (!provider) {
121
+ return [];
122
+ }
123
+ try {
124
+ const accounts = await provider.request({ method: "eth_accounts" });
125
+ return accounts || [];
126
+ } catch (_) {
127
+ return [];
128
+ }
129
+ }
130
+ async signMessage(message, address) {
131
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
132
+ if (!provider) {
133
+ throw new Error("Provider not found.");
134
+ }
135
+ if (!provider.isConnected) {
136
+ throw new Error("Provider is not connected.");
137
+ }
138
+ const signature = await provider.request({
139
+ method: "eth_sign",
140
+ params: [address, message]
141
+ });
142
+ return signature;
143
+ }
144
+ async signPersonalMessage(message, address) {
145
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
146
+ if (!provider) {
147
+ throw new Error("Provider not found.");
148
+ }
149
+ if (!provider.isConnected) {
150
+ throw new Error("Provider is not connected.");
151
+ }
152
+ const signature = await provider.request({
153
+ method: "personal_sign",
154
+ params: [message, address]
155
+ });
156
+ return signature;
157
+ }
158
+ async signTypedData(typedData, address) {
159
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
160
+ if (!provider) {
161
+ throw new Error("Provider not found.");
162
+ }
163
+ if (!provider.isConnected) {
164
+ throw new Error("Provider is not connected.");
165
+ }
166
+ const signature = await provider.request({
167
+ method: "eth_signTypedData_v4",
168
+ params: [address, JSON.stringify(typedData)]
169
+ });
170
+ return signature;
171
+ }
172
+ async signIn(signInData) {
173
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
174
+ if (!provider) {
175
+ throw new Error("Provider not found.");
176
+ }
177
+ const message = `Sign in to ${signInData.domain || "this application"}`;
178
+ const address = provider.selectedAddress;
179
+ if (!address) {
180
+ throw new Error("No address available.");
181
+ }
182
+ const signature = await this.signPersonalMessage(message, address);
183
+ return {
184
+ address,
185
+ signature,
186
+ signedMessage: message
187
+ };
188
+ }
189
+ async sendTransaction(transaction) {
190
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
191
+ if (!provider) {
192
+ throw new Error("Provider not found.");
193
+ }
194
+ if (!provider.isConnected) {
195
+ throw new Error("Provider is not connected.");
196
+ }
197
+ const txHash = await provider.request({
198
+ method: "eth_sendTransaction",
199
+ params: [transaction]
200
+ });
201
+ return txHash;
202
+ }
203
+ async signTransaction(transaction) {
204
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
205
+ if (!provider) {
206
+ throw new Error("Provider not found.");
207
+ }
208
+ if (!provider.isConnected) {
209
+ throw new Error("Provider is not connected.");
210
+ }
211
+ const signedTx = await provider.request({
212
+ method: "eth_signTransaction",
213
+ params: [transaction]
214
+ });
215
+ return signedTx;
216
+ }
217
+ async getChainId() {
218
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
219
+ if (!provider) {
220
+ throw new Error("Provider not found.");
221
+ }
222
+ const chainId = await provider.request({ method: "eth_chainId" });
223
+ return chainId;
224
+ }
225
+ async switchChain(chainId) {
226
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
227
+ if (!provider) {
228
+ throw new Error("Provider not found.");
229
+ }
230
+ await provider.request({
231
+ method: "wallet_switchEthereumChain",
232
+ params: [{ chainId }]
233
+ });
234
+ }
235
+ };
236
+ _getProvider = new WeakSet();
237
+ getProvider_fn = function() {
238
+ return window?.phantom?.ethereum;
239
+ };
240
+
241
+ // src/ethereum/getProvider.ts
242
+ async function getProvider(strategy = "injected" /* INJECTED */) {
243
+ if (strategy === "injected") {
244
+ const provider = new InjectedEthereumStrategy();
245
+ try {
246
+ await provider.load();
247
+ return provider;
248
+ } catch (error) {
249
+ throw new Error("Provider not found.");
250
+ }
251
+ } else {
252
+ throw new Error("Invalid provider type.");
253
+ }
254
+ }
255
+
256
+ // src/ethereum/eventListeners.ts
257
+ var eventListeners = /* @__PURE__ */ new Map();
258
+ function addEventListener(event, callback) {
259
+ if (!eventListeners.has(event)) {
260
+ eventListeners.set(event, /* @__PURE__ */ new Set());
261
+ }
262
+ const listeners = eventListeners.get(event);
263
+ listeners.add(callback);
264
+ return () => removeEventListener(event, callback);
265
+ }
266
+ function removeEventListener(event, callback) {
267
+ const listeners = eventListeners.get(event);
268
+ if (listeners) {
269
+ listeners.delete(callback);
270
+ }
271
+ }
272
+ function triggerEvent(event, data) {
273
+ const listeners = eventListeners.get(event);
274
+ if (listeners) {
275
+ listeners.forEach((callback) => {
276
+ try {
277
+ callback(data);
278
+ } catch (error) {
279
+ console.error(`Error in ${event} event listener:`, error);
280
+ }
281
+ });
282
+ }
283
+ }
284
+
285
+ // src/ethereum/connect.ts
286
+ async function connect() {
287
+ const provider = await getProvider();
288
+ if (!provider) {
289
+ throw new Error("Provider not found.");
290
+ }
291
+ if (provider.isConnected) {
292
+ const accounts = await provider.getAccounts();
293
+ return accounts;
294
+ }
295
+ try {
296
+ const accounts = await provider.connect({ onlyIfTrusted: true });
297
+ if (accounts && accounts.length > 0) {
298
+ triggerEvent("connect", accounts);
299
+ return accounts;
300
+ }
301
+ } catch (error) {
302
+ }
303
+ try {
304
+ const accounts = await provider.connect({ onlyIfTrusted: false });
305
+ if (accounts && accounts.length > 0) {
306
+ triggerEvent("connect", accounts);
307
+ return accounts;
308
+ }
309
+ } catch (error) {
310
+ }
311
+ throw new Error("Failed to connect to Phantom.");
312
+ }
313
+
314
+ // src/ethereum/disconnect.ts
315
+ async function disconnect() {
316
+ const provider = await getProvider();
317
+ if (!provider) {
318
+ throw new Error("Provider not found.");
319
+ }
320
+ await provider.disconnect();
321
+ triggerEvent("disconnect", []);
322
+ }
323
+
324
+ // src/ethereum/getAccounts.ts
325
+ async function getAccounts() {
326
+ const provider = await getProvider();
327
+ if (!provider) {
328
+ throw new Error("Provider not found.");
329
+ }
330
+ return provider.getAccounts();
331
+ }
332
+
333
+ // src/ethereum/signMessage.ts
334
+ async function signMessage(message, address) {
335
+ const provider = await getProvider();
336
+ if (!provider) {
337
+ throw new Error("Provider not found.");
338
+ }
339
+ if (!provider.isConnected) {
340
+ await provider.connect({ onlyIfTrusted: false });
341
+ }
342
+ return provider.signMessage(message, address);
343
+ }
344
+ async function signPersonalMessage(message, address) {
345
+ const provider = await getProvider();
346
+ if (!provider) {
347
+ throw new Error("Provider not found.");
348
+ }
349
+ if (!provider.isConnected) {
350
+ await provider.connect({ onlyIfTrusted: false });
351
+ }
352
+ return provider.signPersonalMessage(message, address);
353
+ }
354
+ async function signTypedData(typedData, address) {
355
+ const provider = await getProvider();
356
+ if (!provider) {
357
+ throw new Error("Provider not found.");
358
+ }
359
+ if (!provider.isConnected) {
360
+ await provider.connect({ onlyIfTrusted: false });
361
+ }
362
+ return provider.signTypedData(typedData, address);
363
+ }
364
+
365
+ // src/ethereum/signIn.ts
366
+ async function signIn(signInData) {
367
+ const provider = await getProvider();
368
+ if (!provider) {
369
+ throw new Error("Provider not found.");
370
+ }
371
+ if (!provider.isConnected) {
372
+ await provider.connect({ onlyIfTrusted: false });
373
+ }
374
+ return provider.signIn(signInData);
375
+ }
376
+
377
+ // src/ethereum/sendTransaction.ts
378
+ async function sendTransaction(transaction) {
379
+ const provider = await getProvider();
380
+ if (!provider) {
381
+ throw new Error("Provider not found.");
382
+ }
383
+ if (!provider.isConnected) {
384
+ await provider.connect({ onlyIfTrusted: false });
385
+ }
386
+ return provider.sendTransaction(transaction);
387
+ }
388
+ async function signTransaction(transaction) {
389
+ const provider = await getProvider();
390
+ if (!provider) {
391
+ throw new Error("Provider not found.");
392
+ }
393
+ if (!provider.isConnected) {
394
+ await provider.connect({ onlyIfTrusted: false });
395
+ }
396
+ return provider.signTransaction(transaction);
397
+ }
398
+
399
+ // src/ethereum/chainUtils.ts
400
+ async function getChainId() {
401
+ const provider = await getProvider();
402
+ if (!provider) {
403
+ throw new Error("Provider not found.");
404
+ }
405
+ return provider.getChainId();
406
+ }
407
+ async function switchChain(chainId) {
408
+ const provider = await getProvider();
409
+ if (!provider) {
410
+ throw new Error("Provider not found.");
411
+ }
412
+ return provider.switchChain(chainId);
413
+ }
414
+
415
+ // src/ethereum/plugin.ts
416
+ var ethereum = {
417
+ connect,
418
+ disconnect,
419
+ getAccounts,
420
+ signMessage,
421
+ signPersonalMessage,
422
+ signTypedData,
423
+ signIn,
424
+ sendTransaction,
425
+ signTransaction,
426
+ getChainId,
427
+ switchChain,
428
+ addEventListener,
429
+ removeEventListener
430
+ };
431
+ function createEthereumPlugin() {
432
+ return {
433
+ name: "ethereum",
434
+ create: () => ethereum
435
+ };
436
+ }
437
+
438
+ // src/index.ts
439
+ function createPhantom({ plugins = [] }) {
440
+ const phantom = {};
441
+ for (const plugin of plugins) {
442
+ phantom[plugin.name] = plugin.create();
443
+ }
444
+ return phantom;
445
+ }
446
+ // Annotate the CommonJS export names for ESM import in node:
447
+ 0 && (module.exports = {
448
+ createEthereumPlugin,
449
+ createExtensionPlugin,
450
+ createPhantom,
451
+ isPhantomExtensionInstalled
452
+ });
package/dist/index.mjs ADDED
@@ -0,0 +1,41 @@
1
+ import {
2
+ createEthereumPlugin
3
+ } from "./chunk-QNVIOBKG.mjs";
4
+ import "./chunk-WUKYLWAZ.mjs";
5
+ import "./chunk-GV6AIHPN.mjs";
6
+
7
+ // src/extension/isInstalled.ts
8
+ function isInstalled() {
9
+ try {
10
+ const phantom = window.phantom;
11
+ return !!phantom;
12
+ } catch (error) {
13
+ return false;
14
+ }
15
+ }
16
+
17
+ // src/extension/plugin.ts
18
+ var extension = {
19
+ isInstalled
20
+ };
21
+ function createExtensionPlugin() {
22
+ return {
23
+ name: "extension",
24
+ create: () => extension
25
+ };
26
+ }
27
+
28
+ // src/index.ts
29
+ function createPhantom({ plugins = [] }) {
30
+ const phantom = {};
31
+ for (const plugin of plugins) {
32
+ phantom[plugin.name] = plugin.create();
33
+ }
34
+ return phantom;
35
+ }
36
+ export {
37
+ createEthereumPlugin,
38
+ createExtensionPlugin,
39
+ createPhantom,
40
+ isInstalled as isPhantomExtensionInstalled
41
+ };
@@ -0,0 +1,139 @@
1
+ import { P as Plugin } from '../index-2f448acb.js';
2
+ import { Transaction as Transaction$1 } from '@solana/kit';
3
+ import { VersionedTransaction as VersionedTransaction$1 } from '@solana/web3.js';
4
+
5
+ declare function connect(): Promise<string | undefined>;
6
+
7
+ declare function disconnect(): Promise<void>;
8
+
9
+ type Transaction = {
10
+ message: Uint8Array;
11
+ recentBlockhash: string;
12
+ feePayer: string;
13
+ instructions: any[];
14
+ signers: string[];
15
+ version: number;
16
+ };
17
+ type VersionedTransaction = {
18
+ signatures: Uint8Array[];
19
+ message: {
20
+ deserialize: (serializedTransaction: Uint8Array) => VersionedTransaction;
21
+ serialize: (transaction: VersionedTransaction) => Uint8Array;
22
+ };
23
+ };
24
+ type SendOptions = {
25
+ skipPreflight?: boolean;
26
+ preflightCommitment?: string;
27
+ maxRetries?: number;
28
+ minContextSlot?: number;
29
+ };
30
+ type PublicKey = {
31
+ toString: () => string;
32
+ toBase58: () => string;
33
+ };
34
+ type SolanaSignInData = {
35
+ domain?: string;
36
+ address?: string;
37
+ statement?: string;
38
+ uri?: string;
39
+ version?: string;
40
+ chainId?: string;
41
+ nonce?: string;
42
+ issuedAt?: string;
43
+ expirationTime?: string;
44
+ notBefore?: string;
45
+ requestId?: string;
46
+ resources?: string[];
47
+ };
48
+ type DisplayEncoding = "utf8" | "hex";
49
+ type PhantomEventType = "connect" | "disconnect" | "accountChanged";
50
+ interface PhantomSolanaProvider {
51
+ isPhantom: boolean;
52
+ publicKey: PublicKey | null;
53
+ isConnected: boolean;
54
+ connect: (opts?: {
55
+ onlyIfTrusted?: boolean;
56
+ }) => Promise<{
57
+ publicKey: PublicKey;
58
+ }>;
59
+ disconnect: () => Promise<void>;
60
+ signMessage: (message: Uint8Array, display?: DisplayEncoding) => Promise<{
61
+ signature: Uint8Array;
62
+ publicKey: PublicKey;
63
+ }>;
64
+ signIn: (signInData: SolanaSignInData) => Promise<{
65
+ address: PublicKey;
66
+ signature: Uint8Array;
67
+ signedMessage: Uint8Array;
68
+ }>;
69
+ signAndSendTransaction: (transaction: Transaction | VersionedTransaction, options?: SendOptions) => Promise<{
70
+ signature: string;
71
+ publicKey?: string;
72
+ }>;
73
+ signAllTransactions: (transactions: (Transaction | VersionedTransaction)[]) => Promise<(Transaction | VersionedTransaction)[]>;
74
+ signTransaction: (transaction: Transaction | VersionedTransaction) => Promise<Transaction | VersionedTransaction>;
75
+ on: (event: "connect" | "disconnect" | "accountChanged", handler: (publicKey?: PublicKey) => void) => void;
76
+ off: (event: "connect" | "disconnect" | "accountChanged", handler: (publicKey?: PublicKey) => void) => void;
77
+ }
78
+
79
+ type ConnectCallback = (publicKey: string) => void;
80
+ type DisconnectCallback = () => void;
81
+ type AccountChangedCallback = (publicKey: string) => void;
82
+ type PhantomEventCallback = ConnectCallback | DisconnectCallback | AccountChangedCallback;
83
+
84
+ declare function getAccount(): Promise<string | undefined>;
85
+
86
+ /**
87
+ * Signs and sends a transaction using the Phantom provider.
88
+ * @param transaction The transaction to sign and send.
89
+ * @returns A promise that resolves with the transaction signature and optionally the public key.
90
+ * @throws Error if Phantom provider is not found or if the operation fails.
91
+ */
92
+ declare function signAndSendTransaction(transaction: Transaction$1 | VersionedTransaction$1): Promise<{
93
+ signature: string;
94
+ address?: string;
95
+ }>;
96
+
97
+ /**
98
+ * Signs in with Solana using the Phantom provider.
99
+ * @param signInData The sign-in data.
100
+ * @returns A promise that resolves with the address, signature, and signed message.
101
+ * @throws Error if Phantom provider is not found or if the operation fails.
102
+ */
103
+ declare function signIn(signInData: SolanaSignInData): Promise<{
104
+ address: string;
105
+ signature: Uint8Array;
106
+ signedMessage: Uint8Array;
107
+ }>;
108
+
109
+ /**
110
+ * Signs a message using the Phantom provider.
111
+ * @param message The message to sign (as a Uint8Array).
112
+ * @param display The display encoding for the message (optional, defaults to utf8).
113
+ * @returns A promise that resolves with the signature and public key.
114
+ * @throws Error if Phantom provider is not found or if the operation fails.
115
+ */
116
+ declare function signMessage(message: Uint8Array, display?: DisplayEncoding): Promise<{
117
+ signature: Uint8Array;
118
+ address: string;
119
+ }>;
120
+
121
+ type Solana = {
122
+ connect: typeof connect;
123
+ disconnect: typeof disconnect;
124
+ getAccount: typeof getAccount;
125
+ signMessage: typeof signMessage;
126
+ signIn: typeof signIn;
127
+ signAndSendTransaction: typeof signAndSendTransaction;
128
+ addEventListener: (event: PhantomEventType, callback: PhantomEventCallback) => () => void;
129
+ removeEventListener: (event: PhantomEventType, callback: PhantomEventCallback) => void;
130
+ };
131
+ declare function createSolanaPlugin(): Plugin<Solana>;
132
+
133
+ declare module "../index" {
134
+ interface Phantom {
135
+ solana: Solana;
136
+ }
137
+ }
138
+
139
+ export { PhantomSolanaProvider, SolanaSignInData, createSolanaPlugin };