@dynamic-labs/solana 0.0.0-exp20240808.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 (91) hide show
  1. package/CHANGELOG.md +3746 -0
  2. package/LICENSE +21 -0
  3. package/README.md +0 -0
  4. package/_virtual/_tslib.cjs +36 -0
  5. package/_virtual/_tslib.js +32 -0
  6. package/package.json +48 -0
  7. package/src/CoinbaseSolana.cjs +52 -0
  8. package/src/CoinbaseSolana.d.ts +9 -0
  9. package/src/CoinbaseSolana.js +48 -0
  10. package/src/Phantom.cjs +44 -0
  11. package/src/Phantom.d.ts +13 -0
  12. package/src/Phantom.js +40 -0
  13. package/src/SolanaWalletStandardConnector/SolanaWalletStandardConnector.cjs +100 -0
  14. package/src/SolanaWalletStandardConnector/SolanaWalletStandardConnector.d.ts +21 -0
  15. package/src/SolanaWalletStandardConnector/SolanaWalletStandardConnector.js +96 -0
  16. package/src/SolanaWalletStandardConnector/index.d.ts +1 -0
  17. package/src/SolanaWalletStandardConnector/utils/createSolanaSignerFromWalletStandard/createSolanaSignerFromWalletStandard.cjs +117 -0
  18. package/src/SolanaWalletStandardConnector/utils/createSolanaSignerFromWalletStandard/createSolanaSignerFromWalletStandard.d.ts +4 -0
  19. package/src/SolanaWalletStandardConnector/utils/createSolanaSignerFromWalletStandard/createSolanaSignerFromWalletStandard.js +113 -0
  20. package/src/SolanaWalletStandardConnector/utils/createSolanaSignerFromWalletStandard/index.d.ts +1 -0
  21. package/src/Solflare.cjs +63 -0
  22. package/src/Solflare.d.ts +9 -0
  23. package/src/Solflare.js +59 -0
  24. package/src/contants.cjs +8 -0
  25. package/src/contants.d.ts +1 -0
  26. package/src/contants.js +4 -0
  27. package/src/errors/SignMessageNotSupportedError.cjs +17 -0
  28. package/src/errors/SignMessageNotSupportedError.d.ts +4 -0
  29. package/src/errors/SignMessageNotSupportedError.js +13 -0
  30. package/src/index.cjs +30 -0
  31. package/src/index.d.ts +7 -0
  32. package/src/index.js +22 -0
  33. package/src/injected/BackpackSol.cjs +46 -0
  34. package/src/injected/BackpackSol.d.ts +9 -0
  35. package/src/injected/BackpackSol.js +42 -0
  36. package/src/injected/FallbackSolanaConnector.cjs +22 -0
  37. package/src/injected/FallbackSolanaConnector.d.ts +9 -0
  38. package/src/injected/FallbackSolanaConnector.js +18 -0
  39. package/src/injected/InjectedWalletBase.cjs +118 -0
  40. package/src/injected/InjectedWalletBase.d.ts +21 -0
  41. package/src/injected/InjectedWalletBase.js +114 -0
  42. package/src/injected/PhantomInjected.cjs +37 -0
  43. package/src/injected/PhantomInjected.d.ts +8 -0
  44. package/src/injected/PhantomInjected.js +33 -0
  45. package/src/injected/UnknownInjected.cjs +21 -0
  46. package/src/injected/UnknownInjected.d.ts +8 -0
  47. package/src/injected/UnknownInjected.js +17 -0
  48. package/src/injected/fetchInjectedWalletConnectors.cjs +63 -0
  49. package/src/injected/fetchInjectedWalletConnectors.d.ts +6 -0
  50. package/src/injected/fetchInjectedWalletConnectors.js +58 -0
  51. package/src/injected/index.d.ts +3 -0
  52. package/src/phantomRedirect/PhantomRedirect.cjs +337 -0
  53. package/src/phantomRedirect/PhantomRedirect.d.ts +37 -0
  54. package/src/phantomRedirect/PhantomRedirect.js +328 -0
  55. package/src/phantomRedirect/storage.cjs +96 -0
  56. package/src/phantomRedirect/storage.d.ts +40 -0
  57. package/src/phantomRedirect/storage.js +91 -0
  58. package/src/phantomRedirect/types.d.ts +1 -0
  59. package/src/phantomRedirect/utils.cjs +56 -0
  60. package/src/phantomRedirect/utils.d.ts +4 -0
  61. package/src/phantomRedirect/utils.js +44 -0
  62. package/src/solProviderHelper.cjs +173 -0
  63. package/src/solProviderHelper.d.ts +36 -0
  64. package/src/solProviderHelper.js +169 -0
  65. package/src/solWalletConnector.cjs +174 -0
  66. package/src/solWalletConnector.d.ts +37 -0
  67. package/src/solWalletConnector.js +170 -0
  68. package/src/types.d.ts +68 -0
  69. package/src/utils/extractNonce.cjs +14 -0
  70. package/src/utils/extractNonce.d.ts +1 -0
  71. package/src/utils/extractNonce.js +10 -0
  72. package/src/utils/findWalletProviderFromWalletStandard/findWalletProviderFromWalletStandard.cjs +29 -0
  73. package/src/utils/findWalletProviderFromWalletStandard/findWalletProviderFromWalletStandard.d.ts +3 -0
  74. package/src/utils/findWalletProviderFromWalletStandard/findWalletProviderFromWalletStandard.js +25 -0
  75. package/src/utils/findWalletProviderFromWalletStandard/index.d.ts +1 -0
  76. package/src/utils/getGenesisHashLSKey.cjs +10 -0
  77. package/src/utils/getGenesisHashLSKey.d.ts +1 -0
  78. package/src/utils/getGenesisHashLSKey.js +6 -0
  79. package/src/utils/isBackpackSolanaSigner.cjs +8 -0
  80. package/src/utils/isBackpackSolanaSigner.d.ts +2 -0
  81. package/src/utils/isBackpackSolanaSigner.js +4 -0
  82. package/src/utils/isSignedMessage.cjs +8 -0
  83. package/src/utils/isSignedMessage.d.ts +2 -0
  84. package/src/utils/isSignedMessage.js +4 -0
  85. package/src/wallet/SolanaWallet.cjs +33 -0
  86. package/src/wallet/SolanaWallet.d.ts +17 -0
  87. package/src/wallet/SolanaWallet.js +29 -0
  88. package/src/wallet/index.d.ts +2 -0
  89. package/src/wallet/isSolanaWallet.cjs +8 -0
  90. package/src/wallet/isSolanaWallet.d.ts +3 -0
  91. package/src/wallet/isSolanaWallet.js +4 -0
