@phantom/browser-sdk 0.0.5 → 0.0.6

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/README.md CHANGED
@@ -34,14 +34,6 @@ const phantom = createPhantom({
34
34
  // Now you can use the Solana-specific methods
35
35
  async function connectAndSign() {
36
36
  try {
37
- // Get the Solana provider (Phantom wallet instance)
38
- const provider = phantom.solana.getProvider();
39
-
40
- if (!provider) {
41
- console.error("Phantom wallet not found. Please install Phantom.");
42
- return;
43
- }
44
-
45
37
  // Attempt to connect to the wallet
46
38
  const connectionResult = await phantom.solana.connect();
47
39
  console.log("Connection Result:", connectionResult.address);
@@ -68,14 +60,12 @@ connectAndSign();
68
60
 
69
61
  Once the `phantom.solana` object is initialized, you can access the following methods:
70
62
 
71
- - `getProvider(): PhantomSolanaProvider | null`
72
- - Retrieves the Phantom Solana provider instance.
73
63
  - `connect(opts?: { onlyIfTrusted?: boolean }): Promise<string>`
74
64
  - Connects to the Phantom wallet. Optionally, `onlyIfTrusted` can be set to true to only connect if the dApp is already trusted.
75
65
  - `disconnect(): Promise<void>`
76
66
  - Disconnects from the Phantom wallet.
77
- - `getAccount(): { status: "connected" | "disconnected"; address: string | null }`
78
- - Gets the current connected account state. When account is connected returns a public key, when it's not returns it as null.
67
+ - `getAccount(): Promise<string | undefined>`
68
+ - Gets the current connected address
79
69
  - `signIn(): Promise<SignInResult>`
80
70
  - Initiates a sign-in request to the wallet.
81
71
  - `signMessage(message: Uint8Array | string, display?: 'utf8' | 'hex'): Promise<SignedMessage>`
@@ -0,0 +1,18 @@
1
+ var __accessCheck = (obj, member, msg) => {
2
+ if (!member.has(obj))
3
+ throw TypeError("Cannot " + msg);
4
+ };
5
+ var __privateAdd = (obj, member, value) => {
6
+ if (member.has(obj))
7
+ throw TypeError("Cannot add the same private member more than once");
8
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
9
+ };
10
+ var __privateMethod = (obj, member, method) => {
11
+ __accessCheck(obj, member, "access private method");
12
+ return method;
13
+ };
14
+
15
+ export {
16
+ __privateAdd,
17
+ __privateMethod
18
+ };
package/dist/index.mjs CHANGED
@@ -1,3 +1,5 @@
1
+ import "./chunk-GV6AIHPN.mjs";
2
+
1
3
  // src/index.ts
2
4
  function createPhantom({ chainPlugins = [] }) {
3
5
  const phantom = {};
@@ -1,6 +1,10 @@
1
1
  import { ChainPlugin } from '../index.js';
2
2
  import { Transaction as Transaction$1 } from '@solana/kit';
3
3
 
4
+ declare function connect(): Promise<string | undefined>;
5
+
6
+ declare function disconnect(): Promise<void>;
7
+
4
8
  type Transaction = {
5
9
  message: Uint8Array;
6
10
  recentBlockhash: string;
@@ -71,16 +75,22 @@ interface PhantomSolanaProvider {
71
75
  off: (event: "connect" | "disconnect" | "accountChanged", handler: (publicKey?: PublicKey) => void) => void;
72
76
  }
73
77
 
78
+ type ConnectCallback = (publicKey: string) => void;
79
+ type DisconnectCallback = () => void;
80
+ type AccountChangedCallback = (publicKey: string) => void;
81
+ type PhantomEventCallback = ConnectCallback | DisconnectCallback | AccountChangedCallback;
82
+
83
+ declare function getAccount(): Promise<string | undefined>;
84
+
74
85
  /**
75
- * Signs a message using the Phantom provider.
76
- * @param message The message to sign (as a Uint8Array).
77
- * @param display The display encoding for the message (optional, defaults to utf8).
78
- * @returns A promise that resolves with the signature and public key.
86
+ * Signs and sends a transaction using the Phantom provider.
87
+ * @param transaction The transaction to sign and send.
88
+ * @returns A promise that resolves with the transaction signature and optionally the public key.
79
89
  * @throws Error if Phantom provider is not found or if the operation fails.
80
90
  */
81
- declare function signMessage(message: Uint8Array, display?: DisplayEncoding): Promise<{
82
- signature: Uint8Array;
83
- address: string;
91
+ declare function signAndSendTransaction(transaction: Transaction$1): Promise<{
92
+ signature: string;
93
+ address?: string;
84
94
  }>;
85
95
 
86
96
  /**
@@ -96,36 +106,18 @@ declare function signIn(signInData: SolanaSignInData): Promise<{
96
106
  }>;
97
107
 
98
108
  /**
99
- * Signs and sends a transaction using the Phantom provider.
100
- * @param transaction The transaction to sign and send.
101
- * @returns A promise that resolves with the transaction signature and optionally the public key.
109
+ * Signs a message using the Phantom provider.
110
+ * @param message The message to sign (as a Uint8Array).
111
+ * @param display The display encoding for the message (optional, defaults to utf8).
112
+ * @returns A promise that resolves with the signature and public key.
102
113
  * @throws Error if Phantom provider is not found or if the operation fails.
103
114
  */
104
- declare function signAndSendTransaction(transaction: Transaction$1): Promise<{
105
- signature: string;
106
- address?: string;
107
- }>;
108
-
109
- declare function connect(): Promise<string | undefined>;
110
-
111
- declare function disconnect(): Promise<void>;
112
-
113
- type ConnectCallback = (publicKey: string) => void;
114
- type DisconnectCallback = () => void;
115
- type AccountChangedCallback = (publicKey: string) => void;
116
- type PhantomEventCallback = ConnectCallback | DisconnectCallback | AccountChangedCallback;
117
-
118
- type GetAccountResult = {
119
- status: "connected";
115
+ declare function signMessage(message: Uint8Array, display?: DisplayEncoding): Promise<{
116
+ signature: Uint8Array;
120
117
  address: string;
121
- } | {
122
- status: "disconnected";
123
- address: null;
124
- };
125
- declare function getAccount(): GetAccountResult;
118
+ }>;
126
119
 
127
120
  type Solana = {
128
- getProvider: () => PhantomSolanaProvider | null;
129
121
  connect: typeof connect;
130
122
  disconnect: typeof disconnect;
131
123
  getAccount: typeof getAccount;
@@ -16,6 +16,19 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
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
+ };
19
32
 
20
33
  // src/solana/index.ts
21
34
  var solana_exports = {};
@@ -24,9 +37,165 @@ __export(solana_exports, {
24
37
  });
25
38
  module.exports = __toCommonJS(solana_exports);
26
39
 
27
- // src/solana/getProvider.ts
28
- function getProvider() {
29
- return window.phantom?.solana ?? null;
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/adapters/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 InjectedSolanaAdapter = class {
58
+ constructor() {
59
+ __privateAdd(this, _getProvider);
60
+ }
61
+ load() {
62
+ let retryCount = 0;
63
+ const scheduleRetry = (resolve, reject) => {
64
+ const delay = BASE_DELAY * Math.pow(2, Math.min(retryCount, 5));
65
+ setTimeout(() => {
66
+ if (__privateMethod(this, _getProvider, getProvider_fn).call(this)) {
67
+ resolve();
68
+ return;
69
+ }
70
+ retryCount++;
71
+ if (retryCount >= MAX_RETRIES) {
72
+ reject();
73
+ } else {
74
+ scheduleRetry(resolve, reject);
75
+ }
76
+ }, delay);
77
+ };
78
+ return new Promise((resolve, reject) => {
79
+ scheduleRetry(() => resolve(this), reject);
80
+ });
81
+ }
82
+ get isConnected() {
83
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
84
+ return provider?.isConnected && provider.publicKey ? true : false;
85
+ }
86
+ async connect({ onlyIfTrusted }) {
87
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
88
+ if (!provider) {
89
+ throw new Error("Phantom provider not found.");
90
+ }
91
+ if (provider.isConnected && provider.publicKey) {
92
+ return this.getAccount() ?? void 0;
93
+ }
94
+ try {
95
+ const result = await provider.connect({ onlyIfTrusted });
96
+ return result.publicKey.toString();
97
+ } catch (_) {
98
+ return void 0;
99
+ }
100
+ }
101
+ async disconnect() {
102
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
103
+ if (!provider) {
104
+ throw new Error("Phantom provider not found.");
105
+ }
106
+ await provider.disconnect();
107
+ }
108
+ async getAccount() {
109
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
110
+ if (provider && provider.isConnected && provider.publicKey) {
111
+ return Promise.resolve(provider.publicKey.toString());
112
+ }
113
+ return Promise.resolve(void 0);
114
+ }
115
+ async signMessage(message, display) {
116
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
117
+ if (!provider) {
118
+ throw new Error("Phantom provider not found.");
119
+ }
120
+ if (!provider.isConnected) {
121
+ throw new Error("Provider is not connected.");
122
+ }
123
+ const result = await provider.signMessage(message, display);
124
+ return {
125
+ signature: result.signature,
126
+ address: result.publicKey.toString()
127
+ };
128
+ }
129
+ async signIn(signInData) {
130
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
131
+ if (!provider) {
132
+ throw new Error("Phantom provider not found.");
133
+ }
134
+ const result = await provider.signIn(signInData);
135
+ return {
136
+ address: result.address.toString(),
137
+ signature: result.signature,
138
+ signedMessage: result.signedMessage
139
+ };
140
+ }
141
+ async signAndSendTransaction(transaction) {
142
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
143
+ if (!provider) {
144
+ throw new Error("Phantom provider not found.");
145
+ }
146
+ if (!provider.isConnected) {
147
+ throw new Error("Provider is not connected.");
148
+ }
149
+ const versionedTransaction = transactionToVersionedTransaction(transaction);
150
+ const result = await provider.signAndSendTransaction(versionedTransaction);
151
+ return {
152
+ signature: result.signature,
153
+ address: result.publicKey
154
+ };
155
+ }
156
+ async signTransaction(transaction) {
157
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
158
+ if (!provider) {
159
+ throw new Error("Phantom provider not found.");
160
+ }
161
+ if (!provider.isConnected) {
162
+ throw new Error("Provider is not connected.");
163
+ }
164
+ const versionedTransaction = transactionToVersionedTransaction(transaction);
165
+ const result = await provider.signTransaction(versionedTransaction);
166
+ const responseTransaction = (0, import_compat.fromVersionedTransaction)(result);
167
+ return responseTransaction;
168
+ }
169
+ async signAllTransactions(transactions) {
170
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
171
+ if (!provider) {
172
+ throw new Error("Phantom provider not found.");
173
+ }
174
+ if (!provider.isConnected) {
175
+ throw new Error("Provider is not connected.");
176
+ }
177
+ const versionedTransactions = transactions.map(
178
+ (transaction) => transactionToVersionedTransaction(transaction)
179
+ );
180
+ const result = await provider.signAllTransactions(versionedTransactions);
181
+ const responseTransactions = result.map((transaction) => (0, import_compat.fromVersionedTransaction)(transaction));
182
+ return responseTransactions;
183
+ }
184
+ };
185
+ _getProvider = new WeakSet();
186
+ getProvider_fn = function() {
187
+ return window?.phantom?.solana;
188
+ };
189
+
190
+ // src/solana/getAdapter.ts
191
+ async function getAdapter(_type = "injected") {
192
+ const adapter = new InjectedSolanaAdapter();
193
+ try {
194
+ await adapter.load();
195
+ return adapter;
196
+ } catch (error) {
197
+ throw new Error("Phantom provider not found.");
198
+ }
30
199
  }
31
200
 
32
201
  // src/solana/eventListeners.ts
@@ -64,136 +233,83 @@ function triggerEvent(event, ...args) {
64
233
 
65
234
  // src/solana/connect.ts
66
235
  async function connect() {
67
- const provider = getProvider();
68
- if (!provider) {
236
+ const adapter = await getAdapter();
237
+ if (!adapter) {
69
238
  throw new Error("Phantom provider not found.");
70
239
  }
71
- if (provider.isConnected) {
72
- return provider.publicKey?.toString();
240
+ if (adapter.isConnected) {
241
+ return adapter.getAccount();
73
242
  }
74
243
  try {
75
- const eagerConnectResult = await provider.connect({ onlyIfTrusted: true });
76
- if (eagerConnectResult.publicKey) {
77
- const publicKeyStr = eagerConnectResult.publicKey.toString();
78
- triggerEvent("connect", publicKeyStr);
79
- return publicKeyStr;
244
+ const address = await adapter.connect({ onlyIfTrusted: true });
245
+ if (address) {
246
+ triggerEvent("connect", address);
247
+ return address;
80
248
  }
81
249
  } catch (error) {
82
250
  }
83
251
  try {
84
- const connectResult = await provider.connect({ onlyIfTrusted: false });
85
- if (connectResult.publicKey) {
86
- const publicKeyStr = connectResult.publicKey.toString();
87
- triggerEvent("connect", publicKeyStr);
88
- return publicKeyStr;
252
+ const address = await adapter.connect({ onlyIfTrusted: false });
253
+ if (address) {
254
+ triggerEvent("connect", address);
255
+ return address;
89
256
  }
90
257
  } catch (error) {
91
258
  }
92
259
  throw new Error("Failed to connect to Phantom.");
93
260
  }
94
261
 
95
- // src/solana/signMessage.ts
96
- async function signMessage(message, display) {
97
- const provider = getProvider();
98
- if (!provider) {
99
- throw new Error("Phantom provider not found.");
100
- }
101
- if (!provider.isConnected) {
102
- await connect();
103
- }
104
- if (!provider.signMessage) {
105
- throw new Error("The connected provider does not support signMessage.");
106
- }
107
- if (!provider.isConnected) {
108
- throw new Error("Provider is not connected even after attempting to connect.");
109
- }
110
- const result = await provider.signMessage(message, display);
111
- return {
112
- signature: result.signature,
113
- address: result.publicKey.toString()
114
- };
115
- }
116
-
117
- // src/solana/signIn.ts
118
- async function signIn(signInData) {
119
- const provider = getProvider();
120
- if (!provider) {
262
+ // src/solana/disconnect.ts
263
+ async function disconnect() {
264
+ const adapter = await getAdapter();
265
+ if (!adapter) {
121
266
  throw new Error("Phantom provider not found.");
122
267
  }
123
- if (!provider.signIn) {
124
- throw new Error("The connected provider does not support signIn.");
125
- }
126
- const result = await provider.signIn(signInData);
127
- return {
128
- address: result.address.toString(),
129
- signature: result.signature,
130
- signedMessage: result.signedMessage
131
- };
268
+ await adapter.disconnect();
269
+ triggerEvent("disconnect");
132
270
  }
133
271
 
134
- // src/solana/utils/transactionToVersionedTransaction.ts
135
- var import_transactions = require("@solana/transactions");
136
- function transactionToVersionedTransaction(transaction) {
137
- const serialized = (0, import_transactions.getTransactionEncoder)().encode(transaction);
138
- const fakeVersioned = {
139
- serialize() {
140
- return new Uint8Array(serialized);
141
- }
142
- };
143
- return fakeVersioned;
272
+ // src/solana/getAccount.ts
273
+ async function getAccount() {
274
+ const adapter = await getAdapter();
275
+ return adapter.getAccount();
144
276
  }
145
277
 
146
278
  // src/solana/signAndSendTransaction.ts
147
279
  async function signAndSendTransaction(transaction) {
148
- const provider = getProvider();
149
- if (!provider) {
150
- throw new Error("Phantom provider not found.");
151
- }
152
- if (!provider.isConnected) {
153
- await connect();
154
- }
155
- if (!provider.signAndSendTransaction) {
156
- throw new Error("The connected provider does not support signAndSendTransaction.");
280
+ const adapter = await getAdapter();
281
+ if (!adapter) {
282
+ throw new Error("Adapter not found.");
157
283
  }
158
- if (!provider.isConnected) {
159
- throw new Error("Provider is not connected even after attempting to connect.");
284
+ if (!adapter.isConnected) {
285
+ await adapter.connect({ onlyIfTrusted: false });
160
286
  }
161
- const versionedTransaction = transactionToVersionedTransaction(transaction);
162
- const result = await provider.signAndSendTransaction(versionedTransaction);
163
- return {
164
- signature: result.signature,
165
- address: result.publicKey
166
- };
287
+ return adapter.signAndSendTransaction(transaction);
167
288
  }
168
289
 
169
- // src/solana/disconnect.ts
170
- async function disconnect() {
171
- const provider = getProvider();
172
- if (!provider) {
173
- throw new Error("Phantom provider not found.");
290
+ // src/solana/signIn.ts
291
+ async function signIn(signInData) {
292
+ const adapter = await getAdapter();
293
+ if (!adapter) {
294
+ throw new Error("Adapter not found.");
174
295
  }
175
- await provider.disconnect();
176
- triggerEvent("disconnect");
296
+ return adapter.signIn(signInData);
177
297
  }
178
298
 
179
- // src/solana/getAccount.ts
180
- function getAccount() {
181
- const provider = getProvider();
182
- if (provider && provider.isConnected && provider.publicKey) {
183
- return {
184
- status: "connected",
185
- address: provider.publicKey.toString()
186
- };
299
+ // src/solana/signMessage.ts
300
+ async function signMessage(message, display) {
301
+ const adapter = await getAdapter();
302
+ if (!adapter) {
303
+ throw new Error("Adapter not found.");
187
304
  }
188
- return {
189
- status: "disconnected",
190
- address: null
191
- };
305
+ if (!adapter.isConnected) {
306
+ await adapter.connect({ onlyIfTrusted: false });
307
+ }
308
+ return adapter.signMessage(message, display);
192
309
  }
193
310
 
194
311
  // src/solana/plugin.ts
195
312
  var solana = {
196
- getProvider,
197
313
  connect,
198
314
  disconnect,
199
315
  getAccount,
@@ -1,6 +1,167 @@
1
- // src/solana/getProvider.ts
2
- function getProvider() {
3
- return window.phantom?.solana ?? null;
1
+ import {
2
+ __privateAdd,
3
+ __privateMethod
4
+ } from "../chunk-GV6AIHPN.mjs";
5
+
6
+ // src/solana/utils/transactionToVersionedTransaction.ts
7
+ import { getTransactionEncoder } from "@solana/transactions";
8
+ function transactionToVersionedTransaction(transaction) {
9
+ const serialized = getTransactionEncoder().encode(transaction);
10
+ const fakeVersioned = {
11
+ serialize() {
12
+ return new Uint8Array(serialized);
13
+ }
14
+ };
15
+ return fakeVersioned;
16
+ }
17
+
18
+ // src/solana/adapters/injected.ts
19
+ import { fromVersionedTransaction } from "@solana/compat";
20
+ var MAX_RETRIES = 4;
21
+ var BASE_DELAY = 100;
22
+ var _getProvider, getProvider_fn;
23
+ var InjectedSolanaAdapter = class {
24
+ constructor() {
25
+ __privateAdd(this, _getProvider);
26
+ }
27
+ load() {
28
+ let retryCount = 0;
29
+ const scheduleRetry = (resolve, reject) => {
30
+ const delay = BASE_DELAY * Math.pow(2, Math.min(retryCount, 5));
31
+ setTimeout(() => {
32
+ if (__privateMethod(this, _getProvider, getProvider_fn).call(this)) {
33
+ resolve();
34
+ return;
35
+ }
36
+ retryCount++;
37
+ if (retryCount >= MAX_RETRIES) {
38
+ reject();
39
+ } else {
40
+ scheduleRetry(resolve, reject);
41
+ }
42
+ }, delay);
43
+ };
44
+ return new Promise((resolve, reject) => {
45
+ scheduleRetry(() => resolve(this), reject);
46
+ });
47
+ }
48
+ get isConnected() {
49
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
50
+ return provider?.isConnected && provider.publicKey ? true : false;
51
+ }
52
+ async connect({ onlyIfTrusted }) {
53
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
54
+ if (!provider) {
55
+ throw new Error("Phantom provider not found.");
56
+ }
57
+ if (provider.isConnected && provider.publicKey) {
58
+ return this.getAccount() ?? void 0;
59
+ }
60
+ try {
61
+ const result = await provider.connect({ onlyIfTrusted });
62
+ return result.publicKey.toString();
63
+ } catch (_) {
64
+ return void 0;
65
+ }
66
+ }
67
+ async disconnect() {
68
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
69
+ if (!provider) {
70
+ throw new Error("Phantom provider not found.");
71
+ }
72
+ await provider.disconnect();
73
+ }
74
+ async getAccount() {
75
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
76
+ if (provider && provider.isConnected && provider.publicKey) {
77
+ return Promise.resolve(provider.publicKey.toString());
78
+ }
79
+ return Promise.resolve(void 0);
80
+ }
81
+ async signMessage(message, display) {
82
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
83
+ if (!provider) {
84
+ throw new Error("Phantom provider not found.");
85
+ }
86
+ if (!provider.isConnected) {
87
+ throw new Error("Provider is not connected.");
88
+ }
89
+ const result = await provider.signMessage(message, display);
90
+ return {
91
+ signature: result.signature,
92
+ address: result.publicKey.toString()
93
+ };
94
+ }
95
+ async signIn(signInData) {
96
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
97
+ if (!provider) {
98
+ throw new Error("Phantom provider not found.");
99
+ }
100
+ const result = await provider.signIn(signInData);
101
+ return {
102
+ address: result.address.toString(),
103
+ signature: result.signature,
104
+ signedMessage: result.signedMessage
105
+ };
106
+ }
107
+ async signAndSendTransaction(transaction) {
108
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
109
+ if (!provider) {
110
+ throw new Error("Phantom provider not found.");
111
+ }
112
+ if (!provider.isConnected) {
113
+ throw new Error("Provider is not connected.");
114
+ }
115
+ const versionedTransaction = transactionToVersionedTransaction(transaction);
116
+ const result = await provider.signAndSendTransaction(versionedTransaction);
117
+ return {
118
+ signature: result.signature,
119
+ address: result.publicKey
120
+ };
121
+ }
122
+ async signTransaction(transaction) {
123
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
124
+ if (!provider) {
125
+ throw new Error("Phantom provider not found.");
126
+ }
127
+ if (!provider.isConnected) {
128
+ throw new Error("Provider is not connected.");
129
+ }
130
+ const versionedTransaction = transactionToVersionedTransaction(transaction);
131
+ const result = await provider.signTransaction(versionedTransaction);
132
+ const responseTransaction = fromVersionedTransaction(result);
133
+ return responseTransaction;
134
+ }
135
+ async signAllTransactions(transactions) {
136
+ const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
137
+ if (!provider) {
138
+ throw new Error("Phantom provider not found.");
139
+ }
140
+ if (!provider.isConnected) {
141
+ throw new Error("Provider is not connected.");
142
+ }
143
+ const versionedTransactions = transactions.map(
144
+ (transaction) => transactionToVersionedTransaction(transaction)
145
+ );
146
+ const result = await provider.signAllTransactions(versionedTransactions);
147
+ const responseTransactions = result.map((transaction) => fromVersionedTransaction(transaction));
148
+ return responseTransactions;
149
+ }
150
+ };
151
+ _getProvider = new WeakSet();
152
+ getProvider_fn = function() {
153
+ return window?.phantom?.solana;
154
+ };
155
+
156
+ // src/solana/getAdapter.ts
157
+ async function getAdapter(_type = "injected") {
158
+ const adapter = new InjectedSolanaAdapter();
159
+ try {
160
+ await adapter.load();
161
+ return adapter;
162
+ } catch (error) {
163
+ throw new Error("Phantom provider not found.");
164
+ }
4
165
  }
5
166
 
6
167
  // src/solana/eventListeners.ts
@@ -38,136 +199,83 @@ function triggerEvent(event, ...args) {
38
199
 
39
200
  // src/solana/connect.ts
40
201
  async function connect() {
41
- const provider = getProvider();
42
- if (!provider) {
202
+ const adapter = await getAdapter();
203
+ if (!adapter) {
43
204
  throw new Error("Phantom provider not found.");
44
205
  }
45
- if (provider.isConnected) {
46
- return provider.publicKey?.toString();
206
+ if (adapter.isConnected) {
207
+ return adapter.getAccount();
47
208
  }
48
209
  try {
49
- const eagerConnectResult = await provider.connect({ onlyIfTrusted: true });
50
- if (eagerConnectResult.publicKey) {
51
- const publicKeyStr = eagerConnectResult.publicKey.toString();
52
- triggerEvent("connect", publicKeyStr);
53
- return publicKeyStr;
210
+ const address = await adapter.connect({ onlyIfTrusted: true });
211
+ if (address) {
212
+ triggerEvent("connect", address);
213
+ return address;
54
214
  }
55
215
  } catch (error) {
56
216
  }
57
217
  try {
58
- const connectResult = await provider.connect({ onlyIfTrusted: false });
59
- if (connectResult.publicKey) {
60
- const publicKeyStr = connectResult.publicKey.toString();
61
- triggerEvent("connect", publicKeyStr);
62
- return publicKeyStr;
218
+ const address = await adapter.connect({ onlyIfTrusted: false });
219
+ if (address) {
220
+ triggerEvent("connect", address);
221
+ return address;
63
222
  }
64
223
  } catch (error) {
65
224
  }
66
225
  throw new Error("Failed to connect to Phantom.");
67
226
  }
68
227
 
69
- // src/solana/signMessage.ts
70
- async function signMessage(message, display) {
71
- const provider = getProvider();
72
- if (!provider) {
73
- throw new Error("Phantom provider not found.");
74
- }
75
- if (!provider.isConnected) {
76
- await connect();
77
- }
78
- if (!provider.signMessage) {
79
- throw new Error("The connected provider does not support signMessage.");
80
- }
81
- if (!provider.isConnected) {
82
- throw new Error("Provider is not connected even after attempting to connect.");
83
- }
84
- const result = await provider.signMessage(message, display);
85
- return {
86
- signature: result.signature,
87
- address: result.publicKey.toString()
88
- };
89
- }
90
-
91
- // src/solana/signIn.ts
92
- async function signIn(signInData) {
93
- const provider = getProvider();
94
- if (!provider) {
228
+ // src/solana/disconnect.ts
229
+ async function disconnect() {
230
+ const adapter = await getAdapter();
231
+ if (!adapter) {
95
232
  throw new Error("Phantom provider not found.");
96
233
  }
97
- if (!provider.signIn) {
98
- throw new Error("The connected provider does not support signIn.");
99
- }
100
- const result = await provider.signIn(signInData);
101
- return {
102
- address: result.address.toString(),
103
- signature: result.signature,
104
- signedMessage: result.signedMessage
105
- };
234
+ await adapter.disconnect();
235
+ triggerEvent("disconnect");
106
236
  }
107
237
 
108
- // src/solana/utils/transactionToVersionedTransaction.ts
109
- import { getTransactionEncoder } from "@solana/transactions";
110
- function transactionToVersionedTransaction(transaction) {
111
- const serialized = getTransactionEncoder().encode(transaction);
112
- const fakeVersioned = {
113
- serialize() {
114
- return new Uint8Array(serialized);
115
- }
116
- };
117
- return fakeVersioned;
238
+ // src/solana/getAccount.ts
239
+ async function getAccount() {
240
+ const adapter = await getAdapter();
241
+ return adapter.getAccount();
118
242
  }
119
243
 
120
244
  // src/solana/signAndSendTransaction.ts
121
245
  async function signAndSendTransaction(transaction) {
122
- const provider = getProvider();
123
- if (!provider) {
124
- throw new Error("Phantom provider not found.");
246
+ const adapter = await getAdapter();
247
+ if (!adapter) {
248
+ throw new Error("Adapter not found.");
125
249
  }
126
- if (!provider.isConnected) {
127
- await connect();
250
+ if (!adapter.isConnected) {
251
+ await adapter.connect({ onlyIfTrusted: false });
128
252
  }
129
- if (!provider.signAndSendTransaction) {
130
- throw new Error("The connected provider does not support signAndSendTransaction.");
131
- }
132
- if (!provider.isConnected) {
133
- throw new Error("Provider is not connected even after attempting to connect.");
134
- }
135
- const versionedTransaction = transactionToVersionedTransaction(transaction);
136
- const result = await provider.signAndSendTransaction(versionedTransaction);
137
- return {
138
- signature: result.signature,
139
- address: result.publicKey
140
- };
253
+ return adapter.signAndSendTransaction(transaction);
141
254
  }
142
255
 
143
- // src/solana/disconnect.ts
144
- async function disconnect() {
145
- const provider = getProvider();
146
- if (!provider) {
147
- throw new Error("Phantom provider not found.");
256
+ // src/solana/signIn.ts
257
+ async function signIn(signInData) {
258
+ const adapter = await getAdapter();
259
+ if (!adapter) {
260
+ throw new Error("Adapter not found.");
148
261
  }
149
- await provider.disconnect();
150
- triggerEvent("disconnect");
262
+ return adapter.signIn(signInData);
151
263
  }
152
264
 
153
- // src/solana/getAccount.ts
154
- function getAccount() {
155
- const provider = getProvider();
156
- if (provider && provider.isConnected && provider.publicKey) {
157
- return {
158
- status: "connected",
159
- address: provider.publicKey.toString()
160
- };
265
+ // src/solana/signMessage.ts
266
+ async function signMessage(message, display) {
267
+ const adapter = await getAdapter();
268
+ if (!adapter) {
269
+ throw new Error("Adapter not found.");
161
270
  }
162
- return {
163
- status: "disconnected",
164
- address: null
165
- };
271
+ if (!adapter.isConnected) {
272
+ await adapter.connect({ onlyIfTrusted: false });
273
+ }
274
+ return adapter.signMessage(message, display);
166
275
  }
167
276
 
168
277
  // src/solana/plugin.ts
169
278
  var solana = {
170
- getProvider,
171
279
  connect,
172
280
  disconnect,
173
281
  getAccount,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phantom/browser-sdk",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
@@ -21,15 +21,20 @@
21
21
  ],
22
22
  "license": "MIT",
23
23
  "scripts": {
24
- "build": "rm -rf dist && tsup src/index.ts src/solana/index.ts --format cjs,esm --dts",
25
- "build:watch": "rm -rf dist && tsup src/index.ts src/solana/index.ts --format cjs,esm --dts --watch",
26
- "dev": "rm -rf dist && tsup src/index.ts src/solana/index.ts --format cjs,esm --dts --watch",
24
+ "?pack-release": "When https://github.com/changesets/changesets/issues/432 has a solution we can remove this trick",
25
+ "pack-release": "rimraf ./_release && yarn pack && mkdir ./_release && tar zxvf ./package.tgz --directory ./_release && rm ./package.tgz",
26
+ "build": "rimraf ./dist && tsup src/index.ts src/solana/index.ts --format cjs,esm --dts",
27
+ "build:watch": "rimraf ./dist && tsup src/index.ts src/solana/index.ts --format cjs,esm --dts --watch",
28
+ "dev": "rimraf ./dist && tsup src/index.ts src/solana/index.ts --format cjs,esm --dts --watch",
27
29
  "lint": "tsc --noEmit && eslint --cache . --ext .ts,.tsx",
28
30
  "test": "jest"
29
31
  },
30
32
  "devDependencies": {
31
33
  "@solana/web3.js": "^1.98.2",
34
+ "@types/jest": "^29.5.14",
32
35
  "eslint": "8.53.0",
36
+ "jest": "^29.7.0",
37
+ "rimraf": "^6.0.1",
33
38
  "tsup": "^6.7.0",
34
39
  "typescript": "^5.0.4"
35
40
  },
@@ -37,5 +42,8 @@
37
42
  "@solana/compat": "2.1.1",
38
43
  "@solana/kit": "^2.1.1",
39
44
  "@solana/transactions": "^2.1.1"
45
+ },
46
+ "publishConfig": {
47
+ "directory": "_release/package"
40
48
  }
41
- }
49
+ }