@usebutr/polkadot 1.1.2 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # @usebutr/polkadot
2
2
 
3
+ ## 2.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`488fe13`](https://github.com/pedroapfilho/usebutr/commit/488fe13fe9cddb99ff6c5d60f798140e6ac4076f)]:
8
+ - @usebutr/core@3.0.1
9
+ - @usebutr/wallet-standard-shared@2.0.1
10
+
11
+ ## 2.0.0
12
+
13
+ ### Major Changes
14
+
15
+ - [#203](https://github.com/pedroapfilho/usebutr/pull/203) [`1263f86`](https://github.com/pedroapfilho/usebutr/commit/1263f8666afd43b4f7dbf8df1763709c3edf09d9) Thanks [@pedroapfilho](https://github.com/pedroapfilho)! - Adapters now say what they can do by having the method: `capabilities` is gone, and an optional method (`sendTx`, `signMessage`, `getBalance`, `switchChain`, …) exists only when it works for that wallet. No adapter returns a placeholder balance or a receipt that stays pending anymore.
16
+
17
+ - `sendTx(tx, { account, chain })` replaces `sendTx` and `sendTxToChain`, and `signMessage`, `signTransaction` and `getBalance` take options objects. `chain` is a `ChainBase`. An adapter either routes the call to that chain, switches the wallet to it, or rejects; none ignores it.
18
+ - An `account` the wallet does not expose now rejects instead of signing with the first account. `chain.name` is the chain's name, never the wallet's.
19
+ - `getAccounts()` resolves the active account first. `getAccount` and `switchAccount` are removed.
20
+ - `getSigner()` resolves a tagged `WalletSigner` (`eip1193`, `wallet-standard`, `walletconnect`, `ledger-*`, …), so it can be narrowed with `switch (signer.kind)` instead of cast.
21
+ - `createWalletManager(config, { initialState })` owns discovery, hydration and persistence, and works without React. `config.sources` replaces the `discovery`, `connectors` and `createConnector` props. `fromAdapters` registers WalletConnect, Ledger and hand-built adapters, which now also appear in `useDiscoveredWallets()`.
22
+ - `WalletManagerProvider` takes `config` and `initialState`. `useSigner(wallet)` and `useBalance(wallet, { token, account })` take the wallet entry itself, and id-taking hooks read the active wallet only when the id is omitted (`null` reads none). The hooks are `useWalletManager`, `useWalletState`, `useConnect`, `useWallet`, `useSelectedWallet` (now typed per platform), `useAccounts`, `useConnectionStatus`, `useIsHydrated`, `useIsReconnecting`, `useDiscoveredWallets`, `useConnectedWallets`, the `…ByPlatform` groupings, `useBalance` and `useSigner`.
23
+ - `manager.connect()` and `useConnect().connectAsync()` resolve the `ConnectedWallet` and reject with a `ConnectionError`, now an `Error` subclass with a `kind` and a new `WalletNotFound` kind. `useConnect().connect()` never rejects: the failure lands in its `error`.
24
+ - `WalletPersistence` is `load()` / `save(state)`, and `createWalletStorage` replaces `new WalletStorage`. Storage keys are unchanged.
25
+ - Chain registries (`EVM_CHAINS`, `SVM_CHAINS`, …, `CHAINS_BY_PLATFORM`) move to `@usebutr/core`, and `BITCOIN_CHAINS` gains `testnet4`. `@usebutr/wallets` loads every platform's signer kinds, so an app that imports only it can narrow `signer.kind`.
26
+ - `@usebutr/react` requires React 19, which its `use()` call already needed.
27
+ - WalletConnect requests on Solana, Sui and Bitcoin now carry their chain, so they no longer fall through to the first namespace in a multi-namespace session. Solana takes `SVM_CHAINS` chains and maps them to the genesis-hash ids WalletConnect sessions use.
28
+ - Ledger's Solana `signTransaction` returns the full signed transaction, Sui signs the intent message, and Bitcoin `signMessage` returns a BIP-137 signature.
29
+ - `@usebutr/testing`'s fake adapter resolves a `signer` you pass instead of registering a test-only signer kind.
30
+ - `setAccount` selects an exposed account without changing any account's chain. Unknown accounts are ignored; chain changes come from the adapter.
31
+ - WalletConnect EVM events use the namespace in `session_event`, including empty account lists that end the connection. Local chain switches still update the manager.
32
+ - Failed persistence saves wait for every key write to finish before reporting failure, so delayed writes cannot overwrite a later disconnect.
33
+ - `@usebutr/svm/transaction` provides the shared legacy/v0 signing codec used by Ledger and WalletConnect, with consistent layout and signature validation.
34
+
35
+ See the migration guide at https://docs.usebutr.com/migration.
36
+
37
+ ### Patch Changes
38
+
39
+ - Updated dependencies [[`1263f86`](https://github.com/pedroapfilho/usebutr/commit/1263f8666afd43b4f7dbf8df1763709c3edf09d9), [`5d1f234`](https://github.com/pedroapfilho/usebutr/commit/5d1f23403263f7a1f8a48be061727972fe749b5f)]:
40
+ - @usebutr/core@3.0.0
41
+ - @usebutr/wallet-standard-shared@2.0.0
42
+
3
43
  ## 1.1.2
4
44
 
5
45
  ### Patch Changes
package/README.md CHANGED
@@ -11,22 +11,51 @@ connection-state library. Your application owns the picker UI and chain client.
11
11
  npm install @usebutr/react @usebutr/core @usebutr/polkadot zustand
12
12
  ```
13
13
 
14
- React 18+ is a peer dependency of the provider. Discovery does not render a connect modal; add your picker as the provider child. This example uses injectedWeb3. Use `@usebutr/wallets` to also compose the Wallet Standard fallback.
14
+ React 19 is a peer dependency of the provider. Discovery does not render a connect modal; add your picker as the provider child. This example uses injectedWeb3. Use `@usebutr/wallets` to also compose the Wallet Standard fallback.
15
15
 
16
16
  ## Usage
17
17
 
18
18
  ```tsx
19
19
  import type { ReactNode } from "react";
20
- import { createWalletSource } from "@usebutr/core";
20
+ import type { WalletManagerConfig } from "@usebutr/core";
21
21
  import { discoverInjectedPolkadotAdapters } from "@usebutr/polkadot";
22
22
  import { WalletManagerProvider } from "@usebutr/react";
23
23
 
24
- const discovery = createWalletSource(discoverInjectedPolkadotAdapters);
24
+ const config: WalletManagerConfig = { sources: [discoverInjectedPolkadotAdapters] };
25
+
25
26
  export const WalletProvider = ({ children }: { children: ReactNode }) => (
26
- <WalletManagerProvider discovery={discovery}>{children}</WalletManagerProvider>
27
+ <WalletManagerProvider config={config}>{children}</WalletManagerProvider>
27
28
  );
28
29
  ```
29
30
 
31
+ ## Signing
32
+
33
+ butr ships no Polkadot RPC, so a Polkadot adapter has no `sendTx`,
34
+ `getBalance` or `getTransactionReceipt`. Build and submit extrinsics with
35
+ polkadot-api through `getSigner()`:
36
+
37
+ ```ts
38
+ import { connectInjectedExtension } from "polkadot-api/pjs-signer";
39
+
40
+ const signer = await wallet.connector.getSigner();
41
+ if (signer.kind === "polkadot-injected") {
42
+ const extension = await connectInjectedExtension(signer.extensionName);
43
+ const account = extension.getAccounts().find((a) => a.address === wallet.account.walletAddress);
44
+ // tx.signSubmitAndWatch(account.polkadotSigner)
45
+ }
46
+ ```
47
+
48
+ Wallet Standard wallets resolve `{ kind: "wallet-standard", wallet }` instead.
49
+ `signMessage` is defined when the wallet can sign bytes: on Wallet Standard
50
+ when it advertises `polkadot:signMessage`, on injectedWeb3 once `connect()`
51
+ has enabled an extension that exposes `signRaw`. Pass `{ account }` to sign
52
+ as another exposed account; an account the wallet does not expose rejects.
53
+
54
+ Chains come from `POLKADOT_CHAINS` in `@usebutr/core`. injectedWeb3
55
+ extensions have no network to switch, so those adapters have no
56
+ `switchChain`; an account the extension pins to a network through
57
+ `genesisHash` carries that chain.
58
+
30
59
  ## Documentation
31
60
 
32
61
  - [Package reference](https://docs.usebutr.com/api/polkadot)
package/dist/index.d.ts CHANGED
@@ -1,55 +1,5 @@
1
+ import { PlatformDiscoverer, PolkadotAdapter, WalletAdapter } from "@usebutr/core";
1
2
  import { WalletStandardWallet, WalletStandardWalletAccount } from "@usebutr/wallet-standard-shared";
2
- import { ChainBase, PlatformDiscoverer, PolkadotAdapter, WalletAdapter, WalletCapabilities, WalletSigner } from "@usebutr/core";
3
- //#region src/chains.d.ts
4
- declare const POLKADOT_CHAINS: {
5
- readonly kusama: {
6
- readonly id: "polkadot:b0a8d493285c2df73290dfb7e61f870f";
7
- readonly name: "Kusama";
8
- readonly namespace: "polkadot";
9
- readonly reference: "b0a8d493285c2df73290dfb7e61f870f";
10
- };
11
- readonly paseo: {
12
- readonly id: "polkadot:77afd6190f1554ad45fd0d31aee62aac";
13
- readonly name: "Paseo";
14
- readonly namespace: "polkadot";
15
- readonly reference: "77afd6190f1554ad45fd0d31aee62aac";
16
- };
17
- readonly polkadot: {
18
- readonly id: "polkadot:91b171bb158e2d3848fa23a9f1c25182";
19
- readonly name: "Polkadot";
20
- readonly namespace: "polkadot";
21
- readonly reference: "91b171bb158e2d3848fa23a9f1c25182";
22
- };
23
- readonly westend: {
24
- readonly id: "polkadot:e143f23803ac50e8f6f8e62695d1ce9e";
25
- readonly name: "Westend";
26
- readonly namespace: "polkadot";
27
- readonly reference: "e143f23803ac50e8f6f8e62695d1ce9e";
28
- };
29
- };
30
- declare const POLKADOT_CHAINS_LIST: ReadonlyArray<ChainBase>;
31
- //#endregion
32
- //#region src/capabilities.d.ts
33
- type WalletStandardPolkadotCapabilityInput = {
34
- chainCount: number;
35
- features: {
36
- events: boolean;
37
- signMessage: boolean;
38
- };
39
- };
40
- /**
41
- * injectedWeb3 always exposes `signer.signRaw` and `accounts.subscribe`, so
42
- * those flags are unconditional. The chain count comes from butr's own
43
- * registry because injectedWeb3 wallets advertise no chains.
44
- */
45
- declare const resolveInjectedPolkadotCapabilities: () => WalletCapabilities;
46
- /**
47
- * Wallet Standard `polkadot:*` feature → butr capability mapping. No
48
- * standalone `signTransaction`: building an extrinsic needs chain metadata
49
- * butr doesn't fetch, so transaction signing goes through `getSigner()`.
50
- */
51
- declare const resolveWalletStandardPolkadotCapabilities: (input: WalletStandardPolkadotCapabilityInput) => WalletCapabilities;
52
- //#endregion
53
3
  //#region src/injected/injected-web3.d.ts
54
4
  /**
55
5
  * Local narrowing of the `@polkadot/extension-dapp` injectedWeb3 standard
@@ -99,19 +49,10 @@ declare global {
99
49
  }
100
50
  //#endregion
101
51
  //#region src/injected/adapter.d.ts
102
- /** Handle returned by `getSigner()`. Carries the `window.injectedWeb3`
103
- * key (`extensionName`) so consumers can bridge to polkadot-api's
104
- * `connectInjectedExtension`, the active SS58 address, and the raw
105
- * `Injected` object for direct `signer` access. */
106
- type PolkadotSignerHandle = {
107
- address: string;
108
- extension: Injected;
109
- extensionName: string;
110
- };
111
- declare const isPolkadotSignerHandle: (value: WalletSigner) => value is PolkadotSignerHandle;
112
52
  /**
113
- * The provider is not enabled at construction: `enable()` raises the
114
- * extension's authorization prompt, so it runs lazily in `connect()`.
53
+ * `enable()` prompts, so it waits for `connect()`. No `switchChain`: the
54
+ * extension has no network to switch and nothing here takes a chain; an
55
+ * extrinsic carries its genesis hash in the payload polkadot-api builds.
115
56
  */
116
57
  declare const buildInjectedPolkadotAdapter: (extensionName: string, displayName: string, provider: InjectedWindowProvider) => PolkadotAdapter;
117
58
  //#endregion
@@ -149,7 +90,7 @@ declare const buildPolkadotWalletStandardAdapter: (wallet: WalletStandardWallet,
149
90
  /** Optional. Called with a function that pushes a synthetic
150
91
  * `disconnected` event to all current subscribers. The discovery
151
92
  * layer invokes it on Wallet Standard `unregister`. */
152
- registerDisconnector?: (emit: () => void) => void) => WalletAdapter | null;
93
+ registerDisconnector?: (emit: () => void) => void) => PolkadotAdapter | null;
153
94
  /**
154
95
  * The fallback channel; see `polkadotDiscoverer`. Requires the optional
155
96
  * `@wallet-standard/app` peer dep and no-ops without it.
@@ -166,15 +107,18 @@ declare const polkadotDiscoverer: PlatformDiscoverer;
166
107
  //#endregion
167
108
  //#region src/signer-augmentation.d.ts
168
109
  /**
169
- * The `getSigner()` shape depends on the discovery channel: injectedWeb3
170
- * yields a `PolkadotSignerHandle` to bridge into polkadot-api's
171
- * `connectInjectedExtension`, Wallet Standard yields the raw wallet.
110
+ * `extensionName` is the `window.injectedWeb3` key polkadot-api's
111
+ * `connectInjectedExtension` takes. No address: sign as the connected
112
+ * wallet's `account`, which follows `setAccount`.
172
113
  */
173
114
  declare module "@usebutr/core" {
174
- interface SignerForPlatform {
175
- polkadot: PolkadotSignerHandle | WalletStandardWallet;
115
+ interface WalletSignerRegistry {
116
+ "polkadot-injected": {
117
+ extension: Injected;
118
+ extensionName: string;
119
+ };
176
120
  }
177
121
  }
178
122
  //#endregion
179
- export { type InjectedPolkadotDiscoveryOptions, POLKADOT_CHAINS, POLKADOT_CHAINS_LIST, type PolkadotSignMessageFeature, type PolkadotSignMessageInput, type PolkadotSignMessageOutput, type PolkadotSignerHandle, type WalletStandardPolkadotCapabilityInput, buildInjectedPolkadotAdapter, buildPolkadotWalletStandardAdapter, discoverInjectedPolkadotAdapters, discoverPolkadotWalletStandardAdapters, isPolkadotSignerHandle, polkadotDiscoverer, resolveInjectedPolkadotCapabilities, resolveWalletStandardPolkadotCapabilities };
123
+ export { type InjectedPolkadotDiscoveryOptions, type PolkadotSignMessageFeature, type PolkadotSignMessageInput, type PolkadotSignMessageOutput, buildInjectedPolkadotAdapter, buildPolkadotWalletStandardAdapter, discoverInjectedPolkadotAdapters, discoverPolkadotWalletStandardAdapters, polkadotDiscoverer };
180
124
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/chains.ts","../src/capabilities.ts","../src/injected/injected-web3.ts","../src/injected/adapter.ts","../src/injected/index.ts","../src/wallet-standard-types.ts","../src/wallet-standard-adapter.ts","../src/discoverer.ts","../src/signer-augmentation.ts"],"mappings":";;;cAEM;;aAEF;aACA;aACA;aACA;;;aAGA;aACA;aACA;aACA;;;aAGA;aACA;aACA;aACA;;;aAGA;aACA;aACA;aACA;;;cAIE,sBAAsB,cAAc;;;KCxBrC;EACH;EACA;IACE;IACA;;;;;;;;cASE,2CAA0C;;;;;;cAe1C,4CAAyC,OACtC,0CACN;;;;;;;;;;KC3BE;EACH;EACA;EACA;EACA;;;;KAKG;EACH,WAAW;IACT;IACA;IACA;QACI;IAAU;IAAY;;;;KAIzB;EACH;IACE,WAAW,QAAQ,cAAc;IACjC,aAAa,KAAK,UAAU,cAAc;;EAE5C,QAAQ;;;KAIL;EACH,SAAS,mBAAmB,QAAQ;EACpC;;KAGG;EACH,eAAe,eAAe;;QAGxB;YAEI;IACR,eAAe,eAAe;;;;;;;;;KCvB7B;EACH;EACA,WAAW;EACX;;cAGI,yBAAsB,OAAW,iBAAe,SAAS;;;;;cAuCzD,+BAA4B,uBACX,qBACF,UACT,2BACT;;;KCrCE;;;EAGH,SAAS;;EAET,SAAS;;;;;;;cAUL,mCAAgC,YACxB,SAAS,wBAAsB,UAClC;;;KC9CN;EACH,SAAS;EACT,SAAS;;KAGN;EACH,WAAW;EACX,gBAAgB;;KAGb;EACH,cAAc,OAAO,6BAA6B,QAAQ;EAC1D;;;;cCII,qCAAkC,QAC9B,sBAIe;;;;AAAA,wBAAC,8BACvB;;;;;cAmDG,yCAAsC,YAC9B,SAAS;;;;;;;;cCvEjB,oBAAoB;;;;;;;;;YCCd;IACR,UAAU,uBAAuB"}
1
+ {"version":3,"file":"index.d.ts","names":["_0"],"sources":["../src/injected/injected-web3.ts","../src/injected/adapter.ts","../src/injected/index.ts","../src/wallet-standard-types.ts","../src/wallet-standard-adapter.ts","../src/discoverer.ts","../src/signer-augmentation.ts"],"mappings":";;;;;;;;;;KAQK;EACH;EACA;EACA;EACA;;;;KAKG;EACH,WAAW;IACT;IACA;IACA;QACI;IAAU;IAAY;;;;KAIzB;EACH;IACE,WAAW,QAAQ,cAAc;IACjC,aAAa,KAAK,UAAU,cAAc;;EAE5C,QAAQ;;;KAIL;EACH,SAAS,mBAAmB,QAAQ;EACpC;;KAGG;EACH,eAAe,eAAe;;QAGxB;YAEI;IACR,eAAe,eAAe;;;;;;;;;;cCiB5B,+BAA4B,uBACX,qBACF,UACT,2BACT;;;KChCE;;;EAGH,SAAS;;EAET,SAAS;;;;;;;cAUL,mCAAgC,YACxB,SAAS,wBAAsB,UAClC;;;KC9CN;EACH,SAAS;EACT,SAAS;;KAGN;EACH,WAAW;EACX,gBAAgB;;KAGb;EACH,cAAc,OAAO,6BAA6B,QAAQ;EAC1D;;;;cCPI,qCAAkC,QAC9B,sBAIe;;;;AAAA,wBAAC,8BACvB;;;;;cA0CG,yCAAsC,YAC9B,SAAS;;;;;;;;cCnDjB,oBAAoB;;;;;;;;;YCDd;IACR;MAAuB,WAAW;MAAU"}
package/dist/index.js CHANGED
@@ -1,89 +1,6 @@
1
- import { buildWalletCapabilities, createWalletStandardCore, discoverWalletStandard, getFeature, slugify } from "@usebutr/wallet-standard-shared";
2
- import { bytesToHexPrefixed as bytesToHex, hexToBytes, logWarn, sanitizeIcon } from "@usebutr/core";
1
+ import { POLKADOT_CHAINS, POLKADOT_CHAINS_LIST, buildAccount, bytesToHexPrefixed as bytesToHex, hexToBytes, logWarn, resolveChain, sanitizeIcon } from "@usebutr/core";
2
+ import { createWalletStandardCore, discoverWalletStandard, getFeature, slugify } from "@usebutr/wallet-standard-shared";
3
3
 
4
- //#region src/chains.ts
5
- const POLKADOT_CHAINS = {
6
- kusama: {
7
- id: "polkadot:b0a8d493285c2df73290dfb7e61f870f",
8
- name: "Kusama",
9
- namespace: "polkadot",
10
- reference: "b0a8d493285c2df73290dfb7e61f870f"
11
- },
12
- paseo: {
13
- id: "polkadot:77afd6190f1554ad45fd0d31aee62aac",
14
- name: "Paseo",
15
- namespace: "polkadot",
16
- reference: "77afd6190f1554ad45fd0d31aee62aac"
17
- },
18
- polkadot: {
19
- id: "polkadot:91b171bb158e2d3848fa23a9f1c25182",
20
- name: "Polkadot",
21
- namespace: "polkadot",
22
- reference: "91b171bb158e2d3848fa23a9f1c25182"
23
- },
24
- westend: {
25
- id: "polkadot:e143f23803ac50e8f6f8e62695d1ce9e",
26
- name: "Westend",
27
- namespace: "polkadot",
28
- reference: "e143f23803ac50e8f6f8e62695d1ce9e"
29
- }
30
- };
31
- const POLKADOT_CHAINS_LIST = Object.values(POLKADOT_CHAINS);
32
- const POLKADOT_CHAIN_BY_ID = new Map(POLKADOT_CHAINS_LIST.map((chain) => [chain.id, chain]));
33
- /** Chains a wallet advertising several networks should resolve to first.
34
- * Kusama sits alongside Polkadot because it carries real value; Westend
35
- * and Paseo are faucet testnets and must never win the default. */
36
- const POLKADOT_MAINNET_IDS = [POLKADOT_CHAINS.polkadot.id, POLKADOT_CHAINS.kusama.id];
37
-
38
- //#endregion
39
- //#region src/capabilities.ts
40
- /**
41
- * injectedWeb3 always exposes `signer.signRaw` and `accounts.subscribe`, so
42
- * those flags are unconditional. The chain count comes from butr's own
43
- * registry because injectedWeb3 wallets advertise no chains.
44
- */
45
- const resolveInjectedPolkadotCapabilities = () => buildWalletCapabilities({
46
- chainCount: POLKADOT_CHAINS_LIST.length,
47
- events: true,
48
- sendTransaction: false,
49
- signIn: false,
50
- signMessage: true,
51
- signTransaction: false
52
- });
53
- /**
54
- * Wallet Standard `polkadot:*` feature → butr capability mapping. No
55
- * standalone `signTransaction`: building an extrinsic needs chain metadata
56
- * butr doesn't fetch, so transaction signing goes through `getSigner()`.
57
- */
58
- const resolveWalletStandardPolkadotCapabilities = (input) => buildWalletCapabilities({
59
- chainCount: input.chainCount,
60
- events: input.features.events,
61
- sendTransaction: false,
62
- signIn: false,
63
- signMessage: input.features.signMessage,
64
- signTransaction: false
65
- });
66
-
67
- //#endregion
68
- //#region src/no-rpc.ts
69
- /**
70
- * Building an extrinsic or reading on-chain state both need chain metadata
71
- * butr doesn't fetch, so it ships no Polkadot RPC. The neutral balance and
72
- * receipt values are gated behind the matching `capabilities` flags.
73
- */
74
- const POLKADOT_SEND_TX_HINT = "Polkadot sendTx is unsupported: use getSigner() with polkadot-api to build and submit extrinsics";
75
- const POLKADOT_SEND_TX_TO_CHAIN_HINT = "Polkadot sendTxToChain is unsupported: use getSigner() with polkadot-api to build and submit extrinsics";
76
- const noRpcBalance = () => Promise.resolve({
77
- decimals: 0,
78
- formatted: "0",
79
- symbol: "",
80
- value: 0n
81
- });
82
- const noRpcTransactionReceipt = () => Promise.resolve({ status: "Pending" });
83
- const noRpcSendTx = () => Promise.reject(/* @__PURE__ */ new Error(POLKADOT_SEND_TX_HINT));
84
- const noRpcSendTxToChain = () => Promise.reject(/* @__PURE__ */ new Error(POLKADOT_SEND_TX_TO_CHAIN_HINT));
85
-
86
- //#endregion
87
4
  //#region src/injected/icon.ts
88
5
  const GENERIC_POLKADOT_ICON = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiNFNjAwN0EiLz48L3N2Zz4=";
89
6
 
@@ -107,39 +24,29 @@ const readInjectedWindow = (target) => {
107
24
  //#endregion
108
25
  //#region src/injected/adapter.ts
109
26
  const DAPP_NAME = "butr";
110
- const isPolkadotSignerHandle = (value) => "address" in value && typeof value.address === "string" && "extension" in value && typeof value.extension === "object" && value.extension !== null && "extensionName" in value && typeof value.extensionName === "string";
111
27
  /**
112
28
  * Deliberately not wallet-standard-shared's `slugify`: that helper embeds
113
29
  * the `wallet-standard:` scheme, while injected adapter ids follow the
114
30
  * `injected:polkadot:<slug>` convention.
115
31
  */
116
32
  const toKebab = (name) => name.trim().toLowerCase().replaceAll(new RegExp("[^a-z0-9]+", "gv"), "-").replaceAll(new RegExp("^-|-$", "gv"), "");
117
- const buildPolkadotAccount = (address, chain) => ({
118
- chain,
119
- id: `${chain.id}:${address}`,
120
- walletAddress: address
121
- });
122
33
  /**
123
- * The provider is not enabled at construction: `enable()` raises the
124
- * extension's authorization prompt, so it runs lazily in `connect()`.
34
+ * An account works on any Substrate chain unless the extension pins it to
35
+ * one through `genesisHash`, whose first 16 bytes are the CAIP-2 reference.
36
+ * Unpinned accounts are labelled Polkadot, butr's default network.
37
+ */
38
+ const chainOf = ({ genesisHash }) => genesisHash === void 0 || genesisHash === null || genesisHash === "" ? POLKADOT_CHAINS.polkadot : resolveChain(`polkadot:${genesisHash.replace(new RegExp("^0x", "v"), "").slice(0, 32)}`, POLKADOT_CHAINS_LIST);
39
+ const toAccount = (account) => buildAccount(account.address, chainOf(account));
40
+ /**
41
+ * `enable()` prompts, so it waits for `connect()`. No `switchChain`: the
42
+ * extension has no network to switch and nothing here takes a chain; an
43
+ * extrinsic carries its genesis hash in the payload polkadot-api builds.
125
44
  */
126
45
  const buildInjectedPolkadotAdapter = (extensionName, displayName, provider) => {
127
- const capabilities = resolveInjectedPolkadotCapabilities();
128
46
  let session = null;
129
- let chain = POLKADOT_CHAINS.polkadot;
130
- const listenersSet = /* @__PURE__ */ new Set();
47
+ const listeners = /* @__PURE__ */ new Set();
131
48
  const emit = (event) => {
132
- const snapshot = [...listenersSet];
133
- for (const listener of snapshot) listener(event);
134
- };
135
- const emitAccounts = (accounts) => {
136
- const built = accounts.map((a) => buildPolkadotAccount(a.address, chain));
137
- const first = built[0];
138
- if (first !== void 0) emit({
139
- account: first,
140
- accounts: built,
141
- type: "accountChanged"
142
- });
49
+ for (const listener of listeners) listener(event);
143
50
  };
144
51
  const closeSession = () => {
145
52
  session?.unsubscribe?.();
@@ -151,7 +58,10 @@ const buildInjectedPolkadotAdapter = (extensionName, displayName, provider) => {
151
58
  emit({ type: "disconnected" });
152
59
  return;
153
60
  }
154
- emitAccounts(accounts);
61
+ emit({
62
+ accounts: accounts.map(toAccount),
63
+ type: "accountsChanged"
64
+ });
155
65
  };
156
66
  const openSession = (injected) => {
157
67
  closeSession();
@@ -173,74 +83,62 @@ const buildInjectedPolkadotAdapter = (extensionName, displayName, provider) => {
173
83
  if (session === null) throw new Error(`Wallet ${displayName} is not connected`);
174
84
  return session.injected;
175
85
  };
176
- const firstAddress = async () => {
177
- if (session === null) return null;
178
- return (await session.injected.accounts.get())[0]?.address ?? null;
86
+ const subscribe = (listener) => {
87
+ listeners.add(listener);
88
+ return () => {
89
+ listeners.delete(listener);
90
+ };
91
+ };
92
+ const signMessage = async (message, options) => {
93
+ const injected = requireInjected();
94
+ if (injected.signer.signRaw === void 0) throw new Error(`Wallet ${displayName} does not expose signRaw`);
95
+ const exposed = await injected.accounts.get();
96
+ const requested = options?.account;
97
+ const match = requested === void 0 ? exposed[0] : exposed.find((a) => a.address === requested.walletAddress);
98
+ if (match === void 0) throw new Error(requested === void 0 ? `Wallet ${displayName} has no connected account` : `Wallet ${displayName} does not expose account ${requested.walletAddress}`);
99
+ const wrapped = wrapBytes(message);
100
+ const result = await injected.signer.signRaw({
101
+ address: match.address,
102
+ data: bytesToHex(wrapped),
103
+ type: "bytes"
104
+ });
105
+ return {
106
+ signature: hexToBytes(result.signature),
107
+ signedMessage: wrapped
108
+ };
179
109
  };
180
110
  return {
181
- capabilities,
182
111
  chainPlatform: "polkadot",
183
112
  async connect() {
184
113
  const injected = await provider.enable(DAPP_NAME);
185
114
  if ((await injected.accounts.get()).length === 0) throw new Error(`Wallet ${displayName} exposed no accounts`);
186
115
  openSession(injected);
187
116
  },
188
- disconnect: () => {
117
+ async disconnect() {
189
118
  closeSession();
190
- return Promise.resolve();
191
- },
192
- async getAccount() {
193
- const address = await firstAddress();
194
- return address === null ? null : buildPolkadotAccount(address, chain);
119
+ await Promise.resolve();
195
120
  },
196
121
  async getAccounts() {
197
122
  if (session === null) return [];
198
- return (await session.injected.accounts.get()).map((a) => buildPolkadotAccount(a.address, chain));
123
+ return (await session.injected.accounts.get()).map(toAccount);
199
124
  },
200
- getBalance: noRpcBalance,
201
125
  async getSigner() {
202
- const ext = requireInjected();
203
- const address = await firstAddress();
204
- if (address === null) throw new Error("No connected account");
126
+ const extension = requireInjected();
127
+ await Promise.resolve();
205
128
  return {
206
- address,
207
- extension: ext,
208
- extensionName
129
+ extension,
130
+ extensionName,
131
+ kind: "polkadot-injected"
209
132
  };
210
133
  },
211
- getTransactionReceipt: noRpcTransactionReceipt,
212
134
  icon: sanitizeIcon(GENERIC_POLKADOT_ICON),
213
135
  id: `injected:polkadot:${toKebab(extensionName)}`,
214
136
  name: displayName,
215
- sendTx: noRpcSendTx,
216
- sendTxToChain: noRpcSendTxToChain,
217
- async signMessage(msg, account) {
218
- const ext = requireInjected();
219
- if (ext.signer.signRaw === void 0) throw new Error(`Wallet ${displayName} does not expose signRaw`);
220
- const address = account?.walletAddress ?? await firstAddress();
221
- if (address === null || address === "") throw new Error("No connected account");
222
- const wrapped = wrapBytes(msg);
223
- const result = await ext.signer.signRaw({
224
- address,
225
- data: bytesToHex(wrapped),
226
- type: "bytes"
227
- });
228
- return {
229
- signature: hexToBytes(result.signature),
230
- signedMessage: wrapped
231
- };
232
- },
233
- subscribe(listener) {
234
- listenersSet.add(listener);
235
- return () => {
236
- listenersSet.delete(listener);
237
- };
137
+ get signMessage() {
138
+ return session?.injected.signer.signRaw === void 0 ? void 0 : signMessage;
238
139
  },
239
- async switchChain(target) {
240
- if (target.namespace !== "polkadot") throw new Error(`Polkadot adapter received non-Polkadot chain "${target.id}". Pass a chain with namespace "polkadot".`);
241
- chain = POLKADOT_CHAIN_BY_ID.get(target.id) ?? target;
242
- if (session === null) return;
243
- emitAccounts(await session.injected.accounts.get());
140
+ get subscribe() {
141
+ return (session?.unsubscribe ?? null) === null ? void 0 : subscribe;
244
142
  }
245
143
  };
246
144
  };
@@ -292,55 +190,39 @@ const discoverInjectedPolkadotAdapters = (onAdapter, options = {}) => {
292
190
 
293
191
  //#endregion
294
192
  //#region src/wallet-standard-adapter.ts
295
- const POLKADOT_PREFIX = "polkadot:";
296
- const isPolkadotSignMessageFeature = (feature) => "signMessage" in feature && typeof feature.signMessage === "function";
297
- const slugify$1 = (name) => slugify("polkadot", name);
298
193
  const buildPolkadotWalletStandardAdapter = (wallet, registerDisconnector) => {
299
194
  const core = createWalletStandardCore({
300
- chainPrefix: POLKADOT_PREFIX,
301
- id: slugify$1(wallet.name),
195
+ chains: POLKADOT_CHAINS_LIST,
196
+ id: slugify("polkadot", wallet.name),
302
197
  label: "Polkadot",
303
198
  namespace: "polkadot",
304
- platform: "Polkadot",
305
- preferredChainIds: POLKADOT_MAINNET_IDS,
199
+ preferredChainIds: [POLKADOT_CHAINS.polkadot.id, POLKADOT_CHAINS.kusama.id],
306
200
  registerDisconnector,
307
201
  trackChainChanges: false,
308
202
  wallet
309
203
  });
310
204
  if (core === null) return null;
311
- const signMessage = getFeature(wallet, "polkadot:signMessage", isPolkadotSignMessageFeature);
205
+ const signer = getFeature(wallet, "polkadot:signMessage", "signMessage");
312
206
  return {
313
- ...core,
314
- capabilities: resolveWalletStandardPolkadotCapabilities({
315
- chainCount: core.chainCount,
316
- features: {
317
- events: core.hasEvents,
318
- signMessage: Boolean(signMessage)
319
- }
320
- }),
207
+ ...core.base,
321
208
  chainPlatform: "polkadot",
322
- getBalance: noRpcBalance,
323
- getTransactionReceipt: noRpcTransactionReceipt,
324
- sendTx: noRpcSendTx,
325
- sendTxToChain: noRpcSendTxToChain,
326
- async signMessage(msg, account) {
327
- if (signMessage === void 0) throw new Error(`Wallet ${wallet.name} does not advertise polkadot:signMessage`);
328
- const output = await signMessage.signMessage({
329
- account: core.resolveAccount(account),
330
- message: msg
209
+ ...signer !== void 0 && { signMessage: async (message, options) => {
210
+ const output = await signer.signMessage({
211
+ account: core.resolveAccount(options?.account),
212
+ message
331
213
  });
332
214
  return {
333
215
  signature: output.signature,
334
- signedMessage: output.signedMessage ?? msg
216
+ signedMessage: output.signedMessage ?? message
335
217
  };
336
- }
218
+ } }
337
219
  };
338
220
  };
339
221
  /**
340
222
  * The fallback channel; see `polkadotDiscoverer`. Requires the optional
341
223
  * `@wallet-standard/app` peer dep and no-ops without it.
342
224
  */
343
- const discoverPolkadotWalletStandardAdapters = (onAdapter) => discoverWalletStandard(onAdapter, (wallet, registerDisconnector) => buildPolkadotWalletStandardAdapter(wallet, registerDisconnector));
225
+ const discoverPolkadotWalletStandardAdapters = (onAdapter) => discoverWalletStandard(onAdapter, buildPolkadotWalletStandardAdapter);
344
226
 
345
227
  //#endregion
346
228
  //#region src/discoverer.ts
@@ -358,5 +240,5 @@ const polkadotDiscoverer = {
358
240
  };
359
241
 
360
242
  //#endregion
361
- export { POLKADOT_CHAINS, POLKADOT_CHAINS_LIST, buildInjectedPolkadotAdapter, buildPolkadotWalletStandardAdapter, discoverInjectedPolkadotAdapters, discoverPolkadotWalletStandardAdapters, isPolkadotSignerHandle, polkadotDiscoverer, resolveInjectedPolkadotCapabilities, resolveWalletStandardPolkadotCapabilities };
243
+ export { buildInjectedPolkadotAdapter, buildPolkadotWalletStandardAdapter, discoverInjectedPolkadotAdapters, discoverPolkadotWalletStandardAdapters, polkadotDiscoverer };
362
244
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["slugify","kitSlugify"],"sources":["../src/chains.ts","../src/capabilities.ts","../src/no-rpc.ts","../src/injected/icon.ts","../src/injected/injected-web3.ts","../src/injected/adapter.ts","../src/injected/index.ts","../src/wallet-standard-adapter.ts","../src/discoverer.ts"],"sourcesContent":["import type { ChainBase } from \"@usebutr/core\";\n\nconst POLKADOT_CHAINS = {\n kusama: {\n id: \"polkadot:b0a8d493285c2df73290dfb7e61f870f\",\n name: \"Kusama\",\n namespace: \"polkadot\",\n reference: \"b0a8d493285c2df73290dfb7e61f870f\",\n },\n paseo: {\n id: \"polkadot:77afd6190f1554ad45fd0d31aee62aac\",\n name: \"Paseo\",\n namespace: \"polkadot\",\n reference: \"77afd6190f1554ad45fd0d31aee62aac\",\n },\n polkadot: {\n id: \"polkadot:91b171bb158e2d3848fa23a9f1c25182\",\n name: \"Polkadot\",\n namespace: \"polkadot\",\n reference: \"91b171bb158e2d3848fa23a9f1c25182\",\n },\n westend: {\n id: \"polkadot:e143f23803ac50e8f6f8e62695d1ce9e\",\n name: \"Westend\",\n namespace: \"polkadot\",\n reference: \"e143f23803ac50e8f6f8e62695d1ce9e\",\n },\n} as const satisfies Record<string, ChainBase>;\n\nconst POLKADOT_CHAINS_LIST: ReadonlyArray<ChainBase> = Object.values(POLKADOT_CHAINS);\n\nconst POLKADOT_CHAIN_BY_ID: ReadonlyMap<string, ChainBase> = new Map(\n POLKADOT_CHAINS_LIST.map((chain) => [chain.id, chain]),\n);\n\n/** Chains a wallet advertising several networks should resolve to first.\n * Kusama sits alongside Polkadot because it carries real value; Westend\n * and Paseo are faucet testnets and must never win the default. */\nconst POLKADOT_MAINNET_IDS: ReadonlyArray<string> = [\n POLKADOT_CHAINS.polkadot.id,\n POLKADOT_CHAINS.kusama.id,\n];\n\nexport { POLKADOT_CHAIN_BY_ID, POLKADOT_CHAINS, POLKADOT_CHAINS_LIST, POLKADOT_MAINNET_IDS };\n","import type { WalletCapabilities } from \"@usebutr/core\";\nimport { buildWalletCapabilities } from \"@usebutr/wallet-standard-shared\";\n\nimport { POLKADOT_CHAINS_LIST } from \"./chains\";\n\ntype WalletStandardPolkadotCapabilityInput = {\n chainCount: number;\n features: {\n events: boolean;\n signMessage: boolean;\n };\n};\n\n/**\n * injectedWeb3 always exposes `signer.signRaw` and `accounts.subscribe`, so\n * those flags are unconditional. The chain count comes from butr's own\n * registry because injectedWeb3 wallets advertise no chains.\n */\nconst resolveInjectedPolkadotCapabilities = (): WalletCapabilities =>\n buildWalletCapabilities({\n chainCount: POLKADOT_CHAINS_LIST.length,\n events: true,\n sendTransaction: false,\n signIn: false,\n signMessage: true,\n signTransaction: false,\n });\n\n/**\n * Wallet Standard `polkadot:*` feature → butr capability mapping. No\n * standalone `signTransaction`: building an extrinsic needs chain metadata\n * butr doesn't fetch, so transaction signing goes through `getSigner()`.\n */\nconst resolveWalletStandardPolkadotCapabilities = (\n input: WalletStandardPolkadotCapabilityInput,\n): WalletCapabilities =>\n buildWalletCapabilities({\n chainCount: input.chainCount,\n events: input.features.events,\n sendTransaction: false,\n signIn: false,\n signMessage: input.features.signMessage,\n signTransaction: false,\n });\n\nexport type { WalletStandardPolkadotCapabilityInput };\nexport { resolveInjectedPolkadotCapabilities, resolveWalletStandardPolkadotCapabilities };\n","import type { Balance } from \"@usebutr/core\";\n\n/**\n * Building an extrinsic or reading on-chain state both need chain metadata\n * butr doesn't fetch, so it ships no Polkadot RPC. The neutral balance and\n * receipt values are gated behind the matching `capabilities` flags.\n */\nconst POLKADOT_SEND_TX_HINT =\n \"Polkadot sendTx is unsupported: use getSigner() with polkadot-api to build and submit extrinsics\";\nconst POLKADOT_SEND_TX_TO_CHAIN_HINT =\n \"Polkadot sendTxToChain is unsupported: use getSigner() with polkadot-api to build and submit extrinsics\";\n\nconst noRpcBalance = (): Promise<Balance> =>\n Promise.resolve({ decimals: 0, formatted: \"0\", symbol: \"\", value: 0n });\n\nconst noRpcTransactionReceipt = (): Promise<{ status: \"Success\" | \"Error\" | \"Pending\" }> =>\n Promise.resolve({ status: \"Pending\" });\n\nconst noRpcSendTx = (): Promise<string> => Promise.reject(new Error(POLKADOT_SEND_TX_HINT));\n\nconst noRpcSendTxToChain = (): Promise<string> =>\n Promise.reject(new Error(POLKADOT_SEND_TX_TO_CHAIN_HINT));\n\nexport { noRpcBalance, noRpcSendTx, noRpcSendTxToChain, noRpcTransactionReceipt };\n","const GENERIC_POLKADOT_ICON =\n \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiNFNjAwN0EiLz48L3N2Zz4=\";\n\nexport { GENERIC_POLKADOT_ICON };\n","/**\n * Local narrowing of the `@polkadot/extension-dapp` injectedWeb3 standard\n * to the fields butr reads, so the connector takes no dependency on\n * `@polkadot/extension-inject`.\n */\n\n/** A single account the extension exposes. Addresses are SS58; accounts\n * are chain-agnostic across Substrate. */\ntype InjectedAccount = {\n address: string;\n genesisHash?: string | null;\n name?: string;\n type?: string;\n};\n\n/** The polkadot-js `Signer`: butr only uses `signRaw` for message\n * signing. `signPayload` is consumer territory (via polkadot-api). */\ntype InjectedSigner = {\n signRaw?: (raw: {\n address: string;\n data: string;\n type: \"bytes\" | \"payload\";\n }) => Promise<{ id: number; signature: string }>;\n};\n\n/** The object returned by `enable()`. */\ntype Injected = {\n accounts: {\n get: () => Promise<ReadonlyArray<InjectedAccount>>;\n subscribe?: (cb: (accounts: ReadonlyArray<InjectedAccount>) => void) => () => void;\n };\n signer: InjectedSigner;\n};\n\n/** What lives at `window.injectedWeb3[key]`. */\ntype InjectedWindowProvider = {\n enable: (origin: string) => Promise<Injected>;\n version?: string;\n};\n\ntype InjectedWindow = {\n injectedWeb3?: Record<string, InjectedWindowProvider>;\n};\n\ndeclare global {\n // oxlint-disable-next-line typescript/consistent-type-definitions -- DOM globals require interface merging.\n interface Window {\n injectedWeb3?: Record<string, InjectedWindowProvider>;\n }\n}\n\nconst BYTES_PREFIX = new TextEncoder().encode(\"<Bytes>\");\nconst BYTES_SUFFIX = new TextEncoder().encode(\"</Bytes>\");\n\nconst wrapBytes = (message: Uint8Array): Uint8Array => {\n const out = new Uint8Array(BYTES_PREFIX.length + message.length + BYTES_SUFFIX.length);\n out.set(BYTES_PREFIX, 0);\n out.set(message, BYTES_PREFIX.length);\n out.set(BYTES_SUFFIX, BYTES_PREFIX.length + message.length);\n return out;\n};\n\nconst readInjectedWindow = (target?: InjectedWindow | null): InjectedWindow | null => {\n if (target !== undefined) {\n return target;\n }\n if (typeof window === \"undefined\") {\n return null;\n }\n return window;\n};\n\nexport type { Injected, InjectedAccount, InjectedSigner, InjectedWindow, InjectedWindowProvider };\nexport { bytesToHexPrefixed as bytesToHex, hexToBytes } from \"@usebutr/core\";\nexport { readInjectedWindow, wrapBytes };\n","import type {\n Account,\n ChainBase,\n ConnectorEvent,\n PolkadotAdapter,\n WalletCapabilities,\n WalletSigner,\n} from \"@usebutr/core\";\nimport { logWarn, sanitizeIcon } from \"@usebutr/core\";\n\nimport { resolveInjectedPolkadotCapabilities } from \"../capabilities\";\nimport { POLKADOT_CHAIN_BY_ID, POLKADOT_CHAINS } from \"../chains\";\nimport { noRpcBalance, noRpcSendTx, noRpcSendTxToChain, noRpcTransactionReceipt } from \"../no-rpc\";\n\nimport { GENERIC_POLKADOT_ICON } from \"./icon\";\nimport type { Injected, InjectedAccount, InjectedWindowProvider } from \"./injected-web3\";\nimport { bytesToHex, hexToBytes, wrapBytes } from \"./injected-web3\";\n\nconst DAPP_NAME = \"butr\";\n\n/** Handle returned by `getSigner()`. Carries the `window.injectedWeb3`\n * key (`extensionName`) so consumers can bridge to polkadot-api's\n * `connectInjectedExtension`, the active SS58 address, and the raw\n * `Injected` object for direct `signer` access. */\ntype PolkadotSignerHandle = {\n address: string;\n extension: Injected;\n extensionName: string;\n};\n\nconst isPolkadotSignerHandle = (value: WalletSigner): value is PolkadotSignerHandle =>\n \"address\" in value &&\n typeof value.address === \"string\" &&\n \"extension\" in value &&\n typeof value.extension === \"object\" &&\n value.extension !== null &&\n \"extensionName\" in value &&\n typeof value.extensionName === \"string\";\n\n/**\n * Deliberately not wallet-standard-shared's `slugify`: that helper embeds\n * the `wallet-standard:` scheme, while injected adapter ids follow the\n * `injected:polkadot:<slug>` convention.\n */\nconst toKebab = (name: string): string =>\n name\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/gv, \"-\")\n .replaceAll(/^-|-$/gv, \"\");\n\nconst buildPolkadotAccount = (address: string, chain: ChainBase): Account => ({\n chain,\n id: `${chain.id}:${address}`,\n walletAddress: address,\n});\n\n/** Everything that only exists between `connect()` and `disconnect()`: the\n * enabled provider and the wallet-side account subscription opened against\n * it. One value so the adapter can never be half-connected. */\ntype InjectedSession = {\n injected: Injected;\n unsubscribe: (() => void) | null;\n};\n\n/**\n * The provider is not enabled at construction: `enable()` raises the\n * extension's authorization prompt, so it runs lazily in `connect()`.\n */\nconst buildInjectedPolkadotAdapter = (\n extensionName: string,\n displayName: string,\n provider: InjectedWindowProvider,\n): PolkadotAdapter => {\n const capabilities: WalletCapabilities = resolveInjectedPolkadotCapabilities();\n let session: InjectedSession | null = null;\n let chain: ChainBase = POLKADOT_CHAINS.polkadot;\n const listenersSet = new Set<(event: ConnectorEvent) => void>();\n\n const emit = (event: ConnectorEvent): void => {\n const snapshot = [...listenersSet];\n for (const listener of snapshot) {\n listener(event);\n }\n };\n\n const emitAccounts = (accounts: ReadonlyArray<InjectedAccount>): void => {\n const built = accounts.map((a) => buildPolkadotAccount(a.address, chain));\n const first = built[0];\n if (first !== undefined) {\n emit({ account: first, accounts: built, type: \"accountChanged\" });\n }\n };\n\n const closeSession = (): void => {\n session?.unsubscribe?.();\n session = null;\n };\n\n const handleWalletAccounts = (accounts: ReadonlyArray<InjectedAccount>): void => {\n if (accounts.length === 0) {\n closeSession();\n emit({ type: \"disconnected\" });\n return;\n }\n emitAccounts(accounts);\n };\n\n const openSession = (injected: Injected): void => {\n closeSession();\n const opened: InjectedSession = { injected, unsubscribe: null };\n session = opened;\n try {\n const unsubscribe = injected.accounts.subscribe?.(handleWalletAccounts);\n if (unsubscribe === undefined) {\n return;\n }\n // Wallets may fire the callback synchronously; an empty first payload\n // closes the session before this assignment, so never revive it.\n if (session === opened) {\n opened.unsubscribe = unsubscribe;\n } else {\n unsubscribe();\n }\n } catch (error) {\n logWarn(`[butr/polkadot] ${displayName} accounts.subscribe threw:`, error);\n }\n };\n\n const requireInjected = (): Injected => {\n if (session === null) {\n throw new Error(`Wallet ${displayName} is not connected`);\n }\n return session.injected;\n };\n\n const firstAddress = async (): Promise<string | null> => {\n if (session === null) {\n return null;\n }\n const accounts = await session.injected.accounts.get();\n return accounts[0]?.address ?? null;\n };\n\n return {\n capabilities,\n chainPlatform: \"polkadot\",\n\n async connect() {\n const injected = await provider.enable(DAPP_NAME);\n const accounts = await injected.accounts.get();\n if (accounts.length === 0) {\n throw new Error(`Wallet ${displayName} exposed no accounts`);\n }\n openSession(injected);\n },\n\n disconnect: () => {\n closeSession();\n return Promise.resolve();\n },\n\n async getAccount() {\n const address = await firstAddress();\n return address === null ? null : buildPolkadotAccount(address, chain);\n },\n\n async getAccounts() {\n if (session === null) {\n return [];\n }\n const accounts = await session.injected.accounts.get();\n return accounts.map((a) => buildPolkadotAccount(a.address, chain));\n },\n\n getBalance: noRpcBalance,\n\n async getSigner() {\n const ext = requireInjected();\n const address = await firstAddress();\n if (address === null) {\n throw new Error(\"No connected account\");\n }\n const handle: PolkadotSignerHandle = { address, extension: ext, extensionName };\n return handle;\n },\n\n getTransactionReceipt: noRpcTransactionReceipt,\n\n icon: sanitizeIcon(GENERIC_POLKADOT_ICON),\n id: `injected:polkadot:${toKebab(extensionName)}`,\n name: displayName,\n\n sendTx: noRpcSendTx,\n\n sendTxToChain: noRpcSendTxToChain,\n\n async signMessage(msg, account) {\n const ext = requireInjected();\n if (ext.signer.signRaw === undefined) {\n throw new Error(`Wallet ${displayName} does not expose signRaw`);\n }\n const address = account?.walletAddress ?? (await firstAddress());\n if (address === null || address === \"\") {\n throw new Error(\"No connected account\");\n }\n const wrapped = wrapBytes(msg);\n const result = await ext.signer.signRaw({\n address,\n data: bytesToHex(wrapped),\n type: \"bytes\",\n });\n return { signature: hexToBytes(result.signature), signedMessage: wrapped };\n },\n\n subscribe(listener) {\n listenersSet.add(listener);\n return () => {\n listenersSet.delete(listener);\n };\n },\n\n async switchChain(target) {\n if (target.namespace !== \"polkadot\") {\n throw new Error(\n `Polkadot adapter received non-Polkadot chain \"${target.id}\". Pass a chain with namespace \"polkadot\".`,\n );\n }\n chain = POLKADOT_CHAIN_BY_ID.get(target.id) ?? target;\n if (session === null) {\n return;\n }\n emitAccounts(await session.injected.accounts.get());\n },\n };\n};\n\nexport type { PolkadotSignerHandle };\nexport { buildInjectedPolkadotAdapter, isPolkadotSignerHandle };\n","import type { WalletAdapter } from \"@usebutr/core\";\n\nimport { buildInjectedPolkadotAdapter } from \"./adapter\";\nimport type { InjectedWindow } from \"./injected-web3\";\nimport { readInjectedWindow } from \"./injected-web3\";\n\nconst knownDisplayNameFor = (key: string): string | undefined => {\n switch (key) {\n case \"enkrypt\": {\n return \"Enkrypt\";\n }\n case \"nova-wallet\": {\n return \"Nova Wallet\";\n }\n case \"polkadot-js\": {\n return \"Polkadot{.js}\";\n }\n case \"subwallet-js\": {\n return \"SubWallet\";\n }\n case \"talisman\": {\n return \"Talisman\";\n }\n default: {\n return undefined;\n }\n }\n};\n\nconst displayNameFor = (key: string): string =>\n knownDisplayNameFor(key) ??\n key\n .split(/[\\-_]/v)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n\ntype InjectedPolkadotDiscoveryOptions = {\n /** Poll schedule (ms offsets) for late-injecting extensions. Defaults\n * to a few short polls; pass `[]` in tests for a single sync read. */\n pollMs?: ReadonlyArray<number>;\n /** Override the global host (tests, iframes). */\n target?: InjectedWindow | null;\n};\n\nconst DEFAULT_POLLS: ReadonlyArray<number> = [250, 750];\n\n/**\n * Adapters are built without calling `enable()`, which would raise the\n * extension's authorization prompt at discovery time. Extensions inject at\n * different points during page load, hence the poll schedule.\n */\nconst discoverInjectedPolkadotAdapters = (\n onAdapter: (adapter: WalletAdapter) => void,\n options: InjectedPolkadotDiscoveryOptions = {},\n): (() => void) => {\n const polls = options.pollMs ?? DEFAULT_POLLS;\n const seen = new Set<string>();\n const timers: Array<ReturnType<typeof setTimeout>> = [];\n let cancelled = false;\n\n const scan = () => {\n if (cancelled) {\n return;\n }\n const host = readInjectedWindow(options.target);\n const registry = host?.injectedWeb3;\n if (!registry) {\n return;\n }\n for (const [key, provider] of Object.entries(registry)) {\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n onAdapter(buildInjectedPolkadotAdapter(key, displayNameFor(key), provider));\n }\n };\n\n scan();\n for (const offset of polls) {\n if (offset === 0) {\n continue;\n }\n timers.push(setTimeout(scan, offset));\n }\n\n return () => {\n cancelled = true;\n for (const timer of timers) {\n clearTimeout(timer);\n }\n };\n};\n\nexport type { InjectedPolkadotDiscoveryOptions };\nexport { discoverInjectedPolkadotAdapters };\n","import type { WalletAdapter } from \"@usebutr/core\";\nimport {\n createWalletStandardCore,\n discoverWalletStandard,\n getFeature,\n slugify as kitSlugify,\n} from \"@usebutr/wallet-standard-shared\";\nimport type { WalletStandardFeature, WalletStandardWallet } from \"@usebutr/wallet-standard-shared\";\n\nimport { resolveWalletStandardPolkadotCapabilities } from \"./capabilities\";\nimport { POLKADOT_MAINNET_IDS } from \"./chains\";\nimport { noRpcBalance, noRpcSendTx, noRpcSendTxToChain, noRpcTransactionReceipt } from \"./no-rpc\";\nimport type { PolkadotSignMessageFeature } from \"./wallet-standard-types\";\n\nconst POLKADOT_PREFIX = \"polkadot:\";\n\nconst isPolkadotSignMessageFeature = (\n feature: WalletStandardFeature,\n): feature is WalletStandardFeature & PolkadotSignMessageFeature =>\n \"signMessage\" in feature && typeof feature.signMessage === \"function\";\n\nconst slugify = (name: string): string => kitSlugify(\"polkadot\", name);\n\nconst buildPolkadotWalletStandardAdapter = (\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`. */\n registerDisconnector?: (emit: () => void) => void,\n): WalletAdapter | null => {\n const core = createWalletStandardCore({\n chainPrefix: POLKADOT_PREFIX,\n id: slugify(wallet.name),\n label: \"Polkadot\",\n namespace: \"polkadot\",\n platform: \"Polkadot\",\n preferredChainIds: POLKADOT_MAINNET_IDS,\n registerDisconnector,\n trackChainChanges: false,\n wallet,\n });\n if (core === null) {\n return null;\n }\n\n const signMessage = getFeature(wallet, \"polkadot:signMessage\", isPolkadotSignMessageFeature);\n\n return {\n ...core,\n capabilities: resolveWalletStandardPolkadotCapabilities({\n chainCount: core.chainCount,\n features: { events: core.hasEvents, signMessage: Boolean(signMessage) },\n }),\n chainPlatform: \"polkadot\",\n\n getBalance: noRpcBalance,\n\n getTransactionReceipt: noRpcTransactionReceipt,\n\n sendTx: noRpcSendTx,\n\n sendTxToChain: noRpcSendTxToChain,\n\n async signMessage(msg, account) {\n if (signMessage === undefined) {\n throw new Error(`Wallet ${wallet.name} does not advertise polkadot:signMessage`);\n }\n const output = await signMessage.signMessage({\n account: core.resolveAccount(account),\n message: msg,\n });\n return { signature: output.signature, signedMessage: output.signedMessage ?? msg };\n },\n };\n};\n\n/**\n * The fallback channel; see `polkadotDiscoverer`. Requires the optional\n * `@wallet-standard/app` peer dep and no-ops without it.\n */\nconst discoverPolkadotWalletStandardAdapters = (\n onAdapter: (adapter: WalletAdapter) => void,\n): (() => void) =>\n discoverWalletStandard(onAdapter, (wallet, registerDisconnector) =>\n buildPolkadotWalletStandardAdapter(wallet, registerDisconnector),\n );\n\nexport { buildPolkadotWalletStandardAdapter, discoverPolkadotWalletStandardAdapters };\n","import type { PlatformDiscoverer } from \"@usebutr/core\";\n\nimport { discoverInjectedPolkadotAdapters } from \"./injected\";\nimport { discoverPolkadotWalletStandardAdapters } from \"./wallet-standard-adapter\";\n\n/**\n * Primary is injectedWeb3; Wallet Standard `polkadot:*` is the fallback. Its\n * defer is the only thing preventing double-listing: a wallet on both\n * channels mints two unrelated ids the discovery bus cannot collapse.\n */\nconst polkadotDiscoverer: PlatformDiscoverer = {\n fallback: {\n subscribe: (onAdapter, opts) => {\n if (opts.hasAnyPrimaryAdapter()) {\n return () => undefined;\n }\n return discoverPolkadotWalletStandardAdapters(onAdapter);\n },\n },\n subscribe: discoverInjectedPolkadotAdapters,\n};\n\nexport { polkadotDiscoverer };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/injected/icon.ts","../src/injected/injected-web3.ts","../src/injected/adapter.ts","../src/injected/index.ts","../src/wallet-standard-adapter.ts","../src/discoverer.ts"],"sourcesContent":["const GENERIC_POLKADOT_ICON =\n \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiNFNjAwN0EiLz48L3N2Zz4=\";\n\nexport { GENERIC_POLKADOT_ICON };\n","/**\n * Local narrowing of the `@polkadot/extension-dapp` injectedWeb3 standard\n * to the fields butr reads, so the connector takes no dependency on\n * `@polkadot/extension-inject`.\n */\n\n/** A single account the extension exposes. Addresses are SS58; accounts\n * are chain-agnostic across Substrate. */\ntype InjectedAccount = {\n address: string;\n genesisHash?: string | null;\n name?: string;\n type?: string;\n};\n\n/** The polkadot-js `Signer`: butr only uses `signRaw` for message\n * signing. `signPayload` is consumer territory (via polkadot-api). */\ntype InjectedSigner = {\n signRaw?: (raw: {\n address: string;\n data: string;\n type: \"bytes\" | \"payload\";\n }) => Promise<{ id: number; signature: string }>;\n};\n\n/** The object returned by `enable()`. */\ntype Injected = {\n accounts: {\n get: () => Promise<ReadonlyArray<InjectedAccount>>;\n subscribe?: (cb: (accounts: ReadonlyArray<InjectedAccount>) => void) => () => void;\n };\n signer: InjectedSigner;\n};\n\n/** What lives at `window.injectedWeb3[key]`. */\ntype InjectedWindowProvider = {\n enable: (origin: string) => Promise<Injected>;\n version?: string;\n};\n\ntype InjectedWindow = {\n injectedWeb3?: Record<string, InjectedWindowProvider>;\n};\n\ndeclare global {\n // oxlint-disable-next-line typescript/consistent-type-definitions -- DOM globals require interface merging.\n interface Window {\n injectedWeb3?: Record<string, InjectedWindowProvider>;\n }\n}\n\nconst BYTES_PREFIX = new TextEncoder().encode(\"<Bytes>\");\nconst BYTES_SUFFIX = new TextEncoder().encode(\"</Bytes>\");\n\nconst wrapBytes = (message: Uint8Array): Uint8Array => {\n const out = new Uint8Array(BYTES_PREFIX.length + message.length + BYTES_SUFFIX.length);\n out.set(BYTES_PREFIX, 0);\n out.set(message, BYTES_PREFIX.length);\n out.set(BYTES_SUFFIX, BYTES_PREFIX.length + message.length);\n return out;\n};\n\nconst readInjectedWindow = (target?: InjectedWindow | null): InjectedWindow | null => {\n if (target !== undefined) {\n return target;\n }\n if (typeof window === \"undefined\") {\n return null;\n }\n return window;\n};\n\nexport type { Injected, InjectedAccount, InjectedSigner, InjectedWindow, InjectedWindowProvider };\nexport { bytesToHexPrefixed as bytesToHex, hexToBytes } from \"@usebutr/core\";\nexport { readInjectedWindow, wrapBytes };\n","import type {\n Account,\n AccountOptions,\n ChainBase,\n ConnectorEvent,\n PolkadotAdapter,\n SignedMessage,\n} from \"@usebutr/core\";\nimport {\n buildAccount,\n logWarn,\n POLKADOT_CHAINS,\n POLKADOT_CHAINS_LIST,\n resolveChain,\n sanitizeIcon,\n} from \"@usebutr/core\";\n\nimport { GENERIC_POLKADOT_ICON } from \"./icon\";\nimport type { Injected, InjectedAccount, InjectedWindowProvider } from \"./injected-web3\";\nimport { bytesToHex, hexToBytes, wrapBytes } from \"./injected-web3\";\n\nconst DAPP_NAME = \"butr\";\n\n/**\n * Deliberately not wallet-standard-shared's `slugify`: that helper embeds\n * the `wallet-standard:` scheme, while injected adapter ids follow the\n * `injected:polkadot:<slug>` convention.\n */\nconst toKebab = (name: string): string =>\n name\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/gv, \"-\")\n .replaceAll(/^-|-$/gv, \"\");\n\n/**\n * An account works on any Substrate chain unless the extension pins it to\n * one through `genesisHash`, whose first 16 bytes are the CAIP-2 reference.\n * Unpinned accounts are labelled Polkadot, butr's default network.\n */\nconst chainOf = ({ genesisHash }: InjectedAccount): ChainBase =>\n genesisHash === undefined || genesisHash === null || genesisHash === \"\"\n ? POLKADOT_CHAINS.polkadot\n : resolveChain(\n `polkadot:${genesisHash.replace(/^0x/v, \"\").slice(0, 32)}`,\n POLKADOT_CHAINS_LIST,\n );\n\nconst toAccount = (account: InjectedAccount): Account =>\n buildAccount(account.address, chainOf(account));\n\n/** Everything that only exists between `connect()` and `disconnect()`: the\n * enabled provider and the wallet-side account subscription opened against\n * it. One value so the adapter can never be half-connected. */\ntype InjectedSession = {\n injected: Injected;\n unsubscribe: (() => void) | null;\n};\n\n/**\n * `enable()` prompts, so it waits for `connect()`. No `switchChain`: the\n * extension has no network to switch and nothing here takes a chain; an\n * extrinsic carries its genesis hash in the payload polkadot-api builds.\n */\nconst buildInjectedPolkadotAdapter = (\n extensionName: string,\n displayName: string,\n provider: InjectedWindowProvider,\n): PolkadotAdapter => {\n let session: InjectedSession | null = null;\n const listeners = new Set<(event: ConnectorEvent) => void>();\n\n const emit = (event: ConnectorEvent): void => {\n for (const listener of listeners) {\n listener(event);\n }\n };\n\n const closeSession = (): void => {\n session?.unsubscribe?.();\n session = null;\n };\n\n const handleWalletAccounts = (accounts: ReadonlyArray<InjectedAccount>): void => {\n if (accounts.length === 0) {\n closeSession();\n emit({ type: \"disconnected\" });\n return;\n }\n emit({ accounts: accounts.map(toAccount), type: \"accountsChanged\" });\n };\n\n const openSession = (injected: Injected): void => {\n closeSession();\n const opened: InjectedSession = { injected, unsubscribe: null };\n session = opened;\n try {\n const unsubscribe = injected.accounts.subscribe?.(handleWalletAccounts);\n if (unsubscribe === undefined) {\n return;\n }\n // Wallets may fire the callback synchronously; an empty first payload\n // closes the session before this assignment, so never revive it.\n if (session === opened) {\n opened.unsubscribe = unsubscribe;\n } else {\n unsubscribe();\n }\n } catch (error) {\n logWarn(`[butr/polkadot] ${displayName} accounts.subscribe threw:`, error);\n }\n };\n\n const requireInjected = (): Injected => {\n if (session === null) {\n throw new Error(`Wallet ${displayName} is not connected`);\n }\n return session.injected;\n };\n\n const subscribe = (listener: (event: ConnectorEvent) => void) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n };\n\n const signMessage = async (\n message: Uint8Array,\n options?: AccountOptions,\n ): Promise<SignedMessage> => {\n const injected = requireInjected();\n if (injected.signer.signRaw === undefined) {\n throw new Error(`Wallet ${displayName} does not expose signRaw`);\n }\n const exposed = await injected.accounts.get();\n const requested = options?.account;\n const match =\n requested === undefined\n ? exposed[0]\n : exposed.find((a) => a.address === requested.walletAddress);\n if (match === undefined) {\n throw new Error(\n requested === undefined\n ? `Wallet ${displayName} has no connected account`\n : `Wallet ${displayName} does not expose account ${requested.walletAddress}`,\n );\n }\n const wrapped = wrapBytes(message);\n const result = await injected.signer.signRaw({\n address: match.address,\n data: bytesToHex(wrapped),\n type: \"bytes\",\n });\n return { signature: hexToBytes(result.signature), signedMessage: wrapped };\n };\n\n return {\n chainPlatform: \"polkadot\",\n\n // injectedWeb3 has no silent check, so `silent` still calls `enable()`.\n // It only prompts an origin the extension has not authorised, and a\n // session being restored already is.\n async connect() {\n const injected = await provider.enable(DAPP_NAME);\n const accounts = await injected.accounts.get();\n if (accounts.length === 0) {\n throw new Error(`Wallet ${displayName} exposed no accounts`);\n }\n openSession(injected);\n },\n\n async disconnect() {\n closeSession();\n await Promise.resolve();\n },\n\n async getAccounts() {\n if (session === null) {\n return [];\n }\n const accounts = await session.injected.accounts.get();\n return accounts.map(toAccount);\n },\n\n async getSigner() {\n const extension = requireInjected();\n await Promise.resolve();\n return { extension, extensionName, kind: \"polkadot-injected\" };\n },\n\n icon: sanitizeIcon(GENERIC_POLKADOT_ICON),\n id: `injected:polkadot:${toKebab(extensionName)}`,\n name: displayName,\n\n // `signRaw` and `accounts.subscribe` are optional in injectedWeb3 and\n // live on the object `enable()` returns, so both members appear once\n // `connect()` has shown the extension offers them.\n get signMessage() {\n return session?.injected.signer.signRaw === undefined ? undefined : signMessage;\n },\n\n get subscribe() {\n return (session?.unsubscribe ?? null) === null ? undefined : subscribe;\n },\n };\n};\n\nexport { buildInjectedPolkadotAdapter };\n","import type { WalletAdapter } from \"@usebutr/core\";\n\nimport { buildInjectedPolkadotAdapter } from \"./adapter\";\nimport type { InjectedWindow } from \"./injected-web3\";\nimport { readInjectedWindow } from \"./injected-web3\";\n\nconst knownDisplayNameFor = (key: string): string | undefined => {\n switch (key) {\n case \"enkrypt\": {\n return \"Enkrypt\";\n }\n case \"nova-wallet\": {\n return \"Nova Wallet\";\n }\n case \"polkadot-js\": {\n return \"Polkadot{.js}\";\n }\n case \"subwallet-js\": {\n return \"SubWallet\";\n }\n case \"talisman\": {\n return \"Talisman\";\n }\n default: {\n return undefined;\n }\n }\n};\n\nconst displayNameFor = (key: string): string =>\n knownDisplayNameFor(key) ??\n key\n .split(/[\\-_]/v)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n\ntype InjectedPolkadotDiscoveryOptions = {\n /** Poll schedule (ms offsets) for late-injecting extensions. Defaults\n * to a few short polls; pass `[]` in tests for a single sync read. */\n pollMs?: ReadonlyArray<number>;\n /** Override the global host (tests, iframes). */\n target?: InjectedWindow | null;\n};\n\nconst DEFAULT_POLLS: ReadonlyArray<number> = [250, 750];\n\n/**\n * Adapters are built without calling `enable()`, which would raise the\n * extension's authorization prompt at discovery time. Extensions inject at\n * different points during page load, hence the poll schedule.\n */\nconst discoverInjectedPolkadotAdapters = (\n onAdapter: (adapter: WalletAdapter) => void,\n options: InjectedPolkadotDiscoveryOptions = {},\n): (() => void) => {\n const polls = options.pollMs ?? DEFAULT_POLLS;\n const seen = new Set<string>();\n const timers: Array<ReturnType<typeof setTimeout>> = [];\n let cancelled = false;\n\n const scan = () => {\n if (cancelled) {\n return;\n }\n const host = readInjectedWindow(options.target);\n const registry = host?.injectedWeb3;\n if (!registry) {\n return;\n }\n for (const [key, provider] of Object.entries(registry)) {\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n onAdapter(buildInjectedPolkadotAdapter(key, displayNameFor(key), provider));\n }\n };\n\n scan();\n for (const offset of polls) {\n if (offset === 0) {\n continue;\n }\n timers.push(setTimeout(scan, offset));\n }\n\n return () => {\n cancelled = true;\n for (const timer of timers) {\n clearTimeout(timer);\n }\n };\n};\n\nexport type { InjectedPolkadotDiscoveryOptions };\nexport { discoverInjectedPolkadotAdapters };\n","import type { AccountOptions, PolkadotAdapter, WalletAdapter } from \"@usebutr/core\";\nimport { POLKADOT_CHAINS, POLKADOT_CHAINS_LIST } 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 type { PolkadotSignMessageFeature } from \"./wallet-standard-types\";\n\nconst buildPolkadotWalletStandardAdapter = (\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`. */\n registerDisconnector?: (emit: () => void) => void,\n): PolkadotAdapter | null => {\n const core = createWalletStandardCore({\n chains: POLKADOT_CHAINS_LIST,\n id: slugify(\"polkadot\", wallet.name),\n label: \"Polkadot\",\n namespace: \"polkadot\",\n // Kusama sits alongside Polkadot because it carries real value; Westend\n // and Paseo are faucet testnets and must never win the default.\n preferredChainIds: [POLKADOT_CHAINS.polkadot.id, POLKADOT_CHAINS.kusama.id],\n registerDisconnector,\n trackChainChanges: false,\n wallet,\n });\n if (core === null) {\n return null;\n }\n\n const signer = getFeature<PolkadotSignMessageFeature>(\n wallet,\n \"polkadot:signMessage\",\n \"signMessage\",\n );\n\n return {\n ...core.base,\n chainPlatform: \"polkadot\",\n ...(signer !== undefined && {\n signMessage: async (message: Uint8Array, options?: AccountOptions) => {\n const output = await signer.signMessage({\n account: core.resolveAccount(options?.account),\n message,\n });\n return { signature: output.signature, signedMessage: output.signedMessage ?? message };\n },\n }),\n };\n};\n\n/**\n * The fallback channel; see `polkadotDiscoverer`. Requires the optional\n * `@wallet-standard/app` peer dep and no-ops without it.\n */\nconst discoverPolkadotWalletStandardAdapters = (\n onAdapter: (adapter: WalletAdapter) => void,\n): (() => void) => discoverWalletStandard(onAdapter, buildPolkadotWalletStandardAdapter);\n\nexport { buildPolkadotWalletStandardAdapter, discoverPolkadotWalletStandardAdapters };\n","import type { PlatformDiscoverer } from \"@usebutr/core\";\n\nimport { discoverInjectedPolkadotAdapters } from \"./injected\";\nimport { discoverPolkadotWalletStandardAdapters } from \"./wallet-standard-adapter\";\n\n/**\n * Primary is injectedWeb3; Wallet Standard `polkadot:*` is the fallback. Its\n * defer is the only thing preventing double-listing: a wallet on both\n * channels mints two unrelated ids the discovery bus cannot collapse.\n */\nconst polkadotDiscoverer: PlatformDiscoverer = {\n fallback: {\n subscribe: (onAdapter, opts) => {\n if (opts.hasAnyPrimaryAdapter()) {\n return () => undefined;\n }\n return discoverPolkadotWalletStandardAdapters(onAdapter);\n },\n },\n subscribe: discoverInjectedPolkadotAdapters,\n};\n\nexport { polkadotDiscoverer };\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usebutr/polkadot",
3
- "version": "1.1.2",
3
+ "version": "2.0.1",
4
4
  "description": "injectedWeb3 + Wallet Standard adapter for butr (Polkadot/Substrate).",
5
5
  "keywords": [
6
6
  "butr",
@@ -41,13 +41,13 @@
41
41
  "access": "public"
42
42
  },
43
43
  "dependencies": {
44
- "@usebutr/core": "2.0.1",
45
- "@usebutr/wallet-standard-shared": "1.0.0"
44
+ "@usebutr/core": "3.0.1",
45
+ "@usebutr/wallet-standard-shared": "2.0.1"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@wallet-standard/app": "^1.1.1",
49
49
  "typescript": "^7.0.2",
50
- "vitest": "^4.1.10",
50
+ "vitest": "^5.0.1",
51
51
  "@repo/config-vitest": "0.0.0",
52
52
  "@repo/typescript-config": "0.0.0"
53
53
  },