@multiplatform.one/web3 7.33.1 → 7.34.1

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.
Files changed (61) hide show
  1. package/README.md +24 -6
  2. package/dist/cjs/phantom/crypto.cjs +108 -0
  3. package/dist/cjs/phantom/crypto.native.js +224 -0
  4. package/dist/cjs/phantom/crypto.native.js.map +1 -0
  5. package/dist/cjs/phantom/index.cjs +16 -1
  6. package/dist/cjs/phantom/index.native.js +16 -1
  7. package/dist/cjs/phantom/index.native.js.map +1 -1
  8. package/dist/cjs/phantom/solana.cjs +309 -0
  9. package/dist/cjs/phantom/solana.native.js +466 -0
  10. package/dist/cjs/phantom/solana.native.js.map +1 -0
  11. package/dist/cjs/phantom/urls.cjs +68 -3
  12. package/dist/cjs/phantom/urls.native.js +92 -4
  13. package/dist/cjs/phantom/urls.native.js.map +1 -1
  14. package/dist/esm/phantom/crypto.mjs +67 -0
  15. package/dist/esm/phantom/crypto.mjs.map +1 -0
  16. package/dist/esm/phantom/crypto.native.js +180 -0
  17. package/dist/esm/phantom/crypto.native.js.map +1 -0
  18. package/dist/esm/phantom/index.mjs +4 -2
  19. package/dist/esm/phantom/index.mjs.map +1 -1
  20. package/dist/esm/phantom/index.native.js +4 -2
  21. package/dist/esm/phantom/index.native.js.map +1 -1
  22. package/dist/esm/phantom/solana.mjs +271 -0
  23. package/dist/esm/phantom/solana.mjs.map +1 -0
  24. package/dist/esm/phantom/solana.native.js +425 -0
  25. package/dist/esm/phantom/solana.native.js.map +1 -0
  26. package/dist/esm/phantom/urls.mjs +53 -3
  27. package/dist/esm/phantom/urls.mjs.map +1 -1
  28. package/dist/esm/phantom/urls.native.js +77 -4
  29. package/dist/esm/phantom/urls.native.js.map +1 -1
  30. package/dist/jsx/phantom/crypto.mjs +67 -0
  31. package/dist/jsx/phantom/crypto.mjs.map +1 -0
  32. package/dist/jsx/phantom/crypto.native.js +224 -0
  33. package/dist/jsx/phantom/crypto.native.js.map +1 -0
  34. package/dist/jsx/phantom/index.mjs +4 -2
  35. package/dist/jsx/phantom/index.mjs.map +1 -1
  36. package/dist/jsx/phantom/index.native.js +16 -1
  37. package/dist/jsx/phantom/index.native.js.map +1 -1
  38. package/dist/jsx/phantom/solana.mjs +271 -0
  39. package/dist/jsx/phantom/solana.mjs.map +1 -0
  40. package/dist/jsx/phantom/solana.native.js +466 -0
  41. package/dist/jsx/phantom/solana.native.js.map +1 -0
  42. package/dist/jsx/phantom/urls.mjs +53 -3
  43. package/dist/jsx/phantom/urls.mjs.map +1 -1
  44. package/dist/jsx/phantom/urls.native.js +92 -4
  45. package/dist/jsx/phantom/urls.native.js.map +1 -1
  46. package/package.json +7 -6
  47. package/src/phantom/crypto.spec.ts +61 -0
  48. package/src/phantom/crypto.ts +88 -0
  49. package/src/phantom/index.ts +38 -5
  50. package/src/phantom/solana.spec.ts +262 -0
  51. package/src/phantom/solana.ts +374 -0
  52. package/src/phantom/urls.spec.ts +101 -10
  53. package/src/phantom/urls.ts +119 -4
  54. package/types/phantom/crypto.d.ts +27 -0
  55. package/types/phantom/crypto.d.ts.map +1 -0
  56. package/types/phantom/index.d.ts +3 -1
  57. package/types/phantom/index.d.ts.map +1 -1
  58. package/types/phantom/solana.d.ts +113 -0
  59. package/types/phantom/solana.d.ts.map +1 -0
  60. package/types/phantom/urls.d.ts +46 -2
  61. package/types/phantom/urls.d.ts.map +1 -1
