@dynamic-labs-sdk/solana 0.0.1-alpha.8 → 0.1.0-alpha.0

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 (83) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/addSolanaWalletStandardExtension.cjs.js +141 -97
  3. package/addSolanaWalletStandardExtension.esm.js +142 -98
  4. package/addWaasSolanaExtension.cjs.js +176 -0
  5. package/addWaasSolanaExtension.esm.js +173 -0
  6. package/index.cjs.js +44 -11
  7. package/index.esm.js +44 -11
  8. package/isVersionedTransaction.cjs.js +63 -0
  9. package/isVersionedTransaction.esm.js +57 -0
  10. package/package.json +11 -4
  11. package/src/SolanaNetworkProvider.types.d.ts +8 -0
  12. package/src/SolanaNetworkProvider.types.d.ts.map +1 -0
  13. package/src/SolanaWalletAccount.types.d.ts +8 -0
  14. package/src/SolanaWalletAccount.types.d.ts.map +1 -0
  15. package/src/SolanaWalletProvider.types.d.ts +1 -1
  16. package/src/SolanaWalletProvider.types.d.ts.map +1 -1
  17. package/src/addSolanaExtension/addSolanaExtension.d.ts +7 -4
  18. package/src/addSolanaExtension/addSolanaExtension.d.ts.map +1 -1
  19. package/src/exports/index.d.ts +4 -1
  20. package/src/exports/index.d.ts.map +1 -1
  21. package/src/exports/waas.d.ts +2 -0
  22. package/src/exports/waas.d.ts.map +1 -0
  23. package/src/exports/walletStandard.d.ts.map +1 -1
  24. package/src/getSigner/getSigner.d.ts +14 -1
  25. package/src/getSigner/getSigner.d.ts.map +1 -1
  26. package/src/getSolanaConnection/getSolanaConnection.d.ts +29 -0
  27. package/src/getSolanaConnection/getSolanaConnection.d.ts.map +1 -0
  28. package/src/getSolanaConnection/index.d.ts +2 -0
  29. package/src/getSolanaConnection/index.d.ts.map +1 -0
  30. package/src/isSolanaNetworkProvider/index.d.ts +2 -0
  31. package/src/isSolanaNetworkProvider/index.d.ts.map +1 -0
  32. package/src/isSolanaNetworkProvider/isSolanaNetworkProvider.d.ts +10 -0
  33. package/src/isSolanaNetworkProvider/isSolanaNetworkProvider.d.ts.map +1 -0
  34. package/src/isSolanaWalletAccount/isSolanaWalletAccount.d.ts +8 -1
  35. package/src/isSolanaWalletAccount/isSolanaWalletAccount.d.ts.map +1 -1
  36. package/src/isSolanaWalletProvider/isSolanaWalletProvider.d.ts +1 -1
  37. package/src/isSolanaWalletProvider/isSolanaWalletProvider.d.ts.map +1 -1
  38. package/src/registerSolanaNetworkProviderBuilder/index.d.ts +2 -0
  39. package/src/registerSolanaNetworkProviderBuilder/index.d.ts.map +1 -0
  40. package/src/registerSolanaNetworkProviderBuilder/registerSolanaNetworkProviderBuilder.d.ts +3 -0
  41. package/src/registerSolanaNetworkProviderBuilder/registerSolanaNetworkProviderBuilder.d.ts.map +1 -0
  42. package/src/utils/createEmptyEventEmitter/createEmptyEventEmitter.d.ts +17 -0
  43. package/src/utils/createEmptyEventEmitter/createEmptyEventEmitter.d.ts.map +1 -0
  44. package/src/utils/createEmptyEventEmitter/index.d.ts +2 -0
  45. package/src/utils/createEmptyEventEmitter/index.d.ts.map +1 -0
  46. package/src/utils/createSolanaNetworkProvider/createSolanaNetworkProvider.d.ts +4 -0
  47. package/src/utils/createSolanaNetworkProvider/createSolanaNetworkProvider.d.ts.map +1 -0
  48. package/src/utils/createSolanaNetworkProvider/index.d.ts +2 -0
  49. package/src/utils/createSolanaNetworkProvider/index.d.ts.map +1 -0
  50. package/src/utils/fetchSolBalance/fetchSolBalance.d.ts +5 -0
  51. package/src/utils/fetchSolBalance/fetchSolBalance.d.ts.map +1 -0
  52. package/src/utils/fetchSolBalance/index.d.ts +2 -0
  53. package/src/utils/fetchSolBalance/index.d.ts.map +1 -0
  54. package/src/waas/WaasSolanaWalletProvider.types.d.ts +4 -0
  55. package/src/waas/WaasSolanaWalletProvider.types.d.ts.map +1 -0
  56. package/src/waas/addWaasSolanaExtension/addWaasSolanaExtension.d.ts +11 -0
  57. package/src/waas/addWaasSolanaExtension/addWaasSolanaExtension.d.ts.map +1 -0
  58. package/src/waas/addWaasSolanaExtension/index.d.ts +2 -0
  59. package/src/waas/addWaasSolanaExtension/index.d.ts.map +1 -0
  60. package/src/waas/utils/createSolanaSignerFromSolanaWaasProvider/createSolanaSignerFromSolanaWaasProvider.d.ts +11 -0
  61. package/src/waas/utils/createSolanaSignerFromSolanaWaasProvider/createSolanaSignerFromSolanaWaasProvider.d.ts.map +1 -0
  62. package/src/waas/utils/createSolanaSignerFromSolanaWaasProvider/index.d.ts +2 -0
  63. package/src/waas/utils/createSolanaSignerFromSolanaWaasProvider/index.d.ts.map +1 -0
  64. package/src/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.d.ts +4 -0
  65. package/src/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.d.ts.map +1 -0
  66. package/src/waas/utils/createWalletProviderForWaasSolana/index.d.ts +2 -0
  67. package/src/waas/utils/createWalletProviderForWaasSolana/index.d.ts.map +1 -0
  68. package/src/walletStandard/addSolanaWalletStandardExtension/addSolanaWalletStandardExtension.d.ts +9 -2
  69. package/src/walletStandard/addSolanaWalletStandardExtension/addSolanaWalletStandardExtension.d.ts.map +1 -1
  70. package/src/walletStandard/utils/createSolanaSignerFromSolanaStandardWallet/createSolanaSignerFromSolanaStandardWallet.d.ts +7 -1
  71. package/src/walletStandard/utils/createSolanaSignerFromSolanaStandardWallet/createSolanaSignerFromSolanaStandardWallet.d.ts.map +1 -1
  72. package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.d.ts +5 -3
  73. package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.d.ts.map +1 -1
  74. package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/getActiveNetworkId/getActiveNetworkId.d.ts +5 -0
  75. package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/getActiveNetworkId/getActiveNetworkId.d.ts.map +1 -0
  76. package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/getActiveNetworkId/index.d.ts +2 -0
  77. package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/getActiveNetworkId/index.d.ts.map +1 -0
  78. package/waas.cjs.d.ts +1 -0
  79. package/waas.cjs.js +15 -0
  80. package/waas.esm.d.ts +1 -0
  81. package/waas.esm.js +11 -0
  82. package/walletStandard.cjs.js +5 -2
  83. package/walletStandard.esm.js +6 -1
