@vue-solana/core 0.2.1 → 0.3.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/README.md +31 -3
- package/dist/clusters.cjs +35 -0
- package/dist/clusters.d.cts +9 -0
- package/dist/clusters.d.mts +9 -0
- package/dist/clusters.d.ts +9 -0
- package/dist/clusters.mjs +30 -0
- package/dist/index.cjs +33 -301
- package/dist/index.d.cts +9 -78
- package/dist/index.d.mts +9 -78
- package/dist/index.d.ts +9 -78
- package/dist/index.mjs +12 -283
- package/dist/mobile-wallet.cjs +69 -0
- package/dist/mobile-wallet.d.cts +19 -0
- package/dist/mobile-wallet.d.mts +19 -0
- package/dist/mobile-wallet.d.ts +19 -0
- package/dist/mobile-wallet.mjs +65 -0
- package/dist/rpc.cjs +31 -0
- package/dist/rpc.d.cts +7 -0
- package/dist/rpc.d.mts +7 -0
- package/dist/rpc.d.ts +7 -0
- package/dist/rpc.mjs +28 -0
- package/dist/transaction.cjs +17 -0
- package/dist/transaction.d.cts +6 -0
- package/dist/transaction.d.mts +6 -0
- package/dist/transaction.d.ts +6 -0
- package/dist/transaction.mjs +15 -0
- package/dist/types.cjs +2 -0
- package/dist/types.d.cts +53 -0
- package/dist/types.d.mts +53 -0
- package/dist/types.d.ts +53 -0
- package/dist/types.mjs +1 -0
- package/dist/wallet-standard.cjs +221 -0
- package/dist/wallet-standard.d.cts +17 -0
- package/dist/wallet-standard.d.mts +17 -0
- package/dist/wallet-standard.d.ts +17 -0
- package/dist/wallet-standard.mjs +211 -0
- package/dist/wallet.cjs +20 -0
- package/dist/wallet.d.cts +10 -0
- package/dist/wallet.d.mts +10 -0
- package/dist/wallet.d.ts +10 -0
- package/dist/wallet.mjs +16 -0
- package/package.json +37 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { getWallets } from '@wallet-standard/app';
|
|
2
|
+
import { SolanaMobileWalletAdapterWalletName } from '@solana-mobile/wallet-standard-mobile';
|
|
3
|
+
import { StandardEvents, StandardDisconnect, StandardConnect } from '@wallet-standard/features';
|
|
4
|
+
import { SolanaSignAndSendTransaction, SolanaSignTransaction } from '@solana/wallet-standard-features';
|
|
5
|
+
import { PublicKey, Transaction, VersionedTransaction } from '@solana/web3-compat';
|
|
6
|
+
import bs58 from 'bs58';
|
|
7
|
+
|
|
8
|
+
const SOLANA_CHAINS = [
|
|
9
|
+
"solana:mainnet",
|
|
10
|
+
"solana:testnet",
|
|
11
|
+
"solana:devnet",
|
|
12
|
+
"solana:localnet"
|
|
13
|
+
];
|
|
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
|
+
get publicKey() {
|
|
60
|
+
return account ? new PublicKey(account.publicKey) : null;
|
|
61
|
+
},
|
|
62
|
+
get connected() {
|
|
63
|
+
return Boolean(account);
|
|
64
|
+
},
|
|
65
|
+
get connecting() {
|
|
66
|
+
return connecting;
|
|
67
|
+
},
|
|
68
|
+
get disconnecting() {
|
|
69
|
+
return disconnecting;
|
|
70
|
+
},
|
|
71
|
+
async connect() {
|
|
72
|
+
connecting = true;
|
|
73
|
+
manuallyDisconnected = false;
|
|
74
|
+
options.onChange?.();
|
|
75
|
+
try {
|
|
76
|
+
const feature = wallet.features[StandardConnect];
|
|
77
|
+
const result = await feature.connect();
|
|
78
|
+
accounts = result.accounts;
|
|
79
|
+
allowAccountUpdates = true;
|
|
80
|
+
account = getSolanaAccount(accounts, options.chain);
|
|
81
|
+
if (!account) {
|
|
82
|
+
throw new Error("Solana wallet did not authorize a Solana account");
|
|
83
|
+
}
|
|
84
|
+
} finally {
|
|
85
|
+
connecting = false;
|
|
86
|
+
options.onChange?.();
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
async disconnect() {
|
|
90
|
+
const feature = wallet.features[StandardDisconnect];
|
|
91
|
+
disconnecting = true;
|
|
92
|
+
manuallyDisconnected = true;
|
|
93
|
+
allowAccountUpdates = false;
|
|
94
|
+
account = void 0;
|
|
95
|
+
options.onChange?.();
|
|
96
|
+
try {
|
|
97
|
+
await feature.disconnect();
|
|
98
|
+
accounts = [];
|
|
99
|
+
account = void 0;
|
|
100
|
+
} catch (error) {
|
|
101
|
+
manuallyDisconnected = false;
|
|
102
|
+
allowAccountUpdates = true;
|
|
103
|
+
account = getSolanaAccount(accounts, options.chain);
|
|
104
|
+
throw error;
|
|
105
|
+
} finally {
|
|
106
|
+
disconnecting = false;
|
|
107
|
+
options.onChange?.();
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
signTransaction: hasSignTransaction(wallet) ? async (transaction) => {
|
|
111
|
+
const activeAccount = getActiveAccount(account);
|
|
112
|
+
const [result] = await wallet.features[SolanaSignTransaction].signTransaction({
|
|
113
|
+
account: activeAccount,
|
|
114
|
+
transaction: serializeTransaction(transaction),
|
|
115
|
+
chain: options.chain
|
|
116
|
+
});
|
|
117
|
+
if (!result) {
|
|
118
|
+
throw new Error("Solana wallet did not return a signed transaction");
|
|
119
|
+
}
|
|
120
|
+
return deserializeTransaction(transaction, result.signedTransaction);
|
|
121
|
+
} : void 0,
|
|
122
|
+
signAllTransactions: hasSignTransaction(wallet) ? async (transactions) => {
|
|
123
|
+
const activeAccount = getActiveAccount(account);
|
|
124
|
+
const results = await wallet.features[SolanaSignTransaction].signTransaction(
|
|
125
|
+
...transactions.map((transaction) => ({
|
|
126
|
+
account: activeAccount,
|
|
127
|
+
transaction: serializeTransaction(transaction),
|
|
128
|
+
chain: options.chain
|
|
129
|
+
}))
|
|
130
|
+
);
|
|
131
|
+
return results.map(
|
|
132
|
+
(result, index) => deserializeTransaction(transactions[index], result.signedTransaction)
|
|
133
|
+
);
|
|
134
|
+
} : void 0,
|
|
135
|
+
signAndSendTransaction: hasSignAndSendTransaction(wallet) ? async (transaction, sendOptions) => {
|
|
136
|
+
const activeAccount = getActiveAccount(account);
|
|
137
|
+
const [result] = await wallet.features[SolanaSignAndSendTransaction].signAndSendTransaction({
|
|
138
|
+
account: activeAccount,
|
|
139
|
+
transaction: serializeTransaction(transaction),
|
|
140
|
+
chain: options.chain ?? getSolanaAccountChain(activeAccount),
|
|
141
|
+
options: sendOptions
|
|
142
|
+
});
|
|
143
|
+
if (!result) {
|
|
144
|
+
throw new Error("Solana wallet did not return a transaction signature");
|
|
145
|
+
}
|
|
146
|
+
return { signature: bs58.encode(result.signature) };
|
|
147
|
+
} : void 0
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function createSolanaWalletInfo(wallet) {
|
|
151
|
+
const isMobileWallet = wallet.name === SolanaMobileWalletAdapterWalletName;
|
|
152
|
+
return {
|
|
153
|
+
name: wallet.name,
|
|
154
|
+
icon: wallet.icon,
|
|
155
|
+
chains: wallet.chains,
|
|
156
|
+
platform: isMobileWallet ? "mobile" : "browser",
|
|
157
|
+
source: isMobileWallet ? "mobile-wallet-adapter" : "wallet-standard",
|
|
158
|
+
appUrl: getWalletUrl(wallet),
|
|
159
|
+
accounts: wallet.accounts.map((account) => ({
|
|
160
|
+
address: account.address,
|
|
161
|
+
publicKey: Uint8Array.from(account.publicKey),
|
|
162
|
+
chains: account.chains,
|
|
163
|
+
label: account.label,
|
|
164
|
+
icon: account.icon
|
|
165
|
+
})),
|
|
166
|
+
wallet
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function getWalletUrl(wallet) {
|
|
170
|
+
return "url" in wallet && typeof wallet.url === "string" ? wallet.url : void 0;
|
|
171
|
+
}
|
|
172
|
+
function getSolanaAccount(accounts, chain) {
|
|
173
|
+
return accounts.find((account) => account.chains.some((accountChain) => accountChain === chain)) ?? accounts.find(
|
|
174
|
+
(account) => account.chains.some((accountChain) => SOLANA_CHAINS.includes(accountChain))
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
function getActiveAccount(account) {
|
|
178
|
+
if (!account) {
|
|
179
|
+
throw new Error("Solana wallet is not connected");
|
|
180
|
+
}
|
|
181
|
+
return account;
|
|
182
|
+
}
|
|
183
|
+
function getSolanaAccountChain(account) {
|
|
184
|
+
const chain = account.chains.find(
|
|
185
|
+
(accountChain) => SOLANA_CHAINS.includes(accountChain)
|
|
186
|
+
);
|
|
187
|
+
if (!chain) {
|
|
188
|
+
throw new Error("Solana wallet account does not support a Solana chain");
|
|
189
|
+
}
|
|
190
|
+
return chain;
|
|
191
|
+
}
|
|
192
|
+
function hasSignTransaction(wallet) {
|
|
193
|
+
return SolanaSignTransaction in wallet.features;
|
|
194
|
+
}
|
|
195
|
+
function hasSignAndSendTransaction(wallet) {
|
|
196
|
+
return SolanaSignAndSendTransaction in wallet.features;
|
|
197
|
+
}
|
|
198
|
+
function serializeTransaction(transaction) {
|
|
199
|
+
if (transaction instanceof Transaction) {
|
|
200
|
+
return transaction.serialize({ requireAllSignatures: false, verifySignatures: false });
|
|
201
|
+
}
|
|
202
|
+
return transaction.serialize();
|
|
203
|
+
}
|
|
204
|
+
function deserializeTransaction(source, bytes) {
|
|
205
|
+
if (source instanceof Transaction) {
|
|
206
|
+
return Transaction.from(bytes);
|
|
207
|
+
}
|
|
208
|
+
return VersionedTransaction.deserialize(bytes);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export { adaptSolanaStandardWallet, getRegisteredSolanaWallets, getSolanaChain, isSolanaStandardWallet, subscribeSolanaWallets };
|
package/dist/wallet.cjs
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function isWalletConnected(wallet) {
|
|
4
|
+
return Boolean(wallet?.connected && wallet.publicKey);
|
|
5
|
+
}
|
|
6
|
+
function assertWalletConnected(wallet) {
|
|
7
|
+
if (!isWalletConnected(wallet)) {
|
|
8
|
+
throw new Error("Solana wallet is not connected");
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function assertWalletCanSign(wallet) {
|
|
12
|
+
assertWalletConnected(wallet);
|
|
13
|
+
if (!wallet.signTransaction) {
|
|
14
|
+
throw new Error("Solana wallet does not support signTransaction");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
exports.assertWalletCanSign = assertWalletCanSign;
|
|
19
|
+
exports.assertWalletConnected = assertWalletConnected;
|
|
20
|
+
exports.isWalletConnected = isWalletConnected;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SolanaWallet } from './types.cjs';
|
|
2
|
+
import '@solana/web3-compat';
|
|
3
|
+
|
|
4
|
+
declare function isWalletConnected(wallet: Pick<SolanaWallet, "connected" | "publicKey"> | null | undefined): boolean;
|
|
5
|
+
declare function assertWalletConnected(wallet: SolanaWallet | null | undefined): asserts wallet is SolanaWallet & {
|
|
6
|
+
publicKey: NonNullable<SolanaWallet["publicKey"]>;
|
|
7
|
+
};
|
|
8
|
+
declare function assertWalletCanSign(wallet: SolanaWallet | null | undefined): asserts wallet is SolanaWallet & Required<Pick<SolanaWallet, "signTransaction">>;
|
|
9
|
+
|
|
10
|
+
export { assertWalletCanSign, assertWalletConnected, isWalletConnected };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SolanaWallet } from './types.mjs';
|
|
2
|
+
import '@solana/web3-compat';
|
|
3
|
+
|
|
4
|
+
declare function isWalletConnected(wallet: Pick<SolanaWallet, "connected" | "publicKey"> | null | undefined): boolean;
|
|
5
|
+
declare function assertWalletConnected(wallet: SolanaWallet | null | undefined): asserts wallet is SolanaWallet & {
|
|
6
|
+
publicKey: NonNullable<SolanaWallet["publicKey"]>;
|
|
7
|
+
};
|
|
8
|
+
declare function assertWalletCanSign(wallet: SolanaWallet | null | undefined): asserts wallet is SolanaWallet & Required<Pick<SolanaWallet, "signTransaction">>;
|
|
9
|
+
|
|
10
|
+
export { assertWalletCanSign, assertWalletConnected, isWalletConnected };
|
package/dist/wallet.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SolanaWallet } from './types.js';
|
|
2
|
+
import '@solana/web3-compat';
|
|
3
|
+
|
|
4
|
+
declare function isWalletConnected(wallet: Pick<SolanaWallet, "connected" | "publicKey"> | null | undefined): boolean;
|
|
5
|
+
declare function assertWalletConnected(wallet: SolanaWallet | null | undefined): asserts wallet is SolanaWallet & {
|
|
6
|
+
publicKey: NonNullable<SolanaWallet["publicKey"]>;
|
|
7
|
+
};
|
|
8
|
+
declare function assertWalletCanSign(wallet: SolanaWallet | null | undefined): asserts wallet is SolanaWallet & Required<Pick<SolanaWallet, "signTransaction">>;
|
|
9
|
+
|
|
10
|
+
export { assertWalletCanSign, assertWalletConnected, isWalletConnected };
|
package/dist/wallet.mjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function isWalletConnected(wallet) {
|
|
2
|
+
return Boolean(wallet?.connected && wallet.publicKey);
|
|
3
|
+
}
|
|
4
|
+
function assertWalletConnected(wallet) {
|
|
5
|
+
if (!isWalletConnected(wallet)) {
|
|
6
|
+
throw new Error("Solana wallet is not connected");
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function assertWalletCanSign(wallet) {
|
|
10
|
+
assertWalletConnected(wallet);
|
|
11
|
+
if (!wallet.signTransaction) {
|
|
12
|
+
throw new Error("Solana wallet does not support signTransaction");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { assertWalletCanSign, assertWalletConnected, isWalletConnected };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vue-solana/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Framework-agnostic primitives for Vue Solana libraries.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -29,6 +29,41 @@
|
|
|
29
29
|
"types": "./dist/index.d.ts",
|
|
30
30
|
"import": "./dist/index.mjs",
|
|
31
31
|
"require": "./dist/index.cjs"
|
|
32
|
+
},
|
|
33
|
+
"./types": {
|
|
34
|
+
"types": "./dist/types.d.ts",
|
|
35
|
+
"import": "./dist/types.mjs",
|
|
36
|
+
"require": "./dist/types.cjs"
|
|
37
|
+
},
|
|
38
|
+
"./clusters": {
|
|
39
|
+
"types": "./dist/clusters.d.ts",
|
|
40
|
+
"import": "./dist/clusters.mjs",
|
|
41
|
+
"require": "./dist/clusters.cjs"
|
|
42
|
+
},
|
|
43
|
+
"./mobile-wallet": {
|
|
44
|
+
"types": "./dist/mobile-wallet.d.ts",
|
|
45
|
+
"import": "./dist/mobile-wallet.mjs",
|
|
46
|
+
"require": "./dist/mobile-wallet.cjs"
|
|
47
|
+
},
|
|
48
|
+
"./rpc": {
|
|
49
|
+
"types": "./dist/rpc.d.ts",
|
|
50
|
+
"import": "./dist/rpc.mjs",
|
|
51
|
+
"require": "./dist/rpc.cjs"
|
|
52
|
+
},
|
|
53
|
+
"./transaction": {
|
|
54
|
+
"types": "./dist/transaction.d.ts",
|
|
55
|
+
"import": "./dist/transaction.mjs",
|
|
56
|
+
"require": "./dist/transaction.cjs"
|
|
57
|
+
},
|
|
58
|
+
"./wallet": {
|
|
59
|
+
"types": "./dist/wallet.d.ts",
|
|
60
|
+
"import": "./dist/wallet.mjs",
|
|
61
|
+
"require": "./dist/wallet.cjs"
|
|
62
|
+
},
|
|
63
|
+
"./wallet-standard": {
|
|
64
|
+
"types": "./dist/wallet-standard.d.ts",
|
|
65
|
+
"import": "./dist/wallet-standard.mjs",
|
|
66
|
+
"require": "./dist/wallet-standard.cjs"
|
|
32
67
|
}
|
|
33
68
|
},
|
|
34
69
|
"files": [
|
|
@@ -38,6 +73,7 @@
|
|
|
38
73
|
"access": "public"
|
|
39
74
|
},
|
|
40
75
|
"dependencies": {
|
|
76
|
+
"@solana-mobile/wallet-standard-mobile": "^0.5.3",
|
|
41
77
|
"@solana/wallet-standard-features": "^1.3.0",
|
|
42
78
|
"@solana/web3-compat": "^0.0.21",
|
|
43
79
|
"@wallet-standard/app": "^1.1.1",
|