@@ -0,0 +1,173 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var _tslib = require('../_virtual/_tslib.cjs');
7
+ var utils = require('@dynamic-labs/utils');
8
+ var walletConnectorCore = require('@dynamic-labs/wallet-connector-core');
9
+ var isSignedMessage = require('./utils/isSignedMessage.cjs');
10
+ var findWalletProviderFromWalletStandard = require('./utils/findWalletProviderFromWalletStandard/findWalletProviderFromWalletStandard.cjs');
11
+
12
+ class SolProviderHelper {
13
+ constructor(wallet) {
14
+ this.wallet = wallet;
15
+ }
16
+ getInjectedConfig() {
17
+ if (!this.wallet || !this.wallet.injectedConfig)
18
+ return;
19
+ const { injectedConfig } = this.wallet;
20
+ return injectedConfig.find((c) => c.chain === 'sol');
21
+ }
22
+ getInstalledProvider() {
23
+ const config = this.getInjectedConfig();
24
+ if (!config || !config.extensionLocators) {
25
+ return undefined;
26
+ }
27
+ return this.installedProviderLookup(config.extensionLocators);
28
+ }
29
+ installedProviders() {
30
+ var _a, _b;
31
+ const config = this.getInjectedConfig();
32
+ if (!config)
33
+ return [];
34
+ const providers = [];
35
+ if (config.windowLocations) {
36
+ for (const windowLocation of config.windowLocations) {
37
+ const foundProviders = utils.getProvidersFromWindow(windowLocation);
38
+ if (foundProviders && foundProviders.length) {
39
+ providers.push(...foundProviders);
40
+ }
41
+ }
42
+ }
43
+ // We should only include the `window.solana` provider
44
+ // when extensionLocators are provided
45
+ if (config.extensionLocators.length !== 0 && window.solana) {
46
+ if (!window.solana.providers) {
47
+ providers.push(window.solana);
48
+ }
49
+ else {
50
+ window.solana.providers.forEach((provider) => providers.push(provider));
51
+ }
52
+ }
53
+ if (((_b = (_a = config.walletStandardLocators) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) > 0) {
54
+ const walletStandardProvider = findWalletProviderFromWalletStandard.findWalletProviderFromWalletStandard(config);
55
+ if (walletStandardProvider) {
56
+ providers.push(walletStandardProvider);
57
+ }
58
+ }
59
+ return providers;
60
+ }
61
+ installedProviderLookup(extensionLocators) {
62
+ const allInstalledProviders = this.installedProviders();
63
+ // No need to search through the window.solana providers if the
64
+ // wallet doesn't have extensionLocators
65
+ if (extensionLocators.length === 0) {
66
+ return allInstalledProviders[0];
67
+ }
68
+ return walletConnectorCore.ProviderLookup(allInstalledProviders, extensionLocators);
69
+ }
70
+ findProvider() {
71
+ return this.getInstalledProvider();
72
+ }
73
+ isInstalledHelper() {
74
+ return this.findProvider() !== undefined;
75
+ }
76
+ getAddress() {
77
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
78
+ var _a;
79
+ const provider = this.findProvider();
80
+ if (!provider) {
81
+ return undefined;
82
+ }
83
+ yield provider.connect();
84
+ return (_a = provider.publicKey) === null || _a === void 0 ? void 0 : _a.toString();
85
+ });
86
+ }
87
+ connect() {
88
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
89
+ const provider = this.findProvider();
90
+ if (!provider)
91
+ return undefined;
92
+ try {
93
+ if (!provider.isConnected) {
94
+ yield provider.connect();
95
+ }
96
+ return provider;
97
+ }
98
+ catch (err) {
99
+ return undefined;
100
+ }
101
+ });
102
+ }
103
+ signMessage(messageToSign) {
104
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
105
+ const walletAddress = yield this.getAddress();
106
+ if (!walletAddress)
107
+ return undefined;
108
+ const provider = this.findProvider();
109
+ if (!provider)
110
+ return undefined;
111
+ const encodedMessage = new TextEncoder().encode(messageToSign);
112
+ const signedMessage = yield provider.signMessage(encodedMessage, 'utf8');
113
+ if (!signedMessage)
114
+ return undefined;
115
+ return utils.bufferToBase64(isSignedMessage.isSignedMessage(signedMessage) ? signedMessage.signature : signedMessage);
116
+ });
117
+ }
118
+ handleAccountChange(walletConnector, web3Provider, address) {
119
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
120
+ var _a;
121
+ if (!address) {
122
+ yield (web3Provider === null || web3Provider === void 0 ? void 0 : web3Provider.connect());
123
+ if ((_a = web3Provider === null || web3Provider === void 0 ? void 0 : web3Provider.publicKey) === null || _a === void 0 ? void 0 : _a.toString()) {
124
+ walletConnector.emit('accountChange', {
125
+ accounts: [web3Provider.publicKey.toString()],
126
+ });
127
+ }
128
+ return;
129
+ }
130
+ if (address.toString()) {
131
+ walletConnector.emit('accountChange', { accounts: [address.toString()] });
132
+ }
133
+ });
134
+ }
135
+ _setupEventListeners(walletConnector) {
136
+ const provider = this.findProvider();
137
+ provider === null || provider === void 0 ? void 0 : provider.on('accountChanged', (publicKey) => this.handleAccountChange(walletConnector, provider, publicKey));
138
+ provider === null || provider === void 0 ? void 0 : provider.on('disconnect', () => walletConnector.emit('disconnect'));
139
+ }
140
+ _teardownEventListeners() {
141
+ const provider = this.findProvider();
142
+ if (!provider)
143
+ return;
144
+ provider.removeAllListeners();
145
+ }
146
+ getConnectedAccounts() {
147
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
148
+ var _a, _b;
149
+ const provider = this.findProvider();
150
+ if (!provider)
151
+ return [];
152
+ let connectionResult;
153
+ try {
154
+ if (!provider.isConnected) {
155
+ connectionResult = yield provider.connect({ onlyIfTrusted: true });
156
+ }
157
+ }
158
+ catch (e) {
159
+ return [];
160
+ }
161
+ const address = connectionResult === null || connectionResult === void 0 ? void 0 : connectionResult.address;
162
+ const publicKey = (_a = connectionResult === null || connectionResult === void 0 ? void 0 : connectionResult.publicKey) !== null && _a !== void 0 ? _a : (_b = provider.publicKey) === null || _b === void 0 ? void 0 : _b.toString();
163
+ if (address)
164
+ return [address];
165
+ else if (publicKey)
166
+ return [publicKey === null || publicKey === void 0 ? void 0 : publicKey.toString()];
167
+ else
168
+ return [];
169
+ });
170
+ }
171
+ }
172
+
173
+ exports.SolProviderHelper = SolProviderHelper;
@@ -0,0 +1,36 @@
1
+ import { WalletSchema } from '@dynamic-labs/wallet-book';
2
+ import { ProviderCondition, WalletConnector } from '@dynamic-labs/wallet-connector-core';
3
+ import { ISolana, ExtensionLocator as ExtensionLocator } from './types';
4
+ export declare class SolProviderHelper {
5
+ private wallet;
6
+ constructor(wallet: WalletSchema);
7
+ getInjectedConfig(): {
8
+ chain: string;
9
+ extensionLocators: {
10
+ value: boolean;
11
+ flag: string;
12
+ }[];
13
+ providerInterface?: string | undefined;
14
+ walletStandard?: {
15
+ features: string[];
16
+ name: string;
17
+ } | undefined;
18
+ walletStandardLocators?: {
19
+ name: string;
20
+ locator: string;
21
+ }[] | undefined;
22
+ windowLocations?: string[] | undefined;
23
+ } | undefined;
24
+ getInstalledProvider(): ISolana | undefined;
25
+ installedProviders(): (import("./types").ISolanaSigner | import("./types").IBackpackSolanaSigner | import("./types").ICoinbaseSolanaSigner)[];
26
+ installedProviderLookup(extensionLocators: Array<ProviderCondition<ExtensionLocator>>): ISolana | undefined;
27
+ findProvider(): ISolana | undefined;
28
+ isInstalledHelper(): boolean;
29
+ getAddress(): Promise<string | undefined>;
30
+ connect(): Promise<ISolana | undefined>;
31
+ signMessage(messageToSign: string): Promise<string | undefined>;
32
+ handleAccountChange(walletConnector: WalletConnector, web3Provider: ISolana, address: string): Promise<void>;
33
+ _setupEventListeners(walletConnector: WalletConnector): void;
34
+ _teardownEventListeners(): void;
35
+ getConnectedAccounts(): Promise<string[]>;
36
+ }
@@ -0,0 +1,169 @@
1
+ 'use client'
2
+ import { __awaiter } from '../_virtual/_tslib.js';
3
+ import { getProvidersFromWindow, bufferToBase64 } from '@dynamic-labs/utils';
4
+ import { ProviderLookup } from '@dynamic-labs/wallet-connector-core';
5
+ import { isSignedMessage } from './utils/isSignedMessage.js';
6
+ import { findWalletProviderFromWalletStandard } from './utils/findWalletProviderFromWalletStandard/findWalletProviderFromWalletStandard.js';
7
+
8
+ class SolProviderHelper {
9
+ constructor(wallet) {
10
+ this.wallet = wallet;
11
+ }
12
+ getInjectedConfig() {
13
+ if (!this.wallet || !this.wallet.injectedConfig)
14
+ return;
15
+ const { injectedConfig } = this.wallet;
16
+ return injectedConfig.find((c) => c.chain === 'sol');
17
+ }
18
+ getInstalledProvider() {
19
+ const config = this.getInjectedConfig();
20
+ if (!config || !config.extensionLocators) {
21
+ return undefined;
22
+ }
23
+ return this.installedProviderLookup(config.extensionLocators);
24
+ }
25
+ installedProviders() {
26
+ var _a, _b;
27
+ const config = this.getInjectedConfig();
28
+ if (!config)
29
+ return [];
30
+ const providers = [];
31
+ if (config.windowLocations) {
32
+ for (const windowLocation of config.windowLocations) {
33
+ const foundProviders = getProvidersFromWindow(windowLocation);
34
+ if (foundProviders && foundProviders.length) {
35
+ providers.push(...foundProviders);
36
+ }
37
+ }
38
+ }
39
+ // We should only include the `window.solana` provider
40
+ // when extensionLocators are provided
41
+ if (config.extensionLocators.length !== 0 && window.solana) {
42
+ if (!window.solana.providers) {
43
+ providers.push(window.solana);
44
+ }
45
+ else {
46
+ window.solana.providers.forEach((provider) => providers.push(provider));
47
+ }
48
+ }
49
+ if (((_b = (_a = config.walletStandardLocators) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) > 0) {
50
+ const walletStandardProvider = findWalletProviderFromWalletStandard(config);
51
+ if (walletStandardProvider) {
52
+ providers.push(walletStandardProvider);
53
+ }
54
+ }
55
+ return providers;
56
+ }
57
+ installedProviderLookup(extensionLocators) {
58
+ const allInstalledProviders = this.installedProviders();
59
+ // No need to search through the window.solana providers if the
60
+ // wallet doesn't have extensionLocators
61
+ if (extensionLocators.length === 0) {
62
+ return allInstalledProviders[0];
63
+ }
64
+ return ProviderLookup(allInstalledProviders, extensionLocators);
65
+ }
66
+ findProvider() {
67
+ return this.getInstalledProvider();
68
+ }
69
+ isInstalledHelper() {
70
+ return this.findProvider() !== undefined;
71
+ }
72
+ getAddress() {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ var _a;
75
+ const provider = this.findProvider();
76
+ if (!provider) {
77
+ return undefined;
78
+ }
79
+ yield provider.connect();
80
+ return (_a = provider.publicKey) === null || _a === void 0 ? void 0 : _a.toString();
81
+ });
82
+ }
83
+ connect() {
84
+ return __awaiter(this, void 0, void 0, function* () {
85
+ const provider = this.findProvider();
86
+ if (!provider)
87
+ return undefined;
88
+ try {
89
+ if (!provider.isConnected) {
90
+ yield provider.connect();
91
+ }
92
+ return provider;
93
+ }
94
+ catch (err) {
95
+ return undefined;
96
+ }
97
+ });
98
+ }
99
+ signMessage(messageToSign) {
100
+ return __awaiter(this, void 0, void 0, function* () {
101
+ const walletAddress = yield this.getAddress();
102
+ if (!walletAddress)
103
+ return undefined;
104
+ const provider = this.findProvider();
105
+ if (!provider)
106
+ return undefined;
107
+ const encodedMessage = new TextEncoder().encode(messageToSign);
108
+ const signedMessage = yield provider.signMessage(encodedMessage, 'utf8');
109
+ if (!signedMessage)
110
+ return undefined;
111
+ return bufferToBase64(isSignedMessage(signedMessage) ? signedMessage.signature : signedMessage);
112
+ });
113
+ }
114
+ handleAccountChange(walletConnector, web3Provider, address) {
115
+ return __awaiter(this, void 0, void 0, function* () {
116
+ var _a;
117
+ if (!address) {
118
+ yield (web3Provider === null || web3Provider === void 0 ? void 0 : web3Provider.connect());
119
+ if ((_a = web3Provider === null || web3Provider === void 0 ? void 0 : web3Provider.publicKey) === null || _a === void 0 ? void 0 : _a.toString()) {
120
+ walletConnector.emit('accountChange', {
121
+ accounts: [web3Provider.publicKey.toString()],
122
+ });
123
+ }
124
+ return;
125
+ }
126
+ if (address.toString()) {
127
+ walletConnector.emit('accountChange', { accounts: [address.toString()] });
128
+ }
129
+ });
130
+ }
131
+ _setupEventListeners(walletConnector) {
132
+ const provider = this.findProvider();
133
+ provider === null || provider === void 0 ? void 0 : provider.on('accountChanged', (publicKey) => this.handleAccountChange(walletConnector, provider, publicKey));
134
+ provider === null || provider === void 0 ? void 0 : provider.on('disconnect', () => walletConnector.emit('disconnect'));
135
+ }
136
+ _teardownEventListeners() {
137
+ const provider = this.findProvider();
138
+ if (!provider)
139
+ return;
140
+ provider.removeAllListeners();
141
+ }
142
+ getConnectedAccounts() {
143
+ return __awaiter(this, void 0, void 0, function* () {
144
+ var _a, _b;
145
+ const provider = this.findProvider();
146
+ if (!provider)
147
+ return [];
148
+ let connectionResult;
149
+ try {
150
+ if (!provider.isConnected) {
151
+ connectionResult = yield provider.connect({ onlyIfTrusted: true });
152
+ }
153
+ }
154
+ catch (e) {
155
+ return [];
156
+ }
157
+ const address = connectionResult === null || connectionResult === void 0 ? void 0 : connectionResult.address;
158
+ const publicKey = (_a = connectionResult === null || connectionResult === void 0 ? void 0 : connectionResult.publicKey) !== null && _a !== void 0 ? _a : (_b = provider.publicKey) === null || _b === void 0 ? void 0 : _b.toString();
159
+ if (address)
160
+ return [address];
161
+ else if (publicKey)
162
+ return [publicKey === null || publicKey === void 0 ? void 0 : publicKey.toString()];
163
+ else
164
+ return [];
165
+ });
166
+ }
167
+ }
168
+
169
+ export { SolProviderHelper };
@@ -0,0 +1,174 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var _tslib = require('../_virtual/_tslib.cjs');
7
+ var web3_js = require('@solana/web3.js');
8
+ var walletConnectorCore = require('@dynamic-labs/wallet-connector-core');
9
+ var utils = require('@dynamic-labs/utils');
10
+ var walletBook = require('@dynamic-labs/wallet-book');
11
+ var extractNonce = require('./utils/extractNonce.cjs');
12
+ var getGenesisHashLSKey = require('./utils/getGenesisHashLSKey.cjs');
13
+ var SolanaWallet = require('./wallet/SolanaWallet.cjs');
14
+
15
+ const MEMO_PROGRAM_ID = new web3_js.PublicKey('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr');
16
+ class SolWalletConnector extends walletConnectorCore.WalletConnectorBase {
17
+ constructor(opts) {
18
+ var _a;
19
+ super(opts);
20
+ this.isHardwareWalletEnabled = false;
21
+ this.verifiedCredentials = [];
22
+ this.ChainWallet = SolanaWallet.SolanaWallet;
23
+ this.supportedChains = ['SOL'];
24
+ this.connectedChain = 'SOL';
25
+ this.solNetworks = opts.solNetworks;
26
+ this.chainRpcProviders = opts.chainRpcProviders;
27
+ (_a = this.chainRpcProviders) === null || _a === void 0 ? void 0 : _a.registerSolanaProviders();
28
+ }
29
+ getNetwork() {
30
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
31
+ const provider = this.getWalletClient();
32
+ let genesisHash = localStorage.getItem(getGenesisHashLSKey.getGenesisHashLSKey(provider.rpcEndpoint));
33
+ if (!genesisHash) {
34
+ genesisHash = yield provider.getGenesisHash();
35
+ localStorage.setItem(getGenesisHashLSKey.getGenesisHashLSKey(provider.rpcEndpoint), genesisHash);
36
+ }
37
+ genesisHash = genesisHash.substring(0, 32);
38
+ // see: https://github.com/ChainAgnostic/namespaces/blob/main/solana/caip2.md
39
+ let network;
40
+ if (genesisHash === '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp') {
41
+ network = 'mainnet';
42
+ }
43
+ else if (genesisHash === 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1') {
44
+ network = 'devnet';
45
+ }
46
+ else {
47
+ network = 'testnet';
48
+ }
49
+ return network;
50
+ });
51
+ }
52
+ endSession() {
53
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
54
+ localStorage.removeItem(getGenesisHashLSKey.getGenesisHashLSKey(this.getWalletClient().rpcEndpoint));
55
+ });
56
+ }
57
+ getWalletClient() {
58
+ var _a;
59
+ const [network] = this.solNetworks;
60
+ if (!network) {
61
+ throw new utils.DynamicError('No enabled networks');
62
+ }
63
+ const rpcUrl = ((_a = network.privateCustomerRpcUrls) === null || _a === void 0 ? void 0 : _a[0]) || network.rpcUrls[0];
64
+ return new web3_js.Connection(rpcUrl, 'confirmed');
65
+ }
66
+ getPublicClient() {
67
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
68
+ var _a;
69
+ if (this.solNetworks.length === 0)
70
+ return;
71
+ const configurations = {
72
+ cosmos: [],
73
+ evm: undefined,
74
+ solana: this.solNetworks,
75
+ starknet: undefined,
76
+ };
77
+ if (!this.chainRpcProviders)
78
+ return undefined;
79
+ const providers = this.chainRpcProviders.getProviders(configurations);
80
+ return (_a = this.chainRpcProviders.getSolanaProviderByChainId(providers, '101')) === null || _a === void 0 ? void 0 : _a.provider;
81
+ });
82
+ }
83
+ getBalance(address) {
84
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
85
+ const publicKey = new web3_js.PublicKey(address);
86
+ const balance = this.lamportsToSol(yield this.getWalletClient().getBalance(publicKey));
87
+ return balance.toString();
88
+ });
89
+ }
90
+ // Solana uses lamports as the smallest unit of currency. This converts lamports to SOL.
91
+ lamportsToSol(lamports) {
92
+ return lamports / 1000000000;
93
+ }
94
+ canConnectWithHardwareWallet() {
95
+ const wallet = walletBook.findWalletBookWallet(this.walletBook, this.key);
96
+ if (!wallet || !wallet.hardwareWallets)
97
+ return false;
98
+ return wallet.hardwareWallets.includes('ledger');
99
+ }
100
+ signMessage(messageToSign) {
101
+ const _super = Object.create(null, {
102
+ signMessage: { get: () => super.signMessage }
103
+ });
104
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
105
+ if (this.isHardwareWalletEnabled) {
106
+ throw new utils.NotSupportedError(`Message signing is currently not supported on ${this.name} hardware wallet.
107
+ You can use signMessageViaTransaction instead to achieve similar functionality
108
+ by signing a transaction with a memo instruction.
109
+ You can read more about it here https://github.com/solana-labs/solana/issues/21366`);
110
+ }
111
+ return _super.signMessage.call(this, messageToSign);
112
+ });
113
+ }
114
+ proveOwnership(messageToSign) {
115
+ const _super = Object.create(null, {
116
+ proveOwnership: { get: () => super.proveOwnership }
117
+ });
118
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
119
+ if (this.isHardwareWalletEnabled) {
120
+ const nonce = extractNonce.extractNonce(messageToSign);
121
+ if (!nonce) {
122
+ throw new utils.DynamicError('Nonce missing');
123
+ }
124
+ return this.signMessageViaTransaction(nonce);
125
+ }
126
+ return _super.proveOwnership.call(this, messageToSign);
127
+ });
128
+ }
129
+ signMessageViaTransaction(messageToSign) {
130
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
131
+ const address = yield this.getAddress();
132
+ if (!address) {
133
+ throw new utils.DynamicError('Address missing');
134
+ }
135
+ const transaction = this.buildAuthTx(messageToSign);
136
+ transaction.feePayer = new web3_js.PublicKey(address);
137
+ transaction.recentBlockhash = (yield this.getWalletClient().getLatestBlockhash()).blockhash;
138
+ const signer = yield this.getSigner();
139
+ if (!signer) {
140
+ throw new utils.DynamicError('Signer not found');
141
+ }
142
+ const signedTransaction = yield signer.signTransaction(transaction);
143
+ const serializedSignedTransaction = signedTransaction.serialize();
144
+ /**
145
+ * Serializing the transaction and adding the type 'Buffer' is required
146
+ * when connecting with backpack + Ledger, because the returned object is not correctly
147
+ * serialized
148
+ */
149
+ return JSON.stringify({
150
+ signedTransaction: {
151
+ data: Array.from(serializedSignedTransaction),
152
+ type: 'Buffer',
153
+ },
154
+ });
155
+ });
156
+ }
157
+ buildAuthTx(message) {
158
+ const transaction = new web3_js.Transaction();
159
+ transaction.add(new web3_js.TransactionInstruction({
160
+ data: Buffer.from(message, 'utf8'),
161
+ keys: [],
162
+ programId: MEMO_PROGRAM_ID,
163
+ }));
164
+ return transaction;
165
+ }
166
+ setVerifiedCredentials(verifiedCredentials) {
167
+ this.verifiedCredentials = verifiedCredentials;
168
+ }
169
+ isLedgerAddress(address) {
170
+ return utils.isLedgerAddressViaVerifiedCredentials(address, this.verifiedCredentials);
171
+ }
172
+ }
173
+
174
+ exports.SolWalletConnector = SolWalletConnector;
@@ -0,0 +1,37 @@
1
+ import { Connection } from '@solana/web3.js';
2
+ import { IChainRpcProviders } from '@dynamic-labs/rpc-provider-solana';
3
+ import { Chain, IHardwareWalletConnector, WalletConnectorBase } from '@dynamic-labs/wallet-connector-core';
4
+ import { GenericNetwork } from '@dynamic-labs/types';
5
+ import { WalletBookSchema } from '@dynamic-labs/wallet-book';
6
+ import { JwtVerifiedCredential } from '@dynamic-labs/sdk-api-core';
7
+ import { ISolana } from './types';
8
+ import { SolanaWallet } from './wallet';
9
+ export type SolWalletConnectorOpts = {
10
+ chainRpcProviders: IChainRpcProviders;
11
+ solNetworks: GenericNetwork[];
12
+ walletBook: WalletBookSchema;
13
+ };
14
+ export declare abstract class SolWalletConnector extends WalletConnectorBase<typeof SolanaWallet> implements IHardwareWalletConnector {
15
+ isHardwareWalletEnabled: boolean;
16
+ verifiedCredentials: JwtVerifiedCredential[];
17
+ solNetworks: GenericNetwork[];
18
+ ChainWallet: typeof SolanaWallet;
19
+ supportedChains: Chain[];
20
+ connectedChain: Chain;
21
+ constructor(opts: SolWalletConnectorOpts);
22
+ getNetwork(): Promise<string>;
23
+ endSession(): Promise<void>;
24
+ getWalletClient(): Connection;
25
+ getPublicClient(): Promise<Connection | undefined>;
26
+ abstract getSigner(): Promise<ISolana | undefined>;
27
+ abstract connect(): Promise<void>;
28
+ getBalance(address: string): Promise<string | undefined>;
29
+ lamportsToSol(lamports: number): number;
30
+ canConnectWithHardwareWallet(): boolean;
31
+ signMessage(messageToSign: string): Promise<string | undefined>;
32
+ proveOwnership(messageToSign: string): Promise<string | undefined>;
33
+ signMessageViaTransaction(messageToSign: string): Promise<string>;
34
+ private buildAuthTx;
35
+ setVerifiedCredentials(verifiedCredentials: JwtVerifiedCredential[]): void;
36
+ isLedgerAddress(address: string): boolean;
37
+ }