@phantom/browser-sdk 0.0.4 → 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 +2 -12
- package/dist/chunk-GV6AIHPN.mjs +18 -0
- package/dist/index.mjs +2 -0
- package/dist/solana/index.d.ts +24 -32
- package/dist/solana/index.js +215 -99
- package/dist/solana/index.mjs +207 -99
- package/package.json +13 -5
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():
|
|
78
|
-
- Gets the current connected
|
|
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
package/dist/solana/index.d.ts
CHANGED
|
@@ -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
|
|
76
|
-
* @param
|
|
77
|
-
* @
|
|
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
|
|
82
|
-
signature:
|
|
83
|
-
address
|
|
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
|
|
100
|
-
* @param
|
|
101
|
-
* @
|
|
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
|
|
105
|
-
signature:
|
|
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;
|
package/dist/solana/index.js
CHANGED
|
@@ -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/
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
68
|
-
if (!
|
|
236
|
+
const adapter = await getAdapter();
|
|
237
|
+
if (!adapter) {
|
|
69
238
|
throw new Error("Phantom provider not found.");
|
|
70
239
|
}
|
|
71
|
-
if (
|
|
72
|
-
return
|
|
240
|
+
if (adapter.isConnected) {
|
|
241
|
+
return adapter.getAccount();
|
|
73
242
|
}
|
|
74
243
|
try {
|
|
75
|
-
const
|
|
76
|
-
if (
|
|
77
|
-
|
|
78
|
-
|
|
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
|
|
85
|
-
if (
|
|
86
|
-
|
|
87
|
-
|
|
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/
|
|
96
|
-
async function
|
|
97
|
-
const
|
|
98
|
-
if (!
|
|
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
|
-
|
|
124
|
-
|
|
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/
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
|
149
|
-
if (!
|
|
150
|
-
throw new Error("
|
|
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 (!
|
|
159
|
-
|
|
284
|
+
if (!adapter.isConnected) {
|
|
285
|
+
await adapter.connect({ onlyIfTrusted: false });
|
|
160
286
|
}
|
|
161
|
-
|
|
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/
|
|
170
|
-
async function
|
|
171
|
-
const
|
|
172
|
-
if (!
|
|
173
|
-
throw new Error("
|
|
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
|
-
|
|
176
|
-
triggerEvent("disconnect");
|
|
296
|
+
return adapter.signIn(signInData);
|
|
177
297
|
}
|
|
178
298
|
|
|
179
|
-
// src/solana/
|
|
180
|
-
function
|
|
181
|
-
const
|
|
182
|
-
if (
|
|
183
|
-
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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,
|
package/dist/solana/index.mjs
CHANGED
|
@@ -1,6 +1,167 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
|
42
|
-
if (!
|
|
202
|
+
const adapter = await getAdapter();
|
|
203
|
+
if (!adapter) {
|
|
43
204
|
throw new Error("Phantom provider not found.");
|
|
44
205
|
}
|
|
45
|
-
if (
|
|
46
|
-
return
|
|
206
|
+
if (adapter.isConnected) {
|
|
207
|
+
return adapter.getAccount();
|
|
47
208
|
}
|
|
48
209
|
try {
|
|
49
|
-
const
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
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
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
|
|
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/
|
|
70
|
-
async function
|
|
71
|
-
const
|
|
72
|
-
if (!
|
|
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
|
-
|
|
98
|
-
|
|
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/
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
|
123
|
-
if (!
|
|
124
|
-
throw new Error("
|
|
246
|
+
const adapter = await getAdapter();
|
|
247
|
+
if (!adapter) {
|
|
248
|
+
throw new Error("Adapter not found.");
|
|
125
249
|
}
|
|
126
|
-
if (!
|
|
127
|
-
await connect();
|
|
250
|
+
if (!adapter.isConnected) {
|
|
251
|
+
await adapter.connect({ onlyIfTrusted: false });
|
|
128
252
|
}
|
|
129
|
-
|
|
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/
|
|
144
|
-
async function
|
|
145
|
-
const
|
|
146
|
-
if (!
|
|
147
|
-
throw new Error("
|
|
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
|
-
|
|
150
|
-
triggerEvent("disconnect");
|
|
262
|
+
return adapter.signIn(signInData);
|
|
151
263
|
}
|
|
152
264
|
|
|
153
|
-
// src/solana/
|
|
154
|
-
function
|
|
155
|
-
const
|
|
156
|
-
if (
|
|
157
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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.
|
|
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
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
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
|
+
}
|