@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/README.md +161 -0
- package/dist/auto-confirm/index.d.ts +37 -0
- package/dist/auto-confirm/index.js +107 -0
- package/dist/auto-confirm/index.mjs +82 -0
- package/dist/chunk-GV6AIHPN.mjs +18 -0
- package/dist/chunk-QNVIOBKG.mjs +382 -0
- package/dist/chunk-WUKYLWAZ.mjs +0 -0
- package/dist/ethereum/index.d.ts +1 -0
- package/dist/ethereum/index.js +416 -0
- package/dist/ethereum/index.mjs +8 -0
- package/dist/index-2f448acb.d.ts +168 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +452 -0
- package/dist/index.mjs +41 -0
- package/dist/solana/index.d.ts +139 -0
- package/dist/solana/index.js +413 -0
- package/dist/solana/index.mjs +379 -0
- package/package.json +61 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import "../chunk-WUKYLWAZ.mjs";
|
|
2
|
+
import {
|
|
3
|
+
__privateAdd,
|
|
4
|
+
__privateMethod
|
|
5
|
+
} from "../chunk-GV6AIHPN.mjs";
|
|
6
|
+
|
|
7
|
+
// src/solana/utils/transactionToVersionedTransaction.ts
|
|
8
|
+
import { getTransactionEncoder } from "@solana/transactions";
|
|
9
|
+
function transactionToVersionedTransaction(transaction) {
|
|
10
|
+
const serialized = getTransactionEncoder().encode(transaction);
|
|
11
|
+
const fakeVersioned = {
|
|
12
|
+
serialize() {
|
|
13
|
+
return new Uint8Array(serialized);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
return fakeVersioned;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// src/solana/strategies/injected.ts
|
|
20
|
+
import { fromVersionedTransaction } from "@solana/compat";
|
|
21
|
+
var MAX_RETRIES = 4;
|
|
22
|
+
var BASE_DELAY = 100;
|
|
23
|
+
var _getProvider, getProvider_fn;
|
|
24
|
+
var InjectedSolanaStrategy = class {
|
|
25
|
+
constructor() {
|
|
26
|
+
__privateAdd(this, _getProvider);
|
|
27
|
+
this.type = "injected" /* INJECTED */;
|
|
28
|
+
}
|
|
29
|
+
load() {
|
|
30
|
+
let retryCount = 0;
|
|
31
|
+
const scheduleRetry = (resolve, reject) => {
|
|
32
|
+
const delay = BASE_DELAY * Math.pow(2, Math.min(retryCount, 5));
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
if (__privateMethod(this, _getProvider, getProvider_fn).call(this)) {
|
|
35
|
+
resolve();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
retryCount++;
|
|
39
|
+
if (retryCount >= MAX_RETRIES) {
|
|
40
|
+
reject();
|
|
41
|
+
} else {
|
|
42
|
+
scheduleRetry(resolve, reject);
|
|
43
|
+
}
|
|
44
|
+
}, delay);
|
|
45
|
+
};
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
scheduleRetry(() => resolve(this), reject);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
get isConnected() {
|
|
51
|
+
const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
|
|
52
|
+
return provider?.isConnected && provider.publicKey ? true : false;
|
|
53
|
+
}
|
|
54
|
+
async connect({ onlyIfTrusted }) {
|
|
55
|
+
const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
|
|
56
|
+
if (!provider) {
|
|
57
|
+
throw new Error("Provider not found.");
|
|
58
|
+
}
|
|
59
|
+
if (provider.isConnected && provider.publicKey) {
|
|
60
|
+
return this.getAccount() ?? void 0;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const result = await provider.connect({ onlyIfTrusted });
|
|
64
|
+
return result.publicKey.toString();
|
|
65
|
+
} catch (_) {
|
|
66
|
+
return void 0;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async disconnect() {
|
|
70
|
+
const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
|
|
71
|
+
if (!provider) {
|
|
72
|
+
throw new Error("Provider not found.");
|
|
73
|
+
}
|
|
74
|
+
await provider.disconnect();
|
|
75
|
+
}
|
|
76
|
+
async getAccount() {
|
|
77
|
+
const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
|
|
78
|
+
if (provider && provider.isConnected && provider.publicKey) {
|
|
79
|
+
return Promise.resolve(provider.publicKey.toString());
|
|
80
|
+
}
|
|
81
|
+
return Promise.resolve(void 0);
|
|
82
|
+
}
|
|
83
|
+
async signMessage(message, display) {
|
|
84
|
+
const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
|
|
85
|
+
if (!provider) {
|
|
86
|
+
throw new Error("Provider not found.");
|
|
87
|
+
}
|
|
88
|
+
if (!provider.isConnected) {
|
|
89
|
+
throw new Error("Provider is not connected.");
|
|
90
|
+
}
|
|
91
|
+
const result = await provider.signMessage(message, display);
|
|
92
|
+
return {
|
|
93
|
+
signature: result.signature,
|
|
94
|
+
address: result.publicKey.toString()
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async signIn(signInData) {
|
|
98
|
+
const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
|
|
99
|
+
if (!provider) {
|
|
100
|
+
throw new Error("Provider not found.");
|
|
101
|
+
}
|
|
102
|
+
const result = await provider.signIn(signInData);
|
|
103
|
+
return {
|
|
104
|
+
address: result.address.toString(),
|
|
105
|
+
signature: result.signature,
|
|
106
|
+
signedMessage: result.signedMessage
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async signAndSendTransaction(transaction) {
|
|
110
|
+
const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
|
|
111
|
+
if (!provider) {
|
|
112
|
+
throw new Error("Provider not found.");
|
|
113
|
+
}
|
|
114
|
+
if (!provider.isConnected) {
|
|
115
|
+
throw new Error("Provider is not connected.");
|
|
116
|
+
}
|
|
117
|
+
const versionedTransaction = transactionToVersionedTransaction(transaction);
|
|
118
|
+
const result = await provider.signAndSendTransaction(versionedTransaction);
|
|
119
|
+
return {
|
|
120
|
+
signature: result.signature,
|
|
121
|
+
address: result.publicKey
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async signTransaction(transaction) {
|
|
125
|
+
const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
|
|
126
|
+
if (!provider) {
|
|
127
|
+
throw new Error("Provider not found.");
|
|
128
|
+
}
|
|
129
|
+
if (!provider.isConnected) {
|
|
130
|
+
throw new Error("Provider is not connected.");
|
|
131
|
+
}
|
|
132
|
+
const versionedTransaction = transactionToVersionedTransaction(transaction);
|
|
133
|
+
const result = await provider.signTransaction(versionedTransaction);
|
|
134
|
+
const responseTransaction = fromVersionedTransaction(result);
|
|
135
|
+
return responseTransaction;
|
|
136
|
+
}
|
|
137
|
+
async signAllTransactions(transactions) {
|
|
138
|
+
const provider = __privateMethod(this, _getProvider, getProvider_fn).call(this);
|
|
139
|
+
if (!provider) {
|
|
140
|
+
throw new Error("Provider not found.");
|
|
141
|
+
}
|
|
142
|
+
if (!provider.isConnected) {
|
|
143
|
+
throw new Error("Provider is not connected.");
|
|
144
|
+
}
|
|
145
|
+
const versionedTransactions = transactions.map(
|
|
146
|
+
(transaction) => transactionToVersionedTransaction(transaction)
|
|
147
|
+
);
|
|
148
|
+
const result = await provider.signAllTransactions(versionedTransactions);
|
|
149
|
+
const responseTransactions = result.map((transaction) => fromVersionedTransaction(transaction));
|
|
150
|
+
return responseTransactions;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
_getProvider = new WeakSet();
|
|
154
|
+
getProvider_fn = function() {
|
|
155
|
+
return window?.phantom?.solana;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// src/solana/strategies/deeplinks.ts
|
|
159
|
+
var DeepLinkSolanaStrategy = class {
|
|
160
|
+
constructor() {
|
|
161
|
+
this.type = "deeplink" /* DEEPLINK */;
|
|
162
|
+
}
|
|
163
|
+
load() {
|
|
164
|
+
return Promise.resolve(this);
|
|
165
|
+
}
|
|
166
|
+
get isConnected() {
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
async connect({ onlyIfTrusted }) {
|
|
170
|
+
const deeplink = `phantom://connect?onlyIfTrusted=${onlyIfTrusted}`;
|
|
171
|
+
window.location.href = deeplink;
|
|
172
|
+
return Promise.resolve(void 0);
|
|
173
|
+
}
|
|
174
|
+
async disconnect() {
|
|
175
|
+
const deeplink = `phantom://disconnect`;
|
|
176
|
+
window.location.href = deeplink;
|
|
177
|
+
return Promise.resolve();
|
|
178
|
+
}
|
|
179
|
+
async getAccount() {
|
|
180
|
+
const deeplink = `phantom://account`;
|
|
181
|
+
window.location.href = deeplink;
|
|
182
|
+
return Promise.resolve(void 0);
|
|
183
|
+
}
|
|
184
|
+
async signMessage(message, display) {
|
|
185
|
+
const messageEncoded = Buffer.from(message).toString("base64");
|
|
186
|
+
const deeplink = `phantom://sign-message?message=${messageEncoded}&display=${display}`;
|
|
187
|
+
window.location.href = deeplink;
|
|
188
|
+
return Promise.resolve({
|
|
189
|
+
signature: new Uint8Array(),
|
|
190
|
+
address: ""
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
async signIn(signInData) {
|
|
194
|
+
const deeplink = `phantom://sign-in?signInData=${encodeURIComponent(JSON.stringify(signInData))}`;
|
|
195
|
+
window.location.href = deeplink;
|
|
196
|
+
return Promise.resolve({
|
|
197
|
+
address: "",
|
|
198
|
+
signature: new Uint8Array(),
|
|
199
|
+
signedMessage: new Uint8Array()
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
async signAndSendTransaction(transaction) {
|
|
203
|
+
const deeplink = `phantom://sign-and-send-transaction?transaction=${transaction}`;
|
|
204
|
+
window.location.href = deeplink;
|
|
205
|
+
return Promise.resolve({
|
|
206
|
+
signature: "",
|
|
207
|
+
address: ""
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
async signTransaction(transaction) {
|
|
211
|
+
const deeplink = `phantom://sign-transaction?transaction=${transaction}`;
|
|
212
|
+
window.location.href = deeplink;
|
|
213
|
+
return Promise.resolve(transaction);
|
|
214
|
+
}
|
|
215
|
+
async signAllTransactions(transactions) {
|
|
216
|
+
const deeplink = `phantom://sign-all-transactions?transactions=${transactions}`;
|
|
217
|
+
window.location.href = deeplink;
|
|
218
|
+
return Promise.resolve(transactions);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
// src/solana/getProvider.ts
|
|
223
|
+
async function getProvider(strategy = "injected" /* INJECTED */) {
|
|
224
|
+
if (strategy === "injected") {
|
|
225
|
+
const provider = new InjectedSolanaStrategy();
|
|
226
|
+
try {
|
|
227
|
+
await provider.load();
|
|
228
|
+
return provider;
|
|
229
|
+
} catch (error) {
|
|
230
|
+
throw new Error("Provider not found.");
|
|
231
|
+
}
|
|
232
|
+
} else if (strategy === "deeplink") {
|
|
233
|
+
return new DeepLinkSolanaStrategy();
|
|
234
|
+
} else {
|
|
235
|
+
throw new Error("Invalid provider type.");
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// src/solana/eventListeners.ts
|
|
240
|
+
var eventCallbacks = /* @__PURE__ */ new Map();
|
|
241
|
+
function addEventListener(event, callback) {
|
|
242
|
+
if (!eventCallbacks.has(event)) {
|
|
243
|
+
eventCallbacks.set(event, /* @__PURE__ */ new Set());
|
|
244
|
+
}
|
|
245
|
+
eventCallbacks.get(event).add(callback);
|
|
246
|
+
return () => {
|
|
247
|
+
removeEventListener(event, callback);
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
function removeEventListener(event, callback) {
|
|
251
|
+
if (eventCallbacks.has(event)) {
|
|
252
|
+
eventCallbacks.get(event).delete(callback);
|
|
253
|
+
if (eventCallbacks.get(event).size === 0) {
|
|
254
|
+
eventCallbacks.delete(event);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function triggerEvent(event, ...args) {
|
|
259
|
+
if (eventCallbacks.has(event)) {
|
|
260
|
+
eventCallbacks.get(event).forEach((cb) => {
|
|
261
|
+
if (event === "connect" && args[0] && typeof args[0] === "string") {
|
|
262
|
+
cb(args[0]);
|
|
263
|
+
} else if (event === "disconnect") {
|
|
264
|
+
cb();
|
|
265
|
+
} else if (event === "accountChanged" && args[0] && typeof args[0] === "string") {
|
|
266
|
+
cb(args[0]);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// src/solana/connect.ts
|
|
273
|
+
async function connect() {
|
|
274
|
+
const provider = await getProvider();
|
|
275
|
+
if (!provider) {
|
|
276
|
+
throw new Error("Provider not found.");
|
|
277
|
+
}
|
|
278
|
+
if (provider.isConnected) {
|
|
279
|
+
return provider.getAccount();
|
|
280
|
+
}
|
|
281
|
+
try {
|
|
282
|
+
const address = await provider.connect({ onlyIfTrusted: true });
|
|
283
|
+
if (address) {
|
|
284
|
+
triggerEvent("connect", address);
|
|
285
|
+
return address;
|
|
286
|
+
}
|
|
287
|
+
} catch (error) {
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
const address = await provider.connect({ onlyIfTrusted: false });
|
|
291
|
+
if (address) {
|
|
292
|
+
triggerEvent("connect", address);
|
|
293
|
+
return address;
|
|
294
|
+
}
|
|
295
|
+
} catch (error) {
|
|
296
|
+
}
|
|
297
|
+
throw new Error("Failed to connect to Phantom.");
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// src/solana/disconnect.ts
|
|
301
|
+
async function disconnect() {
|
|
302
|
+
const provider = await getProvider();
|
|
303
|
+
if (!provider) {
|
|
304
|
+
throw new Error("Provider not found.");
|
|
305
|
+
}
|
|
306
|
+
await provider.disconnect();
|
|
307
|
+
triggerEvent("disconnect");
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// src/solana/getAccount.ts
|
|
311
|
+
async function getAccount() {
|
|
312
|
+
const provider = await getProvider();
|
|
313
|
+
return provider.getAccount();
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// src/solana/signAndSendTransaction.ts
|
|
317
|
+
import { fromVersionedTransaction as fromVersionedTransaction2 } from "@solana/compat";
|
|
318
|
+
async function signAndSendTransaction(transaction) {
|
|
319
|
+
const provider = await getProvider();
|
|
320
|
+
if (!provider) {
|
|
321
|
+
throw new Error("Provider not found.");
|
|
322
|
+
}
|
|
323
|
+
if (!provider.isConnected) {
|
|
324
|
+
await provider.connect({ onlyIfTrusted: false });
|
|
325
|
+
}
|
|
326
|
+
let kitTransaction;
|
|
327
|
+
if (transaction?.messageBytes == null) {
|
|
328
|
+
kitTransaction = fromVersionedTransaction2(transaction);
|
|
329
|
+
} else {
|
|
330
|
+
kitTransaction = transaction;
|
|
331
|
+
}
|
|
332
|
+
return provider.signAndSendTransaction(kitTransaction);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// src/solana/signIn.ts
|
|
336
|
+
async function signIn(signInData) {
|
|
337
|
+
const provider = await getProvider();
|
|
338
|
+
if (!provider) {
|
|
339
|
+
throw new Error("Provider not found.");
|
|
340
|
+
}
|
|
341
|
+
const result = await provider.signIn(signInData);
|
|
342
|
+
if (result.address) {
|
|
343
|
+
triggerEvent("connect", result.address);
|
|
344
|
+
}
|
|
345
|
+
return result;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// src/solana/signMessage.ts
|
|
349
|
+
async function signMessage(message, display) {
|
|
350
|
+
const provider = await getProvider();
|
|
351
|
+
if (!provider) {
|
|
352
|
+
throw new Error("Provider not found.");
|
|
353
|
+
}
|
|
354
|
+
if (!provider.isConnected) {
|
|
355
|
+
await provider.connect({ onlyIfTrusted: false });
|
|
356
|
+
}
|
|
357
|
+
return provider.signMessage(message, display);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// src/solana/plugin.ts
|
|
361
|
+
var solana = {
|
|
362
|
+
connect,
|
|
363
|
+
disconnect,
|
|
364
|
+
getAccount,
|
|
365
|
+
signMessage,
|
|
366
|
+
signIn,
|
|
367
|
+
signAndSendTransaction,
|
|
368
|
+
addEventListener,
|
|
369
|
+
removeEventListener
|
|
370
|
+
};
|
|
371
|
+
function createSolanaPlugin() {
|
|
372
|
+
return {
|
|
373
|
+
name: "solana",
|
|
374
|
+
create: () => solana
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
export {
|
|
378
|
+
createSolanaPlugin
|
|
379
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@phantom/browser-injected-sdk",
|
|
3
|
+
"version": "0.0.9",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"module": "dist/index.mjs",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.mjs",
|
|
10
|
+
"require": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./solana": {
|
|
14
|
+
"import": "./dist/solana/index.mjs",
|
|
15
|
+
"require": "./dist/solana/index.js",
|
|
16
|
+
"types": "./dist/solana/index.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./auto-confirm": {
|
|
19
|
+
"import": "./dist/auto-confirm/index.mjs",
|
|
20
|
+
"require": "./dist/auto-confirm/index.js",
|
|
21
|
+
"types": "./dist/auto-confirm/index.d.ts"
|
|
22
|
+
},
|
|
23
|
+
"./ethereum": {
|
|
24
|
+
"import": "./dist/ethereum/index.mjs",
|
|
25
|
+
"require": "./dist/ethereum/index.js",
|
|
26
|
+
"types": "./dist/ethereum/index.d.ts"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist"
|
|
31
|
+
],
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"scripts": {
|
|
34
|
+
"?pack-release": "When https://github.com/changesets/changesets/issues/432 has a solution we can remove this trick",
|
|
35
|
+
"pack-release": "rimraf ./_release && yarn pack && mkdir ./_release && tar zxvf ./package.tgz --directory ./_release && rm ./package.tgz",
|
|
36
|
+
"build": "rimraf ./dist && tsup src/index.ts src/solana/index.ts src/auto-confirm/index.ts src/ethereum/index.ts --format cjs,esm --dts",
|
|
37
|
+
"build:watch": "rimraf ./dist && tsup src/index.ts src/solana/index.ts src/auto-confirm/index.ts src/ethereum/index.ts --format cjs,esm --dts --watch",
|
|
38
|
+
"dev": "rimraf ./dist && tsup src/index.ts src/solana/index.ts src/auto-confirm/index.ts src/ethereum/index.ts --format cjs,esm --dts --watch",
|
|
39
|
+
"lint": "tsc --noEmit && eslint --cache . --ext .ts,.tsx",
|
|
40
|
+
"test": "jest",
|
|
41
|
+
"prettier": "prettier --write \"src/**/*.{ts,tsx}\""
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@solana/web3.js": "^1.98.2",
|
|
45
|
+
"@types/jest": "^29.5.14",
|
|
46
|
+
"eslint": "8.53.0",
|
|
47
|
+
"jest": "^29.7.0",
|
|
48
|
+
"prettier": "^3.5.2",
|
|
49
|
+
"rimraf": "^6.0.1",
|
|
50
|
+
"tsup": "^6.7.0",
|
|
51
|
+
"typescript": "^5.0.4"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@solana/compat": "2.1.1",
|
|
55
|
+
"@solana/kit": "^2.1.1",
|
|
56
|
+
"@solana/transactions": "^2.1.1"
|
|
57
|
+
},
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"directory": "_release/package"
|
|
60
|
+
}
|
|
61
|
+
}
|