@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.
- package/CHANGELOG.md +157 -0
- package/addSolanaWalletStandardExtension.cjs.js +141 -97
- package/addSolanaWalletStandardExtension.esm.js +142 -98
- package/addWaasSolanaExtension.cjs.js +176 -0
- package/addWaasSolanaExtension.esm.js +173 -0
- package/index.cjs.js +44 -11
- package/index.esm.js +44 -11
- package/isVersionedTransaction.cjs.js +63 -0
- package/isVersionedTransaction.esm.js +57 -0
- package/package.json +11 -4
- package/src/SolanaNetworkProvider.types.d.ts +8 -0
- package/src/SolanaNetworkProvider.types.d.ts.map +1 -0
- package/src/SolanaWalletAccount.types.d.ts +8 -0
- package/src/SolanaWalletAccount.types.d.ts.map +1 -0
- package/src/SolanaWalletProvider.types.d.ts +1 -1
- package/src/SolanaWalletProvider.types.d.ts.map +1 -1
- package/src/addSolanaExtension/addSolanaExtension.d.ts +7 -4
- package/src/addSolanaExtension/addSolanaExtension.d.ts.map +1 -1
- package/src/exports/index.d.ts +4 -1
- package/src/exports/index.d.ts.map +1 -1
- package/src/exports/waas.d.ts +2 -0
- package/src/exports/waas.d.ts.map +1 -0
- package/src/exports/walletStandard.d.ts.map +1 -1
- package/src/getSigner/getSigner.d.ts +14 -1
- package/src/getSigner/getSigner.d.ts.map +1 -1
- package/src/getSolanaConnection/getSolanaConnection.d.ts +29 -0
- package/src/getSolanaConnection/getSolanaConnection.d.ts.map +1 -0
- package/src/getSolanaConnection/index.d.ts +2 -0
- package/src/getSolanaConnection/index.d.ts.map +1 -0
- package/src/isSolanaNetworkProvider/index.d.ts +2 -0
- package/src/isSolanaNetworkProvider/index.d.ts.map +1 -0
- package/src/isSolanaNetworkProvider/isSolanaNetworkProvider.d.ts +10 -0
- package/src/isSolanaNetworkProvider/isSolanaNetworkProvider.d.ts.map +1 -0
- package/src/isSolanaWalletAccount/isSolanaWalletAccount.d.ts +8 -1
- package/src/isSolanaWalletAccount/isSolanaWalletAccount.d.ts.map +1 -1
- package/src/isSolanaWalletProvider/isSolanaWalletProvider.d.ts +1 -1
- package/src/isSolanaWalletProvider/isSolanaWalletProvider.d.ts.map +1 -1
- package/src/registerSolanaNetworkProviderBuilder/index.d.ts +2 -0
- package/src/registerSolanaNetworkProviderBuilder/index.d.ts.map +1 -0
- package/src/registerSolanaNetworkProviderBuilder/registerSolanaNetworkProviderBuilder.d.ts +3 -0
- package/src/registerSolanaNetworkProviderBuilder/registerSolanaNetworkProviderBuilder.d.ts.map +1 -0
- package/src/utils/createEmptyEventEmitter/createEmptyEventEmitter.d.ts +17 -0
- package/src/utils/createEmptyEventEmitter/createEmptyEventEmitter.d.ts.map +1 -0
- package/src/utils/createEmptyEventEmitter/index.d.ts +2 -0
- package/src/utils/createEmptyEventEmitter/index.d.ts.map +1 -0
- package/src/utils/createSolanaNetworkProvider/createSolanaNetworkProvider.d.ts +4 -0
- package/src/utils/createSolanaNetworkProvider/createSolanaNetworkProvider.d.ts.map +1 -0
- package/src/utils/createSolanaNetworkProvider/index.d.ts +2 -0
- package/src/utils/createSolanaNetworkProvider/index.d.ts.map +1 -0
- package/src/utils/fetchSolBalance/fetchSolBalance.d.ts +5 -0
- package/src/utils/fetchSolBalance/fetchSolBalance.d.ts.map +1 -0
- package/src/utils/fetchSolBalance/index.d.ts +2 -0
- package/src/utils/fetchSolBalance/index.d.ts.map +1 -0
- package/src/waas/WaasSolanaWalletProvider.types.d.ts +4 -0
- package/src/waas/WaasSolanaWalletProvider.types.d.ts.map +1 -0
- package/src/waas/addWaasSolanaExtension/addWaasSolanaExtension.d.ts +11 -0
- package/src/waas/addWaasSolanaExtension/addWaasSolanaExtension.d.ts.map +1 -0
- package/src/waas/addWaasSolanaExtension/index.d.ts +2 -0
- package/src/waas/addWaasSolanaExtension/index.d.ts.map +1 -0
- package/src/waas/utils/createSolanaSignerFromSolanaWaasProvider/createSolanaSignerFromSolanaWaasProvider.d.ts +11 -0
- package/src/waas/utils/createSolanaSignerFromSolanaWaasProvider/createSolanaSignerFromSolanaWaasProvider.d.ts.map +1 -0
- package/src/waas/utils/createSolanaSignerFromSolanaWaasProvider/index.d.ts +2 -0
- package/src/waas/utils/createSolanaSignerFromSolanaWaasProvider/index.d.ts.map +1 -0
- package/src/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.d.ts +4 -0
- package/src/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.d.ts.map +1 -0
- package/src/waas/utils/createWalletProviderForWaasSolana/index.d.ts +2 -0
- package/src/waas/utils/createWalletProviderForWaasSolana/index.d.ts.map +1 -0
- package/src/walletStandard/addSolanaWalletStandardExtension/addSolanaWalletStandardExtension.d.ts +9 -2
- package/src/walletStandard/addSolanaWalletStandardExtension/addSolanaWalletStandardExtension.d.ts.map +1 -1
- package/src/walletStandard/utils/createSolanaSignerFromSolanaStandardWallet/createSolanaSignerFromSolanaStandardWallet.d.ts +7 -1
- package/src/walletStandard/utils/createSolanaSignerFromSolanaStandardWallet/createSolanaSignerFromSolanaStandardWallet.d.ts.map +1 -1
- package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.d.ts +5 -3
- package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.d.ts.map +1 -1
- package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/getActiveNetworkId/getActiveNetworkId.d.ts +5 -0
- package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/getActiveNetworkId/getActiveNetworkId.d.ts.map +1 -0
- package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/getActiveNetworkId/index.d.ts +2 -0
- package/src/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/getActiveNetworkId/index.d.ts.map +1 -0
- package/waas.cjs.d.ts +1 -0
- package/waas.cjs.js +15 -0
- package/waas.esm.d.ts +1 -0
- package/waas.esm.js +11 -0
- package/walletStandard.cjs.js +5 -2
- package/walletStandard.esm.js +6 -1
|
@@ -1,48 +1,81 @@
|
|
|
1
|
-
import {
|
|
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
|
|
5
|
-
import
|
|
6
|
+
import { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';
|
|
7
|
+
import bs58 from 'bs58';
|
|
6
8
|
|
|
7
|
-
const
|
|
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 = (
|
|
14
|
-
const features = getFeaturesForSolanaStandardWallet(
|
|
50
|
+
const createSolanaSignerFromSolanaStandardWallet = ({ networkProvider, walletStandardWallet })=>{
|
|
51
|
+
const features = getFeaturesForSolanaStandardWallet(walletStandardWallet);
|
|
15
52
|
const getPublicKey = ()=>{
|
|
16
|
-
var
|
|
17
|
-
if (!((
|
|
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(
|
|
57
|
+
return new PublicKey(walletStandardWallet.accounts[0].publicKey);
|
|
21
58
|
};
|
|
22
59
|
const getChain = ()=>{
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
32
|
-
return ((
|
|
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
|
|
68
|
+
var _walletStandardWallet_accounts;
|
|
36
69
|
if (!isConnected()) {
|
|
37
70
|
await connect();
|
|
38
71
|
}
|
|
39
|
-
const account = (
|
|
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 =
|
|
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:
|
|
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 = ({
|
|
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:
|
|
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(
|
|
228
|
+
await assertWalletAccountSigningAvailability({
|
|
229
|
+
walletAccount
|
|
230
|
+
}, dynamicClient);
|
|
213
231
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
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(
|
|
264
|
-
key
|
|
284
|
+
groupKey: formatWalletProviderGroupKey(walletStandardWallet.name),
|
|
285
|
+
key,
|
|
265
286
|
metadata: {
|
|
266
|
-
displayName:
|
|
267
|
-
icon:
|
|
287
|
+
displayName: walletStandardWallet.name,
|
|
288
|
+
icon: walletStandardWallet.icon
|
|
268
289
|
},
|
|
269
|
-
|
|
270
|
-
|
|
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
|
-
|
|
281
|
-
|
|
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
|
|
286
|
-
|
|
287
|
-
const walletProvider =
|
|
288
|
-
|
|
289
|
-
|
|
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 };
|