bitcoin-wallet-connector 0.1.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.
Files changed (158) hide show
  1. package/README.md +208 -0
  2. package/lib/BitcoinConnectionProvider.d.ts +23 -0
  3. package/lib/BitcoinWalletAdapterConnector-Bq835yj0.mjs +123 -0
  4. package/lib/BitcoinWalletAdapterConnector-Bq835yj0.mjs.map +1 -0
  5. package/lib/BitcoinWalletAdapterConnector-DMef0iHV.js +2 -0
  6. package/lib/BitcoinWalletAdapterConnector-DMef0iHV.js.map +1 -0
  7. package/lib/BitcoinWalletAdapterConnector.d.ts +30 -0
  8. package/lib/BitgetWalletAdapter.impl-C_HLO7Oi.mjs +10 -0
  9. package/lib/BitgetWalletAdapter.impl-C_HLO7Oi.mjs.map +1 -0
  10. package/lib/BitgetWalletAdapter.impl-CxnKMf7U.js +2 -0
  11. package/lib/BitgetWalletAdapter.impl-CxnKMf7U.js.map +1 -0
  12. package/lib/LeatherWalletAdapter.impl-B2QgX_tO.js +2 -0
  13. package/lib/LeatherWalletAdapter.impl-B2QgX_tO.js.map +1 -0
  14. package/lib/LeatherWalletAdapter.impl-RUYx555r.mjs +184 -0
  15. package/lib/LeatherWalletAdapter.impl-RUYx555r.mjs.map +1 -0
  16. package/lib/MagicEdenWalletAdapter.impl-CrA6SGvG.mjs +235 -0
  17. package/lib/MagicEdenWalletAdapter.impl-CrA6SGvG.mjs.map +1 -0
  18. package/lib/MagicEdenWalletAdapter.impl-Di3Nu2S5.js +2 -0
  19. package/lib/MagicEdenWalletAdapter.impl-Di3Nu2S5.js.map +1 -0
  20. package/lib/OkxWalletAdapter.impl-BepoUL1B.mjs +67 -0
  21. package/lib/OkxWalletAdapter.impl-BepoUL1B.mjs.map +1 -0
  22. package/lib/OkxWalletAdapter.impl-C8kesjGu.js +2 -0
  23. package/lib/OkxWalletAdapter.impl-C8kesjGu.js.map +1 -0
  24. package/lib/UnisatCompatibleWalletAdapterImpl-Cq2Oqk1b.js +2 -0
  25. package/lib/UnisatCompatibleWalletAdapterImpl-Cq2Oqk1b.js.map +1 -0
  26. package/lib/UnisatCompatibleWalletAdapterImpl-M38FqkZI.mjs +137 -0
  27. package/lib/UnisatCompatibleWalletAdapterImpl-M38FqkZI.mjs.map +1 -0
  28. package/lib/UnisatWalletAdapter.impl-CJB22se8.mjs +14 -0
  29. package/lib/UnisatWalletAdapter.impl-CJB22se8.mjs.map +1 -0
  30. package/lib/UnisatWalletAdapter.impl-EISvxdpc.js +2 -0
  31. package/lib/UnisatWalletAdapter.impl-EISvxdpc.js.map +1 -0
  32. package/lib/WalletAdapters.types-CnvOqHFH.mjs +32 -0
  33. package/lib/WalletAdapters.types-CnvOqHFH.mjs.map +1 -0
  34. package/lib/WalletAdapters.types-De_x1lzr.js +2 -0
  35. package/lib/WalletAdapters.types-De_x1lzr.js.map +1 -0
  36. package/lib/WalletAdapters.types.d.ts +110 -0
  37. package/lib/XverseCompatibleWalletAdapterImpl-Bf-BK5VK.js +2 -0
  38. package/lib/XverseCompatibleWalletAdapterImpl-Bf-BK5VK.js.map +1 -0
  39. package/lib/XverseCompatibleWalletAdapterImpl-DXKnO_-V.mjs +151 -0
  40. package/lib/XverseCompatibleWalletAdapterImpl-DXKnO_-V.mjs.map +1 -0
  41. package/lib/XverseWalletAdapter.impl-CZO0RQva.mjs +105 -0
  42. package/lib/XverseWalletAdapter.impl-CZO0RQva.mjs.map +1 -0
  43. package/lib/XverseWalletAdapter.impl-lJwMi-Iv.js +2 -0
  44. package/lib/XverseWalletAdapter.impl-lJwMi-Iv.js.map +1 -0
  45. package/lib/adapters/BitgetWalletAdapter.d.ts +2 -0
  46. package/lib/adapters/BitgetWalletAdapter.impl.d.ts +8 -0
  47. package/lib/adapters/LeatherWalletAdapter.d.ts +2 -0
  48. package/lib/adapters/LeatherWalletAdapter.impl.d.ts +41 -0
  49. package/lib/adapters/MagicEdenWalletAdapter.d.ts +11 -0
  50. package/lib/adapters/MagicEdenWalletAdapter.impl.d.ts +22 -0
  51. package/lib/adapters/MockAddressWalletAdapter.d.ts +33 -0
  52. package/lib/adapters/OkxWalletAdapter.d.ts +2 -0
  53. package/lib/adapters/OkxWalletAdapter.impl.d.ts +51 -0
  54. package/lib/adapters/UnisatWalletAdapter.d.ts +2 -0
  55. package/lib/adapters/UnisatWalletAdapter.impl.d.ts +14 -0
  56. package/lib/adapters/XverseWalletAdapter.d.ts +3 -0
  57. package/lib/adapters/XverseWalletAdapter.impl.d.ts +14 -0
  58. package/lib/adapters/index.d.ts +7 -0
  59. package/lib/adapters.js +2 -0
  60. package/lib/adapters.js.map +1 -0
  61. package/lib/adapters.mjs +11 -0
  62. package/lib/adapters.mjs.map +1 -0
  63. package/lib/bitget-C7oB4Ffq.mjs +5 -0
  64. package/lib/bitget-C7oB4Ffq.mjs.map +1 -0
  65. package/lib/bitget-DXnsxx_y.js +2 -0
  66. package/lib/bitget-DXnsxx_y.js.map +1 -0
  67. package/lib/index-CaV3F1Nm.js +424 -0
  68. package/lib/index-CaV3F1Nm.js.map +1 -0
  69. package/lib/index-CcQUdePc.mjs +12224 -0
  70. package/lib/index-CcQUdePc.mjs.map +1 -0
  71. package/lib/index-D7YwhNAG.mjs +3946 -0
  72. package/lib/index-D7YwhNAG.mjs.map +1 -0
  73. package/lib/index-Zx0KcpYx.js +2 -0
  74. package/lib/index-Zx0KcpYx.js.map +1 -0
  75. package/lib/index.d.ts +3 -0
  76. package/lib/index.js +2 -0
  77. package/lib/index.js.map +1 -0
  78. package/lib/index.mjs +20 -0
  79. package/lib/index.mjs.map +1 -0
  80. package/lib/leather-BoQG_CPn.mjs +5 -0
  81. package/lib/leather-BoQG_CPn.mjs.map +1 -0
  82. package/lib/leather-DJ8nWmM8.js +2 -0
  83. package/lib/leather-DJ8nWmM8.js.map +1 -0
  84. package/lib/magiceden-B36CEQa6.js +2 -0
  85. package/lib/magiceden-B36CEQa6.js.map +1 -0
  86. package/lib/magiceden-Cg7d3agI.mjs +5 -0
  87. package/lib/magiceden-Cg7d3agI.mjs.map +1 -0
  88. package/lib/misc-B5EWO_dn.mjs +10 -0
  89. package/lib/misc-B5EWO_dn.mjs.map +1 -0
  90. package/lib/misc-CigR0RqC.js +2 -0
  91. package/lib/misc-CigR0RqC.js.map +1 -0
  92. package/lib/okx-ChwzM0dK.js +2 -0
  93. package/lib/okx-ChwzM0dK.js.map +1 -0
  94. package/lib/okx-DWbHwazu.mjs +5 -0
  95. package/lib/okx-DWbHwazu.mjs.map +1 -0
  96. package/lib/react.d.ts +2 -0
  97. package/lib/react.js +2 -0
  98. package/lib/react.js.map +1 -0
  99. package/lib/react.mjs +128 -0
  100. package/lib/react.mjs.map +1 -0
  101. package/lib/transaction-CiLOYSE_.mjs +1063 -0
  102. package/lib/transaction-CiLOYSE_.mjs.map +1 -0
  103. package/lib/transaction-CzdnbXSo.js +2 -0
  104. package/lib/transaction-CzdnbXSo.js.map +1 -0
  105. package/lib/unisat-BvZW5h0U.js +2 -0
  106. package/lib/unisat-BvZW5h0U.js.map +1 -0
  107. package/lib/unisat-pLgab4nG.mjs +5 -0
  108. package/lib/unisat-pLgab4nG.mjs.map +1 -0
  109. package/lib/utils/StateChannel.d.ts +14 -0
  110. package/lib/utils/UnisatCompatibleWalletAdapterImpl.d.ts +99 -0
  111. package/lib/utils/XverseCompatibleWalletAdapterImpl.d.ts +80 -0
  112. package/lib/utils/XverseCompatibleWalletAdapterImpl_legacy.d.ts +44 -0
  113. package/lib/utils/bitcoinAddressHelpers.d.ts +14 -0
  114. package/lib/utils/bitcoinNetworkHelpers.d.ts +4 -0
  115. package/lib/utils/createAdapterAvailability.d.ts +15 -0
  116. package/lib/utils/error.d.ts +6 -0
  117. package/lib/utils/misc.d.ts +3 -0
  118. package/lib/xverse-IKOHyGi-.js +2 -0
  119. package/lib/xverse-IKOHyGi-.js.map +1 -0
  120. package/lib/xverse-iHLNanCB.mjs +5 -0
  121. package/lib/xverse-iHLNanCB.mjs.map +1 -0
  122. package/package.json +86 -0
  123. package/src/BitcoinConnectionProvider.stories.tsx +329 -0
  124. package/src/BitcoinConnectionProvider.tsx +234 -0
  125. package/src/BitcoinWalletAdapterConnector.ts +166 -0
  126. package/src/WalletAdapters.types.ts +154 -0
  127. package/src/_/bitget.png +0 -0
  128. package/src/_/leather.svg +4 -0
  129. package/src/_/magiceden.png +0 -0
  130. package/src/_/okx.png +0 -0
  131. package/src/_/unisat.svg +31 -0
  132. package/src/_/xverse.png +0 -0
  133. package/src/adapters/BitgetWalletAdapter.impl.ts +22 -0
  134. package/src/adapters/BitgetWalletAdapter.ts +44 -0
  135. package/src/adapters/LeatherWalletAdapter.impl.ts +324 -0
  136. package/src/adapters/LeatherWalletAdapter.ts +35 -0
  137. package/src/adapters/MagicEdenWalletAdapter.impl.ts +139 -0
  138. package/src/adapters/MagicEdenWalletAdapter.ts +51 -0
  139. package/src/adapters/MockAddressWalletAdapter.ts +199 -0
  140. package/src/adapters/OkxWalletAdapter.impl.ts +168 -0
  141. package/src/adapters/OkxWalletAdapter.ts +37 -0
  142. package/src/adapters/UnisatWalletAdapter.impl.ts +32 -0
  143. package/src/adapters/UnisatWalletAdapter.ts +50 -0
  144. package/src/adapters/XverseWalletAdapter.impl.ts +150 -0
  145. package/src/adapters/XverseWalletAdapter.ts +37 -0
  146. package/src/adapters/index.ts +7 -0
  147. package/src/env.d.ts +9 -0
  148. package/src/index.ts +3 -0
  149. package/src/react.ts +9 -0
  150. package/src/utils/StateChannel.ts +39 -0
  151. package/src/utils/UnisatCompatibleWalletAdapterImpl.ts +342 -0
  152. package/src/utils/XverseCompatibleWalletAdapterImpl.ts +288 -0
  153. package/src/utils/XverseCompatibleWalletAdapterImpl_legacy.ts +278 -0
  154. package/src/utils/bitcoinAddressHelpers.ts +132 -0
  155. package/src/utils/bitcoinNetworkHelpers.ts +17 -0
  156. package/src/utils/createAdapterAvailability.ts +92 -0
  157. package/src/utils/error.ts +13 -0
  158. package/src/utils/misc.ts +10 -0