@@ -0,0 +1,271 @@
1
+ import bs58 from "bs58";
2
+ import { boxKeyPairFromSecretKey, decryptPayload, generateBoxKeyPair, sharedSecret } from "./crypto.mjs";
3
+ import { parsePhantomRedirect, phantomConnectUrl, phantomMethodUrl, stripPhantomRedirect } from "./urls.mjs";
4
+ class PhantomNotConnectedError extends Error {
5
+ constructor() {
6
+ super("no Phantom deeplink session: call connect() first");
7
+ this.name = "PhantomNotConnectedError";
8
+ }
9
+ }
10
+ const defaultStorageKey = "mpo.web3.phantom.deeplink";
11
+ function defaultStorage() {
12
+ const storage = globalThis.localStorage;
13
+ if (!storage) throw new Error("phantomDeeplink: no localStorage here; pass `storage`");
14
+ return storage;
15
+ }
16
+ function currentHref() {
17
+ const href = globalThis.location?.href;
18
+ if (!href) throw new Error("phantomDeeplink: no location here; pass `redirectLink`");
19
+ return href;
20
+ }
21
+ function phantomDeeplink(config) {
22
+ const storageKey = config.storageKey ?? defaultStorageKey;
23
+ const storage = () => config.storage ?? defaultStorage();
24
+ const now = config.now ?? Date.now;
25
+ const navigate = config.navigate ?? (url => globalThis.location.assign(url));
26
+ const redirectLink = () => config.redirectLink ?? stripPhantomRedirect(currentHref());
27
+ const load = () => {
28
+ const raw = storage().getItem(storageKey);
29
+ if (!raw) return void 0;
30
+ try {
31
+ return JSON.parse(raw);
32
+ } catch {
33
+ return void 0;
34
+ }
35
+ };
36
+ const save = record => storage().setItem(storageKey, JSON.stringify(record));
37
+ const connected = () => {
38
+ const record = load();
39
+ if (!record?.session || !record.phantomEncryptionPublicKey) throw new PhantomNotConnectedError();
40
+ return record;
41
+ };
42
+ const methodUrl = (record, method, payload) => {
43
+ const keyPair = boxKeyPairFromSecretKey(bs58.decode(record.dappSecretKey));
44
+ return phantomMethodUrl({
45
+ method,
46
+ payload,
47
+ session: record.session,
48
+ dappEncryptionPublicKey: keyPair.publicKey,
49
+ sharedSecret: sharedSecret(bs58.decode(record.phantomEncryptionPublicKey), keyPair.secretKey),
50
+ redirectLink: redirectLink(),
51
+ base: config.base
52
+ });
53
+ };
54
+ const request = (method, payload) => {
55
+ const record = connected();
56
+ const url = methodUrl(record, method, payload);
57
+ save({
58
+ ...record,
59
+ pending: {
60
+ method,
61
+ at: now()
62
+ }
63
+ });
64
+ navigate(url);
65
+ return url;
66
+ };
67
+ return {
68
+ get publicKey() {
69
+ return load()?.publicKey;
70
+ },
71
+ get connected() {
72
+ const record = load();
73
+ return !!(record?.session && record.phantomEncryptionPublicKey);
74
+ },
75
+ get pending() {
76
+ return load()?.pending;
77
+ },
78
+ connect() {
79
+ const keyPair = generateBoxKeyPair();
80
+ const url = phantomConnectUrl({
81
+ appUrl: config.appUrl,
82
+ dappEncryptionPublicKey: keyPair.publicKey,
83
+ redirectLink: redirectLink(),
84
+ cluster: config.cluster,
85
+ base: config.base
86
+ });
87
+ save({
88
+ dappSecretKey: bs58.encode(keyPair.secretKey),
89
+ cluster: config.cluster,
90
+ pending: {
91
+ method: "connect",
92
+ at: now()
93
+ }
94
+ });
95
+ navigate(url);
96
+ return url;
97
+ },
98
+ signTransaction(serializedTransaction) {
99
+ return request("signTransaction", {
100
+ transaction: bs58.encode(serializedTransaction)
101
+ });
102
+ },
103
+ signAllTransactions(serializedTransactions) {
104
+ return request("signAllTransactions", {
105
+ transactions: serializedTransactions.map(tx => bs58.encode(tx))
106
+ });
107
+ },
108
+ signAndSendTransaction(serializedTransaction, sendOptions) {
109
+ return request("signAndSendTransaction", {
110
+ transaction: bs58.encode(serializedTransaction),
111
+ ...(sendOptions ? {
112
+ sendOptions
113
+ } : {})
114
+ });
115
+ },
116
+ signMessage(message, display) {
117
+ const bytes = typeof message === "string" ? new TextEncoder().encode(message) : message;
118
+ return request("signMessage", {
119
+ message: bs58.encode(bytes),
120
+ ...(display ? {
121
+ display
122
+ } : {})
123
+ });
124
+ },
125
+ disconnect() {
126
+ const url = methodUrl(connected(), "disconnect", {});
127
+ storage().removeItem(storageKey);
128
+ navigate(url);
129
+ return url;
130
+ },
131
+ handleRedirect(href) {
132
+ const params = parsePhantomRedirect(href ?? currentHref());
133
+ if (!params) return void 0;
134
+ const record = load();
135
+ const method = record?.pending?.method;
136
+ if (params.errorCode) {
137
+ if (record) save({
138
+ ...record,
139
+ pending: void 0
140
+ });
141
+ return {
142
+ ok: false,
143
+ method,
144
+ errorCode: params.errorCode,
145
+ errorMessage: params.errorMessage ?? ""
146
+ };
147
+ }
148
+ if (!record || !params.data || !params.nonce) {
149
+ return {
150
+ ok: false,
151
+ method,
152
+ errorCode: "-32603",
153
+ errorMessage: "Phantom answered, but this browser holds no matching request"
154
+ };
155
+ }
156
+ const secretKey = bs58.decode(record.dappSecretKey);
157
+ const phantomKey = method === "connect" ? params.phantomEncryptionPublicKey : record.phantomEncryptionPublicKey;
158
+ if (!phantomKey) {
159
+ return {
160
+ ok: false,
161
+ method,
162
+ errorCode: "-32603",
163
+ errorMessage: "Phantom's answer carries no encryption key"
164
+ };
165
+ }
166
+ const data = decryptPayload(params.data, params.nonce, sharedSecret(bs58.decode(phantomKey), secretKey));
167
+ switch (method) {
168
+ case "connect":
169
+ {
170
+ const publicKey = String(data.public_key);
171
+ const session = String(data.session);
172
+ save({
173
+ ...record,
174
+ phantomEncryptionPublicKey: phantomKey,
175
+ publicKey,
176
+ session,
177
+ pending: void 0
178
+ });
179
+ return {
180
+ ok: true,
181
+ method,
182
+ publicKey,
183
+ session
184
+ };
185
+ }
186
+ case "signTransaction":
187
+ save({
188
+ ...record,
189
+ pending: void 0
190
+ });
191
+ return {
192
+ ok: true,
193
+ method,
194
+ transaction: bs58.decode(String(data.transaction))
195
+ };
196
+ case "signAllTransactions":
197
+ save({
198
+ ...record,
199
+ pending: void 0
200
+ });
201
+ return {
202
+ ok: true,
203
+ method,
204
+ transactions: data.transactions.map(tx => bs58.decode(tx))
205
+ };
206
+ case "signAndSendTransaction":
207
+ save({
208
+ ...record,
209
+ pending: void 0
210
+ });
211
+ return {
212
+ ok: true,
213
+ method,
214
+ signature: String(data.signature)
215
+ };
216
+ case "signMessage":
217
+ save({
218
+ ...record,
219
+ pending: void 0
220
+ });
221
+ return {
222
+ ok: true,
223
+ method,
224
+ signature: bs58.decode(String(data.signature))
225
+ };
226
+ default:
227
+ return {
228
+ ok: false,
229
+ method,
230
+ errorCode: "-32603",
231
+ errorMessage: "Phantom answered a request this browser did not make"
232
+ };
233
+ }
234
+ },
235
+ forget() {
236
+ storage().removeItem(storageKey);
237
+ }
238
+ };
239
+ }
240
+ function toBase64(bytes) {
241
+ let binary = "";
242
+ for (const byte of bytes) binary += String.fromCharCode(byte);
243
+ return btoa(binary);
244
+ }
245
+ async function sendSolanaTransaction(rpcUrl, signedTransaction, options = {}) {
246
+ const response = await (options.fetch ?? fetch)(rpcUrl, {
247
+ method: "POST",
248
+ headers: {
249
+ "content-type": "application/json"
250
+ },
251
+ body: JSON.stringify({
252
+ jsonrpc: "2.0",
253
+ id: 1,
254
+ method: "sendTransaction",
255
+ params: [toBase64(signedTransaction), {
256
+ encoding: "base64",
257
+ skipPreflight: options.skipPreflight ?? false
258
+ }]
259
+ })
260
+ });
261
+ const body = await response.json();
262
+ if (body.error) {
263
+ throw Object.assign(new Error(`sendTransaction failed: ${body.error.message}`), {
264
+ code: body.error.code
265
+ });
266
+ }
267
+ if (typeof body.result !== "string") throw new Error("sendTransaction returned no signature");
268
+ return body.result;
269
+ }
270
+ export { PhantomNotConnectedError, phantomDeeplink, sendSolanaTransaction };
271
+ //# sourceMappingURL=solana.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["bs58","boxKeyPairFromSecretKey","decryptPayload","generateBoxKeyPair","sharedSecret","parsePhantomRedirect","phantomConnectUrl","phantomMethodUrl","stripPhantomRedirect","PhantomNotConnectedError","Error","constructor","name","defaultStorageKey","defaultStorage","storage","globalThis","localStorage","currentHref","href","location","phantomDeeplink","config","storageKey","now","Date","navigate","url","assign","redirectLink","load","raw","getItem","JSON","parse","save","record","setItem","stringify","connected","session","phantomEncryptionPublicKey","methodUrl","method","payload","keyPair","decode","dappSecretKey","dappEncryptionPublicKey","publicKey","secretKey","base","request","pending","at","connect","appUrl","cluster","encode","signTransaction","serializedTransaction","transaction","signAllTransactions","serializedTransactions","transactions","map","tx","signAndSendTransaction","sendOptions","signMessage","message","display","bytes","TextEncoder","disconnect","removeItem","handleRedirect","params","errorCode","ok","errorMessage","data","nonce","phantomKey","String","public_key","signature","forget","toBase64","binary","byte","fromCharCode","btoa","sendSolanaTransaction","rpcUrl","signedTransaction","options","response","fetch","headers","body","jsonrpc","id","encoding","skipPreflight","json","error","Object","code","result"],"sources":["../../../src/phantom/solana.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}