bitcoin-wallet-connector 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -21
- package/lib/BitcoinConnectionProvider.d.ts +3 -3
- package/lib/BitcoinWalletConnector-BC92ulXx.js +2 -0
- package/lib/BitcoinWalletConnector-BC92ulXx.js.map +1 -0
- package/lib/{BitcoinWalletAdapterConnector-Bq835yj0.mjs → BitcoinWalletConnector-CS0BshOl.mjs} +11 -19
- package/lib/BitcoinWalletConnector-CS0BshOl.mjs.map +1 -0
- package/lib/{BitcoinWalletAdapterConnector.d.ts → BitcoinWalletConnector.d.ts} +4 -5
- package/lib/BitgetWalletAdapter.impl-D8kqiYDi.mjs +11 -0
- package/lib/BitgetWalletAdapter.impl-D8kqiYDi.mjs.map +1 -0
- package/lib/BitgetWalletAdapter.impl-DiyzNQ9d.js +2 -0
- package/lib/BitgetWalletAdapter.impl-DiyzNQ9d.js.map +1 -0
- package/lib/{LeatherWalletAdapter.impl-RUYx555r.mjs → LeatherWalletAdapter.impl-B1PoZS7z.mjs} +48 -37
- package/lib/LeatherWalletAdapter.impl-B1PoZS7z.mjs.map +1 -0
- package/lib/LeatherWalletAdapter.impl-BIWirus3.js +2 -0
- package/lib/LeatherWalletAdapter.impl-BIWirus3.js.map +1 -0
- package/lib/{MagicEdenWalletAdapter.impl-CrA6SGvG.mjs → MagicEdenWalletAdapter.impl-B3d5lbkD.mjs} +31 -20
- package/lib/MagicEdenWalletAdapter.impl-B3d5lbkD.mjs.map +1 -0
- package/lib/MagicEdenWalletAdapter.impl-DLBP3p4o.js +2 -0
- package/lib/MagicEdenWalletAdapter.impl-DLBP3p4o.js.map +1 -0
- package/lib/OkxWalletAdapter.impl-7cj96tmr.js +2 -0
- package/lib/OkxWalletAdapter.impl-7cj96tmr.js.map +1 -0
- package/lib/{OkxWalletAdapter.impl-BepoUL1B.mjs → OkxWalletAdapter.impl-nRgHsPTn.mjs} +13 -9
- package/lib/OkxWalletAdapter.impl-nRgHsPTn.mjs.map +1 -0
- package/lib/{UnisatCompatibleWalletAdapterImpl-M38FqkZI.mjs → UnisatCompatibleWalletAdapterImpl-8lRRF7Zj.mjs} +18 -10
- package/lib/UnisatCompatibleWalletAdapterImpl-8lRRF7Zj.mjs.map +1 -0
- package/lib/{UnisatCompatibleWalletAdapterImpl-Cq2Oqk1b.js → UnisatCompatibleWalletAdapterImpl-C-JWrc9s.js} +2 -2
- package/lib/UnisatCompatibleWalletAdapterImpl-C-JWrc9s.js.map +1 -0
- package/lib/UnisatWalletAdapter.impl-DXDfnHz_.js +2 -0
- package/lib/UnisatWalletAdapter.impl-DXDfnHz_.js.map +1 -0
- package/lib/UnisatWalletAdapter.impl-DvA33Ikj.mjs +19 -0
- package/lib/UnisatWalletAdapter.impl-DvA33Ikj.mjs.map +1 -0
- package/lib/WalletAdapters.types-CExaiK0o.js +2 -0
- package/lib/WalletAdapters.types-CExaiK0o.js.map +1 -0
- package/lib/WalletAdapters.types-DBvhI1hu.mjs +20 -0
- package/lib/WalletAdapters.types-DBvhI1hu.mjs.map +1 -0
- package/lib/WalletAdapters.types.d.ts +7 -12
- package/lib/{XverseCompatibleWalletAdapterImpl-Bf-BK5VK.js → XverseCompatibleWalletAdapterImpl-Dp_GUxQM.js} +2 -2
- package/lib/XverseCompatibleWalletAdapterImpl-Dp_GUxQM.js.map +1 -0
- package/lib/{XverseCompatibleWalletAdapterImpl-DXKnO_-V.mjs → XverseCompatibleWalletAdapterImpl-bgp9xDYH.mjs} +12 -8
- package/lib/XverseCompatibleWalletAdapterImpl-bgp9xDYH.mjs.map +1 -0
- package/lib/{XverseWalletAdapter.impl-CZO0RQva.mjs → XverseWalletAdapter.impl-BOpY4Vf8.mjs} +15 -15
- package/lib/XverseWalletAdapter.impl-BOpY4Vf8.mjs.map +1 -0
- package/lib/XverseWalletAdapter.impl-D0eOtEOa.js +2 -0
- package/lib/XverseWalletAdapter.impl-D0eOtEOa.js.map +1 -0
- package/lib/adapters/BitgetWalletAdapter.d.ts +6 -2
- package/lib/adapters/LeatherWalletAdapter.d.ts +4 -2
- package/lib/adapters/LeatherWalletAdapter.impl.d.ts +8 -1
- package/lib/adapters/MagicEdenWalletAdapter.d.ts +5 -2
- package/lib/adapters/MagicEdenWalletAdapter.impl.d.ts +1 -1
- package/lib/adapters/MockAddressWalletAdapter.d.ts +8 -32
- package/lib/adapters/OkxWalletAdapter.d.ts +3 -2
- package/lib/adapters/OkxWalletAdapter.impl.d.ts +5 -1
- package/lib/adapters/UnisatWalletAdapter.d.ts +3 -2
- package/lib/adapters/UnisatWalletAdapter.impl.d.ts +4 -0
- package/lib/adapters/XverseWalletAdapter.d.ts +3 -2
- package/lib/adapters/XverseWalletAdapter.impl.d.ts +1 -1
- package/lib/adapters/index.d.ts +6 -6
- package/lib/adapters.js +1 -1
- package/lib/adapters.mjs +8 -8
- package/lib/constants-B7qVf97f.mjs +5 -0
- package/lib/constants-B7qVf97f.mjs.map +1 -0
- package/lib/constants-Dr0_Mix2.js +2 -0
- package/lib/constants-Dr0_Mix2.js.map +1 -0
- package/lib/constants.d.ts +1 -0
- package/lib/{index-D7YwhNAG.mjs → index-DM4G-LJz.mjs} +639 -590
- package/lib/index-DM4G-LJz.mjs.map +1 -0
- package/lib/index-jRY8YhyK.js +2 -0
- package/lib/index-jRY8YhyK.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.mjs +13 -13
- package/lib/react.js +1 -1
- package/lib/react.js.map +1 -1
- package/lib/react.mjs +7 -7
- package/lib/react.mjs.map +1 -1
- package/lib/{transaction-CiLOYSE_.mjs → transaction-4ShhFCwN.mjs} +2 -2
- package/lib/{transaction-CiLOYSE_.mjs.map → transaction-4ShhFCwN.mjs.map} +1 -1
- package/lib/{transaction-CzdnbXSo.js → transaction-B6SlpRzN.js} +2 -2
- package/lib/{transaction-CzdnbXSo.js.map → transaction-B6SlpRzN.js.map} +1 -1
- package/lib/utils/UnisatCompatibleWalletAdapterImpl.d.ts +11 -3
- package/lib/utils/XverseCompatibleWalletAdapterImpl.d.ts +4 -0
- package/lib/utils/XverseCompatibleWalletAdapterImpl_legacy.d.ts +7 -2
- package/package.json +9 -10
- package/src/BitcoinConnectionProvider.stories.tsx +111 -43
- package/src/BitcoinConnectionProvider.tsx +5 -5
- package/src/{BitcoinWalletAdapterConnector.ts → BitcoinWalletConnector.ts} +18 -26
- package/src/WalletAdapters.types.ts +13 -22
- package/src/adapters/BitgetWalletAdapter.impl.ts +2 -1
- package/src/adapters/BitgetWalletAdapter.ts +9 -7
- package/src/adapters/LeatherWalletAdapter.impl.ts +23 -13
- package/src/adapters/LeatherWalletAdapter.ts +11 -8
- package/src/adapters/MagicEdenWalletAdapter.impl.ts +9 -8
- package/src/adapters/MagicEdenWalletAdapter.ts +17 -14
- package/src/adapters/MockAddressWalletAdapter.ts +61 -35
- package/src/adapters/OkxWalletAdapter.impl.ts +12 -7
- package/src/adapters/OkxWalletAdapter.ts +10 -7
- package/src/adapters/UnisatWalletAdapter.impl.ts +8 -2
- package/src/adapters/UnisatWalletAdapter.ts +9 -7
- package/src/adapters/XverseWalletAdapter.impl.ts +6 -6
- package/src/adapters/XverseWalletAdapter.ts +10 -7
- package/src/adapters/index.ts +6 -6
- package/src/constants.ts +1 -0
- package/src/index.ts +1 -1
- package/src/utils/UnisatCompatibleWalletAdapterImpl.ts +11 -2
- package/src/utils/XverseCompatibleWalletAdapterImpl.ts +4 -0
- package/src/utils/XverseCompatibleWalletAdapterImpl_legacy.ts +19 -7
- package/lib/BitcoinWalletAdapterConnector-Bq835yj0.mjs.map +0 -1
- package/lib/BitcoinWalletAdapterConnector-DMef0iHV.js +0 -2
- package/lib/BitcoinWalletAdapterConnector-DMef0iHV.js.map +0 -1
- package/lib/BitgetWalletAdapter.impl-C_HLO7Oi.mjs +0 -10
- package/lib/BitgetWalletAdapter.impl-C_HLO7Oi.mjs.map +0 -1
- package/lib/BitgetWalletAdapter.impl-CxnKMf7U.js +0 -2
- package/lib/BitgetWalletAdapter.impl-CxnKMf7U.js.map +0 -1
- package/lib/LeatherWalletAdapter.impl-B2QgX_tO.js +0 -2
- package/lib/LeatherWalletAdapter.impl-B2QgX_tO.js.map +0 -1
- package/lib/LeatherWalletAdapter.impl-RUYx555r.mjs.map +0 -1
- package/lib/MagicEdenWalletAdapter.impl-CrA6SGvG.mjs.map +0 -1
- package/lib/MagicEdenWalletAdapter.impl-Di3Nu2S5.js +0 -2
- package/lib/MagicEdenWalletAdapter.impl-Di3Nu2S5.js.map +0 -1
- package/lib/OkxWalletAdapter.impl-BepoUL1B.mjs.map +0 -1
- package/lib/OkxWalletAdapter.impl-C8kesjGu.js +0 -2
- package/lib/OkxWalletAdapter.impl-C8kesjGu.js.map +0 -1
- package/lib/UnisatCompatibleWalletAdapterImpl-Cq2Oqk1b.js.map +0 -1
- package/lib/UnisatCompatibleWalletAdapterImpl-M38FqkZI.mjs.map +0 -1
- package/lib/UnisatWalletAdapter.impl-CJB22se8.mjs +0 -14
- package/lib/UnisatWalletAdapter.impl-CJB22se8.mjs.map +0 -1
- package/lib/UnisatWalletAdapter.impl-EISvxdpc.js +0 -2
- package/lib/UnisatWalletAdapter.impl-EISvxdpc.js.map +0 -1
- package/lib/WalletAdapters.types-CnvOqHFH.mjs +0 -32
- package/lib/WalletAdapters.types-CnvOqHFH.mjs.map +0 -1
- package/lib/WalletAdapters.types-De_x1lzr.js +0 -2
- package/lib/WalletAdapters.types-De_x1lzr.js.map +0 -1
- package/lib/XverseCompatibleWalletAdapterImpl-Bf-BK5VK.js.map +0 -1
- package/lib/XverseCompatibleWalletAdapterImpl-DXKnO_-V.mjs.map +0 -1
- package/lib/XverseWalletAdapter.impl-CZO0RQva.mjs.map +0 -1
- package/lib/XverseWalletAdapter.impl-lJwMi-Iv.js +0 -2
- package/lib/XverseWalletAdapter.impl-lJwMi-Iv.js.map +0 -1
- package/lib/index-D7YwhNAG.mjs.map +0 -1
- package/lib/index-Zx0KcpYx.js +0 -2
- package/lib/index-Zx0KcpYx.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# bitcoin-wallet-connector
|
|
2
2
|
|
|
3
3
|
A unified interface for interacting with multiple Bitcoin wallet browser extensions.
|
|
4
4
|
|
|
@@ -21,17 +21,17 @@ This library is carefully designed with a focus on **API compatibility** and **d
|
|
|
21
21
|
|
|
22
22
|
| Wallet | Adapter | Optional Dependency |
|
|
23
23
|
| ------------------------------------------ | ------------------------------- | ------------------- |
|
|
24
|
-
| [Unisat](https://unisat.io/) | `
|
|
25
|
-
| [Xverse](https://www.xverse.app/) | `
|
|
26
|
-
| [OKX](https://www.okx.com/web3) | `
|
|
27
|
-
| [Leather](https://leather.io/) | `
|
|
28
|
-
| [Bitget](https://web3.bitget.com/) | `
|
|
24
|
+
| [Unisat](https://unisat.io/) | `UnisatWalletAdapterFactory` | - |
|
|
25
|
+
| [Xverse](https://www.xverse.app/) | `XverseWalletAdapterFactory` | `sats-connect` |
|
|
26
|
+
| [OKX](https://www.okx.com/web3) | `OkxWalletAdapterFactory` | - |
|
|
27
|
+
| [Leather](https://leather.io/) | `LeatherWalletAdapterFactory` | `@leather.io/rpc` |
|
|
28
|
+
| [Bitget](https://web3.bitget.com/) | `BitgetWalletAdapterFactory` | - |
|
|
29
29
|
| [Magic Eden](https://wallet.magiceden.io/) | `MagicEdenWalletAdapterFactory` | `sats-connect` |
|
|
30
30
|
|
|
31
31
|
## Installation
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
-
pnpm add
|
|
34
|
+
pnpm add bitcoin-wallet-connector @scure/base @scure/btc-signer
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
### Optional Dependencies
|
|
@@ -55,14 +55,14 @@ pnpm add react
|
|
|
55
55
|
|
|
56
56
|
```typescript
|
|
57
57
|
import {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
} from "
|
|
62
|
-
|
|
63
|
-
const connector = new
|
|
64
|
-
|
|
65
|
-
|
|
58
|
+
BitcoinWalletConnector,
|
|
59
|
+
UnisatWalletAdapterFactory,
|
|
60
|
+
XverseWalletAdapterFactory,
|
|
61
|
+
} from "bitcoin-wallet-connector"
|
|
62
|
+
|
|
63
|
+
const connector = new BitcoinWalletConnector([
|
|
64
|
+
UnisatWalletAdapterFactory(),
|
|
65
|
+
XverseWalletAdapterFactory(),
|
|
66
66
|
])
|
|
67
67
|
|
|
68
68
|
// Get available wallets
|
|
@@ -89,13 +89,16 @@ await connector.disconnect()
|
|
|
89
89
|
import {
|
|
90
90
|
BitcoinConnectionProvider,
|
|
91
91
|
useBitcoinConnectionContext,
|
|
92
|
-
} from "
|
|
92
|
+
} from "bitcoin-wallet-connector/react"
|
|
93
93
|
import {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
} from "
|
|
97
|
-
|
|
98
|
-
const adapterFactories = [
|
|
94
|
+
UnisatWalletAdapterFactory,
|
|
95
|
+
XverseWalletAdapterFactory,
|
|
96
|
+
} from "bitcoin-wallet-connector/adapters"
|
|
97
|
+
|
|
98
|
+
const adapterFactories = [
|
|
99
|
+
UnisatWalletAdapterFactory(),
|
|
100
|
+
XverseWalletAdapterFactory(),
|
|
101
|
+
]
|
|
99
102
|
|
|
100
103
|
function App() {
|
|
101
104
|
return (
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FC, ReactNode } from 'react';
|
|
2
|
-
import { WalletAdapter, WalletAdapterAddress,
|
|
2
|
+
import { WalletAdapter, WalletAdapterAddress, WalletAdapterFactory } from './WalletAdapters.types';
|
|
3
3
|
export interface WalletSession {
|
|
4
4
|
adapterId: string;
|
|
5
5
|
adapter: WalletAdapter;
|
|
@@ -10,12 +10,12 @@ export interface BitcoinConnectionContextValue {
|
|
|
10
10
|
isConnectionInitializing: boolean;
|
|
11
11
|
connect: (adapterId: string, adapter: WalletAdapter) => Promise<void>;
|
|
12
12
|
disconnect: () => Promise<void>;
|
|
13
|
-
adapterFactories:
|
|
13
|
+
adapterFactories: WalletAdapterFactory<WalletAdapter>[];
|
|
14
14
|
availableAdapters: (readonly [adapterId: string, adapter: WalletAdapter])[];
|
|
15
15
|
}
|
|
16
16
|
export declare const BitcoinConnectionProvider: FC<{
|
|
17
17
|
children: ReactNode;
|
|
18
|
-
adapterFactories:
|
|
18
|
+
adapterFactories: WalletAdapterFactory<WalletAdapter>[];
|
|
19
19
|
onWalletConnected?: (session: WalletSession) => void;
|
|
20
20
|
onWalletAddressesChanged?: (addresses: WalletAdapterAddress[]) => void;
|
|
21
21
|
onWalletDisconnected?: () => void;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const u=require("./constants-Dr0_Mix2.js"),d=require("./WalletAdapters.types-CExaiK0o.js");class i{constructor(t){this.value=t}listeners=new Set;getValue(){return this.value}setValue(t){this.value=t,this.emit()}update(t){this.setValue(t(this.value))}subscribe(t){return this.listeners.add(t),t(this.value),{unsubscribe:()=>{this.listeners.delete(t)}}}emit(){for(const t of this.listeners)t(this.value)}}const h=`${u.LOCAL_STORAGE_KEY_PREFIX}:BitcoinWalletConnector`,r=`${h}:previousConnectWallet`;class p{constructor(t){this.factories=t,this.adapterOrder=new Map(t.map((e,a)=>[e.adapterId,a])),this.initializeAdapterAvailability()}availableAdaptersState=new i([]);connectedInfoState=new i(null);autoConnectRunning=!1;availabilitySubscriptions=[];adapterOrder=new Map;dispose(){this.availabilitySubscriptions.forEach(t=>t.unsubscribe()),this.availabilitySubscriptions=[],this.availableAdaptersState=new i([]),this.connectedInfoState=new i(null)}subscribeAvailableAdapters(t){return this.availableAdaptersState.subscribe(t)}getAvailableAdapters(){return this.availableAdaptersState.getValue()}subscribeConnectedInfo(t){return this.connectedInfoState.subscribe(t)}getConnectedInfo(){return this.connectedInfoState.getValue()}initializeAdapterAvailability(){this.availabilitySubscriptions=this.factories.map(t=>t.getAdapter().subscribe(e=>{this.addOrUpdateAvailableAdapter(t.adapterId,e)}))}addOrUpdateAvailableAdapter(t,e){this.availableAdaptersState.update(a=>{const n=[...a],o=a.findIndex(([s])=>s===t);return o===-1?n.push([t,e]):n[o]=[t,e],n.sort((s,c)=>(this.adapterOrder.get(s[0])??Number.MAX_SAFE_INTEGER)-(this.adapterOrder.get(c[0])??Number.MAX_SAFE_INTEGER)),n}),this.autoConnect()}async connect(t,e){const a=e;await a.connect(),localStorage.setItem(r,t),this.connectedInfoState.setValue({adapterId:t,adapter:a})}async disconnect(){const t=this.connectedInfoState.getValue();t!=null&&(await t.adapter.disconnect(),localStorage.removeItem(r),this.connectedInfoState.setValue(null))}async autoConnect(){if(this.isConnected||this.autoConnectRunning)return;const t=this.previousConnectedWallet;if(t==null)return;const e=this.availableAdaptersState.getValue().find(a=>a[0]===t)?.[1];if(e!=null){this.autoConnectRunning=!0;try{await e.getAddresses()}catch(a){if(a instanceof d.WalletAdapterNotConnectedError){this.autoConnectRunning=!1;return}throw this.autoConnectRunning=!1,a}try{await this.connect(t,e)}finally{this.autoConnectRunning=!1}}}get previousConnectedWallet(){const t=localStorage.getItem(r)||void 0;if(this.factories.some(e=>e.adapterId===t))return t}get isConnected(){return this.connectedInfoState.getValue()!=null}}exports.BitcoinWalletConnector=p;
|
|
2
|
+
//# sourceMappingURL=BitcoinWalletConnector-BC92ulXx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitcoinWalletConnector-BC92ulXx.js","sources":["../src/utils/StateChannel.ts","../src/BitcoinWalletConnector.ts"],"sourcesContent":["export type StateChannelListener<T> = (value: T) => void\n\nexport interface StateChannelSubscription {\n unsubscribe: () => void\n}\n\nexport class StateChannel<T> {\n private listeners = new Set<StateChannelListener<T>>()\n constructor(private value: T) {}\n\n getValue(): T {\n return this.value\n }\n\n setValue(value: T): void {\n this.value = value\n this.emit()\n }\n\n update(updater: (current: T) => T): void {\n this.setValue(updater(this.value))\n }\n\n subscribe(listener: StateChannelListener<T>): StateChannelSubscription {\n this.listeners.add(listener)\n listener(this.value)\n return {\n unsubscribe: () => {\n this.listeners.delete(listener)\n },\n }\n }\n\n private emit(): void {\n for (const listener of this.listeners) {\n listener(this.value)\n }\n }\n}\n","import { LOCAL_STORAGE_KEY_PREFIX } from \"./constants\"\nimport { AvailabilitySubscription } from \"./utils/createAdapterAvailability\"\nimport { StateChannel, StateChannelListener } from \"./utils/StateChannel\"\nimport {\n WalletAdapter,\n WalletAdapterFactory,\n WalletAdapterNotConnectedError,\n} from \"./WalletAdapters.types\"\n\nconst localStorageKeyPrefix = `${LOCAL_STORAGE_KEY_PREFIX}:BitcoinWalletConnector`\nconst previousConnectWalletAdapterId_localStorageKey = `${localStorageKeyPrefix}:previousConnectWallet`\n\nexport interface ConnectInfo {\n adapterId: string\n adapter: WalletAdapter\n}\n\nexport type AdapterEntry = readonly [string, WalletAdapter]\n\nexport class BitcoinWalletConnector {\n private availableAdaptersState = new StateChannel<AdapterEntry[]>([])\n private connectedInfoState = new StateChannel<null | ConnectInfo>(null)\n private autoConnectRunning = false\n private availabilitySubscriptions: AvailabilitySubscription[] = []\n private adapterOrder = new Map<string, number>()\n\n constructor(private factories: WalletAdapterFactory<WalletAdapter>[]) {\n this.adapterOrder = new Map(\n factories.map((factory, index) => [factory.adapterId, index]),\n )\n this.initializeAdapterAvailability()\n }\n\n dispose(): void {\n this.availabilitySubscriptions.forEach(s => s.unsubscribe())\n this.availabilitySubscriptions = []\n this.availableAdaptersState = new StateChannel<AdapterEntry[]>([])\n this.connectedInfoState = new StateChannel<null | ConnectInfo>(null)\n }\n\n subscribeAvailableAdapters(\n listener: StateChannelListener<AdapterEntry[]>,\n ): AvailabilitySubscription {\n return this.availableAdaptersState.subscribe(listener)\n }\n getAvailableAdapters(): AdapterEntry[] {\n return this.availableAdaptersState.getValue()\n }\n\n subscribeConnectedInfo(\n listener: StateChannelListener<null | ConnectInfo>,\n ): AvailabilitySubscription {\n return this.connectedInfoState.subscribe(listener)\n }\n getConnectedInfo(): null | ConnectInfo {\n return this.connectedInfoState.getValue()\n }\n\n private initializeAdapterAvailability(): void {\n this.availabilitySubscriptions = this.factories.map(factory => {\n return factory.getAdapter().subscribe(adapter => {\n this.addOrUpdateAvailableAdapter(factory.adapterId, adapter)\n })\n })\n }\n\n private addOrUpdateAvailableAdapter(\n adapterId: string,\n adapter: WalletAdapter,\n ): void {\n this.availableAdaptersState.update(current => {\n const next = [...current]\n const existingIndex = current.findIndex(([id]) => id === adapterId)\n if (existingIndex === -1) {\n next.push([adapterId, adapter] as const)\n } else {\n next[existingIndex] = [adapterId, adapter] as const\n }\n\n next.sort(\n (a, b) =>\n (this.adapterOrder.get(a[0]) ?? Number.MAX_SAFE_INTEGER) -\n (this.adapterOrder.get(b[0]) ?? Number.MAX_SAFE_INTEGER),\n )\n return next\n })\n\n void this.autoConnect()\n }\n\n async connect(adapterId: string, adapter: WalletAdapter): Promise<void> {\n const finalAdapter = adapter\n\n await finalAdapter.connect()\n localStorage.setItem(\n previousConnectWalletAdapterId_localStorageKey,\n adapterId,\n )\n\n this.connectedInfoState.setValue({ adapterId, adapter: finalAdapter })\n }\n\n async disconnect(): Promise<void> {\n const info = this.connectedInfoState.getValue()\n if (info == null) return\n\n await info.adapter.disconnect()\n localStorage.removeItem(previousConnectWalletAdapterId_localStorageKey)\n\n this.connectedInfoState.setValue(null)\n }\n\n private async autoConnect(): Promise<void> {\n if (this.isConnected || this.autoConnectRunning) return\n\n const previousAdapterId = this.previousConnectedWallet\n if (previousAdapterId == null) return\n\n const adapter = this.availableAdaptersState\n .getValue()\n .find(a => a[0] === previousAdapterId)?.[1]\n if (adapter == null) return\n\n this.autoConnectRunning = true\n try {\n await adapter.getAddresses()\n } catch (err: unknown) {\n if (err instanceof WalletAdapterNotConnectedError) {\n this.autoConnectRunning = false\n return\n }\n\n this.autoConnectRunning = false\n throw err\n }\n\n try {\n await this.connect(previousAdapterId, adapter)\n } finally {\n this.autoConnectRunning = false\n }\n }\n\n private get previousConnectedWallet(): string | undefined {\n const adapterId =\n localStorage.getItem(previousConnectWalletAdapterId_localStorageKey) ||\n undefined\n\n if (this.factories.some(factory => factory.adapterId === adapterId)) {\n return adapterId\n }\n return undefined\n }\n\n private get isConnected(): boolean {\n return this.connectedInfoState.getValue() != null\n }\n}\n"],"names":["StateChannel","value","updater","listener","localStorageKeyPrefix","LOCAL_STORAGE_KEY_PREFIX","previousConnectWalletAdapterId_localStorageKey","BitcoinWalletConnector","factories","factory","index","s","adapter","adapterId","current","next","existingIndex","id","a","b","finalAdapter","info","previousAdapterId","err","WalletAdapterNotConnectedError"],"mappings":"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"}
|
package/lib/{BitcoinWalletAdapterConnector-Bq835yj0.mjs → BitcoinWalletConnector-CS0BshOl.mjs}
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { L as u } from "./constants-B7qVf97f.mjs";
|
|
2
|
+
import { d } from "./WalletAdapters.types-DBvhI1hu.mjs";
|
|
2
3
|
class i {
|
|
3
4
|
constructor(t) {
|
|
4
5
|
this.value = t;
|
|
@@ -25,10 +26,10 @@ class i {
|
|
|
25
26
|
t(this.value);
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
|
-
const r =
|
|
29
|
-
class
|
|
29
|
+
const h = `${u}:BitcoinWalletConnector`, r = `${h}:previousConnectWallet`;
|
|
30
|
+
class f {
|
|
30
31
|
constructor(t) {
|
|
31
|
-
this.
|
|
32
|
+
this.factories = t, this.adapterOrder = new Map(
|
|
32
33
|
t.map((e, a) => [e.adapterId, a])
|
|
33
34
|
), this.initializeAdapterAvailability();
|
|
34
35
|
}
|
|
@@ -53,7 +54,7 @@ class h {
|
|
|
53
54
|
return this.connectedInfoState.getValue();
|
|
54
55
|
}
|
|
55
56
|
initializeAdapterAvailability() {
|
|
56
|
-
this.availabilitySubscriptions = this.
|
|
57
|
+
this.availabilitySubscriptions = this.factories.map((t) => t.getAdapter().subscribe((e) => {
|
|
57
58
|
this.addOrUpdateAvailableAdapter(t.adapterId, e);
|
|
58
59
|
}));
|
|
59
60
|
}
|
|
@@ -67,23 +68,14 @@ class h {
|
|
|
67
68
|
}
|
|
68
69
|
async connect(t, e) {
|
|
69
70
|
const a = e;
|
|
70
|
-
await a.connect().
|
|
71
|
-
if (n instanceof u) {
|
|
72
|
-
alert(n.message);
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
throw n;
|
|
76
|
-
}), localStorage.setItem(
|
|
71
|
+
await a.connect(), localStorage.setItem(
|
|
77
72
|
r,
|
|
78
73
|
t
|
|
79
74
|
), this.connectedInfoState.setValue({ adapterId: t, adapter: a });
|
|
80
75
|
}
|
|
81
76
|
async disconnect() {
|
|
82
77
|
const t = this.connectedInfoState.getValue();
|
|
83
|
-
t != null && (await
|
|
84
|
-
}
|
|
85
|
-
async disconnectAdapter(t) {
|
|
86
|
-
await t.disconnect(), localStorage.removeItem(r);
|
|
78
|
+
t != null && (await t.adapter.disconnect(), localStorage.removeItem(r), this.connectedInfoState.setValue(null));
|
|
87
79
|
}
|
|
88
80
|
async autoConnect() {
|
|
89
81
|
if (this.isConnected || this.autoConnectRunning) return;
|
|
@@ -110,7 +102,7 @@ class h {
|
|
|
110
102
|
}
|
|
111
103
|
get previousConnectedWallet() {
|
|
112
104
|
const t = localStorage.getItem(r) || void 0;
|
|
113
|
-
if (this.
|
|
105
|
+
if (this.factories.some((e) => e.adapterId === t))
|
|
114
106
|
return t;
|
|
115
107
|
}
|
|
116
108
|
get isConnected() {
|
|
@@ -118,6 +110,6 @@ class h {
|
|
|
118
110
|
}
|
|
119
111
|
}
|
|
120
112
|
export {
|
|
121
|
-
|
|
113
|
+
f as B
|
|
122
114
|
};
|
|
123
|
-
//# sourceMappingURL=
|
|
115
|
+
//# sourceMappingURL=BitcoinWalletConnector-CS0BshOl.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitcoinWalletConnector-CS0BshOl.mjs","sources":["../src/utils/StateChannel.ts","../src/BitcoinWalletConnector.ts"],"sourcesContent":["export type StateChannelListener<T> = (value: T) => void\n\nexport interface StateChannelSubscription {\n unsubscribe: () => void\n}\n\nexport class StateChannel<T> {\n private listeners = new Set<StateChannelListener<T>>()\n constructor(private value: T) {}\n\n getValue(): T {\n return this.value\n }\n\n setValue(value: T): void {\n this.value = value\n this.emit()\n }\n\n update(updater: (current: T) => T): void {\n this.setValue(updater(this.value))\n }\n\n subscribe(listener: StateChannelListener<T>): StateChannelSubscription {\n this.listeners.add(listener)\n listener(this.value)\n return {\n unsubscribe: () => {\n this.listeners.delete(listener)\n },\n }\n }\n\n private emit(): void {\n for (const listener of this.listeners) {\n listener(this.value)\n }\n }\n}\n","import { LOCAL_STORAGE_KEY_PREFIX } from \"./constants\"\nimport { AvailabilitySubscription } from \"./utils/createAdapterAvailability\"\nimport { StateChannel, StateChannelListener } from \"./utils/StateChannel\"\nimport {\n WalletAdapter,\n WalletAdapterFactory,\n WalletAdapterNotConnectedError,\n} from \"./WalletAdapters.types\"\n\nconst localStorageKeyPrefix = `${LOCAL_STORAGE_KEY_PREFIX}:BitcoinWalletConnector`\nconst previousConnectWalletAdapterId_localStorageKey = `${localStorageKeyPrefix}:previousConnectWallet`\n\nexport interface ConnectInfo {\n adapterId: string\n adapter: WalletAdapter\n}\n\nexport type AdapterEntry = readonly [string, WalletAdapter]\n\nexport class BitcoinWalletConnector {\n private availableAdaptersState = new StateChannel<AdapterEntry[]>([])\n private connectedInfoState = new StateChannel<null | ConnectInfo>(null)\n private autoConnectRunning = false\n private availabilitySubscriptions: AvailabilitySubscription[] = []\n private adapterOrder = new Map<string, number>()\n\n constructor(private factories: WalletAdapterFactory<WalletAdapter>[]) {\n this.adapterOrder = new Map(\n factories.map((factory, index) => [factory.adapterId, index]),\n )\n this.initializeAdapterAvailability()\n }\n\n dispose(): void {\n this.availabilitySubscriptions.forEach(s => s.unsubscribe())\n this.availabilitySubscriptions = []\n this.availableAdaptersState = new StateChannel<AdapterEntry[]>([])\n this.connectedInfoState = new StateChannel<null | ConnectInfo>(null)\n }\n\n subscribeAvailableAdapters(\n listener: StateChannelListener<AdapterEntry[]>,\n ): AvailabilitySubscription {\n return this.availableAdaptersState.subscribe(listener)\n }\n getAvailableAdapters(): AdapterEntry[] {\n return this.availableAdaptersState.getValue()\n }\n\n subscribeConnectedInfo(\n listener: StateChannelListener<null | ConnectInfo>,\n ): AvailabilitySubscription {\n return this.connectedInfoState.subscribe(listener)\n }\n getConnectedInfo(): null | ConnectInfo {\n return this.connectedInfoState.getValue()\n }\n\n private initializeAdapterAvailability(): void {\n this.availabilitySubscriptions = this.factories.map(factory => {\n return factory.getAdapter().subscribe(adapter => {\n this.addOrUpdateAvailableAdapter(factory.adapterId, adapter)\n })\n })\n }\n\n private addOrUpdateAvailableAdapter(\n adapterId: string,\n adapter: WalletAdapter,\n ): void {\n this.availableAdaptersState.update(current => {\n const next = [...current]\n const existingIndex = current.findIndex(([id]) => id === adapterId)\n if (existingIndex === -1) {\n next.push([adapterId, adapter] as const)\n } else {\n next[existingIndex] = [adapterId, adapter] as const\n }\n\n next.sort(\n (a, b) =>\n (this.adapterOrder.get(a[0]) ?? Number.MAX_SAFE_INTEGER) -\n (this.adapterOrder.get(b[0]) ?? Number.MAX_SAFE_INTEGER),\n )\n return next\n })\n\n void this.autoConnect()\n }\n\n async connect(adapterId: string, adapter: WalletAdapter): Promise<void> {\n const finalAdapter = adapter\n\n await finalAdapter.connect()\n localStorage.setItem(\n previousConnectWalletAdapterId_localStorageKey,\n adapterId,\n )\n\n this.connectedInfoState.setValue({ adapterId, adapter: finalAdapter })\n }\n\n async disconnect(): Promise<void> {\n const info = this.connectedInfoState.getValue()\n if (info == null) return\n\n await info.adapter.disconnect()\n localStorage.removeItem(previousConnectWalletAdapterId_localStorageKey)\n\n this.connectedInfoState.setValue(null)\n }\n\n private async autoConnect(): Promise<void> {\n if (this.isConnected || this.autoConnectRunning) return\n\n const previousAdapterId = this.previousConnectedWallet\n if (previousAdapterId == null) return\n\n const adapter = this.availableAdaptersState\n .getValue()\n .find(a => a[0] === previousAdapterId)?.[1]\n if (adapter == null) return\n\n this.autoConnectRunning = true\n try {\n await adapter.getAddresses()\n } catch (err: unknown) {\n if (err instanceof WalletAdapterNotConnectedError) {\n this.autoConnectRunning = false\n return\n }\n\n this.autoConnectRunning = false\n throw err\n }\n\n try {\n await this.connect(previousAdapterId, adapter)\n } finally {\n this.autoConnectRunning = false\n }\n }\n\n private get previousConnectedWallet(): string | undefined {\n const adapterId =\n localStorage.getItem(previousConnectWalletAdapterId_localStorageKey) ||\n undefined\n\n if (this.factories.some(factory => factory.adapterId === adapterId)) {\n return adapterId\n }\n return undefined\n }\n\n private get isConnected(): boolean {\n return this.connectedInfoState.getValue() != null\n }\n}\n"],"names":["StateChannel","value","updater","listener","localStorageKeyPrefix","LOCAL_STORAGE_KEY_PREFIX","previousConnectWalletAdapterId_localStorageKey","BitcoinWalletConnector","factories","factory","index","s","adapter","adapterId","current","next","existingIndex","id","a","b","finalAdapter","info","previousAdapterId","err","WalletAdapterNotConnectedError"],"mappings":"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"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { AvailabilitySubscription } from './utils/createAdapterAvailability';
|
|
2
2
|
import { StateChannelListener } from './utils/StateChannel';
|
|
3
|
-
import { WalletAdapter,
|
|
3
|
+
import { WalletAdapter, WalletAdapterFactory } from './WalletAdapters.types';
|
|
4
4
|
export interface ConnectInfo {
|
|
5
5
|
adapterId: string;
|
|
6
6
|
adapter: WalletAdapter;
|
|
7
7
|
}
|
|
8
8
|
export type AdapterEntry = readonly [string, WalletAdapter];
|
|
9
|
-
export declare class
|
|
10
|
-
private
|
|
9
|
+
export declare class BitcoinWalletConnector {
|
|
10
|
+
private factories;
|
|
11
11
|
private availableAdaptersState;
|
|
12
12
|
private connectedInfoState;
|
|
13
13
|
private autoConnectRunning;
|
|
14
14
|
private availabilitySubscriptions;
|
|
15
15
|
private adapterOrder;
|
|
16
|
-
constructor(
|
|
16
|
+
constructor(factories: WalletAdapterFactory<WalletAdapter>[]);
|
|
17
17
|
dispose(): void;
|
|
18
18
|
subscribeAvailableAdapters(listener: StateChannelListener<AdapterEntry[]>): AvailabilitySubscription;
|
|
19
19
|
getAvailableAdapters(): AdapterEntry[];
|
|
@@ -23,7 +23,6 @@ export declare class BitcoinWalletAdapterConnector {
|
|
|
23
23
|
private addOrUpdateAvailableAdapter;
|
|
24
24
|
connect(adapterId: string, adapter: WalletAdapter): Promise<void>;
|
|
25
25
|
disconnect(): Promise<void>;
|
|
26
|
-
private disconnectAdapter;
|
|
27
26
|
private autoConnect;
|
|
28
27
|
private get previousConnectedWallet();
|
|
29
28
|
private get isConnected();
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { U as a } from "./UnisatCompatibleWalletAdapterImpl-8lRRF7Zj.mjs";
|
|
2
|
+
import { m as e } from "./index-DM4G-LJz.mjs";
|
|
3
|
+
class l extends a {
|
|
4
|
+
constructor(t) {
|
|
5
|
+
super(t, e.name);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
l as BitgetWalletAdapterImpl
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=BitgetWalletAdapter.impl-D8kqiYDi.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitgetWalletAdapter.impl-D8kqiYDi.mjs","sources":["../src/adapters/BitgetWalletAdapter.impl.ts"],"sourcesContent":["import {\n UnisatCompatibleProviderAPI,\n UnisatCompatibleWalletAdapterImpl,\n} from \"../utils/UnisatCompatibleWalletAdapterImpl\"\nimport { WalletAdapter } from \"../WalletAdapters.types\"\nimport { metadata } from \"./BitgetWalletAdapter\"\n\n/**\n * Derivation path (BIP-44): m/44'/0'/0'/0/ address_index\n */\nexport class BitgetWalletAdapterImpl\n extends UnisatCompatibleWalletAdapterImpl\n implements WalletAdapter\n{\n constructor(provider: UnisatCompatibleProviderAPI) {\n /**\n * Bitget Provider API:\n *\n * https://web3.bitget.com/zh-CN/docs/provider-api/btc.html\n */\n super(provider, metadata.name)\n }\n}\n"],"names":["BitgetWalletAdapterImpl","UnisatCompatibleWalletAdapterImpl","provider","metadata"],"mappings":";;AAUO,MAAMA,UACHC,EAEV;AAAA,EACE,YAAYC,GAAuC;AAMjD,UAAMA,GAAUC,EAAS,IAAI;AAAA,EAC/B;AACF;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./UnisatCompatibleWalletAdapterImpl-C-JWrc9s.js"),a=require("./index-jRY8YhyK.js");class l extends e.UnisatCompatibleWalletAdapterImpl{constructor(t){super(t,a.metadata.name)}}exports.BitgetWalletAdapterImpl=l;
|
|
2
|
+
//# sourceMappingURL=BitgetWalletAdapter.impl-DiyzNQ9d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitgetWalletAdapter.impl-DiyzNQ9d.js","sources":["../src/adapters/BitgetWalletAdapter.impl.ts"],"sourcesContent":["import {\n UnisatCompatibleProviderAPI,\n UnisatCompatibleWalletAdapterImpl,\n} from \"../utils/UnisatCompatibleWalletAdapterImpl\"\nimport { WalletAdapter } from \"../WalletAdapters.types\"\nimport { metadata } from \"./BitgetWalletAdapter\"\n\n/**\n * Derivation path (BIP-44): m/44'/0'/0'/0/ address_index\n */\nexport class BitgetWalletAdapterImpl\n extends UnisatCompatibleWalletAdapterImpl\n implements WalletAdapter\n{\n constructor(provider: UnisatCompatibleProviderAPI) {\n /**\n * Bitget Provider API:\n *\n * https://web3.bitget.com/zh-CN/docs/provider-api/btc.html\n */\n super(provider, metadata.name)\n }\n}\n"],"names":["BitgetWalletAdapterImpl","UnisatCompatibleWalletAdapterImpl","provider","metadata"],"mappings":"oLAUO,MAAMA,UACHC,EAAAA,iCAEV,CACE,YAAYC,EAAuC,CAMjD,MAAMA,EAAUC,EAAAA,SAAS,IAAI,CAC/B,CACF"}
|
package/lib/{LeatherWalletAdapter.impl-RUYx555r.mjs → LeatherWalletAdapter.impl-B1PoZS7z.mjs}
RENAMED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { h as u, g as
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { b as T, c as g, h as u, g as b, d as h, e as P, f, i as m } from "./index-DM4G-LJz.mjs";
|
|
2
|
+
import { L as R } from "./constants-B7qVf97f.mjs";
|
|
3
|
+
import { d as y, b as i, a as o, W as w, S as A } from "./WalletAdapters.types-DBvhI1hu.mjs";
|
|
4
|
+
const S = `${R}:${T}`, c = `${S}:connectedAddress`;
|
|
5
|
+
class x {
|
|
5
6
|
constructor(e) {
|
|
6
7
|
this.request = e;
|
|
7
8
|
}
|
|
8
|
-
walletDisplayName = "Leather";
|
|
9
9
|
retrieveConnectedAddress() {
|
|
10
10
|
let e;
|
|
11
11
|
const s = localStorage.getItem(c) || void 0;
|
|
@@ -20,13 +20,16 @@ class I {
|
|
|
20
20
|
}
|
|
21
21
|
async connect() {
|
|
22
22
|
if (this.retrieveConnectedAddress() == null) {
|
|
23
|
-
const e = await
|
|
23
|
+
const e = await d(
|
|
24
24
|
/**
|
|
25
25
|
* https://leather.gitbook.io/developers/bitcoin/connect-users/get-addresses
|
|
26
26
|
*/
|
|
27
27
|
this.request("getAddresses")
|
|
28
28
|
);
|
|
29
|
-
localStorage.setItem(
|
|
29
|
+
localStorage.setItem(
|
|
30
|
+
c,
|
|
31
|
+
JSON.stringify(e)
|
|
32
|
+
);
|
|
30
33
|
}
|
|
31
34
|
}
|
|
32
35
|
async disconnect() {
|
|
@@ -35,28 +38,28 @@ class I {
|
|
|
35
38
|
async getAddresses() {
|
|
36
39
|
const e = this.retrieveConnectedAddress();
|
|
37
40
|
if (e == null)
|
|
38
|
-
throw new y(
|
|
41
|
+
throw new y(g.name);
|
|
39
42
|
const s = e.addresses.filter(
|
|
40
43
|
(t) => t.symbol === "BTC" && t.type
|
|
41
44
|
), r = s.filter((t) => t.type === "p2tr")[0].address.startsWith("bc");
|
|
42
45
|
return s.map((t) => ({
|
|
43
|
-
network: r ?
|
|
46
|
+
network: r ? w.MAINNET : w.TESTNET,
|
|
44
47
|
purposes: t.type === "p2tr" ? [
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
] : [
|
|
48
|
+
o.Ordinals,
|
|
49
|
+
o.BRC20,
|
|
50
|
+
o.Runes
|
|
51
|
+
] : [o.Bitcoin],
|
|
49
52
|
addressType: t.type === "p2tr" ? i.P2TR : i.P2WPKH,
|
|
50
53
|
address: t.address,
|
|
51
54
|
scriptPubKey: u.encode(
|
|
52
|
-
|
|
55
|
+
P(
|
|
53
56
|
h(r ? "mainnet" : "testnet"),
|
|
54
57
|
t.address
|
|
55
58
|
)
|
|
56
59
|
),
|
|
57
60
|
publicKey: t.publicKey,
|
|
58
61
|
tapInternalKey: t.type === "p2tr" ? u.encode(
|
|
59
|
-
|
|
62
|
+
b(
|
|
60
63
|
h(r ? "mainnet" : "testnet"),
|
|
61
64
|
u.decode(t.publicKey)
|
|
62
65
|
)
|
|
@@ -64,28 +67,28 @@ class I {
|
|
|
64
67
|
}));
|
|
65
68
|
}
|
|
66
69
|
async signMessage(e, s) {
|
|
67
|
-
const t = (await this.getAddresses()).find((p) => p.address === e)?.addressType,
|
|
68
|
-
if (
|
|
69
|
-
throw new
|
|
70
|
-
const
|
|
70
|
+
const t = (await this.getAddresses()).find((p) => p.address === e)?.addressType, a = t === i.P2WPKH ? "p2wpkh" : t === i.P2TR ? "p2tr" : void 0;
|
|
71
|
+
if (a == null)
|
|
72
|
+
throw new f("Address is not supported");
|
|
73
|
+
const n = await d(
|
|
71
74
|
/**
|
|
72
75
|
* https://leather.gitbook.io/developers/bitcoin-methods/signmessage
|
|
73
76
|
*/
|
|
74
77
|
this.request("signMessage", {
|
|
75
78
|
message: s,
|
|
76
|
-
paymentType:
|
|
79
|
+
paymentType: a
|
|
77
80
|
})
|
|
78
81
|
);
|
|
79
82
|
return {
|
|
80
|
-
algorithm:
|
|
81
|
-
result:
|
|
83
|
+
algorithm: n.algorithm === "ecdsa" ? A.ECDSA : A.BIP322,
|
|
84
|
+
result: n.signature,
|
|
82
85
|
address: e,
|
|
83
|
-
publicKey:
|
|
86
|
+
publicKey: n.publicKey
|
|
84
87
|
};
|
|
85
88
|
}
|
|
86
89
|
sendBitcoinFeeRateCapability = "required";
|
|
87
90
|
async sendBitcoin(e, s, r, t) {
|
|
88
|
-
return { txid: (await
|
|
91
|
+
return { txid: (await d(
|
|
89
92
|
/**
|
|
90
93
|
* https://leather.gitbook.io/developers/bitcoin-methods/sendbitcoin
|
|
91
94
|
*/
|
|
@@ -97,9 +100,17 @@ class I {
|
|
|
97
100
|
})
|
|
98
101
|
)).txid };
|
|
99
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* @internal
|
|
105
|
+
* @experimental
|
|
106
|
+
*/
|
|
100
107
|
sendInscriptionFeeRateCapability = "available";
|
|
108
|
+
/**
|
|
109
|
+
* @internal
|
|
110
|
+
* @experimental
|
|
111
|
+
*/
|
|
101
112
|
async sendInscription(e, s, r, t) {
|
|
102
|
-
const { txid:
|
|
113
|
+
const { txid: a } = await d(
|
|
103
114
|
/**
|
|
104
115
|
* https://leather.gitbook.io/developers/ordinals/send-ordinals
|
|
105
116
|
*/
|
|
@@ -115,22 +126,22 @@ class I {
|
|
|
115
126
|
feeRate: t?.feeRate
|
|
116
127
|
})
|
|
117
128
|
);
|
|
118
|
-
return { txid:
|
|
129
|
+
return { txid: a };
|
|
119
130
|
}
|
|
120
131
|
async signAndFinalizePsbt(e, s) {
|
|
121
132
|
const t = (await this.getAddresses()).find(
|
|
122
|
-
(
|
|
133
|
+
(n) => n.address === s[0]?.[0]
|
|
123
134
|
);
|
|
124
135
|
if (t == null)
|
|
125
|
-
throw new y(
|
|
126
|
-
return { signedPsbtHex: (await
|
|
136
|
+
throw new y(g.name);
|
|
137
|
+
return { signedPsbtHex: (await d(
|
|
127
138
|
/**
|
|
128
139
|
* https://leather.gitbook.io/developers/bitcoin-methods/signandfinalizepsbt
|
|
129
140
|
*/
|
|
130
141
|
this.request("signAndFinalizePsbt", {
|
|
131
142
|
hex: e,
|
|
132
|
-
inputsToSign: s.map(([
|
|
133
|
-
address:
|
|
143
|
+
inputsToSign: s.map(([n, p]) => ({
|
|
144
|
+
address: n,
|
|
134
145
|
signingIndexes: [p],
|
|
135
146
|
signatureHash: void 0,
|
|
136
147
|
disableTweakSigner: void 0
|
|
@@ -163,22 +174,22 @@ class I {
|
|
|
163
174
|
};
|
|
164
175
|
}
|
|
165
176
|
}
|
|
166
|
-
class
|
|
177
|
+
class K extends f {
|
|
167
178
|
constructor(e) {
|
|
168
179
|
super("Leather wallet error: " + e.error.message, {
|
|
169
180
|
cause: e
|
|
170
181
|
});
|
|
171
182
|
}
|
|
172
183
|
}
|
|
173
|
-
const
|
|
184
|
+
const d = async (l) => {
|
|
174
185
|
try {
|
|
175
186
|
return await l;
|
|
176
187
|
} catch (e) {
|
|
177
|
-
throw e instanceof m ? e : e.error?.code === 4001 ? new m() : new
|
|
188
|
+
throw e instanceof m ? e : e.error?.code === 4001 ? new m() : new K(e);
|
|
178
189
|
}
|
|
179
190
|
};
|
|
180
191
|
export {
|
|
181
|
-
|
|
182
|
-
|
|
192
|
+
K as LeatherWalletAdapterError,
|
|
193
|
+
x as LeatherWalletAdapterImpl
|
|
183
194
|
};
|
|
184
|
-
//# sourceMappingURL=LeatherWalletAdapter.impl-
|
|
195
|
+
//# sourceMappingURL=LeatherWalletAdapter.impl-B1PoZS7z.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LeatherWalletAdapter.impl-B1PoZS7z.mjs","sources":["../src/adapters/LeatherWalletAdapter.impl.ts"],"sourcesContent":["import type { RequestFn, RpcErrorBody, RpcErrorResponse } from \"@leather.io/rpc\"\nimport { hex } from \"@scure/base\"\nimport { LOCAL_STORAGE_KEY_PREFIX } from \"../constants\"\nimport {\n addressToScriptPubKey,\n getTapInternalKeyOf_P2TR_publicKey,\n} from \"../utils/bitcoinAddressHelpers\"\nimport { getBitcoinNetwork } from \"../utils/bitcoinNetworkHelpers\"\nimport { BitcoinWalletAdapterError, UserRejectError } from \"../utils/error\"\nimport {\n SignMessageAlgorithm,\n SignMessageResult,\n WalletAdapter,\n WalletAdapter_onAddressesChanged_callback,\n WalletAdapterAddress,\n WalletAdapterAddressPurpose,\n WalletAdapterAddressType,\n WalletAdapterBitcoinNetwork,\n WalletAdapterNotConnectedError,\n} from \"../WalletAdapters.types\"\nimport { adapterId, metadata } from \"./LeatherWalletAdapter\"\n\ntype GetAddressesResponseData = any\n\n/**\n * https://github.com/leather-io/mono/blob/a664e64040fed1c25abef1f8864a1c7fae5444c1/packages/rpc/src/rpc/schemas.ts#L64-L78\n */\nenum RpcErrorCode {\n // Spec defined server errors\n PARSE_ERROR = -32700,\n INVALID_REQUEST = -32600,\n METHOD_NOT_FOUND = -32601,\n INVALID_PARAMS = -32602,\n INTERNAL_ERROR = -32603,\n SERVER_ERROR = -32000,\n // Client defined errors\n USER_REJECTION = 4001,\n METHOD_NOT_SUPPORTED = 4002,\n // gRPC spec borrowed\n PERMISSION_DENIED = 7,\n UNAUTHENTICATED = 16,\n}\n\ntype Addresses = (WalletAdapterAddress & { publicKey: string })[]\n\nconst localStorageKeyPrefix = `${LOCAL_STORAGE_KEY_PREFIX}:${adapterId}`\nconst connectedAddress_localStorageKey = `${localStorageKeyPrefix}:connectedAddress`\n\n/**\n * Derivation path (BIP-84): m/84'/0'/ account_index '/0/0\n */\nexport class LeatherWalletAdapterImpl implements WalletAdapter {\n constructor(private request: RequestFn) {}\n\n private retrieveConnectedAddress(): GetAddressesResponseData | undefined {\n let resp: GetAddressesResponseData | undefined\n const stored =\n localStorage.getItem(connectedAddress_localStorageKey) || undefined\n if (stored != null) {\n try {\n resp = JSON.parse(stored)\n if (\n resp == null ||\n !(\"addresses\" in resp) ||\n !Array.isArray(resp.addresses)\n ) {\n throw new Error(\"Invalid stored addresses\")\n }\n } catch {\n localStorage.removeItem(connectedAddress_localStorageKey)\n }\n }\n return resp\n }\n\n async connect(): Promise<void> {\n if (this.retrieveConnectedAddress() == null) {\n const resp = await handleRpcError(\n /**\n * https://leather.gitbook.io/developers/bitcoin/connect-users/get-addresses\n */\n this.request(\"getAddresses\"),\n )\n localStorage.setItem(\n connectedAddress_localStorageKey,\n JSON.stringify(resp),\n )\n }\n }\n\n async disconnect(): Promise<void> {\n localStorage.removeItem(connectedAddress_localStorageKey)\n return Promise.resolve()\n }\n\n async getAddresses(): Promise<Addresses> {\n const resp = this.retrieveConnectedAddress()\n\n if (resp == null) {\n throw new WalletAdapterNotConnectedError(metadata.name)\n }\n\n const addresses = resp.addresses.filter(\n (a: any) => (a as any).symbol === \"BTC\" && a.type,\n )\n\n const isMainnet = addresses\n .filter((a: any) => a.type === \"p2tr\")[0]\n .address.startsWith(\"bc\")\n\n return addresses.map((a: any) => ({\n network: isMainnet\n ? WalletAdapterBitcoinNetwork.MAINNET\n : WalletAdapterBitcoinNetwork.TESTNET,\n purposes:\n a.type === \"p2tr\"\n ? [\n WalletAdapterAddressPurpose.Ordinals,\n WalletAdapterAddressPurpose.BRC20,\n WalletAdapterAddressPurpose.Runes,\n ]\n : [WalletAdapterAddressPurpose.Bitcoin],\n addressType:\n a.type === \"p2tr\"\n ? WalletAdapterAddressType.P2TR\n : WalletAdapterAddressType.P2WPKH,\n address: a.address,\n scriptPubKey: hex.encode(\n addressToScriptPubKey(\n getBitcoinNetwork(isMainnet ? \"mainnet\" : \"testnet\"),\n a.address,\n ),\n ),\n publicKey: a.publicKey!,\n tapInternalKey:\n a.type === \"p2tr\"\n ? hex.encode(\n getTapInternalKeyOf_P2TR_publicKey(\n getBitcoinNetwork(isMainnet ? \"mainnet\" : \"testnet\"),\n hex.decode(a.publicKey!),\n ),\n )\n : undefined,\n }))\n }\n\n async signMessage(\n address: string,\n message: string,\n ): Promise<SignMessageResult> {\n const accounts = await this.getAddresses()\n\n const addressType = accounts.find(a => a.address === address)?.addressType\n\n // prettier-ignore\n const paymentType =\n addressType === WalletAdapterAddressType.P2WPKH ? 'p2wpkh' as const :\n addressType === WalletAdapterAddressType.P2TR ? 'p2tr' as const :\n undefined\n if (paymentType == null) {\n throw new BitcoinWalletAdapterError(\"Address is not supported\")\n }\n\n const resp: any = await handleRpcError(\n /**\n * https://leather.gitbook.io/developers/bitcoin-methods/signmessage\n */\n this.request(\"signMessage\", {\n message,\n paymentType,\n }),\n )\n\n return {\n algorithm:\n resp.algorithm === \"ecdsa\"\n ? SignMessageAlgorithm.ECDSA\n : SignMessageAlgorithm.BIP322,\n result: resp.signature,\n address,\n publicKey: resp.publicKey,\n }\n }\n\n sendBitcoinFeeRateCapability = \"required\" as const\n async sendBitcoin(\n fromAddress: string,\n receiverAddress: string,\n satoshiAmount: bigint,\n options?: { feeRate?: number },\n ): Promise<{ txid: string }> {\n const resp: any = await handleRpcError(\n /**\n * https://leather.gitbook.io/developers/bitcoin-methods/sendbitcoin\n */\n (this.request as any)(\"sendBitcoin\", {\n origin: fromAddress,\n destination: receiverAddress,\n amount: satoshiAmount,\n feeRate: options?.feeRate,\n }),\n )\n return { txid: resp.txid }\n }\n\n /**\n * @internal\n * @experimental\n */\n sendInscriptionFeeRateCapability = \"available\" as const\n /**\n * @internal\n * @experimental\n */\n async sendInscription(\n fromAddress: string,\n receiverAddress: string,\n inscriptionId: string,\n options?: { feeRate?: number },\n ): Promise<{ txid: string }> {\n const { txid }: any = await handleRpcError(\n /**\n * https://leather.gitbook.io/developers/ordinals/send-ordinals\n */\n (this.request as any)(\"sendOrdinals\", {\n ordinals: [\n {\n destination: receiverAddress,\n id: inscriptionId,\n },\n ],\n paymentType: \"p2wpkh\",\n sender: fromAddress,\n feeRate: options?.feeRate,\n }),\n )\n return { txid }\n }\n\n async signAndFinalizePsbt(\n psbtHex: string,\n signIndices: [address: string, signIndex: number][],\n ): Promise<{\n signedPsbtHex: string\n }> {\n const accounts = await this.getAddresses()\n const signingAccount = accounts.find(\n account => account.address === signIndices[0]?.[0],\n )\n if (signingAccount == null) {\n throw new WalletAdapterNotConnectedError(metadata.name)\n }\n\n const resp: any = await handleRpcError(\n /**\n * https://leather.gitbook.io/developers/bitcoin-methods/signandfinalizepsbt\n */\n (this.request as any)(\"signAndFinalizePsbt\", {\n hex: psbtHex,\n inputsToSign: signIndices.map(([address, signIndex]) => ({\n address,\n signingIndexes: [signIndex],\n signatureHash: undefined,\n disableTweakSigner: undefined,\n })),\n paymentType:\n signingAccount.addressType === WalletAdapterAddressType.P2TR\n ? \"p2tr\"\n : \"p2wpkh\",\n }),\n )\n\n return { signedPsbtHex: resp.hex }\n }\n\n onAddressesChanged(callback: WalletAdapter_onAddressesChanged_callback): {\n unsubscribe: () => void\n } {\n // Leather doesn't provide event, fallback to polling\n let stopped = false\n\n const tick = async (): Promise<void> => {\n if (stopped) return\n try {\n const addresses = await this.getAddresses()\n callback({ addresses })\n } catch (error) {\n if (error instanceof WalletAdapterNotConnectedError) {\n stopped = true\n return\n }\n console.warn(\"[Leather] Failed to get addresses on change:\", error)\n } finally {\n if (!stopped) {\n setTimeout(tick, 1000)\n }\n }\n }\n\n setTimeout(tick, 1000)\n\n return {\n unsubscribe: () => {\n stopped = true\n },\n }\n }\n}\n\nexport class LeatherWalletAdapterError extends BitcoinWalletAdapterError {\n constructor(rpcError: RpcErrorResponse<RpcErrorBody>) {\n super(\"Leather wallet error: \" + rpcError.error.message, {\n cause: rpcError,\n })\n }\n}\n\nconst handleRpcError = async <T>(\n promise: Promise<T>,\n): Promise<NonNullable<T>> => {\n try {\n return (await promise) as NonNullable<T>\n } catch (e: any) {\n if (e instanceof UserRejectError) {\n throw e\n }\n\n if (e.error?.code === RpcErrorCode.USER_REJECTION) {\n throw new UserRejectError()\n }\n\n throw new LeatherWalletAdapterError(e)\n }\n}\n"],"names":["localStorageKeyPrefix","LOCAL_STORAGE_KEY_PREFIX","adapterId","connectedAddress_localStorageKey","LeatherWalletAdapterImpl","request","resp","stored","handleRpcError","WalletAdapterNotConnectedError","metadata","addresses","a","isMainnet","WalletAdapterBitcoinNetwork","WalletAdapterAddressPurpose","WalletAdapterAddressType","hex","addressToScriptPubKey","getBitcoinNetwork","getTapInternalKeyOf_P2TR_publicKey","address","message","addressType","paymentType","BitcoinWalletAdapterError","SignMessageAlgorithm","fromAddress","receiverAddress","satoshiAmount","options","inscriptionId","txid","psbtHex","signIndices","signingAccount","account","signIndex","callback","stopped","tick","error","LeatherWalletAdapterError","rpcError","promise","UserRejectError"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./index-jRY8YhyK.js"),y=require("./constants-Dr0_Mix2.js"),s=require("./WalletAdapters.types-CExaiK0o.js"),A=`${y.LOCAL_STORAGE_KEY_PREFIX}:${a.adapterId}`,l=`${A}:connectedAddress`;class g{constructor(e){this.request=e}retrieveConnectedAddress(){let e;const r=localStorage.getItem(l)||void 0;if(r!=null)try{if(e=JSON.parse(r),e==null||!("addresses"in e)||!Array.isArray(e.addresses))throw new Error("Invalid stored addresses")}catch{localStorage.removeItem(l)}return e}async connect(){if(this.retrieveConnectedAddress()==null){const e=await o(this.request("getAddresses"));localStorage.setItem(l,JSON.stringify(e))}}async disconnect(){return localStorage.removeItem(l),Promise.resolve()}async getAddresses(){const e=this.retrieveConnectedAddress();if(e==null)throw new s.WalletAdapterNotConnectedError(a.metadata$1.name);const r=e.addresses.filter(t=>t.symbol==="BTC"&&t.type),n=r.filter(t=>t.type==="p2tr")[0].address.startsWith("bc");return r.map(t=>({network:n?s.WalletAdapterBitcoinNetwork.MAINNET:s.WalletAdapterBitcoinNetwork.TESTNET,purposes:t.type==="p2tr"?[s.WalletAdapterAddressPurpose.Ordinals,s.WalletAdapterAddressPurpose.BRC20,s.WalletAdapterAddressPurpose.Runes]:[s.WalletAdapterAddressPurpose.Bitcoin],addressType:t.type==="p2tr"?s.WalletAdapterAddressType.P2TR:s.WalletAdapterAddressType.P2WPKH,address:t.address,scriptPubKey:a.hex.encode(a.addressToScriptPubKey(a.getBitcoinNetwork(n?"mainnet":"testnet"),t.address)),publicKey:t.publicKey,tapInternalKey:t.type==="p2tr"?a.hex.encode(a.getTapInternalKeyOf_P2TR_publicKey(a.getBitcoinNetwork(n?"mainnet":"testnet"),a.hex.decode(t.publicKey))):void 0}))}async signMessage(e,r){const t=(await this.getAddresses()).find(p=>p.address===e)?.addressType,i=t===s.WalletAdapterAddressType.P2WPKH?"p2wpkh":t===s.WalletAdapterAddressType.P2TR?"p2tr":void 0;if(i==null)throw new a.BitcoinWalletAdapterError("Address is not supported");const d=await o(this.request("signMessage",{message:r,paymentType:i}));return{algorithm:d.algorithm==="ecdsa"?s.SignMessageAlgorithm.ECDSA:s.SignMessageAlgorithm.BIP322,result:d.signature,address:e,publicKey:d.publicKey}}sendBitcoinFeeRateCapability="required";async sendBitcoin(e,r,n,t){return{txid:(await o(this.request("sendBitcoin",{origin:e,destination:r,amount:n,feeRate:t?.feeRate}))).txid}}sendInscriptionFeeRateCapability="available";async sendInscription(e,r,n,t){const{txid:i}=await o(this.request("sendOrdinals",{ordinals:[{destination:r,id:n}],paymentType:"p2wpkh",sender:e,feeRate:t?.feeRate}));return{txid:i}}async signAndFinalizePsbt(e,r){const t=(await this.getAddresses()).find(d=>d.address===r[0]?.[0]);if(t==null)throw new s.WalletAdapterNotConnectedError(a.metadata$1.name);return{signedPsbtHex:(await o(this.request("signAndFinalizePsbt",{hex:e,inputsToSign:r.map(([d,p])=>({address:d,signingIndexes:[p],signatureHash:void 0,disableTweakSigner:void 0})),paymentType:t.addressType===s.WalletAdapterAddressType.P2TR?"p2tr":"p2wpkh"}))).hex}}onAddressesChanged(e){let r=!1;const n=async()=>{if(!r)try{const t=await this.getAddresses();e({addresses:t})}catch(t){if(t instanceof s.WalletAdapterNotConnectedError){r=!0;return}console.warn("[Leather] Failed to get addresses on change:",t)}finally{r||setTimeout(n,1e3)}};return setTimeout(n,1e3),{unsubscribe:()=>{r=!0}}}}class u extends a.BitcoinWalletAdapterError{constructor(e){super("Leather wallet error: "+e.error.message,{cause:e})}}const o=async c=>{try{return await c}catch(e){throw e instanceof a.UserRejectError?e:e.error?.code===4001?new a.UserRejectError:new u(e)}};exports.LeatherWalletAdapterError=u;exports.LeatherWalletAdapterImpl=g;
|
|
2
|
+
//# sourceMappingURL=LeatherWalletAdapter.impl-BIWirus3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LeatherWalletAdapter.impl-BIWirus3.js","sources":["../src/adapters/LeatherWalletAdapter.impl.ts"],"sourcesContent":["import type { RequestFn, RpcErrorBody, RpcErrorResponse } from \"@leather.io/rpc\"\nimport { hex } from \"@scure/base\"\nimport { LOCAL_STORAGE_KEY_PREFIX } from \"../constants\"\nimport {\n addressToScriptPubKey,\n getTapInternalKeyOf_P2TR_publicKey,\n} from \"../utils/bitcoinAddressHelpers\"\nimport { getBitcoinNetwork } from \"../utils/bitcoinNetworkHelpers\"\nimport { BitcoinWalletAdapterError, UserRejectError } from \"../utils/error\"\nimport {\n SignMessageAlgorithm,\n SignMessageResult,\n WalletAdapter,\n WalletAdapter_onAddressesChanged_callback,\n WalletAdapterAddress,\n WalletAdapterAddressPurpose,\n WalletAdapterAddressType,\n WalletAdapterBitcoinNetwork,\n WalletAdapterNotConnectedError,\n} from \"../WalletAdapters.types\"\nimport { adapterId, metadata } from \"./LeatherWalletAdapter\"\n\ntype GetAddressesResponseData = any\n\n/**\n * https://github.com/leather-io/mono/blob/a664e64040fed1c25abef1f8864a1c7fae5444c1/packages/rpc/src/rpc/schemas.ts#L64-L78\n */\nenum RpcErrorCode {\n // Spec defined server errors\n PARSE_ERROR = -32700,\n INVALID_REQUEST = -32600,\n METHOD_NOT_FOUND = -32601,\n INVALID_PARAMS = -32602,\n INTERNAL_ERROR = -32603,\n SERVER_ERROR = -32000,\n // Client defined errors\n USER_REJECTION = 4001,\n METHOD_NOT_SUPPORTED = 4002,\n // gRPC spec borrowed\n PERMISSION_DENIED = 7,\n UNAUTHENTICATED = 16,\n}\n\ntype Addresses = (WalletAdapterAddress & { publicKey: string })[]\n\nconst localStorageKeyPrefix = `${LOCAL_STORAGE_KEY_PREFIX}:${adapterId}`\nconst connectedAddress_localStorageKey = `${localStorageKeyPrefix}:connectedAddress`\n\n/**\n * Derivation path (BIP-84): m/84'/0'/ account_index '/0/0\n */\nexport class LeatherWalletAdapterImpl implements WalletAdapter {\n constructor(private request: RequestFn) {}\n\n private retrieveConnectedAddress(): GetAddressesResponseData | undefined {\n let resp: GetAddressesResponseData | undefined\n const stored =\n localStorage.getItem(connectedAddress_localStorageKey) || undefined\n if (stored != null) {\n try {\n resp = JSON.parse(stored)\n if (\n resp == null ||\n !(\"addresses\" in resp) ||\n !Array.isArray(resp.addresses)\n ) {\n throw new Error(\"Invalid stored addresses\")\n }\n } catch {\n localStorage.removeItem(connectedAddress_localStorageKey)\n }\n }\n return resp\n }\n\n async connect(): Promise<void> {\n if (this.retrieveConnectedAddress() == null) {\n const resp = await handleRpcError(\n /**\n * https://leather.gitbook.io/developers/bitcoin/connect-users/get-addresses\n */\n this.request(\"getAddresses\"),\n )\n localStorage.setItem(\n connectedAddress_localStorageKey,\n JSON.stringify(resp),\n )\n }\n }\n\n async disconnect(): Promise<void> {\n localStorage.removeItem(connectedAddress_localStorageKey)\n return Promise.resolve()\n }\n\n async getAddresses(): Promise<Addresses> {\n const resp = this.retrieveConnectedAddress()\n\n if (resp == null) {\n throw new WalletAdapterNotConnectedError(metadata.name)\n }\n\n const addresses = resp.addresses.filter(\n (a: any) => (a as any).symbol === \"BTC\" && a.type,\n )\n\n const isMainnet = addresses\n .filter((a: any) => a.type === \"p2tr\")[0]\n .address.startsWith(\"bc\")\n\n return addresses.map((a: any) => ({\n network: isMainnet\n ? WalletAdapterBitcoinNetwork.MAINNET\n : WalletAdapterBitcoinNetwork.TESTNET,\n purposes:\n a.type === \"p2tr\"\n ? [\n WalletAdapterAddressPurpose.Ordinals,\n WalletAdapterAddressPurpose.BRC20,\n WalletAdapterAddressPurpose.Runes,\n ]\n : [WalletAdapterAddressPurpose.Bitcoin],\n addressType:\n a.type === \"p2tr\"\n ? WalletAdapterAddressType.P2TR\n : WalletAdapterAddressType.P2WPKH,\n address: a.address,\n scriptPubKey: hex.encode(\n addressToScriptPubKey(\n getBitcoinNetwork(isMainnet ? \"mainnet\" : \"testnet\"),\n a.address,\n ),\n ),\n publicKey: a.publicKey!,\n tapInternalKey:\n a.type === \"p2tr\"\n ? hex.encode(\n getTapInternalKeyOf_P2TR_publicKey(\n getBitcoinNetwork(isMainnet ? \"mainnet\" : \"testnet\"),\n hex.decode(a.publicKey!),\n ),\n )\n : undefined,\n }))\n }\n\n async signMessage(\n address: string,\n message: string,\n ): Promise<SignMessageResult> {\n const accounts = await this.getAddresses()\n\n const addressType = accounts.find(a => a.address === address)?.addressType\n\n // prettier-ignore\n const paymentType =\n addressType === WalletAdapterAddressType.P2WPKH ? 'p2wpkh' as const :\n addressType === WalletAdapterAddressType.P2TR ? 'p2tr' as const :\n undefined\n if (paymentType == null) {\n throw new BitcoinWalletAdapterError(\"Address is not supported\")\n }\n\n const resp: any = await handleRpcError(\n /**\n * https://leather.gitbook.io/developers/bitcoin-methods/signmessage\n */\n this.request(\"signMessage\", {\n message,\n paymentType,\n }),\n )\n\n return {\n algorithm:\n resp.algorithm === \"ecdsa\"\n ? SignMessageAlgorithm.ECDSA\n : SignMessageAlgorithm.BIP322,\n result: resp.signature,\n address,\n publicKey: resp.publicKey,\n }\n }\n\n sendBitcoinFeeRateCapability = \"required\" as const\n async sendBitcoin(\n fromAddress: string,\n receiverAddress: string,\n satoshiAmount: bigint,\n options?: { feeRate?: number },\n ): Promise<{ txid: string }> {\n const resp: any = await handleRpcError(\n /**\n * https://leather.gitbook.io/developers/bitcoin-methods/sendbitcoin\n */\n (this.request as any)(\"sendBitcoin\", {\n origin: fromAddress,\n destination: receiverAddress,\n amount: satoshiAmount,\n feeRate: options?.feeRate,\n }),\n )\n return { txid: resp.txid }\n }\n\n /**\n * @internal\n * @experimental\n */\n sendInscriptionFeeRateCapability = \"available\" as const\n /**\n * @internal\n * @experimental\n */\n async sendInscription(\n fromAddress: string,\n receiverAddress: string,\n inscriptionId: string,\n options?: { feeRate?: number },\n ): Promise<{ txid: string }> {\n const { txid }: any = await handleRpcError(\n /**\n * https://leather.gitbook.io/developers/ordinals/send-ordinals\n */\n (this.request as any)(\"sendOrdinals\", {\n ordinals: [\n {\n destination: receiverAddress,\n id: inscriptionId,\n },\n ],\n paymentType: \"p2wpkh\",\n sender: fromAddress,\n feeRate: options?.feeRate,\n }),\n )\n return { txid }\n }\n\n async signAndFinalizePsbt(\n psbtHex: string,\n signIndices: [address: string, signIndex: number][],\n ): Promise<{\n signedPsbtHex: string\n }> {\n const accounts = await this.getAddresses()\n const signingAccount = accounts.find(\n account => account.address === signIndices[0]?.[0],\n )\n if (signingAccount == null) {\n throw new WalletAdapterNotConnectedError(metadata.name)\n }\n\n const resp: any = await handleRpcError(\n /**\n * https://leather.gitbook.io/developers/bitcoin-methods/signandfinalizepsbt\n */\n (this.request as any)(\"signAndFinalizePsbt\", {\n hex: psbtHex,\n inputsToSign: signIndices.map(([address, signIndex]) => ({\n address,\n signingIndexes: [signIndex],\n signatureHash: undefined,\n disableTweakSigner: undefined,\n })),\n paymentType:\n signingAccount.addressType === WalletAdapterAddressType.P2TR\n ? \"p2tr\"\n : \"p2wpkh\",\n }),\n )\n\n return { signedPsbtHex: resp.hex }\n }\n\n onAddressesChanged(callback: WalletAdapter_onAddressesChanged_callback): {\n unsubscribe: () => void\n } {\n // Leather doesn't provide event, fallback to polling\n let stopped = false\n\n const tick = async (): Promise<void> => {\n if (stopped) return\n try {\n const addresses = await this.getAddresses()\n callback({ addresses })\n } catch (error) {\n if (error instanceof WalletAdapterNotConnectedError) {\n stopped = true\n return\n }\n console.warn(\"[Leather] Failed to get addresses on change:\", error)\n } finally {\n if (!stopped) {\n setTimeout(tick, 1000)\n }\n }\n }\n\n setTimeout(tick, 1000)\n\n return {\n unsubscribe: () => {\n stopped = true\n },\n }\n }\n}\n\nexport class LeatherWalletAdapterError extends BitcoinWalletAdapterError {\n constructor(rpcError: RpcErrorResponse<RpcErrorBody>) {\n super(\"Leather wallet error: \" + rpcError.error.message, {\n cause: rpcError,\n })\n }\n}\n\nconst handleRpcError = async <T>(\n promise: Promise<T>,\n): Promise<NonNullable<T>> => {\n try {\n return (await promise) as NonNullable<T>\n } catch (e: any) {\n if (e instanceof UserRejectError) {\n throw e\n }\n\n if (e.error?.code === RpcErrorCode.USER_REJECTION) {\n throw new UserRejectError()\n }\n\n throw new LeatherWalletAdapterError(e)\n }\n}\n"],"names":["localStorageKeyPrefix","LOCAL_STORAGE_KEY_PREFIX","adapterId","connectedAddress_localStorageKey","LeatherWalletAdapterImpl","request","resp","stored","handleRpcError","WalletAdapterNotConnectedError","metadata","addresses","a","isMainnet","WalletAdapterBitcoinNetwork","WalletAdapterAddressPurpose","WalletAdapterAddressType","hex","addressToScriptPubKey","getBitcoinNetwork","getTapInternalKeyOf_P2TR_publicKey","address","message","addressType","paymentType","BitcoinWalletAdapterError","SignMessageAlgorithm","fromAddress","receiverAddress","satoshiAmount","options","inscriptionId","txid","psbtHex","signIndices","signingAccount","account","signIndex","callback","stopped","tick","error","LeatherWalletAdapterError","rpcError","promise","UserRejectError"],"mappings":"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"}
|