@@ -1,48 +1,81 @@
1
- import { MethodNotImplementedError, assertDefined, formatWalletProviderKey, formatWalletProviderGroupKey, bufferToBase64, getClient, getCore, createApiClient, formatSignInMessage, hasExtension, getWalletProviderRegistry, assignClient, WalletProviderPriority } from '@dynamic-labs-sdk/client/core';
1
+ import { createBaseNetworkProvider, getNetworkProviderBuilderRegistry, assertDefined, formatWalletProviderKey, createWalletProviderEventEmitter, formatWalletProviderGroupKey, switchActiveNetworkInLastKnownRegistry, getActiveNetworkIdFromLastKnownRegistry, bufferToBase64, getNetworkProviderFromNetworkId, getDefaultClient, hasExtension, registerExtension, getWalletProviderRegistry, WalletProviderPriority } from '@dynamic-labs-sdk/client/core';
2
2
  import { getWallets } from '@wallet-standard/app';
3
+ import { _ as _extends, c as createEmptyEventEmitter, i as isVersionedTransaction } from './isVersionedTransaction.esm.js';
4
+ import { Connection, PublicKey, VersionedTransaction, Transaction } from '@solana/web3.js';
3
5
  import { assertWalletAccountSigningAvailability } from '@dynamic-labs-sdk/client';
