@usebutr/svm 1.0.1 → 2.0.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/dist/index.d.ts +7 -59
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -67
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
package/dist/index.d.ts
CHANGED
|
@@ -36,44 +36,9 @@ type SolanaSignInFeature = {
|
|
|
36
36
|
//#endregion
|
|
37
37
|
//#region src/wallet-standard-adapter.d.ts
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* for butr to do anything useful with it.
|
|
43
|
-
*
|
|
44
|
-
* **Capability gating**
|
|
45
|
-
*
|
|
46
|
-
* - `signMessage` is only present if the wallet advertises
|
|
47
|
-
* `solana:signMessage`. Without it, calling `adapter.signMessage`
|
|
48
|
-
* rejects with a clear error.
|
|
49
|
-
* - `sendTx` / `sendTxToChain` use `solana:signAndSendTransaction`.
|
|
50
|
-
* Without it, those methods reject.
|
|
51
|
-
* - `subscribe` is wired through `standard:events`. Wallets that
|
|
52
|
-
* don't expose events get a no-op unsubscribe.
|
|
53
|
-
*
|
|
54
|
-
* **Known limitations**
|
|
55
|
-
*
|
|
56
|
-
* - `getBalance` returns `{ value: 0n, formatted: "0", … }`. Solana
|
|
57
|
-
* balance reads require an RPC connection that's outside butr's
|
|
58
|
-
* scope; consumers wrap their own RPC client.
|
|
59
|
-
* - `getTransactionReceipt` returns `{ status: "Pending" }`. Same
|
|
60
|
-
* reason; needs an RPC.
|
|
61
|
-
* - `switchChain` updates butr's view of the current Solana cluster
|
|
62
|
-
* locally and routes subsequent `signAndSendTransaction` calls
|
|
63
|
-
* through the new chain. Wallet Standard has no "tell the wallet
|
|
64
|
-
* to switch cluster" RPC; the wallet's own UI controls its global
|
|
65
|
-
* cluster setting, and `signAndSendTransaction` accepts the chain
|
|
66
|
-
* per-call. The chain must be one the wallet advertises in
|
|
67
|
-
* `wallet.chains`; otherwise the call rejects.
|
|
68
|
-
* - `requestAccounts` re-runs `standard:connect`. Some wallets show
|
|
69
|
-
* their account picker again; others (those that "remember"
|
|
70
|
-
* authorisations) silently return the existing accounts. butr
|
|
71
|
-
* refreshes the pool entry's `accounts` array either way.
|
|
72
|
-
* - `switchAccount` is intentionally unimplemented. Wallet Standard
|
|
73
|
-
* has no silent "use address X" feature; the user picks the active
|
|
74
|
-
* account through the wallet's own UI. `signAndSendTransaction`
|
|
75
|
-
* accepts an `account` input, so consumers needing per-tx address
|
|
76
|
-
* selection can pick one from `accounts` at call time.
|
|
39
|
+
* Wallet Standard has no switch-cluster RPC: `switchChain` re-points butr's
|
|
40
|
+
* view only, and `signAndSendTransaction` takes the chain per call.
|
|
41
|
+
* `requestAccounts` re-runs `standard:connect`; some wallets answer silently.
|
|
77
42
|
*/
|
|
78
43
|
declare const buildSvmAdapter: (wallet: WalletStandardWallet,
|
|
79
44
|
/** Optional. Called with a function that pushes a synthetic
|
|
@@ -82,24 +47,9 @@ declare const buildSvmAdapter: (wallet: WalletStandardWallet,
|
|
|
82
47
|
* pool entry tears down when its extension is removed. */
|
|
83
48
|
registerDisconnector?: (emit: () => void) => void) => WalletAdapter | null;
|
|
84
49
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* Runtime requires the `@wallet-standard/app` package, which is an
|
|
89
|
-
* **optional peer dependency** of butr. EVM-only consumers don't need
|
|
90
|
-
* to install it; discovery will silently skip the SVM side if the
|
|
91
|
-
* module isn't resolvable.
|
|
92
|
-
*
|
|
93
|
-
* Install for SVM auto-discovery:
|
|
94
|
-
*
|
|
95
|
-
* npm install @wallet-standard/app
|
|
96
|
-
*
|
|
97
|
-
* The function returns a synchronous unsubscribe that's safe to call
|
|
50
|
+
* Requires the optional `@wallet-standard/app` peer dep; without it SVM
|
|
51
|
+
* discovery silently does nothing. The returned unsubscribe is safe to call
|
|
98
52
|
* before the dynamic import has resolved.
|
|
99
|
-
*
|
|
100
|
-
* Implementation: the discovery loop (dynamic import, dedupe, register
|
|
101
|
-
* / unregister bridge) lives in `@usebutr/wallet-standard-shared`. This
|
|
102
|
-
* file's only job is to hand the kit a per-wallet builder.
|
|
103
53
|
*/
|
|
104
54
|
declare const discoverSvmAdapters: (onAdapter: (adapter: WalletAdapter) => void) => (() => void);
|
|
105
55
|
//#endregion
|
|
@@ -145,10 +95,8 @@ declare const resolveWalletStandardCapabilities: (input: WalletStandardCapabilit
|
|
|
145
95
|
//#endregion
|
|
146
96
|
//#region src/discoverer.d.ts
|
|
147
97
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
* before butr existed, so there's no `window.solana` injected path
|
|
151
|
-
* worth shimming.
|
|
98
|
+
* No legacy fallback: Solana wallets standardised on Wallet Standard before
|
|
99
|
+
* butr existed, so there's no `window.solana` injected path worth shimming.
|
|
152
100
|
*/
|
|
153
101
|
declare const svmDiscoverer: PlatformDiscoverer;
|
|
154
102
|
//#endregion
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/wallet-standard-types.ts","../src/wallet-standard-adapter.ts","../src/chains.ts","../src/capabilities.ts","../src/discoverer.ts","../src/signer-augmentation.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/wallet-standard-types.ts","../src/wallet-standard-adapter.ts","../src/chains.ts","../src/capabilities.ts","../src/discoverer.ts","../src/signer-augmentation.ts"],"mappings":";;;KAOK;EACH,SAAS;EACT,SAAS;;KAGN;EACH,WAAW;EACX,eAAe;;KAGZ;EACH,iBACK,QAAQ,cAAc,4BACtB,QAAQ,cAAc;;KAGxB;EACH,SAAS;EACT;EACA,aAAa;;KAGV;EACH,WAAW;;KAGR;EACH,4BACK,QAAQ,cAAc,uCACtB,QAAQ,cAAc;;;KAoBxB,oBAAoB;KAEpB;EACH,SAAS;EACT,WAAW;EACX,eAAe;;KAGZ;EACH,SAAS,QAAQ,sBAAsB,QAAQ,cAAc;;;;;;;;;cCtCzD,kBACJ,QAAQ,sBAKR;;;;;AAAA,wBAAwB,8BACvB;;;;;;cAsKG,sBAAuB,YAAY,SAAS;;;cCtM5C;;;;;;;;;;;;;;;;;;;;cAgBA,iBAAiB,cAAc;;;KCfhC;EACH;EACA;IACE;IACA;IACA;IACA;IACA;;;;;;;cAQE,oCACJ,OAAO,kCACN;;;;;;;cCZG,eAAe;;;;;;;;;YCCT;IACR,KAAK"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildAccount,
|
|
1
|
+
import { buildAccount, bytesToBase58 } from "@usebutr/core";
|
|
2
2
|
import { buildWalletCapabilities, createWalletStandardCore, discoverWalletStandard, getFeature, slugify } from "@usebutr/wallet-standard-shared";
|
|
3
3
|
|
|
4
4
|
//#region src/capabilities.ts
|
|
@@ -21,44 +21,9 @@ const SOLANA_PREFIX = "solana:";
|
|
|
21
21
|
const SOLANA_DECIMALS = 9;
|
|
22
22
|
const SOLANA_MAINNETS = ["solana:mainnet", "solana:mainnet-beta"];
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* for butr to do anything useful with it.
|
|
28
|
-
*
|
|
29
|
-
* **Capability gating**
|
|
30
|
-
*
|
|
31
|
-
* - `signMessage` is only present if the wallet advertises
|
|
32
|
-
* `solana:signMessage`. Without it, calling `adapter.signMessage`
|
|
33
|
-
* rejects with a clear error.
|
|
34
|
-
* - `sendTx` / `sendTxToChain` use `solana:signAndSendTransaction`.
|
|
35
|
-
* Without it, those methods reject.
|
|
36
|
-
* - `subscribe` is wired through `standard:events`. Wallets that
|
|
37
|
-
* don't expose events get a no-op unsubscribe.
|
|
38
|
-
*
|
|
39
|
-
* **Known limitations**
|
|
40
|
-
*
|
|
41
|
-
* - `getBalance` returns `{ value: 0n, formatted: "0", … }`. Solana
|
|
42
|
-
* balance reads require an RPC connection that's outside butr's
|
|
43
|
-
* scope; consumers wrap their own RPC client.
|
|
44
|
-
* - `getTransactionReceipt` returns `{ status: "Pending" }`. Same
|
|
45
|
-
* reason; needs an RPC.
|
|
46
|
-
* - `switchChain` updates butr's view of the current Solana cluster
|
|
47
|
-
* locally and routes subsequent `signAndSendTransaction` calls
|
|
48
|
-
* through the new chain. Wallet Standard has no "tell the wallet
|
|
49
|
-
* to switch cluster" RPC; the wallet's own UI controls its global
|
|
50
|
-
* cluster setting, and `signAndSendTransaction` accepts the chain
|
|
51
|
-
* per-call. The chain must be one the wallet advertises in
|
|
52
|
-
* `wallet.chains`; otherwise the call rejects.
|
|
53
|
-
* - `requestAccounts` re-runs `standard:connect`. Some wallets show
|
|
54
|
-
* their account picker again; others (those that "remember"
|
|
55
|
-
* authorisations) silently return the existing accounts. butr
|
|
56
|
-
* refreshes the pool entry's `accounts` array either way.
|
|
57
|
-
* - `switchAccount` is intentionally unimplemented. Wallet Standard
|
|
58
|
-
* has no silent "use address X" feature; the user picks the active
|
|
59
|
-
* account through the wallet's own UI. `signAndSendTransaction`
|
|
60
|
-
* accepts an `account` input, so consumers needing per-tx address
|
|
61
|
-
* selection can pick one from `accounts` at call time.
|
|
24
|
+
* Wallet Standard has no switch-cluster RPC: `switchChain` re-points butr's
|
|
25
|
+
* view only, and `signAndSendTransaction` takes the chain per call.
|
|
26
|
+
* `requestAccounts` re-runs `standard:connect`; some wallets answer silently.
|
|
62
27
|
*/
|
|
63
28
|
const buildSvmAdapter = (wallet, registerDisconnector) => {
|
|
64
29
|
const core = createWalletStandardCore({
|
|
@@ -77,22 +42,32 @@ const buildSvmAdapter = (wallet, registerDisconnector) => {
|
|
|
77
42
|
const signAndSendTx = getFeature(wallet, "solana:signAndSendTransaction");
|
|
78
43
|
const signTx = getFeature(wallet, "solana:signTransaction");
|
|
79
44
|
const signIn = getFeature(wallet, "solana:signIn");
|
|
80
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Resolve a caller-supplied target into a chain the wallet advertises.
|
|
47
|
+
* Accepts both the full CAIP-2 id (`solana:devnet`) and a bare reference
|
|
48
|
+
* (`devnet`), since consumers reasonably reach for either.
|
|
49
|
+
*/
|
|
50
|
+
const resolveTargetChain = (targetChainId) => {
|
|
51
|
+
const candidate = targetChainId.startsWith(SOLANA_PREFIX) ? targetChainId : `${SOLANA_PREFIX}${targetChainId}`;
|
|
52
|
+
if (!wallet.chains.includes(candidate)) throw new Error(`Wallet ${wallet.name} does not advertise chain "${candidate}". Available: ${wallet.chains.join(", ")}`);
|
|
53
|
+
return candidate;
|
|
54
|
+
};
|
|
55
|
+
const signAndSend = async (tx, account, chain) => {
|
|
81
56
|
if (signAndSendTx === void 0) throw new Error(`Wallet ${wallet.name} does not advertise solana:signAndSendTransaction`);
|
|
82
57
|
const wsAccount = core.resolveAccount(account);
|
|
83
58
|
if (!(tx instanceof Uint8Array)) throw new TypeError("SVM sendTx expects a serialized transaction (Uint8Array)");
|
|
84
59
|
const [output] = await signAndSendTx.signAndSendTransaction({
|
|
85
60
|
account: wsAccount,
|
|
86
|
-
chain: core.currentChainId(),
|
|
61
|
+
chain: chain ?? core.currentChainId(),
|
|
87
62
|
transaction: tx
|
|
88
63
|
});
|
|
89
64
|
if (output === void 0) throw new Error("signAndSendTransaction returned no outputs");
|
|
90
|
-
return
|
|
65
|
+
return bytesToBase58(output.signature);
|
|
91
66
|
};
|
|
92
67
|
return {
|
|
93
68
|
...core,
|
|
94
69
|
capabilities: resolveWalletStandardCapabilities({
|
|
95
|
-
chainCount:
|
|
70
|
+
chainCount: core.chainCount,
|
|
96
71
|
features: {
|
|
97
72
|
events: core.hasEvents,
|
|
98
73
|
signAndSendTransaction: Boolean(signAndSendTx),
|
|
@@ -113,9 +88,10 @@ const buildSvmAdapter = (wallet, registerDisconnector) => {
|
|
|
113
88
|
await core.connect();
|
|
114
89
|
},
|
|
115
90
|
sendTx: (tx, account) => signAndSend(tx, account),
|
|
116
|
-
sendTxToChain
|
|
117
|
-
|
|
118
|
-
|
|
91
|
+
async sendTxToChain(tx, targetChainId, account, cb) {
|
|
92
|
+
const target = resolveTargetChain(targetChainId);
|
|
93
|
+
if (target !== core.currentChainId()) cb?.();
|
|
94
|
+
return await signAndSend(tx, account, target);
|
|
119
95
|
},
|
|
120
96
|
async signMessage(msg, account) {
|
|
121
97
|
if (signMessage === void 0) throw new Error(`Wallet ${wallet.name} does not advertise solana:signMessage`);
|
|
@@ -152,24 +128,9 @@ const buildSvmAdapter = (wallet, registerDisconnector) => {
|
|
|
152
128
|
};
|
|
153
129
|
};
|
|
154
130
|
/**
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
* Runtime requires the `@wallet-standard/app` package, which is an
|
|
159
|
-
* **optional peer dependency** of butr. EVM-only consumers don't need
|
|
160
|
-
* to install it; discovery will silently skip the SVM side if the
|
|
161
|
-
* module isn't resolvable.
|
|
162
|
-
*
|
|
163
|
-
* Install for SVM auto-discovery:
|
|
164
|
-
*
|
|
165
|
-
* npm install @wallet-standard/app
|
|
166
|
-
*
|
|
167
|
-
* The function returns a synchronous unsubscribe that's safe to call
|
|
131
|
+
* Requires the optional `@wallet-standard/app` peer dep; without it SVM
|
|
132
|
+
* discovery silently does nothing. The returned unsubscribe is safe to call
|
|
168
133
|
* before the dynamic import has resolved.
|
|
169
|
-
*
|
|
170
|
-
* Implementation: the discovery loop (dynamic import, dedupe, register
|
|
171
|
-
* / unregister bridge) lives in `@usebutr/wallet-standard-shared`. This
|
|
172
|
-
* file's only job is to hand the kit a per-wallet builder.
|
|
173
134
|
*/
|
|
174
135
|
const discoverSvmAdapters = (onAdapter) => discoverWalletStandard(onAdapter, (wallet, registerDisconnector) => buildSvmAdapter(wallet, registerDisconnector));
|
|
175
136
|
|
|
@@ -200,10 +161,8 @@ const SVM_CHAINS_LIST = Object.values(SVM_CHAINS);
|
|
|
200
161
|
//#endregion
|
|
201
162
|
//#region src/discoverer.ts
|
|
202
163
|
/**
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
* before butr existed, so there's no `window.solana` injected path
|
|
206
|
-
* worth shimming.
|
|
164
|
+
* No legacy fallback: Solana wallets standardised on Wallet Standard before
|
|
165
|
+
* butr existed, so there's no `window.solana` injected path worth shimming.
|
|
207
166
|
*/
|
|
208
167
|
const svmDiscoverer = { subscribe: discoverSvmAdapters };
|
|
209
168
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/capabilities.ts","../src/wallet-standard-adapter.ts","../src/chains.ts","../src/discoverer.ts"],"sourcesContent":["import type { WalletCapabilities } from \"@usebutr/core\";\nimport { buildWalletCapabilities } from \"@usebutr/wallet-standard-shared\";\n\ntype WalletStandardCapabilityInput = {\n chainCount: number;\n features: {\n events: boolean;\n signAndSendTransaction: boolean;\n signIn: boolean;\n signMessage: boolean;\n signTransaction: boolean;\n };\n};\n\n/**\n * Solana Wallet Standard feature → butr capability mapping. The flags that\n * hold for every namespace are documented on `buildWalletCapabilities`.\n */\nconst resolveWalletStandardCapabilities = (\n input: WalletStandardCapabilityInput,\n): WalletCapabilities =>\n buildWalletCapabilities({\n chainCount: input.chainCount,\n events: input.features.events,\n sendTransaction: input.features.signAndSendTransaction,\n signIn: input.features.signIn,\n signMessage: input.features.signMessage,\n signTransaction: input.features.signTransaction,\n });\n\nexport type { WalletStandardCapabilityInput };\nexport { resolveWalletStandardCapabilities };\n","import type { WalletAdapter } from \"@usebutr/core\";\nimport { buildAccount, bytesToBase64 } from \"@usebutr/core\";\nimport {\n createWalletStandardCore,\n discoverWalletStandard,\n getFeature,\n slugify,\n} from \"@usebutr/wallet-standard-shared\";\nimport type { WalletStandardWallet } from \"@usebutr/wallet-standard-shared\";\n\nimport { resolveWalletStandardCapabilities } from \"./capabilities\";\nimport type {\n SolanaSignAndSendTransactionFeature,\n SolanaSignInFeature,\n SolanaSignMessageFeature,\n SolanaSignTransactionFeature,\n} from \"./wallet-standard-types\";\n\nconst SOLANA_PREFIX = \"solana:\";\nconst SOLANA_DECIMALS = 9;\nconst SOLANA_MAINNETS: ReadonlyArray<string> = [\"solana:mainnet\", \"solana:mainnet-beta\"];\n\n/**\n * Adapt a Solana Wallet Standard `Wallet` object into a butr\n * `WalletAdapter`. Returns `null` if the wallet doesn't advertise any\n * Solana chain or doesn't expose `standard:connect`; both required\n * for butr to do anything useful with it.\n *\n * **Capability gating**\n *\n * - `signMessage` is only present if the wallet advertises\n * `solana:signMessage`. Without it, calling `adapter.signMessage`\n * rejects with a clear error.\n * - `sendTx` / `sendTxToChain` use `solana:signAndSendTransaction`.\n * Without it, those methods reject.\n * - `subscribe` is wired through `standard:events`. Wallets that\n * don't expose events get a no-op unsubscribe.\n *\n * **Known limitations**\n *\n * - `getBalance` returns `{ value: 0n, formatted: \"0\", … }`. Solana\n * balance reads require an RPC connection that's outside butr's\n * scope; consumers wrap their own RPC client.\n * - `getTransactionReceipt` returns `{ status: \"Pending\" }`. Same\n * reason; needs an RPC.\n * - `switchChain` updates butr's view of the current Solana cluster\n * locally and routes subsequent `signAndSendTransaction` calls\n * through the new chain. Wallet Standard has no \"tell the wallet\n * to switch cluster\" RPC; the wallet's own UI controls its global\n * cluster setting, and `signAndSendTransaction` accepts the chain\n * per-call. The chain must be one the wallet advertises in\n * `wallet.chains`; otherwise the call rejects.\n * - `requestAccounts` re-runs `standard:connect`. Some wallets show\n * their account picker again; others (those that \"remember\"\n * authorisations) silently return the existing accounts. butr\n * refreshes the pool entry's `accounts` array either way.\n * - `switchAccount` is intentionally unimplemented. Wallet Standard\n * has no silent \"use address X\" feature; the user picks the active\n * account through the wallet's own UI. `signAndSendTransaction`\n * accepts an `account` input, so consumers needing per-tx address\n * selection can pick one from `accounts` at call time.\n */\nconst buildSvmAdapter = (\n wallet: WalletStandardWallet,\n /** Optional. Called with a function that pushes a synthetic\n * `disconnected` event to all current subscribers. The discovery\n * layer invokes it on Wallet Standard `unregister` so a connected\n * pool entry tears down when its extension is removed. */\n registerDisconnector?: (emit: () => void) => void,\n): WalletAdapter | null => {\n const core = createWalletStandardCore({\n chainPrefix: SOLANA_PREFIX,\n id: slugify(\"svm\", wallet.name),\n label: \"SVM\",\n namespace: \"solana\",\n platform: \"Solana\",\n preferredChainIds: SOLANA_MAINNETS,\n registerDisconnector,\n trackChainChanges: true,\n wallet,\n });\n if (core === null) {\n return null;\n }\n\n const signMessage = getFeature<SolanaSignMessageFeature>(wallet, \"solana:signMessage\");\n const signAndSendTx = getFeature<SolanaSignAndSendTransactionFeature>(\n wallet,\n \"solana:signAndSendTransaction\",\n );\n const signTx = getFeature<SolanaSignTransactionFeature>(wallet, \"solana:signTransaction\");\n const signIn = getFeature<SolanaSignInFeature>(wallet, \"solana:signIn\");\n\n const signAndSend = async (tx: unknown, account?: { walletAddress: string }): Promise<string> => {\n if (signAndSendTx === undefined) {\n throw new Error(`Wallet ${wallet.name} does not advertise solana:signAndSendTransaction`);\n }\n const wsAccount = core.resolveAccount(account);\n if (!(tx instanceof Uint8Array)) {\n throw new TypeError(\"SVM sendTx expects a serialized transaction (Uint8Array)\");\n }\n const [output] = await signAndSendTx.signAndSendTransaction({\n account: wsAccount,\n chain: core.currentChainId(),\n transaction: tx,\n });\n if (output === undefined) {\n throw new Error(\"signAndSendTransaction returned no outputs\");\n }\n return bytesToBase64(output.signature);\n };\n\n return {\n ...core,\n capabilities: resolveWalletStandardCapabilities({\n // Deliberately the wallet's whole chain list, not the Solana-only\n // slice: a wallet advertising a single `solana:` cluster alongside\n // other namespaces can still switch clusters from butr's side.\n chainCount: wallet.chains.length,\n features: {\n events: core.hasEvents,\n signAndSendTransaction: Boolean(signAndSendTx),\n signIn: Boolean(signIn),\n signMessage: Boolean(signMessage),\n signTransaction: Boolean(signTx),\n },\n }),\n chainPlatform: \"svm\",\n\n // Wallet Standard exposes no balance feature. Consumers wrap their\n // own RPC client; this default keeps the type signature honoured\n // without lying about a value we don't have.\n getBalance: () =>\n Promise.resolve({\n decimals: SOLANA_DECIMALS,\n formatted: \"0\",\n symbol: \"SOL\",\n value: 0n,\n }),\n\n getTransactionReceipt: () => Promise.resolve({ status: \"Pending\" as const }),\n\n async requestAccounts() {\n // Wallet Standard has no equivalent of EIP-2255's\n // `wallet_requestPermissions`. The closest we can do is re-run\n // `standard:connect`, which prompts the user on wallets that\n // surface their picker each time and silently returns the\n // existing list on wallets that remember authorisations.\n // butr's runtime calls `getAccounts()` afterwards to refresh\n // the pool entry, so newly-exposed addresses appear either way.\n await core.connect();\n },\n\n sendTx: (tx, account) => signAndSend(tx, account),\n\n sendTxToChain: (tx, _targetChainId, account, cb) => {\n // Solana Wallet Standard's signAndSendTransaction takes the\n // target chain directly. `targetChainId` is the decimal-string\n // form butr uses, but the wallet expects a CAIP-2 chain string.\n // For now we honour the connector's current chain and let\n // consumers route per-chain at a higher level if they need\n // multi-cluster support.\n cb?.();\n return signAndSend(tx, account);\n },\n\n async signMessage(msg, account) {\n if (signMessage === undefined) {\n throw new Error(`Wallet ${wallet.name} does not advertise solana:signMessage`);\n }\n const [output] = await signMessage.signMessage({\n account: core.resolveAccount(account),\n message: msg,\n });\n if (output === undefined) {\n throw new Error(\"signMessage returned no outputs\");\n }\n return { signature: output.signature, signedMessage: output.signedMessage };\n },\n\n ...(signTx === undefined\n ? {}\n : {\n async signTransaction(tx, account) {\n const wsAccount = core.resolveAccount(account);\n if (!(tx instanceof Uint8Array)) {\n throw new TypeError(\n \"SVM signTransaction expects a serialized transaction (Uint8Array)\",\n );\n }\n const [output] = await signTx.signTransaction({\n account: wsAccount,\n chain: core.currentChainId(),\n transaction: tx,\n });\n if (output === undefined) {\n throw new Error(\"signTransaction returned no outputs\");\n }\n return output.signedTransaction;\n },\n }),\n\n ...(signIn === undefined\n ? {}\n : {\n async signIn(input) {\n const [output] = await signIn.signIn(input);\n if (output === undefined) {\n throw new Error(\"signIn returned no outputs\");\n }\n return {\n account: buildAccount(output.account.address, core.toChain()),\n signature: output.signature,\n signedMessage: output.signedMessage,\n };\n },\n }),\n };\n};\n\n/**\n * Subscribe to Solana Wallet Standard announcements.\n * Spec: https://github.com/wallet-standard/wallet-standard\n *\n * Runtime requires the `@wallet-standard/app` package, which is an\n * **optional peer dependency** of butr. EVM-only consumers don't need\n * to install it; discovery will silently skip the SVM side if the\n * module isn't resolvable.\n *\n * Install for SVM auto-discovery:\n *\n * npm install @wallet-standard/app\n *\n * The function returns a synchronous unsubscribe that's safe to call\n * before the dynamic import has resolved.\n *\n * Implementation: the discovery loop (dynamic import, dedupe, register\n * / unregister bridge) lives in `@usebutr/wallet-standard-shared`. This\n * file's only job is to hand the kit a per-wallet builder.\n */\nconst discoverSvmAdapters = (onAdapter: (adapter: WalletAdapter) => void): (() => void) =>\n discoverWalletStandard(onAdapter, (wallet, registerDisconnector) =>\n buildSvmAdapter(wallet, registerDisconnector),\n );\n\nexport { buildSvmAdapter, discoverSvmAdapters };\n","import type { ChainBase } from \"@usebutr/core\";\n\n// Solana chain identifiers follow the Wallet Standard convention\n// (`solana:mainnet` / `solana:devnet` / `solana:testnet`) rather than\n// the strict CAIP-2 genesis-hash form (`solana:5eykt…`). Phantom,\n// Solflare, Backpack and the rest of the Wallet Standard ecosystem\n// advertise these shortnames in `wallet.chains`, and the SVM adapter's\n// `switchChain` rejects anything not in that set. The genesis-hash form\n// remains valid CAIP-2 but isn't what real wallets exchange.\nconst SVM_CHAINS = {\n devnet: { id: \"solana:devnet\", name: \"Solana Devnet\", namespace: \"solana\", reference: \"devnet\" },\n mainnet: {\n id: \"solana:mainnet\",\n name: \"Solana Mainnet\",\n namespace: \"solana\",\n reference: \"mainnet\",\n },\n testnet: {\n id: \"solana:testnet\",\n name: \"Solana Testnet\",\n namespace: \"solana\",\n reference: \"testnet\",\n },\n} as const satisfies Record<string, ChainBase>;\n\nconst SVM_CHAINS_LIST: ReadonlyArray<ChainBase> = Object.values(SVM_CHAINS);\n\nexport { SVM_CHAINS, SVM_CHAINS_LIST };\n","import type { PlatformDiscoverer } from \"@usebutr/core\";\n\nimport { discoverSvmAdapters } from \"./wallet-standard-adapter\";\n\n/**\n * SVM's `PlatformDiscoverer`: Solana Wallet Standard announcements. No\n * legacy fallback; Solana wallets standardised on Wallet Standard\n * before butr existed, so there's no `window.solana` injected path\n * worth shimming.\n */\nconst svmDiscoverer: PlatformDiscoverer = {\n subscribe: discoverSvmAdapters,\n};\n\nexport { svmDiscoverer };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/capabilities.ts","../src/wallet-standard-adapter.ts","../src/chains.ts","../src/discoverer.ts"],"sourcesContent":["import type { WalletCapabilities } from \"@usebutr/core\";\nimport { buildWalletCapabilities } from \"@usebutr/wallet-standard-shared\";\n\ntype WalletStandardCapabilityInput = {\n chainCount: number;\n features: {\n events: boolean;\n signAndSendTransaction: boolean;\n signIn: boolean;\n signMessage: boolean;\n signTransaction: boolean;\n };\n};\n\n/**\n * Solana Wallet Standard feature → butr capability mapping. The flags that\n * hold for every namespace are documented on `buildWalletCapabilities`.\n */\nconst resolveWalletStandardCapabilities = (\n input: WalletStandardCapabilityInput,\n): WalletCapabilities =>\n buildWalletCapabilities({\n chainCount: input.chainCount,\n events: input.features.events,\n sendTransaction: input.features.signAndSendTransaction,\n signIn: input.features.signIn,\n signMessage: input.features.signMessage,\n signTransaction: input.features.signTransaction,\n });\n\nexport type { WalletStandardCapabilityInput };\nexport { resolveWalletStandardCapabilities };\n","import type { WalletAdapter } from \"@usebutr/core\";\nimport { buildAccount, bytesToBase58 } from \"@usebutr/core\";\nimport {\n createWalletStandardCore,\n discoverWalletStandard,\n getFeature,\n slugify,\n} from \"@usebutr/wallet-standard-shared\";\nimport type { WalletStandardWallet } from \"@usebutr/wallet-standard-shared\";\n\nimport { resolveWalletStandardCapabilities } from \"./capabilities\";\nimport type {\n SolanaSignAndSendTransactionFeature,\n SolanaSignInFeature,\n SolanaSignMessageFeature,\n SolanaSignTransactionFeature,\n} from \"./wallet-standard-types\";\n\nconst SOLANA_PREFIX = \"solana:\";\nconst SOLANA_DECIMALS = 9;\nconst SOLANA_MAINNETS: ReadonlyArray<string> = [\"solana:mainnet\", \"solana:mainnet-beta\"];\n\n/**\n * Wallet Standard has no switch-cluster RPC: `switchChain` re-points butr's\n * view only, and `signAndSendTransaction` takes the chain per call.\n * `requestAccounts` re-runs `standard:connect`; some wallets answer silently.\n */\nconst buildSvmAdapter = (\n wallet: WalletStandardWallet,\n /** Optional. Called with a function that pushes a synthetic\n * `disconnected` event to all current subscribers. The discovery\n * layer invokes it on Wallet Standard `unregister` so a connected\n * pool entry tears down when its extension is removed. */\n registerDisconnector?: (emit: () => void) => void,\n): WalletAdapter | null => {\n const core = createWalletStandardCore({\n chainPrefix: SOLANA_PREFIX,\n id: slugify(\"svm\", wallet.name),\n label: \"SVM\",\n namespace: \"solana\",\n platform: \"Solana\",\n preferredChainIds: SOLANA_MAINNETS,\n registerDisconnector,\n trackChainChanges: true,\n wallet,\n });\n if (core === null) {\n return null;\n }\n\n const signMessage = getFeature<SolanaSignMessageFeature>(wallet, \"solana:signMessage\");\n const signAndSendTx = getFeature<SolanaSignAndSendTransactionFeature>(\n wallet,\n \"solana:signAndSendTransaction\",\n );\n const signTx = getFeature<SolanaSignTransactionFeature>(wallet, \"solana:signTransaction\");\n const signIn = getFeature<SolanaSignInFeature>(wallet, \"solana:signIn\");\n\n /**\n * Resolve a caller-supplied target into a chain the wallet advertises.\n * Accepts both the full CAIP-2 id (`solana:devnet`) and a bare reference\n * (`devnet`), since consumers reasonably reach for either.\n */\n const resolveTargetChain = (targetChainId: string): string => {\n const candidate = targetChainId.startsWith(SOLANA_PREFIX)\n ? targetChainId\n : `${SOLANA_PREFIX}${targetChainId}`;\n if (!wallet.chains.includes(candidate)) {\n throw new Error(\n `Wallet ${wallet.name} does not advertise chain \"${candidate}\". Available: ${wallet.chains.join(\", \")}`,\n );\n }\n return candidate;\n };\n\n const signAndSend = async (\n tx: unknown,\n account?: { walletAddress: string },\n chain?: string,\n ): Promise<string> => {\n if (signAndSendTx === undefined) {\n throw new Error(`Wallet ${wallet.name} does not advertise solana:signAndSendTransaction`);\n }\n const wsAccount = core.resolveAccount(account);\n if (!(tx instanceof Uint8Array)) {\n throw new TypeError(\"SVM sendTx expects a serialized transaction (Uint8Array)\");\n }\n const [output] = await signAndSendTx.signAndSendTransaction({\n account: wsAccount,\n chain: chain ?? core.currentChainId(),\n transaction: tx,\n });\n if (output === undefined) {\n throw new Error(\"signAndSendTransaction returned no outputs\");\n }\n // Base58 is the encoding every Solana explorer, `getSignatureStatuses`,\n // and the WalletConnect SVM namespace use for a transaction signature.\n return bytesToBase58(output.signature);\n };\n\n return {\n ...core,\n capabilities: resolveWalletStandardCapabilities({\n chainCount: core.chainCount,\n features: {\n events: core.hasEvents,\n signAndSendTransaction: Boolean(signAndSendTx),\n signIn: Boolean(signIn),\n signMessage: Boolean(signMessage),\n signTransaction: Boolean(signTx),\n },\n }),\n chainPlatform: \"svm\",\n\n getBalance: () =>\n Promise.resolve({\n decimals: SOLANA_DECIMALS,\n formatted: \"0\",\n symbol: \"SOL\",\n value: 0n,\n }),\n\n getTransactionReceipt: () => Promise.resolve({ status: \"Pending\" as const }),\n\n async requestAccounts() {\n await core.connect();\n },\n\n sendTx: (tx, account) => signAndSend(tx, account),\n\n // Async so an unadvertised chain surfaces as a rejection rather than a\n // synchronous throw; the declared return type is a promise either way.\n async sendTxToChain(tx, targetChainId, account, cb) {\n const target = resolveTargetChain(targetChainId);\n if (target !== core.currentChainId()) {\n cb?.();\n }\n const signature = await signAndSend(tx, account, target);\n return signature;\n },\n\n async signMessage(msg, account) {\n if (signMessage === undefined) {\n throw new Error(`Wallet ${wallet.name} does not advertise solana:signMessage`);\n }\n const [output] = await signMessage.signMessage({\n account: core.resolveAccount(account),\n message: msg,\n });\n if (output === undefined) {\n throw new Error(\"signMessage returned no outputs\");\n }\n return { signature: output.signature, signedMessage: output.signedMessage };\n },\n\n ...(signTx === undefined\n ? {}\n : {\n async signTransaction(tx, account) {\n const wsAccount = core.resolveAccount(account);\n if (!(tx instanceof Uint8Array)) {\n throw new TypeError(\n \"SVM signTransaction expects a serialized transaction (Uint8Array)\",\n );\n }\n const [output] = await signTx.signTransaction({\n account: wsAccount,\n chain: core.currentChainId(),\n transaction: tx,\n });\n if (output === undefined) {\n throw new Error(\"signTransaction returned no outputs\");\n }\n return output.signedTransaction;\n },\n }),\n\n ...(signIn === undefined\n ? {}\n : {\n async signIn(input) {\n const [output] = await signIn.signIn(input);\n if (output === undefined) {\n throw new Error(\"signIn returned no outputs\");\n }\n return {\n account: buildAccount(output.account.address, core.toChain()),\n signature: output.signature,\n signedMessage: output.signedMessage,\n };\n },\n }),\n };\n};\n\n/**\n * Requires the optional `@wallet-standard/app` peer dep; without it SVM\n * discovery silently does nothing. The returned unsubscribe is safe to call\n * before the dynamic import has resolved.\n */\nconst discoverSvmAdapters = (onAdapter: (adapter: WalletAdapter) => void): (() => void) =>\n discoverWalletStandard(onAdapter, (wallet, registerDisconnector) =>\n buildSvmAdapter(wallet, registerDisconnector),\n );\n\nexport { buildSvmAdapter, discoverSvmAdapters };\n","import type { ChainBase } from \"@usebutr/core\";\n\nconst SVM_CHAINS = {\n devnet: { id: \"solana:devnet\", name: \"Solana Devnet\", namespace: \"solana\", reference: \"devnet\" },\n mainnet: {\n id: \"solana:mainnet\",\n name: \"Solana Mainnet\",\n namespace: \"solana\",\n reference: \"mainnet\",\n },\n testnet: {\n id: \"solana:testnet\",\n name: \"Solana Testnet\",\n namespace: \"solana\",\n reference: \"testnet\",\n },\n} as const satisfies Record<string, ChainBase>;\n\nconst SVM_CHAINS_LIST: ReadonlyArray<ChainBase> = Object.values(SVM_CHAINS);\n\nexport { SVM_CHAINS, SVM_CHAINS_LIST };\n","import type { PlatformDiscoverer } from \"@usebutr/core\";\n\nimport { discoverSvmAdapters } from \"./wallet-standard-adapter\";\n\n/**\n * No legacy fallback: Solana wallets standardised on Wallet Standard before\n * butr existed, so there's no `window.solana` injected path worth shimming.\n */\nconst svmDiscoverer: PlatformDiscoverer = {\n subscribe: discoverSvmAdapters,\n};\n\nexport { svmDiscoverer };\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usebutr/svm",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Wallet Standard adapter for butr (Solana / SVM).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Pedro Filho <pedro@filho.me>",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"access": "public"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@usebutr/core": "
|
|
29
|
-
"@usebutr/wallet-standard-shared": "0.
|
|
28
|
+
"@usebutr/core": "2.0.0",
|
|
29
|
+
"@usebutr/wallet-standard-shared": "0.5.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@wallet-standard/app": "^1.1.1",
|
|
@@ -47,7 +47,6 @@
|
|
|
47
47
|
"build": "tsdown",
|
|
48
48
|
"clean": "rm -rf dist",
|
|
49
49
|
"dev": "tsdown --watch",
|
|
50
|
-
"lint": "oxlint src",
|
|
51
50
|
"test": "vitest run --passWithNoTests",
|
|
52
51
|
"test:coverage": "vitest run --coverage --passWithNoTests",
|
|
53
52
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|