@vue-solana/core 0.4.2 → 0.5.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.
@@ -1,5 +1,7 @@
1
1
  import { assertWalletConnected, assertWalletCanSign } from './wallet.mjs';
2
2
 
3
+ const DEFAULT_CONFIRMATION_COMMITMENT = "confirmed";
4
+ const DEFAULT_CONFIRMATION_TIMEOUT_MS = 6e4;
3
5
  async function signAndSendTransaction(connection, wallet, transaction, options) {
4
6
  assertWalletConnected(wallet);
5
7
  if (isMobileWalletAdapterWallet(wallet) && wallet.signTransaction) {
@@ -13,6 +15,23 @@ async function signAndSendTransaction(connection, wallet, transaction, options)
13
15
  assertWalletCanSign(wallet);
14
16
  return signAndSendRawTransaction(connection, wallet, transaction, options);
15
17
  }
18
+ async function confirmTransactionSignature(connection, signature, options = {}) {
19
+ const commitment = options.commitment ?? DEFAULT_CONFIRMATION_COMMITMENT;
20
+ const confirmation = connection.confirmTransaction(signature, commitment);
21
+ const result = await withTransactionTimeout(
22
+ confirmation,
23
+ options.timeoutMs ?? DEFAULT_CONFIRMATION_TIMEOUT_MS,
24
+ `Timed out waiting for transaction ${signature} to reach ${commitment} commitment.`
25
+ );
26
+ if (result.value.err) {
27
+ throw new Error(`Transaction ${signature} failed to reach ${commitment} commitment.`);
28
+ }
29
+ return {
30
+ signature,
31
+ commitment,
32
+ result
33
+ };
34
+ }
16
35
  async function signAndSendRawTransaction(connection, wallet, transaction, options) {
17
36
  const signedTransaction = await wallet.signTransaction(transaction);
18
37
  const rawTransaction = signedTransaction.serialize();
@@ -21,5 +40,20 @@ async function signAndSendRawTransaction(connection, wallet, transaction, option
21
40
  function isMobileWalletAdapterWallet(wallet) {
22
41
  return wallet.source === "mobile-wallet-adapter";
23
42
  }
43
+ async function withTransactionTimeout(promise, timeoutMs, message) {
44
+ let timeoutId;
45
+ try {
46
+ const timeout = new Promise((_, reject) => {
47
+ timeoutId = setTimeout(() => {
48
+ reject(new Error(message));
49
+ }, timeoutMs);
50
+ });
51
+ return await Promise.race([promise, timeout]);
52
+ } finally {
53
+ if (timeoutId) {
54
+ clearTimeout(timeoutId);
55
+ }
56
+ }
57
+ }
24
58
 
25
- export { signAndSendTransaction };
59
+ export { confirmTransactionSignature, signAndSendTransaction };
package/dist/types.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { SendOptions, Commitment, Connection, Transaction, VersionedTransaction, PublicKey, TransactionSignature } from '@solana/web3-compat';
1
+ import { Commitment, SendOptions, Connection, Transaction, VersionedTransaction, PublicKey, TransactionSignature, RpcResponseAndContext, SignatureResult } from '@solana/web3-compat';
2
2
 
3
3
  type SolanaCluster = "mainnet-beta" | "testnet" | "devnet" | "localnet";
4
4
  type SolanaChain = "solana:mainnet" | "solana:testnet" | "solana:devnet" | "solana:localnet";
@@ -58,5 +58,14 @@ interface SolanaWalletInfo {
58
58
  interface SendTransactionOptions extends SendOptions {
59
59
  skipPreflight?: boolean;
60
60
  }
61
+ interface ConfirmTransactionOptions {
62
+ commitment?: Commitment;
63
+ timeoutMs?: number;
64
+ }
65
+ interface TransactionConfirmation {
66
+ signature: TransactionSignature;
67
+ commitment: Commitment;
68
+ result: RpcResponseAndContext<SignatureResult>;
69
+ }
61
70
 
62
- export type { SendTransactionOptions, SolanaChain, SolanaCluster, SolanaConfig, SolanaContext, SolanaTransaction, SolanaWallet, SolanaWalletInfo };
71
+ export type { ConfirmTransactionOptions, SendTransactionOptions, SolanaChain, SolanaCluster, SolanaConfig, SolanaContext, SolanaTransaction, SolanaWallet, SolanaWalletInfo, TransactionConfirmation };
package/dist/types.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { SendOptions, Commitment, Connection, Transaction, VersionedTransaction, PublicKey, TransactionSignature } from '@solana/web3-compat';
1
+ import { Commitment, SendOptions, Connection, Transaction, VersionedTransaction, PublicKey, TransactionSignature, RpcResponseAndContext, SignatureResult } from '@solana/web3-compat';
2
2
 
3
3
  type SolanaCluster = "mainnet-beta" | "testnet" | "devnet" | "localnet";
4
4
  type SolanaChain = "solana:mainnet" | "solana:testnet" | "solana:devnet" | "solana:localnet";
@@ -58,5 +58,14 @@ interface SolanaWalletInfo {
58
58
  interface SendTransactionOptions extends SendOptions {
59
59
  skipPreflight?: boolean;
60
60
  }
61
+ interface ConfirmTransactionOptions {
62
+ commitment?: Commitment;
63
+ timeoutMs?: number;
64
+ }
65
+ interface TransactionConfirmation {
66
+ signature: TransactionSignature;
67
+ commitment: Commitment;
68
+ result: RpcResponseAndContext<SignatureResult>;
69
+ }
61
70
 
62
- export type { SendTransactionOptions, SolanaChain, SolanaCluster, SolanaConfig, SolanaContext, SolanaTransaction, SolanaWallet, SolanaWalletInfo };
71
+ export type { ConfirmTransactionOptions, SendTransactionOptions, SolanaChain, SolanaCluster, SolanaConfig, SolanaContext, SolanaTransaction, SolanaWallet, SolanaWalletInfo, TransactionConfirmation };
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { SendOptions, Commitment, Connection, Transaction, VersionedTransaction, PublicKey, TransactionSignature } from '@solana/web3-compat';
1
+ import { Commitment, SendOptions, Connection, Transaction, VersionedTransaction, PublicKey, TransactionSignature, RpcResponseAndContext, SignatureResult } from '@solana/web3-compat';
2
2
 
3
3
  type SolanaCluster = "mainnet-beta" | "testnet" | "devnet" | "localnet";
4
4
  type SolanaChain = "solana:mainnet" | "solana:testnet" | "solana:devnet" | "solana:localnet";
@@ -58,5 +58,14 @@ interface SolanaWalletInfo {
58
58
  interface SendTransactionOptions extends SendOptions {
59
59
  skipPreflight?: boolean;
60
60
  }
61
+ interface ConfirmTransactionOptions {
62
+ commitment?: Commitment;
63
+ timeoutMs?: number;
64
+ }
65
+ interface TransactionConfirmation {
66
+ signature: TransactionSignature;
67
+ commitment: Commitment;
68
+ result: RpcResponseAndContext<SignatureResult>;
69
+ }
61
70
 
62
- export type { SendTransactionOptions, SolanaChain, SolanaCluster, SolanaConfig, SolanaContext, SolanaTransaction, SolanaWallet, SolanaWalletInfo };
71
+ export type { ConfirmTransactionOptions, SendTransactionOptions, SolanaChain, SolanaCluster, SolanaConfig, SolanaContext, SolanaTransaction, SolanaWallet, SolanaWalletInfo, TransactionConfirmation };
@@ -1,232 +1,18 @@
1
1
  'use strict';
2
2
 
3
- const app = require('@wallet-standard/app');
4
- const features = require('@wallet-standard/features');
5
- const walletStandardFeatures = require('@solana/wallet-standard-features');
6
- const web3Compat = require('@solana/web3-compat');
7
- const bs58 = require('bs58');
3
+ const discovery = require('./shared/core.8V8PLE-S.cjs');
4
+ require('@wallet-standard/features');
5
+ require('@solana/wallet-standard-features');
6
+ require('@solana/web3-compat');
7
+ require('bs58');
8
+ require('@wallet-standard/app');
8
9
 
9
- function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
10
10
 
11
- const bs58__default = /*#__PURE__*/_interopDefaultCompat(bs58);
12
11
 
13
- const SOLANA_CHAINS = [
14
- "solana:mainnet",
15
- "solana:testnet",
16
- "solana:devnet",
17
- "solana:localnet"
18
- ];
19
- const SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME = "Mobile Wallet Adapter";
20
- function getSolanaChain(cluster) {
21
- if (cluster === "mainnet-beta") {
22
- return "solana:mainnet";
23
- }
24
- return `solana:${cluster}`;
25
- }
26
- function isSolanaStandardWallet(wallet) {
27
- return features.StandardConnect in wallet.features && features.StandardDisconnect in wallet.features && wallet.chains.some((chain) => SOLANA_CHAINS.includes(chain));
28
- }
29
- function getRegisteredSolanaWallets() {
30
- if (typeof window === "undefined") {
31
- return [];
32
- }
33
- return app.getWallets().get().filter(isSolanaStandardWallet).map(createSolanaWalletInfo);
34
- }
35
- function subscribeSolanaWallets(listener) {
36
- if (typeof window === "undefined") {
37
- return () => {
38
- };
39
- }
40
- const wallets = app.getWallets();
41
- const offRegister = wallets.on("register", listener);
42
- const offUnregister = wallets.on("unregister", listener);
43
- return () => {
44
- offRegister();
45
- offUnregister();
46
- };
47
- }
48
- function adaptSolanaStandardWallet(walletInfo, options = {}) {
49
- const wallet = walletInfo.wallet;
50
- let accounts = wallet.accounts;
51
- let account = options.account;
52
- let allowAccountUpdates = Boolean(options.account);
53
- let connecting = false;
54
- let disconnecting = false;
55
- let manuallyDisconnected = false;
56
- const eventsFeature = wallet.features[features.StandardEvents];
57
- eventsFeature?.on("change", (properties) => {
58
- if (properties.accounts) {
59
- accounts = properties.accounts;
60
- account = allowAccountUpdates && !manuallyDisconnected ? getSolanaAccount(accounts, options.chain) : void 0;
61
- options.onChange?.();
62
- }
63
- });
64
- return {
65
- platform: walletInfo.platform,
66
- source: walletInfo.source,
67
- get publicKey() {
68
- return account ? new web3Compat.PublicKey(account.publicKey) : null;
69
- },
70
- get connected() {
71
- return Boolean(account);
72
- },
73
- get connecting() {
74
- return connecting;
75
- },
76
- get disconnecting() {
77
- return disconnecting;
78
- },
79
- async connect() {
80
- connecting = true;
81
- manuallyDisconnected = false;
82
- options.onChange?.();
83
- try {
84
- const feature = wallet.features[features.StandardConnect];
85
- const result = await feature.connect();
86
- accounts = result.accounts;
87
- allowAccountUpdates = true;
88
- account = getSolanaAccount(accounts, options.chain);
89
- if (!account) {
90
- throw new Error("Solana wallet did not authorize a Solana account");
91
- }
92
- } finally {
93
- connecting = false;
94
- options.onChange?.();
95
- }
96
- },
97
- async disconnect() {
98
- const feature = wallet.features[features.StandardDisconnect];
99
- disconnecting = true;
100
- manuallyDisconnected = true;
101
- allowAccountUpdates = false;
102
- account = void 0;
103
- options.onChange?.();
104
- try {
105
- await feature.disconnect();
106
- accounts = [];
107
- account = void 0;
108
- } catch (error) {
109
- manuallyDisconnected = false;
110
- allowAccountUpdates = true;
111
- account = getSolanaAccount(accounts, options.chain);
112
- throw error;
113
- } finally {
114
- disconnecting = false;
115
- options.onChange?.();
116
- }
117
- },
118
- signTransaction: hasSignTransaction(wallet) ? async (transaction) => {
119
- const activeAccount = getActiveAccount(account);
120
- const [result] = await wallet.features[walletStandardFeatures.SolanaSignTransaction].signTransaction({
121
- account: activeAccount,
122
- transaction: serializeTransaction(transaction),
123
- chain: options.chain
124
- });
125
- if (!result) {
126
- throw new Error("Solana wallet did not return a signed transaction");
127
- }
128
- return deserializeTransaction(transaction, result.signedTransaction);
129
- } : void 0,
130
- signAllTransactions: hasSignTransaction(wallet) ? async (transactions) => {
131
- const activeAccount = getActiveAccount(account);
132
- const results = await wallet.features[walletStandardFeatures.SolanaSignTransaction].signTransaction(
133
- ...transactions.map((transaction) => ({
134
- account: activeAccount,
135
- transaction: serializeTransaction(transaction),
136
- chain: options.chain
137
- }))
138
- );
139
- if (results.length !== transactions.length) {
140
- throw new Error(
141
- `Solana wallet returned ${results.length} signed transactions for ${transactions.length} requested transactions`
142
- );
143
- }
144
- return results.map((result, index) => {
145
- if (!result) {
146
- throw new Error("Solana wallet did not return a signed transaction");
147
- }
148
- return deserializeTransaction(transactions[index], result.signedTransaction);
149
- });
150
- } : void 0,
151
- signAndSendTransaction: hasSignAndSendTransaction(wallet) ? async (transaction, sendOptions) => {
152
- const activeAccount = getActiveAccount(account);
153
- const [result] = await wallet.features[walletStandardFeatures.SolanaSignAndSendTransaction].signAndSendTransaction({
154
- account: activeAccount,
155
- transaction: serializeTransaction(transaction),
156
- chain: options.chain ?? getSolanaAccountChain(activeAccount),
157
- options: sendOptions
158
- });
159
- if (!result) {
160
- throw new Error("Solana wallet did not return a transaction signature");
161
- }
162
- return { signature: bs58__default.encode(result.signature) };
163
- } : void 0
164
- };
165
- }
166
- function createSolanaWalletInfo(wallet) {
167
- const isMobileWallet = wallet.name === SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME;
168
- return {
169
- name: wallet.name,
170
- icon: wallet.icon,
171
- chains: wallet.chains,
172
- platform: isMobileWallet ? "mobile" : "browser",
173
- source: isMobileWallet ? "mobile-wallet-adapter" : "wallet-standard",
174
- appUrl: getWalletUrl(wallet),
175
- accounts: wallet.accounts.map((account) => ({
176
- address: account.address,
177
- publicKey: Uint8Array.from(account.publicKey),
178
- chains: account.chains,
179
- label: account.label,
180
- icon: account.icon
181
- })),
182
- wallet
183
- };
184
- }
185
- function getWalletUrl(wallet) {
186
- return "url" in wallet && typeof wallet.url === "string" ? wallet.url : void 0;
187
- }
188
- function getSolanaAccount(accounts, chain) {
189
- return accounts.find((account) => account.chains.some((accountChain) => accountChain === chain)) ?? accounts.find(
190
- (account) => account.chains.some((accountChain) => SOLANA_CHAINS.includes(accountChain))
191
- );
192
- }
193
- function getActiveAccount(account) {
194
- if (!account) {
195
- throw new Error("Solana wallet is not connected");
196
- }
197
- return account;
198
- }
199
- function getSolanaAccountChain(account) {
200
- const chain = account.chains.find(
201
- (accountChain) => SOLANA_CHAINS.includes(accountChain)
202
- );
203
- if (!chain) {
204
- throw new Error("Solana wallet account does not support a Solana chain");
205
- }
206
- return chain;
207
- }
208
- function hasSignTransaction(wallet) {
209
- return walletStandardFeatures.SolanaSignTransaction in wallet.features;
210
- }
211
- function hasSignAndSendTransaction(wallet) {
212
- return walletStandardFeatures.SolanaSignAndSendTransaction in wallet.features;
213
- }
214
- function serializeTransaction(transaction) {
215
- if (transaction instanceof web3Compat.Transaction) {
216
- return transaction.serialize({ requireAllSignatures: false, verifySignatures: false });
217
- }
218
- return transaction.serialize();
219
- }
220
- function deserializeTransaction(source, bytes) {
221
- if (source instanceof web3Compat.Transaction) {
222
- return web3Compat.Transaction.from(bytes);
223
- }
224
- return web3Compat.VersionedTransaction.deserialize(bytes);
225
- }
226
-
227
- exports.SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME = SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME;
228
- exports.adaptSolanaStandardWallet = adaptSolanaStandardWallet;
229
- exports.getRegisteredSolanaWallets = getRegisteredSolanaWallets;
230
- exports.getSolanaChain = getSolanaChain;
231
- exports.isSolanaStandardWallet = isSolanaStandardWallet;
232
- exports.subscribeSolanaWallets = subscribeSolanaWallets;
12
+ exports.SOLANA_CHAINS = discovery.SOLANA_CHAINS;
13
+ exports.SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME = discovery.SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME;
14
+ exports.adaptSolanaStandardWallet = discovery.adaptSolanaStandardWallet;
15
+ exports.getRegisteredSolanaWallets = discovery.getRegisteredSolanaWallets;
16
+ exports.getSolanaChain = discovery.getSolanaChain;
17
+ exports.isSolanaStandardWallet = discovery.isSolanaStandardWallet;
18
+ exports.subscribeSolanaWallets = discovery.subscribeSolanaWallets;
@@ -2,17 +2,20 @@ import { WalletAccount, Wallet } from '@wallet-standard/base';
2
2
  import { SolanaChain, SolanaWalletInfo, SolanaWallet, SolanaCluster } from './types.cjs';
3
3
  import '@solana/web3-compat';
4
4
 
5
- declare const SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME = "Mobile Wallet Adapter";
6
5
  interface AdaptSolanaWalletOptions {
7
6
  chain?: SolanaChain;
8
7
  account?: WalletAccount;
9
8
  onChange?: () => void;
10
9
  }
10
+ declare function adaptSolanaStandardWallet(walletInfo: SolanaWalletInfo, options?: AdaptSolanaWalletOptions): SolanaWallet;
11
+
12
+ declare const SOLANA_CHAINS: readonly SolanaChain[];
11
13
  declare function getSolanaChain(cluster: SolanaCluster): SolanaChain;
14
+
15
+ declare const SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME = "Mobile Wallet Adapter";
12
16
  declare function isSolanaStandardWallet(wallet: Wallet): boolean;
13
17
  declare function getRegisteredSolanaWallets(): SolanaWalletInfo[];
14
18
  declare function subscribeSolanaWallets(listener: () => void): () => void;
15
- declare function adaptSolanaStandardWallet(walletInfo: SolanaWalletInfo, options?: AdaptSolanaWalletOptions): SolanaWallet;
16
19
 
17
- export { SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME, adaptSolanaStandardWallet, getRegisteredSolanaWallets, getSolanaChain, isSolanaStandardWallet, subscribeSolanaWallets };
20
+ export { SOLANA_CHAINS, SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME, adaptSolanaStandardWallet, getRegisteredSolanaWallets, getSolanaChain, isSolanaStandardWallet, subscribeSolanaWallets };
18
21
  export type { AdaptSolanaWalletOptions };
@@ -2,17 +2,20 @@ import { WalletAccount, Wallet } from '@wallet-standard/base';
2
2
  import { SolanaChain, SolanaWalletInfo, SolanaWallet, SolanaCluster } from './types.mjs';
3
3
  import '@solana/web3-compat';
4
4
 
5
- declare const SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME = "Mobile Wallet Adapter";
6
5
  interface AdaptSolanaWalletOptions {
7
6
  chain?: SolanaChain;
8
7
  account?: WalletAccount;
9
8
  onChange?: () => void;
10
9
  }
10
+ declare function adaptSolanaStandardWallet(walletInfo: SolanaWalletInfo, options?: AdaptSolanaWalletOptions): SolanaWallet;
11
+
12
+ declare const SOLANA_CHAINS: readonly SolanaChain[];
11
13
  declare function getSolanaChain(cluster: SolanaCluster): SolanaChain;
14
+
15
+ declare const SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME = "Mobile Wallet Adapter";
12
16
  declare function isSolanaStandardWallet(wallet: Wallet): boolean;
13
17
  declare function getRegisteredSolanaWallets(): SolanaWalletInfo[];
14
18
  declare function subscribeSolanaWallets(listener: () => void): () => void;
15
- declare function adaptSolanaStandardWallet(walletInfo: SolanaWalletInfo, options?: AdaptSolanaWalletOptions): SolanaWallet;
16
19
 
17
- export { SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME, adaptSolanaStandardWallet, getRegisteredSolanaWallets, getSolanaChain, isSolanaStandardWallet, subscribeSolanaWallets };
20
+ export { SOLANA_CHAINS, SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME, adaptSolanaStandardWallet, getRegisteredSolanaWallets, getSolanaChain, isSolanaStandardWallet, subscribeSolanaWallets };
18
21
  export type { AdaptSolanaWalletOptions };
@@ -2,17 +2,20 @@ import { WalletAccount, Wallet } from '@wallet-standard/base';
2
2
  import { SolanaChain, SolanaWalletInfo, SolanaWallet, SolanaCluster } from './types.js';
3
3
  import '@solana/web3-compat';
4
4
 
5
- declare const SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME = "Mobile Wallet Adapter";
6
5
  interface AdaptSolanaWalletOptions {
7
6
  chain?: SolanaChain;
8
7
  account?: WalletAccount;
9
8
  onChange?: () => void;
10
9
  }
10
+ declare function adaptSolanaStandardWallet(walletInfo: SolanaWalletInfo, options?: AdaptSolanaWalletOptions): SolanaWallet;
11
+
12
+ declare const SOLANA_CHAINS: readonly SolanaChain[];
11
13
  declare function getSolanaChain(cluster: SolanaCluster): SolanaChain;
14
+
15
+ declare const SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME = "Mobile Wallet Adapter";
12
16
  declare function isSolanaStandardWallet(wallet: Wallet): boolean;
13
17
  declare function getRegisteredSolanaWallets(): SolanaWalletInfo[];
14
18
  declare function subscribeSolanaWallets(listener: () => void): () => void;
15
- declare function adaptSolanaStandardWallet(walletInfo: SolanaWalletInfo, options?: AdaptSolanaWalletOptions): SolanaWallet;
16
19
 
17
- export { SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME, adaptSolanaStandardWallet, getRegisteredSolanaWallets, getSolanaChain, isSolanaStandardWallet, subscribeSolanaWallets };
20
+ export { SOLANA_CHAINS, SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME, adaptSolanaStandardWallet, getRegisteredSolanaWallets, getSolanaChain, isSolanaStandardWallet, subscribeSolanaWallets };
18
21
  export type { AdaptSolanaWalletOptions };
@@ -1,221 +1,6 @@
1
- import { getWallets } from '@wallet-standard/app';
2
- import { StandardEvents, StandardDisconnect, StandardConnect } from '@wallet-standard/features';
3
- import { SolanaSignAndSendTransaction, SolanaSignTransaction } from '@solana/wallet-standard-features';
4
- import { PublicKey, Transaction, VersionedTransaction } from '@solana/web3-compat';
5
- import bs58 from 'bs58';
6
-
7
- const SOLANA_CHAINS = [
8
- "solana:mainnet",
9
- "solana:testnet",
10
- "solana:devnet",
11
- "solana:localnet"
12
- ];
13
- const SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME = "Mobile Wallet Adapter";
14
- function getSolanaChain(cluster) {
15
- if (cluster === "mainnet-beta") {
16
- return "solana:mainnet";
17
- }
18
- return `solana:${cluster}`;
19
- }
20
- function isSolanaStandardWallet(wallet) {
21
- return StandardConnect in wallet.features && StandardDisconnect in wallet.features && wallet.chains.some((chain) => SOLANA_CHAINS.includes(chain));
22
- }
23
- function getRegisteredSolanaWallets() {
24
- if (typeof window === "undefined") {
25
- return [];
26
- }
27
- return getWallets().get().filter(isSolanaStandardWallet).map(createSolanaWalletInfo);
28
- }
29
- function subscribeSolanaWallets(listener) {
30
- if (typeof window === "undefined") {
31
- return () => {
32
- };
33
- }
34
- const wallets = getWallets();
35
- const offRegister = wallets.on("register", listener);
36
- const offUnregister = wallets.on("unregister", listener);
37
- return () => {
38
- offRegister();
39
- offUnregister();
40
- };
41
- }
42
- function adaptSolanaStandardWallet(walletInfo, options = {}) {
43
- const wallet = walletInfo.wallet;
44
- let accounts = wallet.accounts;
45
- let account = options.account;
46
- let allowAccountUpdates = Boolean(options.account);
47
- let connecting = false;
48
- let disconnecting = false;
49
- let manuallyDisconnected = false;
50
- const eventsFeature = wallet.features[StandardEvents];
51
- eventsFeature?.on("change", (properties) => {
52
- if (properties.accounts) {
53
- accounts = properties.accounts;
54
- account = allowAccountUpdates && !manuallyDisconnected ? getSolanaAccount(accounts, options.chain) : void 0;
55
- options.onChange?.();
56
- }
57
- });
58
- return {
59
- platform: walletInfo.platform,
60
- source: walletInfo.source,
61
- get publicKey() {
62
- return account ? new PublicKey(account.publicKey) : null;
63
- },
64
- get connected() {
65
- return Boolean(account);
66
- },
67
- get connecting() {
68
- return connecting;
69
- },
70
- get disconnecting() {
71
- return disconnecting;
72
- },
73
- async connect() {
74
- connecting = true;
75
- manuallyDisconnected = false;
76
- options.onChange?.();
77
- try {
78
- const feature = wallet.features[StandardConnect];
79
- const result = await feature.connect();
80
- accounts = result.accounts;
81
- allowAccountUpdates = true;
82
- account = getSolanaAccount(accounts, options.chain);
83
- if (!account) {
84
- throw new Error("Solana wallet did not authorize a Solana account");
85
- }
86
- } finally {
87
- connecting = false;
88
- options.onChange?.();
89
- }
90
- },
91
- async disconnect() {
92
- const feature = wallet.features[StandardDisconnect];
93
- disconnecting = true;
94
- manuallyDisconnected = true;
95
- allowAccountUpdates = false;
96
- account = void 0;
97
- options.onChange?.();
98
- try {
99
- await feature.disconnect();
100
- accounts = [];
101
- account = void 0;
102
- } catch (error) {
103
- manuallyDisconnected = false;
104
- allowAccountUpdates = true;
105
- account = getSolanaAccount(accounts, options.chain);
106
- throw error;
107
- } finally {
108
- disconnecting = false;
109
- options.onChange?.();
110
- }
111
- },
112
- signTransaction: hasSignTransaction(wallet) ? async (transaction) => {
113
- const activeAccount = getActiveAccount(account);
114
- const [result] = await wallet.features[SolanaSignTransaction].signTransaction({
115
- account: activeAccount,
116
- transaction: serializeTransaction(transaction),
117
- chain: options.chain
118
- });
119
- if (!result) {
120
- throw new Error("Solana wallet did not return a signed transaction");
121
- }
122
- return deserializeTransaction(transaction, result.signedTransaction);
123
- } : void 0,
124
- signAllTransactions: hasSignTransaction(wallet) ? async (transactions) => {
125
- const activeAccount = getActiveAccount(account);
126
- const results = await wallet.features[SolanaSignTransaction].signTransaction(
127
- ...transactions.map((transaction) => ({
128
- account: activeAccount,
129
- transaction: serializeTransaction(transaction),
130
- chain: options.chain
131
- }))
132
- );
133
- if (results.length !== transactions.length) {
134
- throw new Error(
135
- `Solana wallet returned ${results.length} signed transactions for ${transactions.length} requested transactions`
136
- );
137
- }
138
- return results.map((result, index) => {
139
- if (!result) {
140
- throw new Error("Solana wallet did not return a signed transaction");
141
- }
142
- return deserializeTransaction(transactions[index], result.signedTransaction);
143
- });
144
- } : void 0,
145
- signAndSendTransaction: hasSignAndSendTransaction(wallet) ? async (transaction, sendOptions) => {
146
- const activeAccount = getActiveAccount(account);
147
- const [result] = await wallet.features[SolanaSignAndSendTransaction].signAndSendTransaction({
148
- account: activeAccount,
149
- transaction: serializeTransaction(transaction),
150
- chain: options.chain ?? getSolanaAccountChain(activeAccount),
151
- options: sendOptions
152
- });
153
- if (!result) {
154
- throw new Error("Solana wallet did not return a transaction signature");
155
- }
156
- return { signature: bs58.encode(result.signature) };
157
- } : void 0
158
- };
159
- }
160
- function createSolanaWalletInfo(wallet) {
161
- const isMobileWallet = wallet.name === SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME;
162
- return {
163
- name: wallet.name,
164
- icon: wallet.icon,
165
- chains: wallet.chains,
166
- platform: isMobileWallet ? "mobile" : "browser",
167
- source: isMobileWallet ? "mobile-wallet-adapter" : "wallet-standard",
168
- appUrl: getWalletUrl(wallet),
169
- accounts: wallet.accounts.map((account) => ({
170
- address: account.address,
171
- publicKey: Uint8Array.from(account.publicKey),
172
- chains: account.chains,
173
- label: account.label,
174
- icon: account.icon
175
- })),
176
- wallet
177
- };
178
- }
179
- function getWalletUrl(wallet) {
180
- return "url" in wallet && typeof wallet.url === "string" ? wallet.url : void 0;
181
- }
182
- function getSolanaAccount(accounts, chain) {
183
- return accounts.find((account) => account.chains.some((accountChain) => accountChain === chain)) ?? accounts.find(
184
- (account) => account.chains.some((accountChain) => SOLANA_CHAINS.includes(accountChain))
185
- );
186
- }
187
- function getActiveAccount(account) {
188
- if (!account) {
189
- throw new Error("Solana wallet is not connected");
190
- }
191
- return account;
192
- }
193
- function getSolanaAccountChain(account) {
194
- const chain = account.chains.find(
195
- (accountChain) => SOLANA_CHAINS.includes(accountChain)
196
- );
197
- if (!chain) {
198
- throw new Error("Solana wallet account does not support a Solana chain");
199
- }
200
- return chain;
201
- }
202
- function hasSignTransaction(wallet) {
203
- return SolanaSignTransaction in wallet.features;
204
- }
205
- function hasSignAndSendTransaction(wallet) {
206
- return SolanaSignAndSendTransaction in wallet.features;
207
- }
208
- function serializeTransaction(transaction) {
209
- if (transaction instanceof Transaction) {
210
- return transaction.serialize({ requireAllSignatures: false, verifySignatures: false });
211
- }
212
- return transaction.serialize();
213
- }
214
- function deserializeTransaction(source, bytes) {
215
- if (source instanceof Transaction) {
216
- return Transaction.from(bytes);
217
- }
218
- return VersionedTransaction.deserialize(bytes);
219
- }
220
-
221
- export { SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME, adaptSolanaStandardWallet, getRegisteredSolanaWallets, getSolanaChain, isSolanaStandardWallet, subscribeSolanaWallets };
1
+ export { S as SOLANA_CHAINS, a as SOLANA_MOBILE_WALLET_ADAPTER_WALLET_NAME, b as adaptSolanaStandardWallet, g as getRegisteredSolanaWallets, c as getSolanaChain, i as isSolanaStandardWallet, s as subscribeSolanaWallets } from './shared/core.D7olTUN_.mjs';
2
+ import '@wallet-standard/features';
3
+ import '@solana/wallet-standard-features';
4
+ import '@solana/web3-compat';
5
+ import 'bs58';
6
+ import '@wallet-standard/app';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vue-solana/core",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "Framework-agnostic primitives for Vue Solana libraries.",
5
5
  "license": "MIT",
6
6
  "keywords": [