@@ -0,0 +1,184 @@
1
+ import { h as u, g as f, b as h, c as T } from "./index-D7YwhNAG.mjs";
2
+ import { d as y, b as i, a as d, W as g, B as A, S as w, U as m } from "./WalletAdapters.types-CnvOqHFH.mjs";
3
+ const b = "LeatherProvider.BitcoinProvider", c = `app:${b}:`;
4
+ class I {
5
+ constructor(e) {
6
+ this.request = e;
7
+ }
8
+ walletDisplayName = "Leather";
9
+ retrieveConnectedAddress() {
10
+ let e;
11
+ const s = localStorage.getItem(c) || void 0;
12
+ if (s != null)
13
+ try {
14
+ if (e = JSON.parse(s), e == null || !("addresses" in e) || !Array.isArray(e.addresses))
15
+ throw new Error("Invalid stored addresses");
16
+ } catch {
17
+ localStorage.removeItem(c);
18
+ }
19
+ return e;
20
+ }
21
+ async connect() {
22
+ if (this.retrieveConnectedAddress() == null) {
23
+ const e = await o(
24
+ /**
25
+ * https://leather.gitbook.io/developers/bitcoin/connect-users/get-addresses
26
+ */
27
+ this.request("getAddresses")
28
+ );
29
+ localStorage.setItem(c, JSON.stringify(e));
30
+ }
31
+ }
32
+ async disconnect() {
33
+ return localStorage.removeItem(c), Promise.resolve();
34
+ }
35
+ async getAddresses() {
36
+ const e = this.retrieveConnectedAddress();
37
+ if (e == null)
38
+ throw new y(this.walletDisplayName);
39
+ const s = e.addresses.filter(
40
+ (t) => t.symbol === "BTC" && t.type
41
+ ), r = s.filter((t) => t.type === "p2tr")[0].address.startsWith("bc");
42
+ return s.map((t) => ({
43
+ network: r ? g.MAINNET : g.TESTNET,
44
+ purposes: t.type === "p2tr" ? [
45
+ d.Ordinals,
46
+ d.BRC20,
47
+ d.Runes
48
+ ] : [d.Bitcoin],
49
+ addressType: t.type === "p2tr" ? i.P2TR : i.P2WPKH,
50
+ address: t.address,
51
+ scriptPubKey: u.encode(
52
+ T(
53
+ h(r ? "mainnet" : "testnet"),
54
+ t.address
55
+ )
56
+ ),
57
+ publicKey: t.publicKey,
58
+ tapInternalKey: t.type === "p2tr" ? u.encode(
59
+ f(
60
+ h(r ? "mainnet" : "testnet"),
61
+ u.decode(t.publicKey)
62
+ )
63
+ ) : void 0
64
+ }));
65
+ }
66
+ async signMessage(e, s) {
67
+ const t = (await this.getAddresses()).find((p) => p.address === e)?.addressType, n = t === i.P2WPKH ? "p2wpkh" : t === i.P2TR ? "p2tr" : void 0;
68
+ if (n == null)
69
+ throw new A("Address is not supported");
70
+ const a = await o(
71
+ /**
72
+ * https://leather.gitbook.io/developers/bitcoin-methods/signmessage
73
+ */
74
+ this.request("signMessage", {
75
+ message: s,
76
+ paymentType: n
77
+ })
78
+ );
79
+ return {
80
+ algorithm: a.algorithm === "ecdsa" ? w.ECDSA : w.BIP322,
81
+ result: a.signature,
82
+ address: e,
83
+ publicKey: a.publicKey
84
+ };
85
+ }
86
+ sendBitcoinFeeRateCapability = "required";
87
+ async sendBitcoin(e, s, r, t) {
88
+ return { txid: (await o(
89
+ /**
90
+ * https://leather.gitbook.io/developers/bitcoin-methods/sendbitcoin
91
+ */
92
+ this.request("sendBitcoin", {
93
+ origin: e,
94
+ destination: s,
95
+ amount: r,
96
+ feeRate: t?.feeRate
97
+ })
98
+ )).txid };
99
+ }
100
+ sendInscriptionFeeRateCapability = "available";
101
+ async sendInscription(e, s, r, t) {
102
+ const { txid: n } = await o(
103
+ /**
104
+ * https://leather.gitbook.io/developers/ordinals/send-ordinals
105
+ */
106
+ this.request("sendOrdinals", {
107
+ ordinals: [
108
+ {
109
+ destination: s,
110
+ id: r
111
+ }
112
+ ],
113
+ paymentType: "p2wpkh",
114
+ sender: e,
115
+ feeRate: t?.feeRate
116
+ })
117
+ );
118
+ return { txid: n };
119
+ }
120
+ async signAndFinalizePsbt(e, s) {
121
+ const t = (await this.getAddresses()).find(
122
+ (a) => a.address === s[0]?.[0]
123
+ );
124
+ if (t == null)
125
+ throw new y(this.walletDisplayName);
126
+ return { signedPsbtHex: (await o(
127
+ /**
128
+ * https://leather.gitbook.io/developers/bitcoin-methods/signandfinalizepsbt
129
+ */
130
+ this.request("signAndFinalizePsbt", {
131
+ hex: e,
132
+ inputsToSign: s.map(([a, p]) => ({
133
+ address: a,
134
+ signingIndexes: [p],
135
+ signatureHash: void 0,
136
+ disableTweakSigner: void 0
137
+ })),
138
+ paymentType: t.addressType === i.P2TR ? "p2tr" : "p2wpkh"
139
+ })
140
+ )).hex };
141
+ }
142
+ onAddressesChanged(e) {
143
+ let s = !1;
144
+ const r = async () => {
145
+ if (!s)
146
+ try {
147
+ const t = await this.getAddresses();
148
+ e({ addresses: t });
149
+ } catch (t) {
150
+ if (t instanceof y) {
151
+ s = !0;
152
+ return;
153
+ }
154
+ console.warn("[Leather] Failed to get addresses on change:", t);
155
+ } finally {
156
+ s || setTimeout(r, 1e3);
157
+ }
158
+ };
159
+ return setTimeout(r, 1e3), {
160
+ unsubscribe: () => {
161
+ s = !0;
162
+ }
163
+ };
164
+ }
165
+ }
166
+ class P extends A {
167
+ constructor(e) {
168
+ super("Leather wallet error: " + e.error.message, {
169
+ cause: e
170
+ });
171
+ }
172
+ }
173
+ const o = async (l) => {
174
+ try {
175
+ return await l;
176
+ } catch (e) {
177
+ throw e instanceof m ? e : e.error?.code === 4001 ? new m() : new P(e);
178
+ }
179
+ };
180
+ export {
181
+ P as LeatherWalletAdapterError,
182
+ I as LeatherWalletAdapterImpl
183
+ };
184
+ //# sourceMappingURL=LeatherWalletAdapter.impl-RUYx555r.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeatherWalletAdapter.impl-RUYx555r.mjs","sources":["../src/adapters/LeatherWalletAdapter.impl.ts"],"sourcesContent":["import type { RequestFn, RpcErrorBody, RpcErrorResponse } from \"@leather.io/rpc\"\nimport { hex } from \"@scure/base\"\nimport {\n addressToScriptPubKey,\n getTapInternalKeyOf_P2TR_publicKey,\n} from \"../utils/bitcoinAddressHelpers\"\nimport { getBitcoinNetwork } from \"../utils/bitcoinNetworkHelpers\"\nimport { UserRejectError, BitcoinWalletAdapterError } 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\"\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 LEATHER_PROVIDER_ID = \"LeatherProvider.BitcoinProvider\"\n\nconst localStorageKey = `app:${LEATHER_PROVIDER_ID}:`\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 readonly walletDisplayName = \"Leather\"\n\n private retrieveConnectedAddress(): GetAddressesResponseData | undefined {\n let resp: GetAddressesResponseData | undefined\n const stored = localStorage.getItem(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(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(localStorageKey, JSON.stringify(resp))\n }\n }\n\n async disconnect(): Promise<void> {\n localStorage.removeItem(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(this.walletDisplayName)\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 sendInscriptionFeeRateCapability = \"available\" as const\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(this.walletDisplayName)\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":["LEATHER_PROVIDER_ID","localStorageKey","LeatherWalletAdapterImpl","request","resp","stored","handleRpcError","WalletAdapterNotConnectedError","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,235 @@
1
+ import { i as u, h as l, j as P, c as y, b as w } from "./index-D7YwhNAG.mjs";
2
+ import { W as g, U as c, d as k, S as v, a as o, b as h } from "./WalletAdapters.types-CnvOqHFH.mjs";
3
+ import { a as S, b } from "./XverseCompatibleWalletAdapterImpl-DXKnO_-V.mjs";
4
+ import { T } from "./transaction-CiLOYSE_.mjs";
5
+ class N {
6
+ network;
7
+ localStorageKey;
8
+ walletDisplayName;
9
+ getProvider;
10
+ parseAddresses;
11
+ constructor(e) {
12
+ this.network = e.network, this.localStorageKey = e.localStorageKey, this.walletDisplayName = e.walletDisplayName, this.getProvider = e.getProvider, this.parseAddresses = e.parseAddresses;
13
+ }
14
+ async getSdk() {
15
+ return import("./index-CcQUdePc.mjs");
16
+ }
17
+ retrieveConnectedAddress() {
18
+ let e;
19
+ const r = localStorage.getItem(this.localStorageKey) || void 0;
20
+ if (r != null)
21
+ try {
22
+ if (e = JSON.parse(r), e == null || !("addresses" in e) || !Array.isArray(e.addresses))
23
+ throw new Error("Invalid stored addresses");
24
+ } catch {
25
+ localStorage.removeItem(this.localStorageKey);
26
+ }
27
+ return e;
28
+ }
29
+ async updateConnectedAddress(e) {
30
+ localStorage.setItem(this.localStorageKey, JSON.stringify({ addresses: e }));
31
+ }
32
+ async connect() {
33
+ if (this.retrieveConnectedAddress() == null) {
34
+ const e = await this.connectImpl();
35
+ await this.updateConnectedAddress(e.addresses);
36
+ }
37
+ }
38
+ async connectImpl() {
39
+ const e = await this.getSdk(), r = this.network === g.MAINNET ? e.BitcoinNetworkType.Mainnet : e.BitcoinNetworkType.Testnet;
40
+ return new Promise((t, a) => {
41
+ e.getAddress({
42
+ getProvider: () => this.getProvider(),
43
+ payload: {
44
+ purposes: [e.AddressPurpose.Ordinals, e.AddressPurpose.Payment],
45
+ message: "Address for receiving Ordinals and payments",
46
+ network: { type: r }
47
+ },
48
+ onFinish(n) {
49
+ t(n);
50
+ },
51
+ onCancel() {
52
+ a(new c());
53
+ }
54
+ }).catch(a);
55
+ });
56
+ }
57
+ async disconnect() {
58
+ return localStorage.removeItem(this.localStorageKey), Promise.resolve();
59
+ }
60
+ async getAddresses() {
61
+ const e = this.retrieveConnectedAddress();
62
+ if (e == null)
63
+ throw new k(this.walletDisplayName);
64
+ const r = await this.getSdk();
65
+ return this.parseAddresses({ sdk: r, addresses: e.addresses });
66
+ }
67
+ async signMessage(e, r) {
68
+ const t = await this.getSdk();
69
+ return new Promise((a, n) => {
70
+ t.signMessage({
71
+ getProvider: () => this.getProvider(),
72
+ payload: {
73
+ network: {
74
+ type: this.network === "mainnet" ? t.BitcoinNetworkType.Mainnet : t.BitcoinNetworkType.Testnet
75
+ },
76
+ address: e,
77
+ message: r,
78
+ protocol: t.MessageSigningProtocols.BIP322
79
+ },
80
+ onFinish(s) {
81
+ a({
82
+ result: s,
83
+ address: e,
84
+ algorithm: v.BIP322
85
+ });
86
+ },
87
+ onCancel() {
88
+ n(new c());
89
+ }
90
+ });
91
+ });
92
+ }
93
+ sendBitcoinFeeRateCapability = "unavailable";
94
+ async sendBitcoin(e, r, t) {
95
+ const a = (await this.getAddresses()).find(
96
+ (s) => s.purposes.includes(o.Bitcoin)
97
+ );
98
+ if (a == null)
99
+ throw new S({
100
+ code: b.INVALID_PARAMS,
101
+ message: "Bitcoin address not found"
102
+ });
103
+ const n = await this.getSdk();
104
+ return new Promise((s, i) => {
105
+ n.sendBtcTransaction({
106
+ getProvider: () => this.getProvider(),
107
+ payload: {
108
+ network: {
109
+ type: this.network === g.MAINNET ? n.BitcoinNetworkType.Mainnet : n.BitcoinNetworkType.Testnet
110
+ },
111
+ message: "Send Bitcoin",
112
+ recipients: [
113
+ {
114
+ address: r,
115
+ amountSats: BigInt(t)
116
+ }
117
+ ],
118
+ senderAddress: a.address
119
+ },
120
+ onFinish(d) {
121
+ return s({ txid: d });
122
+ },
123
+ onCancel() {
124
+ i(new c());
125
+ }
126
+ }).catch(i);
127
+ });
128
+ }
129
+ sendInscriptionFeeRateCapability = "unavailable";
130
+ async signAndFinalizePsbt(e, r) {
131
+ const t = await this.getSdk(), a = u.encode(l.decode(e)), n = await new Promise((i, d) => {
132
+ t.signTransaction({
133
+ getProvider: () => this.getProvider(),
134
+ payload: {
135
+ network: {
136
+ type: this.network === g.MAINNET ? t.BitcoinNetworkType.Mainnet : t.BitcoinNetworkType.Testnet
137
+ },
138
+ message: "Sign transaction",
139
+ psbtBase64: a,
140
+ inputsToSign: r.map(([p, A]) => ({
141
+ address: p,
142
+ signingIndexes: [A]
143
+ })),
144
+ broadcast: !1
145
+ },
146
+ onFinish(p) {
147
+ i(u.decode(p.psbtBase64));
148
+ },
149
+ onCancel() {
150
+ d(new c());
151
+ }
152
+ }).catch(d);
153
+ }), s = T.fromPSBT(n, {
154
+ allowUnknownInputs: !0,
155
+ allowUnknownOutputs: !0,
156
+ disableScriptCheck: !0,
157
+ allowLegacyWitnessUtxo: !0
158
+ });
159
+ return s.finalize(), { signedPsbtHex: l.encode(s.toPSBT()) };
160
+ }
161
+ onAddressesChanged(e) {
162
+ throw new Error("Not implemented");
163
+ }
164
+ }
165
+ const B = `app:${P}:`;
166
+ class M extends N {
167
+ magicEden;
168
+ constructor(e, r) {
169
+ super({
170
+ network: e,
171
+ localStorageKey: B,
172
+ walletDisplayName: "Magic Eden",
173
+ getProvider: async () => r,
174
+ parseAddresses: async ({ sdk: t, addresses: a }) => {
175
+ const n = a.filter((s) => s.purpose === t.AddressPurpose.Ordinals)[0].address.startsWith("bc");
176
+ return a.flatMap(
177
+ (s) => s.purpose === t.AddressPurpose.Payment ? [
178
+ {
179
+ addressType: h.P2WPKH,
180
+ purposes: [o.Bitcoin],
181
+ address: s.address,
182
+ network: this.network,
183
+ scriptPubKey: l.encode(
184
+ y(
185
+ w(n ? "mainnet" : "testnet"),
186
+ s.address
187
+ )
188
+ ),
189
+ publicKey: s.publicKey
190
+ }
191
+ ] : s.purpose === t.AddressPurpose.Ordinals ? [
192
+ {
193
+ addressType: h.P2TR,
194
+ purposes: [
195
+ o.Ordinals,
196
+ o.BRC20,
197
+ o.Runes
198
+ ],
199
+ address: s.address,
200
+ network: this.network,
201
+ scriptPubKey: l.encode(
202
+ y(
203
+ w(n ? "mainnet" : "testnet"),
204
+ s.address
205
+ )
206
+ ),
207
+ publicKey: s.publicKey,
208
+ tapInternalKey: s.publicKey
209
+ }
210
+ ] : []
211
+ );
212
+ }
213
+ }), this.magicEden = r;
214
+ }
215
+ onAddressesChanged(e) {
216
+ const r = this.magicEden, t = async (a) => {
217
+ try {
218
+ await this.updateConnectedAddress(a.accounts);
219
+ const n = await this.getAddresses();
220
+ e({ addresses: n });
221
+ } catch (n) {
222
+ console.warn("[Magic Eden] Failed to get addresses on change:", n);
223
+ }
224
+ };
225
+ return r.on("accountsChanged", t), {
226
+ unsubscribe: () => {
227
+ r.removeListener("accountsChanged", t);
228
+ }
229
+ };
230
+ }
231
+ }
232
+ export {
233
+ M as MagicEdenWalletAdapterImpl
234
+ };
235
+ //# sourceMappingURL=MagicEdenWalletAdapter.impl-CrA6SGvG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MagicEdenWalletAdapter.impl-CrA6SGvG.mjs","sources":["../src/utils/XverseCompatibleWalletAdapterImpl_legacy.ts","../src/adapters/MagicEdenWalletAdapter.impl.ts"],"sourcesContent":["import { base64, hex } from \"@scure/base\"\nimport * as btc from \"@scure/btc-signer\"\nimport { UserRejectError } from \"../utils/error\"\nimport {\n SignMessageAlgorithm,\n SignMessageResult,\n WalletAdapter,\n WalletAdapter_onAddressesChanged_callback,\n WalletAdapterAddress,\n WalletAdapterAddressPurpose,\n WalletAdapterBitcoinNetwork,\n WalletAdapterNotConnectedError,\n} from \"../WalletAdapters.types\"\nimport {\n XverseCompatibleProviderError,\n XverseRpcErrorCode,\n} from \"./XverseCompatibleWalletAdapterImpl\"\n\ntype GetAddressResponse = import(\"sats-connect\").GetAddressResponse\n\nexport type XverseCompatibleWalletAdapterGetProviderFn = () => Promise<\n import(\"sats-connect\").BitcoinProvider\n>\n\nexport type XverseCompatibleWalletAdapterParsedAddressesFn = (info: {\n sdk: typeof import(\"sats-connect\")\n addresses: import(\"sats-connect\").Address[]\n}) => Promise<XverseCompatibleWalletAdapterImplAddress[]>\n\nexport type XverseCompatibleWalletAdapterImplAddress = WalletAdapterAddress & {\n publicKey: string\n}\n\nexport class XverseCompatibleWalletAdapterImpl_legacy implements WalletAdapter {\n protected readonly network: WalletAdapterBitcoinNetwork\n protected readonly localStorageKey: string\n protected readonly walletDisplayName: string\n protected readonly getProvider: XverseCompatibleWalletAdapterGetProviderFn\n protected readonly parseAddresses: XverseCompatibleWalletAdapterParsedAddressesFn\n\n constructor(info: {\n network: WalletAdapterBitcoinNetwork\n localStorageKey: string\n walletDisplayName: string\n getProvider: XverseCompatibleWalletAdapterGetProviderFn\n parseAddresses: XverseCompatibleWalletAdapterParsedAddressesFn\n }) {\n this.network = info.network\n this.localStorageKey = info.localStorageKey\n this.walletDisplayName = info.walletDisplayName\n this.getProvider = info.getProvider\n this.parseAddresses = info.parseAddresses\n }\n\n private async getSdk(): Promise<typeof import(\"sats-connect\")> {\n return import(\"sats-connect\")\n }\n\n protected retrieveConnectedAddress(): GetAddressResponse | undefined {\n let resp: GetAddressResponse | undefined\n const stored = localStorage.getItem(this.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(this.localStorageKey)\n }\n }\n return resp\n }\n protected async updateConnectedAddress(\n addresses: GetAddressResponse[\"addresses\"],\n ): Promise<void> {\n localStorage.setItem(this.localStorageKey, JSON.stringify({ addresses }))\n }\n\n async connect(): Promise<void> {\n if (this.retrieveConnectedAddress() == null) {\n const resp = await this.connectImpl()\n await this.updateConnectedAddress(resp.addresses)\n }\n }\n private async connectImpl(): Promise<GetAddressResponse> {\n const sdk = await this.getSdk()\n\n const networkType =\n this.network === WalletAdapterBitcoinNetwork.MAINNET\n ? sdk.BitcoinNetworkType.Mainnet\n : sdk.BitcoinNetworkType.Testnet\n\n return new Promise<GetAddressResponse>((resolve, reject) => {\n void sdk\n .getAddress({\n getProvider: () => this.getProvider(),\n payload: {\n purposes: [sdk.AddressPurpose.Ordinals, sdk.AddressPurpose.Payment],\n message: \"Address for receiving Ordinals and payments\",\n network: { type: networkType },\n },\n onFinish(resp) {\n resolve(resp)\n },\n onCancel() {\n reject(new UserRejectError())\n },\n })\n .catch(reject)\n })\n }\n\n async disconnect(): Promise<void> {\n localStorage.removeItem(this.localStorageKey)\n return Promise.resolve()\n }\n\n async getAddresses(): Promise<XverseCompatibleWalletAdapterImplAddress[]> {\n const resp = this.retrieveConnectedAddress()\n\n if (resp == null) {\n throw new WalletAdapterNotConnectedError(this.walletDisplayName)\n }\n\n const sdk = await this.getSdk()\n\n return this.parseAddresses({ sdk, addresses: resp.addresses })\n }\n\n async signMessage(\n address: string,\n message: string,\n ): Promise<SignMessageResult> {\n const sdk = await this.getSdk()\n\n return new Promise((resolve, reject) => {\n /**\n * https://docs.xverse.app/sats-connect/methods/signmessage\n */\n void sdk.signMessage({\n getProvider: () => this.getProvider(),\n payload: {\n network: {\n type:\n this.network === \"mainnet\"\n ? sdk.BitcoinNetworkType.Mainnet\n : sdk.BitcoinNetworkType.Testnet,\n },\n address,\n message,\n protocol: sdk.MessageSigningProtocols.BIP322,\n },\n onFinish(resp) {\n resolve({\n result: resp,\n address,\n algorithm: SignMessageAlgorithm.BIP322,\n })\n },\n onCancel() {\n reject(new UserRejectError())\n },\n })\n })\n }\n\n sendBitcoinFeeRateCapability = \"unavailable\" as const\n async sendBitcoin(\n fromAddress: string,\n receiverAddress: string,\n satoshiAmount: bigint,\n ): Promise<{ txid: string }> {\n const senderAddress = (await this.getAddresses()).find(a =>\n a.purposes.includes(WalletAdapterAddressPurpose.Bitcoin),\n )\n if (senderAddress == null) {\n throw new XverseCompatibleProviderError({\n code: XverseRpcErrorCode.INVALID_PARAMS,\n message: \"Bitcoin address not found\",\n })\n }\n\n const sdk = await this.getSdk()\n\n return new Promise((resolve, reject) => {\n void sdk\n .sendBtcTransaction({\n getProvider: () => this.getProvider(),\n payload: {\n network: {\n type:\n this.network === WalletAdapterBitcoinNetwork.MAINNET\n ? sdk.BitcoinNetworkType.Mainnet\n : sdk.BitcoinNetworkType.Testnet,\n },\n message: \"Send Bitcoin\",\n recipients: [\n {\n address: receiverAddress,\n amountSats: BigInt(satoshiAmount),\n },\n ],\n senderAddress: senderAddress.address,\n },\n onFinish(resp) {\n return resolve({ txid: resp })\n },\n onCancel() {\n reject(new UserRejectError())\n },\n })\n .catch(reject)\n })\n }\n\n sendInscriptionFeeRateCapability = \"unavailable\" as const\n\n async signAndFinalizePsbt(\n psbtHex: string,\n signIndices: [address: string, signIndex: number][],\n ): Promise<{\n signedPsbtHex: string\n }> {\n const sdk = await this.getSdk()\n\n const psbtBase64 = base64.encode(hex.decode(psbtHex))\n\n const signedPsbt = await new Promise<Uint8Array>((resolve, reject) => {\n void sdk\n .signTransaction({\n getProvider: () => this.getProvider(),\n payload: {\n network: {\n type:\n this.network === WalletAdapterBitcoinNetwork.MAINNET\n ? sdk.BitcoinNetworkType.Mainnet\n : sdk.BitcoinNetworkType.Testnet,\n },\n message: \"Sign transaction\",\n psbtBase64,\n inputsToSign: signIndices.map(([address, signIndex]) => ({\n address,\n signingIndexes: [signIndex],\n })),\n broadcast: false,\n },\n onFinish(resp) {\n resolve(base64.decode(resp.psbtBase64))\n },\n onCancel() {\n reject(new UserRejectError())\n },\n })\n .catch(reject)\n })\n\n const tx = btc.Transaction.fromPSBT(signedPsbt, {\n allowUnknownInputs: true,\n allowUnknownOutputs: true,\n disableScriptCheck: true,\n allowLegacyWitnessUtxo: true,\n })\n tx.finalize()\n\n return { signedPsbtHex: hex.encode(tx.toPSBT()) }\n }\n\n onAddressesChanged(callback: WalletAdapter_onAddressesChanged_callback): {\n unsubscribe: () => void\n } {\n throw new Error(\"Not implemented\")\n }\n}\n","import { hex } from \"@scure/base\"\nimport { addressToScriptPubKey } from \"../utils/bitcoinAddressHelpers\"\nimport { getBitcoinNetwork } from \"../utils/bitcoinNetworkHelpers\"\nimport {\n WalletAdapter,\n WalletAdapter_onAddressesChanged_callback,\n WalletAdapterAddressPurpose,\n WalletAdapterAddressType,\n WalletAdapterBitcoinNetwork,\n} from \"../WalletAdapters.types\"\nimport {\n XverseCompatibleWalletAdapterImpl_legacy,\n XverseCompatibleWalletAdapterImplAddress,\n} from \"../utils/XverseCompatibleWalletAdapterImpl_legacy\"\nimport { MAGICEDEN_PROVIDER_ID } from \"./MagicEdenWalletAdapter\"\n\ninterface MagicEdenBitcoinProviderEvents {\n accountsChanged: [\n event: {\n accounts: import(\"sats-connect\").GetAddressResponse[\"addresses\"]\n },\n ]\n}\n\nexport interface MagicEdenBitcoinProvider {\n isMagicEden: boolean\n on: <K extends keyof MagicEdenBitcoinProviderEvents>(\n event: K,\n handler: (...args: MagicEdenBitcoinProviderEvents[K]) => void,\n ) => void\n removeListener: <K extends keyof MagicEdenBitcoinProviderEvents>(\n event: K,\n handler: (...args: MagicEdenBitcoinProviderEvents[K]) => void,\n ) => void\n}\n\nconst localStorageKey = `app:${MAGICEDEN_PROVIDER_ID}:`\n\nexport class MagicEdenWalletAdapterImpl\n extends XverseCompatibleWalletAdapterImpl_legacy\n implements WalletAdapter\n{\n private magicEden: MagicEdenBitcoinProvider\n\n constructor(\n network: WalletAdapterBitcoinNetwork,\n provider: MagicEdenBitcoinProvider,\n ) {\n super({\n network,\n localStorageKey,\n walletDisplayName: \"Magic Eden\",\n getProvider: async () => {\n return provider as any\n },\n parseAddresses: async ({ sdk, addresses }) => {\n const isMainnet = addresses\n .filter(a => a.purpose === sdk.AddressPurpose.Ordinals)[0]\n .address.startsWith(\"bc\")\n\n return addresses.flatMap(\n (a): XverseCompatibleWalletAdapterImplAddress[] => {\n if (a.purpose === sdk.AddressPurpose.Payment) {\n return [\n {\n addressType: WalletAdapterAddressType.P2WPKH,\n purposes: [WalletAdapterAddressPurpose.Bitcoin],\n address: a.address,\n network: this.network,\n scriptPubKey: hex.encode(\n addressToScriptPubKey(\n getBitcoinNetwork(isMainnet ? \"mainnet\" : \"testnet\"),\n a.address,\n ),\n ),\n publicKey: a.publicKey,\n },\n ]\n }\n\n if (a.purpose === sdk.AddressPurpose.Ordinals) {\n return [\n {\n addressType: WalletAdapterAddressType.P2TR,\n purposes: [\n WalletAdapterAddressPurpose.Ordinals,\n WalletAdapterAddressPurpose.BRC20,\n WalletAdapterAddressPurpose.Runes,\n ],\n address: a.address,\n network: this.network,\n scriptPubKey: hex.encode(\n addressToScriptPubKey(\n getBitcoinNetwork(isMainnet ? \"mainnet\" : \"testnet\"),\n a.address,\n ),\n ),\n publicKey: a.publicKey,\n tapInternalKey: a.publicKey,\n },\n ]\n }\n\n return []\n },\n )\n },\n })\n this.magicEden = provider\n }\n\n onAddressesChanged(callback: WalletAdapter_onAddressesChanged_callback): {\n unsubscribe: () => void\n } {\n // MagicEden uses accountsChanged event\n // https://docs-wallet.magiceden.io/bitcoin/provider-events\n const provider = this.magicEden\n\n const handler = async (event: {\n accounts: import(\"sats-connect\").GetAddressResponse[\"addresses\"]\n }): Promise<void> => {\n try {\n await this.updateConnectedAddress(event.accounts)\n const addresses = await this.getAddresses()\n callback({ addresses })\n } catch (error) {\n console.warn(\"[Magic Eden] Failed to get addresses on change:\", error)\n }\n }\n\n provider.on(\"accountsChanged\", handler)\n\n return {\n unsubscribe: () => {\n provider.removeListener(\"accountsChanged\", handler)\n },\n }\n }\n}\n"],"names":["XverseCompatibleWalletAdapterImpl_legacy","info","resp","stored","addresses","sdk","networkType","WalletAdapterBitcoinNetwork","resolve","reject","UserRejectError","WalletAdapterNotConnectedError","address","message","SignMessageAlgorithm","fromAddress","receiverAddress","satoshiAmount","senderAddress","a","WalletAdapterAddressPurpose","XverseCompatibleProviderError","XverseRpcErrorCode","psbtHex","signIndices","psbtBase64","base64","hex","signedPsbt","signIndex","tx","btc.Transaction","callback","localStorageKey","MAGICEDEN_PROVIDER_ID","MagicEdenWalletAdapterImpl","network","provider","isMainnet","WalletAdapterAddressType","addressToScriptPubKey","getBitcoinNetwork","handler","event","error"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./index-Zx0KcpYx.js"),a=require("./WalletAdapters.types-De_x1lzr.js"),p=require("./XverseCompatibleWalletAdapterImpl-Bf-BK5VK.js"),y=require("./transaction-CzdnbXSo.js");class w{network;localStorageKey;walletDisplayName;getProvider;parseAddresses;constructor(e){this.network=e.network,this.localStorageKey=e.localStorageKey,this.walletDisplayName=e.walletDisplayName,this.getProvider=e.getProvider,this.parseAddresses=e.parseAddresses}async getSdk(){return Promise.resolve().then(()=>require("./index-CaV3F1Nm.js"))}retrieveConnectedAddress(){let e;const r=localStorage.getItem(this.localStorageKey)||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(this.localStorageKey)}return e}async updateConnectedAddress(e){localStorage.setItem(this.localStorageKey,JSON.stringify({addresses:e}))}async connect(){if(this.retrieveConnectedAddress()==null){const e=await this.connectImpl();await this.updateConnectedAddress(e.addresses)}}async connectImpl(){const e=await this.getSdk(),r=this.network===a.WalletAdapterBitcoinNetwork.MAINNET?e.BitcoinNetworkType.Mainnet:e.BitcoinNetworkType.Testnet;return new Promise((t,o)=>{e.getAddress({getProvider:()=>this.getProvider(),payload:{purposes:[e.AddressPurpose.Ordinals,e.AddressPurpose.Payment],message:"Address for receiving Ordinals and payments",network:{type:r}},onFinish(n){t(n)},onCancel(){o(new a.UserRejectError)}}).catch(o)})}async disconnect(){return localStorage.removeItem(this.localStorageKey),Promise.resolve()}async getAddresses(){const e=this.retrieveConnectedAddress();if(e==null)throw new a.WalletAdapterNotConnectedError(this.walletDisplayName);const r=await this.getSdk();return this.parseAddresses({sdk:r,addresses:e.addresses})}async signMessage(e,r){const t=await this.getSdk();return new Promise((o,n)=>{t.signMessage({getProvider:()=>this.getProvider(),payload:{network:{type:this.network==="mainnet"?t.BitcoinNetworkType.Mainnet:t.BitcoinNetworkType.Testnet},address:e,message:r,protocol:t.MessageSigningProtocols.BIP322},onFinish(s){o({result:s,address:e,algorithm:a.SignMessageAlgorithm.BIP322})},onCancel(){n(new a.UserRejectError)}})})}sendBitcoinFeeRateCapability="unavailable";async sendBitcoin(e,r,t){const o=(await this.getAddresses()).find(s=>s.purposes.includes(a.WalletAdapterAddressPurpose.Bitcoin));if(o==null)throw new p.XverseCompatibleProviderError({code:p.XverseRpcErrorCode.INVALID_PARAMS,message:"Bitcoin address not found"});const n=await this.getSdk();return new Promise((s,d)=>{n.sendBtcTransaction({getProvider:()=>this.getProvider(),payload:{network:{type:this.network===a.WalletAdapterBitcoinNetwork.MAINNET?n.BitcoinNetworkType.Mainnet:n.BitcoinNetworkType.Testnet},message:"Send Bitcoin",recipients:[{address:r,amountSats:BigInt(t)}],senderAddress:o.address},onFinish(c){return s({txid:c})},onCancel(){d(new a.UserRejectError)}}).catch(d)})}sendInscriptionFeeRateCapability="unavailable";async signAndFinalizePsbt(e,r){const t=await this.getSdk(),o=i.base64.encode(i.hex.decode(e)),n=await new Promise((d,c)=>{t.signTransaction({getProvider:()=>this.getProvider(),payload:{network:{type:this.network===a.WalletAdapterBitcoinNetwork.MAINNET?t.BitcoinNetworkType.Mainnet:t.BitcoinNetworkType.Testnet},message:"Sign transaction",psbtBase64:o,inputsToSign:r.map(([l,u])=>({address:l,signingIndexes:[u]})),broadcast:!1},onFinish(l){d(i.base64.decode(l.psbtBase64))},onCancel(){c(new a.UserRejectError)}}).catch(c)}),s=y.Transaction.fromPSBT(n,{allowUnknownInputs:!0,allowUnknownOutputs:!0,disableScriptCheck:!0,allowLegacyWitnessUtxo:!0});return s.finalize(),{signedPsbtHex:i.hex.encode(s.toPSBT())}}onAddressesChanged(e){throw new Error("Not implemented")}}const h=`app:${i.MAGICEDEN_PROVIDER_ID}:`;class A extends w{magicEden;constructor(e,r){super({network:e,localStorageKey:h,walletDisplayName:"Magic Eden",getProvider:async()=>r,parseAddresses:async({sdk:t,addresses:o})=>{const n=o.filter(s=>s.purpose===t.AddressPurpose.Ordinals)[0].address.startsWith("bc");return o.flatMap(s=>s.purpose===t.AddressPurpose.Payment?[{addressType:a.WalletAdapterAddressType.P2WPKH,purposes:[a.WalletAdapterAddressPurpose.Bitcoin],address:s.address,network:this.network,scriptPubKey:i.hex.encode(i.addressToScriptPubKey(i.getBitcoinNetwork(n?"mainnet":"testnet"),s.address)),publicKey:s.publicKey}]:s.purpose===t.AddressPurpose.Ordinals?[{addressType:a.WalletAdapterAddressType.P2TR,purposes:[a.WalletAdapterAddressPurpose.Ordinals,a.WalletAdapterAddressPurpose.BRC20,a.WalletAdapterAddressPurpose.Runes],address:s.address,network:this.network,scriptPubKey:i.hex.encode(i.addressToScriptPubKey(i.getBitcoinNetwork(n?"mainnet":"testnet"),s.address)),publicKey:s.publicKey,tapInternalKey:s.publicKey}]:[])}}),this.magicEden=r}onAddressesChanged(e){const r=this.magicEden,t=async o=>{try{await this.updateConnectedAddress(o.accounts);const n=await this.getAddresses();e({addresses:n})}catch(n){console.warn("[Magic Eden] Failed to get addresses on change:",n)}};return r.on("accountsChanged",t),{unsubscribe:()=>{r.removeListener("accountsChanged",t)}}}}exports.MagicEdenWalletAdapterImpl=A;
2
+ //# sourceMappingURL=MagicEdenWalletAdapter.impl-Di3Nu2S5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MagicEdenWalletAdapter.impl-Di3Nu2S5.js","sources":["../src/utils/XverseCompatibleWalletAdapterImpl_legacy.ts","../src/adapters/MagicEdenWalletAdapter.impl.ts"],"sourcesContent":["import { base64, hex } from \"@scure/base\"\nimport * as btc from \"@scure/btc-signer\"\nimport { UserRejectError } from \"../utils/error\"\nimport {\n SignMessageAlgorithm,\n SignMessageResult,\n WalletAdapter,\n WalletAdapter_onAddressesChanged_callback,\n WalletAdapterAddress,\n WalletAdapterAddressPurpose,\n WalletAdapterBitcoinNetwork,\n WalletAdapterNotConnectedError,\n} from \"../WalletAdapters.types\"\nimport {\n XverseCompatibleProviderError,\n XverseRpcErrorCode,\n} from \"./XverseCompatibleWalletAdapterImpl\"\n\ntype GetAddressResponse = import(\"sats-connect\").GetAddressResponse\n\nexport type XverseCompatibleWalletAdapterGetProviderFn = () => Promise<\n import(\"sats-connect\").BitcoinProvider\n>\n\nexport type XverseCompatibleWalletAdapterParsedAddressesFn = (info: {\n sdk: typeof import(\"sats-connect\")\n addresses: import(\"sats-connect\").Address[]\n}) => Promise<XverseCompatibleWalletAdapterImplAddress[]>\n\nexport type XverseCompatibleWalletAdapterImplAddress = WalletAdapterAddress & {\n publicKey: string\n}\n\nexport class XverseCompatibleWalletAdapterImpl_legacy implements WalletAdapter {\n protected readonly network: WalletAdapterBitcoinNetwork\n protected readonly localStorageKey: string\n protected readonly walletDisplayName: string\n protected readonly getProvider: XverseCompatibleWalletAdapterGetProviderFn\n protected readonly parseAddresses: XverseCompatibleWalletAdapterParsedAddressesFn\n\n constructor(info: {\n network: WalletAdapterBitcoinNetwork\n localStorageKey: string\n walletDisplayName: string\n getProvider: XverseCompatibleWalletAdapterGetProviderFn\n parseAddresses: XverseCompatibleWalletAdapterParsedAddressesFn\n }) {\n this.network = info.network\n this.localStorageKey = info.localStorageKey\n this.walletDisplayName = info.walletDisplayName\n this.getProvider = info.getProvider\n this.parseAddresses = info.parseAddresses\n }\n\n private async getSdk(): Promise<typeof import(\"sats-connect\")> {\n return import(\"sats-connect\")\n }\n\n protected retrieveConnectedAddress(): GetAddressResponse | undefined {\n let resp: GetAddressResponse | undefined\n const stored = localStorage.getItem(this.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(this.localStorageKey)\n }\n }\n return resp\n }\n protected async updateConnectedAddress(\n addresses: GetAddressResponse[\"addresses\"],\n ): Promise<void> {\n localStorage.setItem(this.localStorageKey, JSON.stringify({ addresses }))\n }\n\n async connect(): Promise<void> {\n if (this.retrieveConnectedAddress() == null) {\n const resp = await this.connectImpl()\n await this.updateConnectedAddress(resp.addresses)\n }\n }\n private async connectImpl(): Promise<GetAddressResponse> {\n const sdk = await this.getSdk()\n\n const networkType =\n this.network === WalletAdapterBitcoinNetwork.MAINNET\n ? sdk.BitcoinNetworkType.Mainnet\n : sdk.BitcoinNetworkType.Testnet\n\n return new Promise<GetAddressResponse>((resolve, reject) => {\n void sdk\n .getAddress({\n getProvider: () => this.getProvider(),\n payload: {\n purposes: [sdk.AddressPurpose.Ordinals, sdk.AddressPurpose.Payment],\n message: \"Address for receiving Ordinals and payments\",\n network: { type: networkType },\n },\n onFinish(resp) {\n resolve(resp)\n },\n onCancel() {\n reject(new UserRejectError())\n },\n })\n .catch(reject)\n })\n }\n\n async disconnect(): Promise<void> {\n localStorage.removeItem(this.localStorageKey)\n return Promise.resolve()\n }\n\n async getAddresses(): Promise<XverseCompatibleWalletAdapterImplAddress[]> {\n const resp = this.retrieveConnectedAddress()\n\n if (resp == null) {\n throw new WalletAdapterNotConnectedError(this.walletDisplayName)\n }\n\n const sdk = await this.getSdk()\n\n return this.parseAddresses({ sdk, addresses: resp.addresses })\n }\n\n async signMessage(\n address: string,\n message: string,\n ): Promise<SignMessageResult> {\n const sdk = await this.getSdk()\n\n return new Promise((resolve, reject) => {\n /**\n * https://docs.xverse.app/sats-connect/methods/signmessage\n */\n void sdk.signMessage({\n getProvider: () => this.getProvider(),\n payload: {\n network: {\n type:\n this.network === \"mainnet\"\n ? sdk.BitcoinNetworkType.Mainnet\n : sdk.BitcoinNetworkType.Testnet,\n },\n address,\n message,\n protocol: sdk.MessageSigningProtocols.BIP322,\n },\n onFinish(resp) {\n resolve({\n result: resp,\n address,\n algorithm: SignMessageAlgorithm.BIP322,\n })\n },\n onCancel() {\n reject(new UserRejectError())\n },\n })\n })\n }\n\n sendBitcoinFeeRateCapability = \"unavailable\" as const\n async sendBitcoin(\n fromAddress: string,\n receiverAddress: string,\n satoshiAmount: bigint,\n ): Promise<{ txid: string }> {\n const senderAddress = (await this.getAddresses()).find(a =>\n a.purposes.includes(WalletAdapterAddressPurpose.Bitcoin),\n )\n if (senderAddress == null) {\n throw new XverseCompatibleProviderError({\n code: XverseRpcErrorCode.INVALID_PARAMS,\n message: \"Bitcoin address not found\",\n })\n }\n\n const sdk = await this.getSdk()\n\n return new Promise((resolve, reject) => {\n void sdk\n .sendBtcTransaction({\n getProvider: () => this.getProvider(),\n payload: {\n network: {\n type:\n this.network === WalletAdapterBitcoinNetwork.MAINNET\n ? sdk.BitcoinNetworkType.Mainnet\n : sdk.BitcoinNetworkType.Testnet,\n },\n message: \"Send Bitcoin\",\n recipients: [\n {\n address: receiverAddress,\n amountSats: BigInt(satoshiAmount),\n },\n ],\n senderAddress: senderAddress.address,\n },\n onFinish(resp) {\n return resolve({ txid: resp })\n },\n onCancel() {\n reject(new UserRejectError())\n },\n })\n .catch(reject)\n })\n }\n\n sendInscriptionFeeRateCapability = \"unavailable\" as const\n\n async signAndFinalizePsbt(\n psbtHex: string,\n signIndices: [address: string, signIndex: number][],\n ): Promise<{\n signedPsbtHex: string\n }> {\n const sdk = await this.getSdk()\n\n const psbtBase64 = base64.encode(hex.decode(psbtHex))\n\n const signedPsbt = await new Promise<Uint8Array>((resolve, reject) => {\n void sdk\n .signTransaction({\n getProvider: () => this.getProvider(),\n payload: {\n network: {\n type:\n this.network === WalletAdapterBitcoinNetwork.MAINNET\n ? sdk.BitcoinNetworkType.Mainnet\n : sdk.BitcoinNetworkType.Testnet,\n },\n message: \"Sign transaction\",\n psbtBase64,\n inputsToSign: signIndices.map(([address, signIndex]) => ({\n address,\n signingIndexes: [signIndex],\n })),\n broadcast: false,\n },\n onFinish(resp) {\n resolve(base64.decode(resp.psbtBase64))\n },\n onCancel() {\n reject(new UserRejectError())\n },\n })\n .catch(reject)\n })\n\n const tx = btc.Transaction.fromPSBT(signedPsbt, {\n allowUnknownInputs: true,\n allowUnknownOutputs: true,\n disableScriptCheck: true,\n allowLegacyWitnessUtxo: true,\n })\n tx.finalize()\n\n return { signedPsbtHex: hex.encode(tx.toPSBT()) }\n }\n\n onAddressesChanged(callback: WalletAdapter_onAddressesChanged_callback): {\n unsubscribe: () => void\n } {\n throw new Error(\"Not implemented\")\n }\n}\n","import { hex } from \"@scure/base\"\nimport { addressToScriptPubKey } from \"../utils/bitcoinAddressHelpers\"\nimport { getBitcoinNetwork } from \"../utils/bitcoinNetworkHelpers\"\nimport {\n WalletAdapter,\n WalletAdapter_onAddressesChanged_callback,\n WalletAdapterAddressPurpose,\n WalletAdapterAddressType,\n WalletAdapterBitcoinNetwork,\n} from \"../WalletAdapters.types\"\nimport {\n XverseCompatibleWalletAdapterImpl_legacy,\n XverseCompatibleWalletAdapterImplAddress,\n} from \"../utils/XverseCompatibleWalletAdapterImpl_legacy\"\nimport { MAGICEDEN_PROVIDER_ID } from \"./MagicEdenWalletAdapter\"\n\ninterface MagicEdenBitcoinProviderEvents {\n accountsChanged: [\n event: {\n accounts: import(\"sats-connect\").GetAddressResponse[\"addresses\"]\n },\n ]\n}\n\nexport interface MagicEdenBitcoinProvider {\n isMagicEden: boolean\n on: <K extends keyof MagicEdenBitcoinProviderEvents>(\n event: K,\n handler: (...args: MagicEdenBitcoinProviderEvents[K]) => void,\n ) => void\n removeListener: <K extends keyof MagicEdenBitcoinProviderEvents>(\n event: K,\n handler: (...args: MagicEdenBitcoinProviderEvents[K]) => void,\n ) => void\n}\n\nconst localStorageKey = `app:${MAGICEDEN_PROVIDER_ID}:`\n\nexport class MagicEdenWalletAdapterImpl\n extends XverseCompatibleWalletAdapterImpl_legacy\n implements WalletAdapter\n{\n private magicEden: MagicEdenBitcoinProvider\n\n constructor(\n network: WalletAdapterBitcoinNetwork,\n provider: MagicEdenBitcoinProvider,\n ) {\n super({\n network,\n localStorageKey,\n walletDisplayName: \"Magic Eden\",\n getProvider: async () => {\n return provider as any\n },\n parseAddresses: async ({ sdk, addresses }) => {\n const isMainnet = addresses\n .filter(a => a.purpose === sdk.AddressPurpose.Ordinals)[0]\n .address.startsWith(\"bc\")\n\n return addresses.flatMap(\n (a): XverseCompatibleWalletAdapterImplAddress[] => {\n if (a.purpose === sdk.AddressPurpose.Payment) {\n return [\n {\n addressType: WalletAdapterAddressType.P2WPKH,\n purposes: [WalletAdapterAddressPurpose.Bitcoin],\n address: a.address,\n network: this.network,\n scriptPubKey: hex.encode(\n addressToScriptPubKey(\n getBitcoinNetwork(isMainnet ? \"mainnet\" : \"testnet\"),\n a.address,\n ),\n ),\n publicKey: a.publicKey,\n },\n ]\n }\n\n if (a.purpose === sdk.AddressPurpose.Ordinals) {\n return [\n {\n addressType: WalletAdapterAddressType.P2TR,\n purposes: [\n WalletAdapterAddressPurpose.Ordinals,\n WalletAdapterAddressPurpose.BRC20,\n WalletAdapterAddressPurpose.Runes,\n ],\n address: a.address,\n network: this.network,\n scriptPubKey: hex.encode(\n addressToScriptPubKey(\n getBitcoinNetwork(isMainnet ? \"mainnet\" : \"testnet\"),\n a.address,\n ),\n ),\n publicKey: a.publicKey,\n tapInternalKey: a.publicKey,\n },\n ]\n }\n\n return []\n },\n )\n },\n })\n this.magicEden = provider\n }\n\n onAddressesChanged(callback: WalletAdapter_onAddressesChanged_callback): {\n unsubscribe: () => void\n } {\n // MagicEden uses accountsChanged event\n // https://docs-wallet.magiceden.io/bitcoin/provider-events\n const provider = this.magicEden\n\n const handler = async (event: {\n accounts: import(\"sats-connect\").GetAddressResponse[\"addresses\"]\n }): Promise<void> => {\n try {\n await this.updateConnectedAddress(event.accounts)\n const addresses = await this.getAddresses()\n callback({ addresses })\n } catch (error) {\n console.warn(\"[Magic Eden] Failed to get addresses on change:\", error)\n }\n }\n\n provider.on(\"accountsChanged\", handler)\n\n return {\n unsubscribe: () => {\n provider.removeListener(\"accountsChanged\", handler)\n },\n }\n }\n}\n"],"names":["XverseCompatibleWalletAdapterImpl_legacy","info","resp","stored","addresses","sdk","networkType","WalletAdapterBitcoinNetwork","resolve","reject","UserRejectError","WalletAdapterNotConnectedError","address","message","SignMessageAlgorithm","fromAddress","receiverAddress","satoshiAmount","senderAddress","a","WalletAdapterAddressPurpose","XverseCompatibleProviderError","XverseRpcErrorCode","psbtHex","signIndices","psbtBase64","base64","hex","signedPsbt","signIndex","tx","btc.Transaction","callback","localStorageKey","MAGICEDEN_PROVIDER_ID","MagicEdenWalletAdapterImpl","network","provider","isMainnet","WalletAdapterAddressType","addressToScriptPubKey","getBitcoinNetwork","handler","event","error"],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { U as o, B as i } from "./WalletAdapters.types-CnvOqHFH.mjs";
2
+ import { U as c } from "./UnisatCompatibleWalletAdapterImpl-M38FqkZI.mjs";
3
+ class u extends c {
4
+ okxwallet;
5
+ constructor(e) {
6
+ super(e, "OKX"), this.okxwallet = e;
7
+ }
8
+ async connect() {
9
+ await this.okxwallet.connect();
10
+ }
11
+ async signMessage(e, s) {
12
+ return n(super.signMessage(e, s));
13
+ }
14
+ async sendBitcoin(e, s, t, a) {
15
+ return n(
16
+ super.sendBitcoin(e, s, t, a)
17
+ );
18
+ }
19
+ async sendInscription(e, s, t, a) {
20
+ return n(
21
+ super.sendInscription(
22
+ e,
23
+ s,
24
+ t,
25
+ a
26
+ )
27
+ );
28
+ }
29
+ async signAndFinalizePsbt(e, s) {
30
+ return n(super.signAndFinalizePsbt(e, s));
31
+ }
32
+ onAddressesChanged(e) {
33
+ if (this.okxwallet?.on && this.okxwallet?.removeListener) {
34
+ const s = async () => {
35
+ try {
36
+ const t = await this.getAddresses();
37
+ e({ addresses: t });
38
+ } catch (t) {
39
+ console.warn("[OKX] Failed to get addresses on change:", t);
40
+ }
41
+ };
42
+ return this.okxwallet.on("accountChanged", s), this.okxwallet.on("networkChanged", s), {
43
+ unsubscribe: () => {
44
+ this.okxwallet.removeListener("accountChanged", s), this.okxwallet.removeListener("networkChanged", s);
45
+ }
46
+ };
47
+ } else
48
+ return super.onAddressesChanged(e);
49
+ }
50
+ }
51
+ class l extends i {
52
+ constructor(e) {
53
+ super("OKX wallet error: " + e.message, { cause: e });
54
+ }
55
+ }
56
+ const n = async (r) => {
57
+ try {
58
+ return await r;
59
+ } catch (e) {
60
+ throw e instanceof o ? e : e.code === 4001 ? new o() : new l(e);
61
+ }
62
+ };
63
+ export {
64
+ l as OkxWalletAdapterError,
65
+ u as OkxWalletAdapterImpl
66
+ };
67
+ //# sourceMappingURL=OkxWalletAdapter.impl-BepoUL1B.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OkxWalletAdapter.impl-BepoUL1B.mjs","sources":["../src/adapters/OkxWalletAdapter.impl.ts"],"sourcesContent":["import { UserRejectError, BitcoinWalletAdapterError } from \"../utils/error\"\nimport {\n SignMessageResult,\n WalletAdapter,\n WalletAdapter_onAddressesChanged_callback,\n} from \"../WalletAdapters.types\"\nimport {\n UniSatEvents,\n UnisatCompatibleProviderAPI,\n UnisatCompatibleWalletAdapterImpl,\n} from \"../utils/UnisatCompatibleWalletAdapterImpl\"\n\nenum RpcErrorCode {\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 USER_REJECTION = 4001,\n METHOD_NOT_SUPPORTED = 4002,\n}\n\ninterface RpcError<TErrorData = unknown> {\n code: number | RpcErrorCode\n message: string\n data?: TErrorData\n}\n\ninterface OkxBitcoinProvider\n extends UnisatCompatibleProviderAPI, Record<string, any> {\n connect(): Promise<void>\n on<K extends keyof UniSatEvents>(\n event: K,\n handler: (...args: UniSatEvents[K]) => void,\n ): void\n on(event: \"accountChanged\" | \"networkChanged\", handler: () => void): void\n removeListener<K extends keyof UniSatEvents>(\n event: K,\n handler: (...args: UniSatEvents[K]) => void,\n ): void\n removeListener(\n event: \"accountChanged\" | \"networkChanged\",\n handler: () => void,\n ): void\n}\n\nexport class OkxWalletAdapterImpl\n extends UnisatCompatibleWalletAdapterImpl\n implements WalletAdapter\n{\n private okxwallet: OkxBitcoinProvider\n constructor(provider: OkxBitcoinProvider) {\n /**\n * OKX Provider API:\n *\n * https://web3.okx.com/zh-hans/build/dev-docs/sdks/chains/bitcoin/provider\n */\n super(provider, \"OKX\")\n this.okxwallet = provider\n }\n\n async connect(): Promise<void> {\n // if not authorized, okx wallet will pop up a window to ask user to authorize\n // if authorized, okx wallet will do nothing\n await this.okxwallet.connect()\n }\n\n async signMessage(\n address: string,\n message: string,\n ): Promise<SignMessageResult> {\n return handleRpcError(super.signMessage(address, message))\n }\n\n async sendBitcoin(\n fromAddress: string,\n receiverAddress: string,\n satoshiAmount: bigint,\n options?: { feeRate?: number },\n ): Promise<{\n txid: string\n }> {\n return handleRpcError(\n super.sendBitcoin(fromAddress, receiverAddress, satoshiAmount, options),\n )\n }\n\n async sendInscription(\n fromAddress: string,\n receiverAddress: string,\n inscriptionId: string,\n options?: { feeRate?: number },\n ): Promise<{\n txid: string\n }> {\n return handleRpcError(\n super.sendInscription(\n fromAddress,\n receiverAddress,\n inscriptionId,\n options,\n ),\n )\n }\n\n async signAndFinalizePsbt(\n psbtHex: string,\n signIndices: [address: string, signIndex: number][],\n ): Promise<{\n signedPsbtHex: string\n }> {\n return handleRpcError(super.signAndFinalizePsbt(psbtHex, signIndices))\n }\n\n onAddressesChanged(callback: WalletAdapter_onAddressesChanged_callback): {\n unsubscribe: () => void\n } {\n // OKX uses 'accountChanged' (no 's') and 'networkChanged' events\n // https://web3.okx.com/build/dev-docs/sdks/chains/bitcoin/provider\n if (this.okxwallet?.on && this.okxwallet?.removeListener) {\n const handler = async (): Promise<void> => {\n try {\n const addresses = await this.getAddresses()\n callback({ addresses })\n } catch (error) {\n console.warn(\"[OKX] Failed to get addresses on change:\", error)\n }\n }\n\n // Listen to account and network changes (OKX uses 'accountChanged' not 'accountsChanged')\n this.okxwallet.on(\"accountChanged\", handler)\n this.okxwallet.on(\"networkChanged\", handler)\n\n return {\n unsubscribe: () => {\n this.okxwallet.removeListener(\"accountChanged\", handler)\n this.okxwallet.removeListener(\"networkChanged\", handler)\n },\n }\n } else {\n // Fallback to parent implementation (polling)\n return super.onAddressesChanged(callback)\n }\n }\n}\n\nexport class OkxWalletAdapterError extends BitcoinWalletAdapterError {\n constructor(rpcError: RpcError) {\n super(\"OKX wallet error: \" + rpcError.message, { cause: rpcError })\n }\n}\n\nconst handleRpcError = async <T>(promise: Promise<T>): Promise<T> => {\n try {\n return await promise\n } catch (e: any) {\n if (e instanceof UserRejectError) {\n throw e\n }\n\n if (e.code === RpcErrorCode.USER_REJECTION) {\n throw new UserRejectError()\n }\n\n throw new OkxWalletAdapterError(e)\n }\n}\n"],"names":["OkxWalletAdapterImpl","UnisatCompatibleWalletAdapterImpl","provider","address","message","handleRpcError","fromAddress","receiverAddress","satoshiAmount","options","inscriptionId","psbtHex","signIndices","callback","handler","addresses","error","OkxWalletAdapterError","BitcoinWalletAdapterError","rpcError","promise","UserRejectError"],"mappings":";;AA+CO,MAAMA,UACHC,EAEV;AAAA,EACU;AAAA,EACR,YAAYC,GAA8B;AAMxC,UAAMA,GAAU,KAAK,GACrB,KAAK,YAAYA;AAAA,EACnB;AAAA,EAEA,MAAM,UAAyB;AAG7B,UAAM,KAAK,UAAU,QAAA;AAAA,EACvB;AAAA,EAEA,MAAM,YACJC,GACAC,GAC4B;AAC5B,WAAOC,EAAe,MAAM,YAAYF,GAASC,CAAO,CAAC;AAAA,EAC3D;AAAA,EAEA,MAAM,YACJE,GACAC,GACAC,GACAC,GAGC;AACD,WAAOJ;AAAA,MACL,MAAM,YAAYC,GAAaC,GAAiBC,GAAeC,CAAO;AAAA,IAAA;AAAA,EAE1E;AAAA,EAEA,MAAM,gBACJH,GACAC,GACAG,GACAD,GAGC;AACD,WAAOJ;AAAA,MACL,MAAM;AAAA,QACJC;AAAA,QACAC;AAAA,QACAG;AAAA,QACAD;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AAAA,EAEA,MAAM,oBACJE,GACAC,GAGC;AACD,WAAOP,EAAe,MAAM,oBAAoBM,GAASC,CAAW,CAAC;AAAA,EACvE;AAAA,EAEA,mBAAmBC,GAEjB;AAGA,QAAI,KAAK,WAAW,MAAM,KAAK,WAAW,gBAAgB;AACxD,YAAMC,IAAU,YAA2B;AACzC,YAAI;AACF,gBAAMC,IAAY,MAAM,KAAK,aAAA;AAC7B,UAAAF,EAAS,EAAE,WAAAE,GAAW;AAAA,QACxB,SAASC,GAAO;AACd,kBAAQ,KAAK,4CAA4CA,CAAK;AAAA,QAChE;AAAA,MACF;AAGA,kBAAK,UAAU,GAAG,kBAAkBF,CAAO,GAC3C,KAAK,UAAU,GAAG,kBAAkBA,CAAO,GAEpC;AAAA,QACL,aAAa,MAAM;AACjB,eAAK,UAAU,eAAe,kBAAkBA,CAAO,GACvD,KAAK,UAAU,eAAe,kBAAkBA,CAAO;AAAA,QACzD;AAAA,MAAA;AAAA,IAEJ;AAEE,aAAO,MAAM,mBAAmBD,CAAQ;AAAA,EAE5C;AACF;AAEO,MAAMI,UAA8BC,EAA0B;AAAA,EACnE,YAAYC,GAAoB;AAC9B,UAAM,uBAAuBA,EAAS,SAAS,EAAE,OAAOA,GAAU;AAAA,EACpE;AACF;AAEA,MAAMd,IAAiB,OAAUe,MAAoC;AACnE,MAAI;AACF,WAAO,MAAMA;AAAA,EACf,SAAS,GAAQ;AACf,UAAI,aAAaC,IACT,IAGJ,EAAE,SAAS,OACP,IAAIA,EAAA,IAGN,IAAIJ,EAAsB,CAAC;AAAA,EACnC;AACF;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./WalletAdapters.types-De_x1lzr.js"),i=require("./UnisatCompatibleWalletAdapterImpl-Cq2Oqk1b.js");class c extends i.UnisatCompatibleWalletAdapterImpl{okxwallet;constructor(e){super(e,"OKX"),this.okxwallet=e}async connect(){await this.okxwallet.connect()}async signMessage(e,t){return r(super.signMessage(e,t))}async sendBitcoin(e,t,s,a){return r(super.sendBitcoin(e,t,s,a))}async sendInscription(e,t,s,a){return r(super.sendInscription(e,t,s,a))}async signAndFinalizePsbt(e,t){return r(super.signAndFinalizePsbt(e,t))}onAddressesChanged(e){if(this.okxwallet?.on&&this.okxwallet?.removeListener){const t=async()=>{try{const s=await this.getAddresses();e({addresses:s})}catch(s){console.warn("[OKX] Failed to get addresses on change:",s)}};return this.okxwallet.on("accountChanged",t),this.okxwallet.on("networkChanged",t),{unsubscribe:()=>{this.okxwallet.removeListener("accountChanged",t),this.okxwallet.removeListener("networkChanged",t)}}}else return super.onAddressesChanged(e)}}class l extends o.BitcoinWalletAdapterError{constructor(e){super("OKX wallet error: "+e.message,{cause:e})}}const r=async n=>{try{return await n}catch(e){throw e instanceof o.UserRejectError?e:e.code===4001?new o.UserRejectError:new l(e)}};exports.OkxWalletAdapterError=l;exports.OkxWalletAdapterImpl=c;
2
+ //# sourceMappingURL=OkxWalletAdapter.impl-C8kesjGu.js.map