btc-wallet 0.5.52-beta → 0.5.55-beta

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 CHANGED
@@ -36,9 +36,14 @@ const selector = await setupWalletSelector({
36
36
  ],
37
37
  });
38
38
 
39
- // 2. Setup wallet selector modal,params see setupModal @near-wallet-selector/modal-ui
39
+ // 2. Setup wallet selector modal
40
+ // Note: For enhanced functionality, use setupWalletSelectorModal exported from btc-wallet
41
+ // If using setupModal from @near-wallet-selector/modal-ui, the showChainGroups and showWalletUIForNearAccount parameters below are not supported
40
42
  setupWalletSelectorModal(selector, {
41
- contractId:'xxx.near',
43
+ contractId: 'xxx.near',
44
+ showChainGroups?: boolean, // optional: show chain group selection, defaults to true
45
+ showWalletUIForNearAccount?: boolean, // optional: show wallet UI for regular NEAR accounts, defaults to true
46
+ env?: 'mainnet' | 'testnet' | 'private_mainnet' | 'dev', // optional: defaults to NEAR network environment
42
47
  });
43
48
 
44
49
  // 3. Wrap your app with BtcWalletSelectorContextProvider
@@ -62,18 +67,18 @@ Execute a native BTC deposit to receive corresponding BTC tokens on NEAR through
62
67
  interface ExecuteBTCDepositAndActionParams<T extends boolean = true> {
63
68
  // Option 1: For dApp one-click BTC deposit and action
64
69
  action?: {
65
- receiver_id: string; // receiver account on NEAR
66
- amount: string; // amount to deposit
67
- msg: string; // message for the transaction
70
+ receiver_id: string; // receiver account on NEAR
71
+ amount: string; // amount to deposit
72
+ msg: string; // message for the transaction
68
73
  };
69
-
74
+
70
75
  // Option 2: For direct Satoshi bridge deposit
71
- amount?: string; // amount to deposit to Satoshi bridge
72
-
76
+ amount?: string; // amount to deposit to Satoshi bridge
77
+
73
78
  // Common optional parameters
74
- feeRate?: number; // optional: custom fee rate for the BTC transaction
79
+ feeRate?: number; // optional: custom fee rate for the BTC transaction
75
80
  env?: 'mainnet' | 'testnet' | 'private_mainnet' | 'dev'; // optional: defaults to NEAR network environment
76
- pollResult?: T; // optional: whether to poll for transaction result
81
+ pollResult?: T; // optional: whether to poll for transaction result
77
82
  registerDeposit?: string; // optional: whether to register deposit,default 0.000125 NEAR
78
83
  newAccountMinDepositAmount?: boolean; // default is true, if true, new account minimum deposit BTC amount 1000sat, otherwise 0
79
84
  registerContractId?: string; // if registerContractId is provided, it will be used to register the contract, otherwise it will be the default contract id
@@ -84,15 +89,15 @@ await executeBTCDepositAndAction({
84
89
  action: {
85
90
  receiver_id: 'token.near',
86
91
  amount: '1000000',
87
- msg: 'ft_transfer_call message' // ft_transfer_call message
92
+ msg: 'ft_transfer_call message', // ft_transfer_call message
88
93
  },
89
- registerDeposit: '100000000000000000000000', // default 0.000125 NEAR, you can set it according to your needs
94
+ registerDeposit: '100000000000000000000000', // default 0.000125 NEAR, you can set it according to your needs
90
95
  });
91
96
 
92
97
  // Example 2: Direct Satoshi bridge deposit
93
98
  await executeBTCDepositAndAction({
94
- amount: '1000000', // amount to deposit to Satoshi bridge
95
- feeRate: 5
99
+ amount: '1000000', // amount to deposit to Satoshi bridge
100
+ feeRate: 5,
96
101
  });
97
102
  ```
98
103
 
@@ -158,4 +163,4 @@ const transaction = await getWithdrawTransaction({
158
163
 
159
164
  ## License
160
165
 
161
- This project is licensed under the MIT License - see the LICENSE file for details.
166
+ This project is licensed under the MIT License - see the LICENSE file for details.
@@ -1,5 +1,11 @@
1
1
  import { type WalletSelectorModal as _WalletSelectorModal, type ModalOptions as _ModalOptions } from 'ref-modal-ui';
2
2
  import type { WalletSelector } from '@near-wallet-selector/core';
3
- export type WalletSelectorModalOptions = _ModalOptions;
3
+ import { ENV } from '../config';
4
+ export interface WalletSelectorModalOptions extends _ModalOptions {
5
+ showChainGroups?: boolean;
6
+ showWalletUIForNearAccount?: boolean;
7
+ walletUrl?: string;
8
+ env?: ENV;
9
+ }
4
10
  export type WalletSelectorModal = _WalletSelectorModal;
5
11
  export declare function setupWalletSelectorModal(selector: WalletSelector, options: WalletSelectorModalOptions): _WalletSelectorModal;
package/dist/index.js CHANGED
@@ -234,6 +234,51 @@ function isMobile() {
234
234
  }
235
235
  return false;
236
236
  }
237
+ function safeJSONParse(str) {
238
+ try {
239
+ return JSON.parse(str);
240
+ } catch (e) {
241
+ console.error("safeJSONParse", e);
242
+ return void 0;
243
+ }
244
+ }
245
+ function safeJSONStringify(obj) {
246
+ try {
247
+ return JSON.stringify(obj);
248
+ } catch (e) {
249
+ console.error("safeJSONStringify", e);
250
+ return void 0;
251
+ }
252
+ }
253
+ function storageStore(namespace, options) {
254
+ if (typeof window === "undefined")
255
+ return;
256
+ const _namespace = namespace || "SATOSHI_WALLET_DEFAULT";
257
+ const storage5 = (options == null ? void 0 : options.storage) || (window == null ? void 0 : window.localStorage);
258
+ const namespaceKey = (key) => {
259
+ return _namespace + ":" + key;
260
+ };
261
+ return {
262
+ set(key, value) {
263
+ const _value = safeJSONStringify(value);
264
+ _value ? storage5.setItem(namespaceKey(key), _value) : storage5.removeItem(namespaceKey(key));
265
+ },
266
+ get(key) {
267
+ const _value = storage5.getItem(namespaceKey(key));
268
+ return _value ? safeJSONParse(_value) : void 0;
269
+ },
270
+ remove(key) {
271
+ storage5.removeItem(namespaceKey(key));
272
+ },
273
+ clearAll: function clearAll() {
274
+ for (const key in storage5) {
275
+ if (key.startsWith(namespace + ":")) {
276
+ storage5.removeItem(key);
277
+ }
278
+ }
279
+ }
280
+ };
281
+ }
237
282
 
238
283
  // src/utils/Dialog.ts
239
284
  var Dialog = class {
@@ -776,6 +821,7 @@ var import_events = __toESM(require("events"), 1);
776
821
  var xverse_default = "data:image/png;base64,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";
777
822
 
778
823
  // src/connector/xverse.ts
824
+ var storage = storageStore("SATOSHI_WALLET_XVERSE");
779
825
  var _network, _event;
780
826
  var XverseConnector = class extends BaseConnector {
781
827
  constructor() {
@@ -801,7 +847,7 @@ var XverseConnector = class extends BaseConnector {
801
847
  walletType
802
848
  }));
803
849
  console.log("\u{1F680} ~ XverseConnector ~ loadAccounts ~ res:", addresses);
804
- localStorage.setItem("btc-connect-xverse-addresses-" + network, JSON.stringify(addresses));
850
+ storage == null ? void 0 : storage.set(`${network}:addresses`, addresses);
805
851
  return addresses;
806
852
  });
807
853
  __privateGet(this, _event).setMaxListeners(100);
@@ -836,9 +882,9 @@ var XverseConnector = class extends BaseConnector {
836
882
  }
837
883
  getAddresses() {
838
884
  return __async(this, null, function* () {
839
- const data = localStorage.getItem("btc-connect-xverse-addresses-" + __privateGet(this, _network));
885
+ const data = storage == null ? void 0 : storage.get(`${__privateGet(this, _network)}:addresses`);
840
886
  if (data) {
841
- return JSON.parse(data);
887
+ return data;
842
888
  }
843
889
  return [];
844
890
  });
@@ -923,8 +969,7 @@ var XverseConnector = class extends BaseConnector {
923
969
  });
924
970
  }
925
971
  disconnect() {
926
- localStorage.removeItem("btc-connect-xverse-addresses-Mainnet");
927
- localStorage.removeItem("btc-connect-xverse-addresses-Testnet");
972
+ storage == null ? void 0 : storage.remove(`${__privateGet(this, _network)}:addresses`);
928
973
  }
929
974
  };
930
975
  _network = new WeakMap();
@@ -937,6 +982,7 @@ var import_events2 = __toESM(require("events"), 1);
937
982
  var magicEden_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAAgCAYAAABZyotbAAADGklEQVR42sVYTW7aQBT+ZsZk0yy8jWoqIxWK1E16A3KDcoLACRqkGKFugE0VAVLgBElOQHqC0BPUm0q0EMVVoWxZNCsYv25MlR/AY2O73xKZefO9ed+b7w0DgFm+ZrquPCdCAYAOwAbQM0btS0SIaa5aJ6AEIhPR49Ge2SxfM6Urb0B4Fowx1nj5o9WMhpTVJ8J7xA3OKsb3VpdNs9YFAaVN30VBbpqr1omogWQwXyxeZDhhexaJqDHNVetho8zyNTNBUgCga9qfQ+5pCnGQuzMbunTlDf4DuOqHYcjtpe7P12k3XjAnPe4MeJC/BCH3+431YZt249KXEPwIANgka1HgnPg0lFm+Zkopv6qU+aasAzQImPSfy+V+N+M05gCghQnrnRw2kfN0pYdPPOlCiObB8MyJXWOqZTnNVesR6EqXUt7cmQ09cWLryE2yVsm/tTOHXLensLyZSt33Q7eQMBpbpznO+dUmB/ME74xR255kTy8BdqywetcYtSqJntjDk5NS3vmRIqKmMWrbALBYLE88f+e3+kmYO1SF2ADRYJAed/6VacbpzoUQRTDmqCTu1+vTQqTEiKhJRDsaYeYIIcpPfz0YnjmC8yMAc4Vyr0deiulxp7ELOSK3vKl1HwzPHCIqKixTCNIllTUWlhwRNdPjztZy1jTNQcQI1DxCkHukq40uRckoM2flKmLpit5Gy2F19RSulEoXuuuiEtuJreCN3+Wwunr2VKBQzq9uW9eJ3GPbyKnoSnUAJRc9v3KO/II2Ru1LIUQGoCsANmO4BlD220iAAdRO37ZPwuxN27X7eOUWaO7aS92fk6+umCMEL4bdVySWKgjUBlDmCMGPdhlbtCRJeQOogl5Il1LWJ1kryPJfhBCDVTISJSal7CsOoDqCPyuUpJTOJGsVjVHbTqwUJ1mrBOAw5jAmgH7SGjtOKI45efvx0JfYcrlvRxKOJfsMx33mrUEQf7bdPeBzMpSYY3z7ZHMAlfXzkJrXU26/QnRVhspdsfKU7EEbvgBQ8Ehe7/r8taXdFzy96WBMj+ycQLbrUm9l5f4C3RupufZdcK8AAAAASUVORK5CYII=";
938
983
 
939
984
  // src/connector/magicEden.ts
985
+ var storage2 = storageStore("SATOSHI_WALLET_MAGICEDEN");
940
986
  var _network2, _event2;
941
987
  var MagicEdenConnector = class extends BaseConnector {
942
988
  constructor() {
@@ -970,7 +1016,7 @@ var MagicEdenConnector = class extends BaseConnector {
970
1016
  };
971
1017
  getAddress(getAddressOptions).catch((error) => reject(error));
972
1018
  });
973
- localStorage.setItem("btc-connect-magicEden-addresses-" + network, JSON.stringify(addresses));
1019
+ storage2 == null ? void 0 : storage2.set(`${network}:addresses`, addresses);
974
1020
  return addresses;
975
1021
  });
976
1022
  __privateGet(this, _event2).setMaxListeners(100);
@@ -997,10 +1043,9 @@ var MagicEdenConnector = class extends BaseConnector {
997
1043
  if (!this.isReady()) {
998
1044
  throw new Error(`${this.metadata.name} is not install!`);
999
1045
  }
1000
- const data = localStorage.getItem("btc-connect-magicEden-addresses-" + __privateGet(this, _network2));
1046
+ const data = storage2 == null ? void 0 : storage2.get(`${__privateGet(this, _network2)}:addresses`);
1001
1047
  if (data) {
1002
- const addresses = JSON.parse(data);
1003
- return addresses.map((item) => item.address);
1048
+ return data.map((item) => item.address);
1004
1049
  } else {
1005
1050
  return [];
1006
1051
  }
@@ -1011,10 +1056,9 @@ var MagicEdenConnector = class extends BaseConnector {
1011
1056
  if (!this.isReady()) {
1012
1057
  throw new Error(`${this.metadata.name} is not install!`);
1013
1058
  }
1014
- const data = localStorage.getItem("btc-connect-magicEden-addresses-" + __privateGet(this, _network2));
1059
+ const data = storage2 == null ? void 0 : storage2.get(`${__privateGet(this, _network2)}:addresses`);
1015
1060
  if (data) {
1016
- const addresses = JSON.parse(data);
1017
- return addresses[0].publicKey;
1061
+ return data[0].publicKey;
1018
1062
  } else {
1019
1063
  return "";
1020
1064
  }
@@ -1127,8 +1171,7 @@ var MagicEdenConnector = class extends BaseConnector {
1127
1171
  });
1128
1172
  }
1129
1173
  disconnect() {
1130
- localStorage.removeItem("btc-connect-magicEden-addresses-Mainnet");
1131
- localStorage.removeItem("btc-connect-magicEden-addresses-Testnet");
1174
+ storage2 == null ? void 0 : storage2.remove(`${__privateGet(this, _network2)}:addresses`);
1132
1175
  }
1133
1176
  };
1134
1177
  _network2 = new WeakMap();
@@ -1222,13 +1265,14 @@ var useConnector = () => {
1222
1265
  const { connectors, setConnectorId } = useConnectProvider();
1223
1266
  const connect = (0, import_react2.useCallback)(
1224
1267
  (connectorId) => __async(void 0, null, function* () {
1268
+ var _a;
1225
1269
  const connector = connectors.find((item) => item.metadata.id === connectorId);
1226
1270
  if (!connector) {
1227
1271
  throw new Error(`connector id ${connectorId} not found`);
1228
1272
  }
1229
1273
  const accounts = yield connector.requestAccounts();
1230
1274
  if (accounts.length > 0) {
1231
- localStorage.setItem("current-connector-id", connector.metadata.id);
1275
+ (_a = storageStore()) == null ? void 0 : _a.set("current-connector-id", connector.metadata.id);
1232
1276
  setConnectorId(connector.metadata.id);
1233
1277
  }
1234
1278
  }),
@@ -2390,12 +2434,16 @@ var ConnectProvider = ({
2390
2434
  name: ((_a = Object.keys(options.aaOptions.accountContracts)) == null ? void 0 : _a[0]) || "BTC",
2391
2435
  version: ((_c = options.aaOptions.accountContracts[((_b = Object.keys(options.aaOptions.accountContracts)) == null ? void 0 : _b[0]) || "BTC"]) == null ? void 0 : _c[0].version) || "1.0.0"
2392
2436
  });
2393
- const initConnectorId = (0, import_react10.useCallback)(() => {
2394
- const id = localStorage.getItem("current-connector-id");
2395
- setConnectorId(id || "");
2437
+ const getConnectorId = (0, import_react10.useCallback)(() => {
2438
+ var _a2;
2439
+ if (typeof window === "undefined") {
2440
+ return "";
2441
+ }
2442
+ const id = (_a2 = storageStore()) == null ? void 0 : _a2.get("current-connector-id");
2443
+ return id != null ? id : "";
2396
2444
  }, []);
2397
2445
  const getConnector = (0, import_react10.useCallback)(() => {
2398
- const connectorId2 = localStorage.getItem("current-connector-id");
2446
+ const connectorId2 = getConnectorId();
2399
2447
  return connectors.find((item) => item.metadata.id === connectorId2);
2400
2448
  }, [connectorId, connectors]);
2401
2449
  const setAccountContract = (0, import_react10.useCallback)(
@@ -2409,8 +2457,11 @@ var ConnectProvider = ({
2409
2457
  [options.aaOptions.accountContracts, _setAccountContract]
2410
2458
  );
2411
2459
  (0, import_react10.useEffect)(() => {
2412
- initConnectorId();
2413
- }, [autoConnect, initConnectorId]);
2460
+ const connectorId2 = getConnectorId();
2461
+ if (connectorId2) {
2462
+ setConnectorId(connectorId2);
2463
+ }
2464
+ }, [autoConnect, getConnectorId]);
2414
2465
  const evmSupportChainIds = (0, import_react10.useMemo)(() => {
2415
2466
  var _a2;
2416
2467
  let chainIds = (_a2 = options.aaOptions.accountContracts[accountContract.name]) == null ? void 0 : _a2.filter((item) => item.version === accountContract.version).map((item) => item.chainIds).reduce((a, b) => {
@@ -2530,7 +2581,8 @@ var ConnectProvider = ({
2530
2581
  }
2531
2582
  }, [connectorId, connectors]);
2532
2583
  const disconnect = (0, import_react10.useCallback)(() => {
2533
- localStorage.removeItem("current-connector-id");
2584
+ var _a2;
2585
+ (_a2 = storageStore()) == null ? void 0 : _a2.remove("current-connector-id");
2534
2586
  txConfirmUtils_default.reset();
2535
2587
  if (connector) {
2536
2588
  connector.disconnect();
@@ -2719,7 +2771,8 @@ function BtcWalletSelectorContextProvider({
2719
2771
  new UnisatConnector(),
2720
2772
  new XverseConnector(),
2721
2773
  new OKXConnector(),
2722
- new BitgetConnector()
2774
+ new BitgetConnector(),
2775
+ new MagicEdenConnector()
2723
2776
  ];
2724
2777
  const walletSelectorContextValue = (0, import_react11.useMemo)(() => {
2725
2778
  const simpleFn = {};
@@ -2958,7 +3011,7 @@ var nearRpcUrls = {
2958
3011
  mainnet: [
2959
3012
  "https://near.lava.build",
2960
3013
  "https://rpc.mainnet.near.org",
2961
- "https://free.rpc.fastnear.com",
3014
+ "https://mw.rpc.fastnear.com",
2962
3015
  "https://near.drpc.org"
2963
3016
  ],
2964
3017
  testnet: ["https://rpc.testnet.near.org"]
@@ -3142,7 +3195,7 @@ function pollTransactionStatuses(network, hashes) {
3142
3195
  var import_transactions = require("@near-js/transactions");
3143
3196
  var import_key_pair = require("near-api-js/lib/utils/key_pair");
3144
3197
  var import_transaction = require("near-api-js/lib/transaction");
3145
- var import_utils9 = require("@near-js/utils");
3198
+ var import_utils13 = require("@near-js/utils");
3146
3199
  var import_bs58 = __toESM(require("bs58"), 1);
3147
3200
  var import_js_sha256 = require("js-sha256");
3148
3201
  var import_near_api_js2 = require("near-api-js");
@@ -3154,36 +3207,37 @@ var STORAGE_KEYS = {
3154
3207
  PUBLIC_KEY: "btc-wallet-publickey",
3155
3208
  BTC_PUBLIC_KEY: "btc-wallet-btc-publickey"
3156
3209
  };
3210
+ var storage3 = storageStore("SATOSHI_WALLET_ACCOUNT");
3157
3211
  var state_default = {
3158
3212
  saveAccount(account) {
3159
3213
  if (!account) {
3160
3214
  this.removeAccount();
3161
3215
  return;
3162
3216
  }
3163
- window.localStorage.setItem(STORAGE_KEYS.ACCOUNT, account);
3217
+ storage3 == null ? void 0 : storage3.set(STORAGE_KEYS.ACCOUNT, account);
3164
3218
  },
3165
3219
  removeAccount() {
3166
- window.localStorage.removeItem(STORAGE_KEYS.ACCOUNT);
3220
+ storage3 == null ? void 0 : storage3.remove(STORAGE_KEYS.ACCOUNT);
3167
3221
  },
3168
3222
  savePublicKey(publicKey) {
3169
3223
  if (!publicKey) {
3170
3224
  this.removePublicKey();
3171
3225
  return;
3172
3226
  }
3173
- window.localStorage.setItem(STORAGE_KEYS.PUBLIC_KEY, publicKey);
3227
+ storage3 == null ? void 0 : storage3.set(STORAGE_KEYS.PUBLIC_KEY, publicKey);
3174
3228
  },
3175
3229
  removePublicKey() {
3176
- window.localStorage.removeItem(STORAGE_KEYS.PUBLIC_KEY);
3230
+ storage3 == null ? void 0 : storage3.remove(STORAGE_KEYS.PUBLIC_KEY);
3177
3231
  },
3178
3232
  saveBtcPublicKey(publicKey) {
3179
3233
  if (!publicKey) {
3180
3234
  this.removeBtcPublicKey();
3181
3235
  return;
3182
3236
  }
3183
- window.localStorage.setItem(STORAGE_KEYS.BTC_PUBLIC_KEY, publicKey);
3237
+ storage3 == null ? void 0 : storage3.set(STORAGE_KEYS.BTC_PUBLIC_KEY, publicKey);
3184
3238
  },
3185
3239
  removeBtcPublicKey() {
3186
- window.localStorage.removeItem(STORAGE_KEYS.BTC_PUBLIC_KEY);
3240
+ storage3 == null ? void 0 : storage3.remove(STORAGE_KEYS.BTC_PUBLIC_KEY);
3187
3241
  },
3188
3242
  clear() {
3189
3243
  this.removeAccount();
@@ -3199,13 +3253,13 @@ var state_default = {
3199
3253
  this.savePublicKey(publicKey);
3200
3254
  },
3201
3255
  getAccount() {
3202
- return window.localStorage.getItem(STORAGE_KEYS.ACCOUNT) || "";
3256
+ return (storage3 == null ? void 0 : storage3.get(STORAGE_KEYS.ACCOUNT)) || "";
3203
3257
  },
3204
3258
  getPublicKey() {
3205
- return window.localStorage.getItem(STORAGE_KEYS.PUBLIC_KEY) || "";
3259
+ return (storage3 == null ? void 0 : storage3.get(STORAGE_KEYS.PUBLIC_KEY)) || "";
3206
3260
  },
3207
3261
  getBtcPublicKey() {
3208
- return window.localStorage.getItem(STORAGE_KEYS.BTC_PUBLIC_KEY) || "";
3262
+ return (storage3 == null ? void 0 : storage3.get(STORAGE_KEYS.BTC_PUBLIC_KEY)) || "";
3209
3263
  },
3210
3264
  isValid() {
3211
3265
  const account = this.getAccount();
@@ -3508,7 +3562,7 @@ function convertTransactionToTxHex(_0) {
3508
3562
  transaction.receiverId,
3509
3563
  BigInt(nearNonceNumber) + BigInt(index),
3510
3564
  newActions,
3511
- (0, import_utils9.baseDecode)(header.hash)
3565
+ (0, import_utils13.baseDecode)(header.hash)
3512
3566
  );
3513
3567
  const txBytes = (0, import_transaction.encodeTransaction)(_transaction);
3514
3568
  const txHex = Array.from(txBytes, (byte) => ("0" + (byte & 255).toString(16)).slice(-2)).join(
@@ -3901,11 +3955,13 @@ function getCsnaAccountId(env) {
3901
3955
  });
3902
3956
  }
3903
3957
  function checkDepositDisabledAddress() {
3904
- const data = localStorage.getItem("btc-connect-xverse-addresses-Mainnet");
3958
+ var _a;
3959
+ const data = (_a = storageStore("SATOSHI_WALLET_XVERSE")) == null ? void 0 : _a.get(
3960
+ `Mainnet:addresses`
3961
+ );
3905
3962
  if (!data)
3906
3963
  return;
3907
- const addresses = JSON.parse(data);
3908
- const address = addresses == null ? void 0 : addresses[0];
3964
+ const address = data == null ? void 0 : data[0];
3909
3965
  if (address.walletType === "ledger" && !["p2wpkh", "p2sh"].includes(address.addressType)) {
3910
3966
  throw new Error("Ledger is only supported for p2wpkh and p2sh address");
3911
3967
  }
@@ -3942,7 +3998,7 @@ function executeBTCDepositAndAction(_0) {
3942
3998
  throw new Error("Deposit amount or action is required");
3943
3999
  }
3944
4000
  const csna = yield getCsnaAccountId(env);
3945
- const depositAmount = Number(amount || (action == null ? void 0 : action.amount) || 0);
4001
+ const depositAmount = new import_big2.default(amount || (action == null ? void 0 : action.amount) || 0).round(0, import_big2.default.roundDown).toNumber();
3946
4002
  console.log("depositAmount", depositAmount);
3947
4003
  if (depositAmount <= 0) {
3948
4004
  throw new Error("Invalid deposit amount");
@@ -4046,13 +4102,14 @@ function checkSatoshiWhitelist(btcAccountId, env = "mainnet") {
4046
4102
  return __async(this, null, function* () {
4047
4103
  if (env !== "mainnet")
4048
4104
  return;
4049
- const hasShownNotice = localStorage.getItem("btc-wallet-private-mainnet-notice");
4105
+ const storage5 = storageStore();
4106
+ const hasShownNotice = storage5 == null ? void 0 : storage5.get("private-mainnet-notice");
4050
4107
  if (!hasShownNotice) {
4051
4108
  Dialog.alert({
4052
4109
  title: "Notice",
4053
4110
  message: "You are currently using Satoshi Private Mainnet. This is a private version for testing. Please try a small amount of assets in Ramp"
4054
4111
  });
4055
- localStorage.setItem("btc-wallet-private-mainnet-notice", "true");
4112
+ storage5 == null ? void 0 : storage5.set("private-mainnet-notice", "true");
4056
4113
  }
4057
4114
  if (!btcAccountId)
4058
4115
  return;
@@ -4382,7 +4439,13 @@ function uint8ArrayToHex(uint8Array) {
4382
4439
  }
4383
4440
 
4384
4441
  // src/utils/initWalletButton.ts
4385
- function setupWalletButton(env, wallet, originalWallet, walletUrl) {
4442
+ var storage4 = storageStore("SATOSHI_WALLET_BUTTON");
4443
+ function setupWalletButton({
4444
+ env,
4445
+ nearWallet,
4446
+ btcWallet,
4447
+ walletUrl
4448
+ }) {
4386
4449
  console.log(`setupWalletButton ${walletUrl || ""}`);
4387
4450
  if (document.getElementById("satoshi-wallet-button")) {
4388
4451
  return;
@@ -4405,23 +4468,25 @@ function setupWalletButton(env, wallet, originalWallet, walletUrl) {
4405
4468
  closeImageUrl: "https://assets.deltatrade.ai/wallet-assets/wallet-btn-active.png",
4406
4469
  iframe
4407
4470
  });
4408
- setupButtonClickHandler(button, iframe, wallet, originalWallet);
4471
+ setupButtonClickHandler(button, iframe, nearWallet, btcWallet);
4409
4472
  }
4410
4473
  function createFloatingButtonWithIframe({
4411
4474
  openImageUrl,
4412
4475
  closeImageUrl,
4413
4476
  iframe
4414
4477
  }) {
4478
+ var _a;
4415
4479
  const button = document.createElement("img");
4416
4480
  button.id = "satoshi-wallet-button";
4417
- const isIframeVisible = localStorage.getItem("btc-wallet-iframe-visible") === "true";
4481
+ const isIframeVisible = (_a = storage4 == null ? void 0 : storage4.get("visible")) != null ? _a : true;
4418
4482
  button.src = isIframeVisible ? closeImageUrl : openImageUrl;
4419
4483
  iframe.style.display = isIframeVisible ? "block" : "none";
4420
4484
  const windowWidth = window.innerWidth;
4421
4485
  const windowHeight = window.innerHeight;
4422
- const savedPosition = JSON.parse(
4423
- localStorage.getItem("btc-wallet-button-position") || '{"right": "20px", "bottom": "20px"}'
4424
- );
4486
+ const savedPosition = (storage4 == null ? void 0 : storage4.get("position")) || {
4487
+ right: "20px",
4488
+ bottom: "20px"
4489
+ };
4425
4490
  const right = Math.min(Math.max(20, parseInt(savedPosition.right)), windowWidth - 80);
4426
4491
  const bottom = Math.min(Math.max(20, parseInt(savedPosition.bottom)), windowHeight - 80);
4427
4492
  Object.assign(button.style, {
@@ -4517,13 +4582,10 @@ function createFloatingButtonWithIframe({
4517
4582
  isDragging = false;
4518
4583
  button.style.cursor = "grab";
4519
4584
  button.style.transition = "transform 0.15s ease";
4520
- localStorage.setItem(
4521
- "btc-wallet-button-position",
4522
- JSON.stringify({
4523
- right: button.style.right,
4524
- bottom: button.style.bottom
4525
- })
4526
- );
4585
+ storage4 == null ? void 0 : storage4.set("position", {
4586
+ right: button.style.right,
4587
+ bottom: button.style.bottom
4588
+ });
4527
4589
  if (!isDragEvent) {
4528
4590
  handleButtonClick();
4529
4591
  }
@@ -4537,7 +4599,7 @@ function createFloatingButtonWithIframe({
4537
4599
  const newVisibleState = !isCurrentlyVisible;
4538
4600
  iframe.style.display = newVisibleState ? "block" : "none";
4539
4601
  button.src = newVisibleState ? closeImageUrl : openImageUrl;
4540
- localStorage.setItem("btc-wallet-iframe-visible", String(newVisibleState));
4602
+ storage4 == null ? void 0 : storage4.set("visible", newVisibleState);
4541
4603
  setTimeout(() => {
4542
4604
  if (newVisibleState) {
4543
4605
  iframe.focus();
@@ -4551,11 +4613,12 @@ function createIframe({
4551
4613
  iframeUrl,
4552
4614
  iframeStyle = {}
4553
4615
  }) {
4616
+ var _a;
4554
4617
  const iframe = document.createElement("iframe");
4555
4618
  iframe.id = "satoshi-wallet-iframe";
4556
4619
  iframe.allow = "clipboard-read; clipboard-write";
4557
4620
  iframe.src = iframeUrl;
4558
- const isVisible = localStorage.getItem("btc-wallet-iframe-visible") === "true";
4621
+ const isVisible = (_a = storage4 == null ? void 0 : storage4.get("visible")) != null ? _a : true;
4559
4622
  Object.assign(iframe.style, __spreadValues({
4560
4623
  position: "fixed",
4561
4624
  bottom: "90px",
@@ -4570,12 +4633,12 @@ function createIframe({
4570
4633
  return iframe;
4571
4634
  }
4572
4635
  var currentMessageHandler = null;
4573
- function setupButtonClickHandler(button, iframe, wallet, originalWallet) {
4636
+ function setupButtonClickHandler(button, iframe, nearWallet, btcWallet) {
4574
4637
  return __async(this, null, function* () {
4575
4638
  var _a;
4576
- const accountId = (_a = yield wallet == null ? void 0 : wallet.getAccounts()) == null ? void 0 : _a[0].accountId;
4577
- const originalAccountId = originalWallet.account;
4578
- const originalPublicKey = yield originalWallet.getPublicKey();
4639
+ const accountId = (_a = yield nearWallet == null ? void 0 : nearWallet.getAccounts()) == null ? void 0 : _a[0].accountId;
4640
+ const originalAccountId = btcWallet == null ? void 0 : btcWallet.account;
4641
+ const originalPublicKey = yield btcWallet == null ? void 0 : btcWallet.getPublicKey();
4579
4642
  console.log({ accountId, originalAccountId, originalPublicKey });
4580
4643
  const iframeSrc = new URL(iframe.src);
4581
4644
  iframeSrc.searchParams.set("origin", window.location.origin);
@@ -4584,8 +4647,8 @@ function setupButtonClickHandler(button, iframe, wallet, originalWallet) {
4584
4647
  originalPublicKey && iframeSrc.searchParams.set("originalPublicKey", originalPublicKey);
4585
4648
  iframe.src = iframeSrc.toString();
4586
4649
  const actions = {
4587
- signAndSendTransaction: wallet.signAndSendTransaction,
4588
- signAndSendTransactions: wallet.signAndSendTransactions,
4650
+ signAndSendTransaction: nearWallet.signAndSendTransaction,
4651
+ signAndSendTransactions: nearWallet.signAndSendTransactions,
4589
4652
  executeBTCDepositAndAction,
4590
4653
  getWithdrawTransaction
4591
4654
  };
@@ -4630,6 +4693,7 @@ function setupButtonClickHandler(button, iframe, wallet, originalWallet) {
4630
4693
  });
4631
4694
  }
4632
4695
  function removeWalletButton() {
4696
+ console.log("removeWalletButton");
4633
4697
  const button = document.getElementById("satoshi-wallet-button");
4634
4698
  button == null ? void 0 : button.remove();
4635
4699
  const iframe = document.getElementById("satoshi-wallet-iframe");
@@ -4736,7 +4800,12 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4736
4800
  if (btcPublicKey) {
4737
4801
  yield getNearAccountByBtcPublicKey(btcPublicKey);
4738
4802
  removeWalletButton();
4739
- setupWalletButton(env, wallet, btcContext, metadata.walletUrl);
4803
+ setupWalletButton({
4804
+ env,
4805
+ nearWallet: wallet,
4806
+ btcWallet: btcContext,
4807
+ walletUrl: metadata.walletUrl
4808
+ });
4740
4809
  }
4741
4810
  } else {
4742
4811
  removeWalletButton();
@@ -4977,11 +5046,30 @@ function setupBTCWallet({
4977
5046
 
4978
5047
  // src/core/setupModal.ts
4979
5048
  var import_ref_modal_ui = require("ref-modal-ui");
5049
+ var subscription;
4980
5050
  function setupWalletSelectorModal(selector, options) {
4981
5051
  if (!selector)
4982
5052
  throw new Error("selector is required");
5053
+ const {
5054
+ showChainGroups = true,
5055
+ showWalletUIForNearAccount = true,
5056
+ env = "mainnet",
5057
+ walletUrl
5058
+ } = options;
5059
+ subscription == null ? void 0 : subscription.unsubscribe();
4983
5060
  const state = selector.store.getState();
4984
5061
  const group = getGroup(state);
5062
+ subscription = selector.store.observable.subscribe((state2) => {
5063
+ const walletId = state2.selectedWalletId;
5064
+ console.log("setupWalletSelectorModal walletId", walletId);
5065
+ if (!walletId)
5066
+ removeWalletButton();
5067
+ if (showWalletUIForNearAccount && walletId !== "btc-wallet") {
5068
+ selector.wallet().then((wallet) => {
5069
+ setupWalletButton({ env, nearWallet: wallet, walletUrl });
5070
+ });
5071
+ }
5072
+ });
4985
5073
  if (group.includes("btc")) {
4986
5074
  document.head.appendChild(document.createElement("style")).textContent = `
4987
5075
  #near-wallet-selector-modal .options-list .btc-wallet {
@@ -4992,7 +5080,7 @@ function setupWalletSelectorModal(selector, options) {
4992
5080
  const modal = (0, import_ref_modal_ui.setupModal)(selector, options);
4993
5081
  const originalShow = modal.show.bind(modal);
4994
5082
  modal.show = () => __async(this, null, function* () {
4995
- const chain = group.length > 1 ? yield openChainModal() : group[0];
5083
+ const chain = group.length > 1 && showChainGroups ? yield openChainModal() : group[0];
4996
5084
  if (chain === "btc") {
4997
5085
  const module2 = state.modules.find((module3) => module3.id === "btc-wallet");
4998
5086
  if (module2) {
@@ -5049,7 +5137,7 @@ function getGroup(state) {
5049
5137
 
5050
5138
  // src/index.ts
5051
5139
  var getVersion = () => {
5052
- return "0.5.52-beta";
5140
+ return "0.5.55-beta";
5053
5141
  };
5054
5142
  if (typeof window !== "undefined") {
5055
5143
  window.__BTC_WALLET_VERSION = getVersion();