4
- import { WalletProviderEnum, ChainEnum } from '@dynamic-labs/sdk-api-core';
5
- import { VersionedTransaction, Transaction, PublicKey } from '@solana/web3.js';
6
+ import { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';
7
+ import bs58 from 'bs58';
6
8
 
7
- const isVersionedTransaction = (transaction)=>!('instructions' in transaction);
9
+ const fetchSolBalance = async ({ address, rpcUrl })=>{
10
+ // Establish a connection to the Solana network using the provided RPC URL.
11
+ const connection = new Connection(rpcUrl);
12
+ // Convert the string address into a PublicKey object.
13
+ const publicKey = new PublicKey(address);
14
+ // Fetch the balance of the public key. The balance is in lamports.
15
+ const balanceInLamports = await connection.getBalance(publicKey);
16
+ // The getBalance method returns the balance in lamports.
17
+ // 1 SOL = 1,000,000,000 lamports.
18
+ const balanceInSol = balanceInLamports / 1000000000;
19
+ // Return the balance in SOL as a string
20
+ return balanceInSol.toString();
21
+ };
22
+
23
+ const createSolanaNetworkProvider = (networkData)=>_extends({}, createBaseNetworkProvider('SOL', networkData), {
24
+ cluster: networkData.cluster,
25
+ getBalance: async ({ address })=>({
26
+ balance: await fetchSolBalance({
27
+ address,
28
+ rpcUrl: networkData.rpcUrls.http[0]
29
+ })
30
+ })
31
+ });
32
+
33
+ const registerSolanaNetworkProviderBuilder = (client)=>{
34
+ const networkProviderBuilderRegistry = getNetworkProviderBuilderRegistry(client);
35
+ /**
36
+ * If the Solana network provider builder is already registered, return.
37
+ */ if (networkProviderBuilderRegistry.get().get('SOL')) {
38
+ return;
39
+ }
40
+ networkProviderBuilderRegistry.register({
41
+ builder: createSolanaNetworkProvider,
42
+ chain: 'SOL'
43
+ });
44
+ };
8
45
 
9
46
  const getFeaturesForSolanaStandardWallet = (wallet)=>{
10
47
  return wallet.features;
11
48
  };
12
49
 
13
- const createSolanaSignerFromSolanaStandardWallet = (wallet)=>{
14
- const features = getFeaturesForSolanaStandardWallet(wallet);
50
+ const createSolanaSignerFromSolanaStandardWallet = ({ networkProvider, walletStandardWallet })=>{
51
+ const features = getFeaturesForSolanaStandardWallet(walletStandardWallet);
15
52
  const getPublicKey = ()=>{
16
- var _wallet_accounts_, _wallet_accounts;
17
- if (!((_wallet_accounts = wallet.accounts) == null ? void 0 : (_wallet_accounts_ = _wallet_accounts[0]) == null ? void 0 : _wallet_accounts_.publicKey)) {
53
+ var _walletStandardWallet_accounts_, _walletStandardWallet_accounts;
54
+ if (!((_walletStandardWallet_accounts = walletStandardWallet.accounts) == null ? void 0 : (_walletStandardWallet_accounts_ = _walletStandardWallet_accounts[0]) == null ? void 0 : _walletStandardWallet_accounts_.publicKey)) {
18
55
  return undefined;
19
56
  }
20
- return new PublicKey(wallet.accounts[0].publicKey);
57
+ return new PublicKey(walletStandardWallet.accounts[0].publicKey);
21
58
  };
22
59
  const getChain = ()=>{
23
- // TODO: add support for getting the chain from the provider
24
- // const currentNetwork = provider.getSelectedNetwork();
25
- // assertDefined(currentNetwork, 'Network not found');
26
- // const cluster = currentNetwork.cluster ?? 'mainnet';
27
- const cluster = 'mainnet';
28
- return `solana:${cluster}`;
60
+ assertDefined(networkProvider.cluster, `Cluster was not defined for network provider ${networkProvider.displayName} (networkId: ${networkProvider.networkId})`);
61
+ return `solana:${networkProvider.cluster}`;
29
62
  };
30
63
  const isConnected = ()=>{
31
- var _wallet_accounts;
32
- return ((_wallet_accounts = wallet.accounts) == null ? void 0 : _wallet_accounts.length) > 0;
64
+ var _walletStandardWallet_accounts;
65
+ return ((_walletStandardWallet_accounts = walletStandardWallet.accounts) == null ? void 0 : _walletStandardWallet_accounts.length) > 0;
33
66
  };
34
67
  const getCurrentAccount = async ()=>{
35
- var _wallet_accounts;
68
+ var _walletStandardWallet_accounts;
36
69
  if (!isConnected()) {
37
70
  await connect();
38
71
  }
39
- const account = (_wallet_accounts = wallet.accounts) == null ? void 0 : _wallet_accounts[0];
72
+ const account = (_walletStandardWallet_accounts = walletStandardWallet.accounts) == null ? void 0 : _walletStandardWallet_accounts[0];
40
73
  assertDefined(account, 'No connected accounts found');
41
74
  return account;
42
75
  };
43
76
  const connect = async ()=>{
44
77
  var _features_standardconnect, _result_accounts;
45
- const autoConnectedAccounts = wallet.accounts;
78
+ const autoConnectedAccounts = walletStandardWallet.accounts;
46
79
  // some wallets like Farcaster will auto inject the account into the wallet object
47
80
  // instead of returning it from the connect method
48
81
  // so we need to check for that first
@@ -123,7 +156,7 @@ const createSolanaSignerFromSolanaStandardWallet = (wallet)=>{
123
156
  });
124
157
  const [{ signature }] = signedTransactions;
125
158
  return {
126
- signature: new TextDecoder().decode(signature)
159
+ signature: bs58.encode(signature)
127
160
  };
128
161
  };
129
162
  const signMessage = async (message)=>{
@@ -139,52 +172,35 @@ const createSolanaSignerFromSolanaStandardWallet = (wallet)=>{
139
172
  signature: messages[0].signature
140
173
  };
141
174
  };
142
- return {
143
- addListener: ()=>{
144
- throw new MethodNotImplementedError('addListener');
145
- },
175
+ return _extends({}, createEmptyEventEmitter(), {
146
176
  connect,
147
177
  disconnect,
148
- emit: ()=>{
149
- throw new MethodNotImplementedError('emit');
150
- },
151
- eventNames: ()=>{
152
- return [];
153
- },
154
178
  get isConnected () {
155
179
  return isConnected();
156
180
  },
157
- listenerCount: ()=>{
158
- return 0;
159
- },
160
- listeners: ()=>{
161
- return [];
162
- },
163
- off: ()=>{
164
- throw new MethodNotImplementedError('off');
165
- },
166
181
  on,
167
- once: ()=>{
168
- throw new MethodNotImplementedError('once');
169
- },
170
182
  providers: [],
171
183
  get publicKey () {
172
184
  return getPublicKey();
173
185
  },
174
- removeAllListeners: ()=>{
175
- throw new MethodNotImplementedError('removeAllListeners');
176
- },
177
- removeListener: ()=>{
178
- throw new MethodNotImplementedError('removeListener');
179
- },
180
186
  signAllTransactions,
181
187
  signAndSendTransaction,
182
188
  signMessage,
183
189
  signTransaction
184
- };
190
+ });
185
191
  };
186
192
 
187
- const createWalletProviderFromSolanaStandardWallet = ({ wallet })=>{
193
+ const createWalletProviderFromSolanaStandardWallet = ({ dynamicClient, walletStandardWallet })=>{
194
+ const key = formatWalletProviderKey(walletStandardWallet.name, 'SOL');
195
+ const getActiveNetworkId = async ()=>getActiveNetworkIdFromLastKnownRegistry({
196
+ client: dynamicClient,
197
+ walletProviderKey: key
198
+ });
199
+ const switchActiveNetwork = async ({ networkId })=>switchActiveNetworkInLastKnownRegistry({
200
+ client: dynamicClient,
201
+ networkId,
202
+ walletProviderKey: key
203
+ });
188
204
  const connect = async ()=>{
189
205
  const signer = await getSigner();
190
206
  const result = await signer.connect();
@@ -204,45 +220,24 @@ const createWalletProviderFromSolanaStandardWallet = ({ wallet })=>{
204
220
  await signer.connect();
205
221
  }
206
222
  return {
207
- addresses: wallet.accounts.map((account)=>account.address)
223
+ addresses: walletStandardWallet.accounts.map((account)=>account.address)
208
224
  };
209
225
  };
210
226
  const getSigner = async (walletAccount)=>{
211
227
  if (walletAccount) {
212
- await assertWalletAccountSigningAvailability(walletAccount);
228
+ await assertWalletAccountSigningAvailability({
229
+ walletAccount
230
+ }, dynamicClient);
213
231
  }
214
- return createSolanaSignerFromSolanaStandardWallet(wallet);
215
- };
216
- const proveOwnership = async (walletAccount)=>{
217
- var _core_metadata;
218
- const client = getClient(walletAccount);
219
- const core = getCore(client);
220
- const apiClient = createApiClient(client);
221
- const appUrl = (_core_metadata = core.metadata) == null ? void 0 : _core_metadata.url;
222
- assertDefined(appUrl, 'App URL is not set');
223
- const url = new URL(appUrl);
224
- const { nonce } = await apiClient.getNonce({
225
- environmentId: core.environmentId
232
+ const { networkId } = await getActiveNetworkId();
233
+ const networkProvider = getNetworkProviderFromNetworkId({
234
+ chain: 'SOL',
235
+ networkId
236
+ }, dynamicClient);
237
+ return createSolanaSignerFromSolanaStandardWallet({
238
+ networkProvider,
239
+ walletStandardWallet
226
240
  });
227
- assertDefined(nonce, 'Failed to get nonce');
228
- const messageToSign = await formatSignInMessage({
229
- address: walletAccount.address,
230
- blockchainName: 'Solana',
231
- domain: url.host,
232
- issuedAt: new Date().toISOString(),
233
- nonce,
234
- requestId: core.environmentId,
235
- uri: url.toString()
236
- });
237
- const signedMessage = await signMessage({
238
- message: messageToSign,
239
- walletAccount
240
- });
241
- return {
242
- chain: ChainEnum.Sol,
243
- messageToSign,
244
- signedMessage: signedMessage.signature
245
- };
246
241
  };
247
242
  const signMessage = async ({ message, walletAccount })=>{
248
243
  const signer = await getSigner(walletAccount);
@@ -253,22 +248,57 @@ const createWalletProviderFromSolanaStandardWallet = ({ wallet })=>{
253
248
  signature: bufferToBase64(signedMessage.signature)
254
249
  };
255
250
  };
256
- return {
251
+ const getEventsFeature = ()=>{
252
+ const features = getFeaturesForSolanaStandardWallet(walletStandardWallet);
253
+ const eventsFeature = features['standard:events'];
254
+ return eventsFeature;
255
+ };
256
+ const { getEventEmitter, cleanupEventEmitter } = createWalletProviderEventEmitter({
257
+ removeEventListeners: ({ setupReturnValue })=>{
258
+ assertDefined(setupReturnValue, 'Setup return value not defined');
259
+ setupReturnValue();
260
+ },
261
+ setupEventListeners: ({ handleAccountsChanged })=>{
262
+ return getEventsFeature().on('change', ({ accounts })=>{
263
+ var _accounts_map;
264
+ handleAccountsChanged({
265
+ addresses: (_accounts_map = accounts == null ? void 0 : accounts.map((account)=>account.address)) != null ? _accounts_map : []
266
+ });
267
+ });
268
+ },
269
+ supportedEvents: [
270
+ 'accountsChanged'
271
+ ]
272
+ });
273
+ const terminate = async ()=>{
274
+ cleanupEventEmitter();
275
+ };
276
+ const walletProvider = {
257
277
  chain: 'SOL',
258
278
  connect,
259
279
  disconnect,
280
+ getActiveNetworkId,
260
281
  getConnectedAddresses,
261
282
  getSigner,
262
283
  getWalletProviderType: ()=>WalletProviderEnum.BrowserExtension,
263
- groupKey: formatWalletProviderGroupKey(wallet.name),
264
- key: formatWalletProviderKey(wallet.name, ChainEnum.Sol),
284
+ groupKey: formatWalletProviderGroupKey(walletStandardWallet.name),
285
+ key,
265
286
  metadata: {
266
- displayName: wallet.name,
267
- icon: wallet.icon
287
+ displayName: walletStandardWallet.name,
288
+ icon: walletStandardWallet.icon
268
289
  },
269
- proveOwnership,
270
- signMessage
290
+ signMessage,
291
+ switchActiveNetwork,
292
+ terminate
271
293
  };
294
+ // The provider will only implement events if this external wallet provider
295
+ // implements the standard:events feature
296
+ if (getEventsFeature()) {
297
+ Object.defineProperty(walletProvider, 'events', {
298
+ get: ()=>getEventEmitter()
299
+ });
300
+ }
301
+ return walletProvider;
272
302
  };
273
303
 
274
304
  const hasAllRequiredFeatures = (wallet)=>{
@@ -277,16 +307,30 @@ const hasAllRequiredFeatures = (wallet)=>{
277
307
  };
278
308
 
279
309
  const SOLANA_WALLET_STANDARD_EXTENSION_KEY = 'solanaWalletStandard';
280
- const addSolanaWalletStandardExtension = (client)=>{
281
- if (hasExtension(client, SOLANA_WALLET_STANDARD_EXTENSION_KEY)) {
310
+ /**
311
+ * Adds the Solana Wallet Standard extension to the Dynamic client.
312
+ *
313
+ * This extension enables integration with wallets that implement the Solana Wallet Standard,
314
+ * automatically detecting and registering compatible wallets for use with the Dynamic SDK.
315
+ *
316
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
317
+ */ const addSolanaWalletStandardExtension = (client = getDefaultClient())=>{
318
+ if (hasExtension({
319
+ extensionKey: SOLANA_WALLET_STANDARD_EXTENSION_KEY
320
+ }, client)) {
282
321
  return;
283
322
  }
323
+ registerExtension({
324
+ extensionKey: SOLANA_WALLET_STANDARD_EXTENSION_KEY
325
+ }, client);
326
+ registerSolanaNetworkProviderBuilder(client);
284
327
  const walletProviderRegistry = getWalletProviderRegistry(client);
285
- const walletStandardWallet = getWallets().get().filter(hasAllRequiredFeatures);
286
- walletStandardWallet.forEach((wallet)=>{
287
- const walletProvider = assignClient(createWalletProviderFromSolanaStandardWallet({
288
- wallet
289
- }), client);
328
+ const walletStandardWallets = getWallets().get().filter(hasAllRequiredFeatures);
329
+ walletStandardWallets.forEach((walletStandardWallet)=>{
330
+ const walletProvider = createWalletProviderFromSolanaStandardWallet({
331
+ dynamicClient: client,
332
+ walletStandardWallet
333
+ });
290
334
  walletProviderRegistry.register({
291
335
  priority: WalletProviderPriority.WALLET_SELF_ANNOUNCEMENT_STANDARD,
292
336
  walletProvider
@@ -0,0 +1,176 @@
1
+ 'use strict';
2
+
3
+ var core = require('@dynamic-labs-sdk/client/core');
4
+ var isVersionedTransaction = require('./isVersionedTransaction.cjs.js');
5
+ var client = require('@dynamic-labs-sdk/client');
6
+ var core$1 = require('@dynamic-labs-sdk/client/waas/core');
7
+ var sdkApiCore = require('@dynamic-labs/sdk-api-core');
8
+ var web3_js = require('@solana/web3.js');
9
+ var bs58 = require('bs58');
10
+
11
+ /**
12
+ * Returns a new Solana connection for the given network provider.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { getActiveNetworkData } from '@dynamic-labs-sdk/client';
17
+ * import { isSolanaNetworkProvider, getSolanaConnection } from '@dynamic-labs-sdk/solana';
18
+ *
19
+ * const { networkData } = getActiveNetworkData({ walletAccount });
20
+ *
21
+ * if(!networkData) {
22
+ * throw new Error('No network data found');
23
+ * }
24
+ *
25
+ * const connection = getSolanaConnection({
26
+ * networkData,
27
+ * });
28
+ * ```
29
+ */ const getSolanaConnection = ({ networkData, commitmentOrConfig })=>{
30
+ return new web3_js.Connection(networkData.rpcUrls.http[0], commitmentOrConfig);
31
+ };
32
+
33
+ const createSolanaSignerFromSolanaWaasProvider = ({ networkData, waasProvider, walletAccount })=>{
34
+ const publicKey = new web3_js.PublicKey(walletAccount.address);
35
+ const signAndSendTransaction = async (transaction)=>{
36
+ const signedTransaction = await signTransaction(transaction);
37
+ const connection = getSolanaConnection({
38
+ networkData
39
+ });
40
+ const rawTransaction = signedTransaction.serialize();
41
+ const signature = await connection.sendRawTransaction(rawTransaction);
42
+ return {
43
+ signature
44
+ };
45
+ };
46
+ const signMessage = async (messageArrayBuffer)=>{
47
+ const message = bs58.encode(messageArrayBuffer);
48
+ const { signature } = await waasProvider.signMessage({
49
+ message,
50
+ walletAccount
51
+ });
52
+ return {
53
+ signature: bs58.decode(signature)
54
+ };
55
+ };
56
+ const signTransaction = async (transaction)=>{
57
+ const messageBytes = isVersionedTransaction.isVersionedTransaction(transaction) ? transaction.message.serialize() : transaction.serializeMessage();
58
+ const serializedTransaction = core.getBuffer().from(messageBytes).toString('hex');
59
+ const { signature } = await waasProvider.signSerializedTransaction({
60
+ serializedTransaction,
61
+ walletAccount
62
+ });
63
+ transaction.addSignature(publicKey, core.getBuffer().from(signature, 'hex'));
64
+ transaction.serialize({
65
+ requireAllSignatures: false,
66
+ verifySignatures: true
67
+ });
68
+ return transaction;
69
+ };
70
+ const signAllTransactions = async (transactions)=>{
71
+ return Promise.all(transactions.map(signTransaction));
72
+ };
73
+ return isVersionedTransaction._extends({}, isVersionedTransaction.createEmptyEventEmitter(), {
74
+ connect: ()=>{
75
+ throw new core.MethodNotImplementedError('connect');
76
+ },
77
+ disconnect: ()=>{
78
+ throw new core.MethodNotImplementedError('disconnect');
79
+ },
80
+ isConnected: true,
81
+ providers: [],
82
+ publicKey,
83
+ signAllTransactions,
84
+ signAndSendTransaction,
85
+ signMessage,
86
+ signTransaction
87
+ });
88
+ };
89
+
90
+ const createWalletProviderForWaasSolana = (sdkClient)=>{
91
+ const chain = 'SOL';
92
+ const key = core.formatWalletProviderKey(core$1.DYNAMIC_WAAS_METADATA.name, chain);
93
+ const waasProvider = core$1.createWaasProvider({
94
+ chain,
95
+ sdkClient
96
+ });
97
+ const getActiveNetworkId = async ()=>core.getActiveNetworkIdFromLastKnownRegistry({
98
+ client: sdkClient,
99
+ walletProviderKey: key
100
+ });
101
+ const switchActiveNetwork = async ({ networkId })=>core.switchActiveNetworkInLastKnownRegistry({
102
+ client: sdkClient,
103
+ networkId,
104
+ walletProviderKey: key
105
+ });
106
+ const getConnectedAddresses = async ()=>{
107
+ const waasSolanaAddresses = core$1.getAllUserWaasAddressesForChain({
108
+ chain
109
+ }, sdkClient);
110
+ return {
111
+ addresses: waasSolanaAddresses
112
+ };
113
+ };
114
+ const signMessage = async ({ message, walletAccount })=>{
115
+ core.assertDefined(walletAccount, 'Wallet account is required');
116
+ return waasProvider.signMessage({
117
+ message,
118
+ walletAccount
119
+ });
120
+ };
121
+ const getSigner = async (walletAccount)=>{
122
+ core.assertDefined(walletAccount, 'Wallet account is required');
123
+ const { networkData } = await client.getActiveNetworkData({
124
+ walletAccount
125
+ });
126
+ core.assertDefined(networkData, 'Network data is required');
127
+ return createSolanaSignerFromSolanaWaasProvider({
128
+ networkData,
129
+ waasProvider,
130
+ walletAccount
131
+ });
132
+ };
133
+ return isVersionedTransaction._extends({}, waasProvider, {
134
+ chain,
135
+ getActiveNetworkId,
136
+ getConnectedAddresses,
137
+ getSigner,
138
+ getWalletProviderType: ()=>sdkApiCore.WalletProviderEnum.EmbeddedWallet,
139
+ groupKey: core.formatWalletProviderGroupKey(core$1.DYNAMIC_WAAS_METADATA.name),
140
+ key,
141
+ metadata: {
142
+ displayName: core$1.DYNAMIC_WAAS_METADATA.name,
143
+ icon: core$1.DYNAMIC_WAAS_METADATA.icon
144
+ },
145
+ signMessage,
146
+ switchActiveNetwork
147
+ });
148
+ };
149
+
150
+ const WAAS_SOLANA_EXTENSION_KEY = 'waasSolana';
151
+ /**
152
+ * Adds the Dynamic WaaS (Wallet as a Service) Solana extension to the Dynamic client.
153
+ *
154
+ * This extension enables embedded wallet functionality for Solana blockchain,
155
+ * allowing users to have wallets managed by Dynamic's infrastructure.
156
+ *
157
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
158
+ */ const addWaasSolanaExtension = (client = core.getDefaultClient())=>{
159
+ if (core.hasExtension({
160
+ extensionKey: WAAS_SOLANA_EXTENSION_KEY
161
+ }, client)) {
162
+ return;
163
+ }
164
+ core.registerExtension({
165
+ extensionKey: WAAS_SOLANA_EXTENSION_KEY
166
+ }, client);
167
+ const walletProviderRegistry = core.getWalletProviderRegistry(client);
168
+ const walletProvider = createWalletProviderForWaasSolana(client);
169
+ walletProviderRegistry.register({
170
+ priority: core.WalletProviderPriority.WALLET_SDK,
171
+ walletProvider
172
+ });
173
+ };
174
+
175
+ exports.addWaasSolanaExtension = addWaasSolanaExtension;
176
+ exports.getSolanaConnection = getSolanaConnection;
@@ -0,0 +1,173 @@
1
+ import { MethodNotImplementedError, getBuffer, formatWalletProviderKey, formatWalletProviderGroupKey, switchActiveNetworkInLastKnownRegistry, getActiveNetworkIdFromLastKnownRegistry, assertDefined, getDefaultClient, hasExtension, registerExtension, getWalletProviderRegistry, WalletProviderPriority } from '@dynamic-labs-sdk/client/core';
2
+ import { _ as _extends, c as createEmptyEventEmitter, i as isVersionedTransaction } from './isVersionedTransaction.esm.js';
3
+ import { getActiveNetworkData } from '@dynamic-labs-sdk/client';
4
+ import { DYNAMIC_WAAS_METADATA, createWaasProvider, getAllUserWaasAddressesForChain } from '@dynamic-labs-sdk/client/waas/core';
5
+ import { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';
6
+ import { Connection, PublicKey } from '@solana/web3.js';
7
+ import bs58 from 'bs58';
8
+
9
+ /**
10
+ * Returns a new Solana connection for the given network provider.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { getActiveNetworkData } from '@dynamic-labs-sdk/client';
15
+ * import { isSolanaNetworkProvider, getSolanaConnection } from '@dynamic-labs-sdk/solana';
16
+ *
17
+ * const { networkData } = getActiveNetworkData({ walletAccount });
18
+ *
19
+ * if(!networkData) {
20
+ * throw new Error('No network data found');
21
+ * }
22
+ *
23
+ * const connection = getSolanaConnection({
24
+ * networkData,
25
+ * });
26
+ * ```
27
+ */ const getSolanaConnection = ({ networkData, commitmentOrConfig })=>{
28
+ return new Connection(networkData.rpcUrls.http[0], commitmentOrConfig);
29
+ };
30
+
31
+ const createSolanaSignerFromSolanaWaasProvider = ({ networkData, waasProvider, walletAccount })=>{
32
+ const publicKey = new PublicKey(walletAccount.address);
33
+ const signAndSendTransaction = async (transaction)=>{
34
+ const signedTransaction = await signTransaction(transaction);
35
+ const connection = getSolanaConnection({
36
+ networkData
37
+ });
38
+ const rawTransaction = signedTransaction.serialize();
39
+ const signature = await connection.sendRawTransaction(rawTransaction);
40
+ return {
41
+ signature
42
+ };
43
+ };
44
+ const signMessage = async (messageArrayBuffer)=>{
45
+ const message = bs58.encode(messageArrayBuffer);
46
+ const { signature } = await waasProvider.signMessage({
47
+ message,
48
+ walletAccount
49
+ });
50
+ return {
51
+ signature: bs58.decode(signature)
52
+ };
53
+ };
54
+ const signTransaction = async (transaction)=>{
55
+ const messageBytes = isVersionedTransaction(transaction) ? transaction.message.serialize() : transaction.serializeMessage();
56
+ const serializedTransaction = getBuffer().from(messageBytes).toString('hex');
57
+ const { signature } = await waasProvider.signSerializedTransaction({
58
+ serializedTransaction,
59
+ walletAccount
60
+ });
61
+ transaction.addSignature(publicKey, getBuffer().from(signature, 'hex'));
62
+ transaction.serialize({
63
+ requireAllSignatures: false,
64
+ verifySignatures: true
65
+ });
66
+ return transaction;
67
+ };
68
+ const signAllTransactions = async (transactions)=>{
69
+ return Promise.all(transactions.map(signTransaction));
70
+ };
71
+ return _extends({}, createEmptyEventEmitter(), {
72
+ connect: ()=>{
73
+ throw new MethodNotImplementedError('connect');
74
+ },
75
+ disconnect: ()=>{
76
+ throw new MethodNotImplementedError('disconnect');
77
+ },
78
+ isConnected: true,
79
+ providers: [],
80
+ publicKey,
81
+ signAllTransactions,
82
+ signAndSendTransaction,
83
+ signMessage,
84
+ signTransaction
85
+ });
86
+ };
87
+
88
+ const createWalletProviderForWaasSolana = (sdkClient)=>{
89
+ const chain = 'SOL';
90
+ const key = formatWalletProviderKey(DYNAMIC_WAAS_METADATA.name, chain);
91
+ const waasProvider = createWaasProvider({
92
+ chain,
93
+ sdkClient
94
+ });
95
+ const getActiveNetworkId = async ()=>getActiveNetworkIdFromLastKnownRegistry({
96
+ client: sdkClient,
97
+ walletProviderKey: key
98
+ });
99
+ const switchActiveNetwork = async ({ networkId })=>switchActiveNetworkInLastKnownRegistry({
100
+ client: sdkClient,
101
+ networkId,
102
+ walletProviderKey: key
103
+ });
104
+ const getConnectedAddresses = async ()=>{
105
+ const waasSolanaAddresses = getAllUserWaasAddressesForChain({
106
+ chain
107
+ }, sdkClient);
108
+ return {
109
+ addresses: waasSolanaAddresses
110
+ };
111
+ };
112
+ const signMessage = async ({ message, walletAccount })=>{
113
+ assertDefined(walletAccount, 'Wallet account is required');
114
+ return waasProvider.signMessage({
115
+ message,
116
+ walletAccount
117
+ });
118
+ };
119
+ const getSigner = async (walletAccount)=>{
120
+ assertDefined(walletAccount, 'Wallet account is required');
121
+ const { networkData } = await getActiveNetworkData({
122
+ walletAccount
123
+ });
124
+ assertDefined(networkData, 'Network data is required');
125
+ return createSolanaSignerFromSolanaWaasProvider({
126
+ networkData,
127
+ waasProvider,
128
+ walletAccount
129
+ });
130
+ };
131
+ return _extends({}, waasProvider, {
132
+ chain,
133
+ getActiveNetworkId,
134
+ getConnectedAddresses,
135
+ getSigner,
136
+ getWalletProviderType: ()=>WalletProviderEnum.EmbeddedWallet,
137
+ groupKey: formatWalletProviderGroupKey(DYNAMIC_WAAS_METADATA.name),
138
+ key,
139
+ metadata: {
140
+ displayName: DYNAMIC_WAAS_METADATA.name,
141
+ icon: DYNAMIC_WAAS_METADATA.icon
142
+ },
143
+ signMessage,
144
+ switchActiveNetwork
145
+ });
146
+ };
147
+
148
+ const WAAS_SOLANA_EXTENSION_KEY = 'waasSolana';
149
+ /**
150
+ * Adds the Dynamic WaaS (Wallet as a Service) Solana extension to the Dynamic client.
151
+ *
152
+ * This extension enables embedded wallet functionality for Solana blockchain,
153
+ * allowing users to have wallets managed by Dynamic's infrastructure.
154
+ *
155
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
156
+ */ const addWaasSolanaExtension = (client = getDefaultClient())=>{
157
+ if (hasExtension({
158
+ extensionKey: WAAS_SOLANA_EXTENSION_KEY
159
+ }, client)) {
160
+ return;
161
+ }
162
+ registerExtension({
163
+ extensionKey: WAAS_SOLANA_EXTENSION_KEY
164
+ }, client);
165
+ const walletProviderRegistry = getWalletProviderRegistry(client);
166
+ const walletProvider = createWalletProviderForWaasSolana(client);
167
+ walletProviderRegistry.register({
168
+ priority: WalletProviderPriority.WALLET_SDK,
169
+ walletProvider
170
+ });
171
+ };
172
+
173
+ export { addWaasSolanaExtension as a, getSolanaConnection as g };