btc-wallet 0.5.11-beta → 0.5.12-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/dist/config.d.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  export type ENV = 'mainnet' | 'testnet' | 'private_mainnet' | 'dev';
2
2
  export declare const walletConfig: Record<ENV, {
3
3
  base_url: string;
4
- token: string;
4
+ btcToken: string;
5
+ btcTokenDecimals: number;
6
+ nearToken: string;
7
+ nearTokenDecimals: number;
5
8
  accountContractId: string;
6
9
  bridgeContractId: string;
7
10
  walletUrl: string;
@@ -2,7 +2,10 @@ import type { ENV } from '../config';
2
2
  import type { FinalExecutionOutcome, Transaction } from '@near-wallet-selector/core';
3
3
  export declare function getConfig(env: ENV): Promise<{
4
4
  base_url: string;
5
- token: string;
5
+ btcToken: string;
6
+ btcTokenDecimals: number;
7
+ nearToken: string;
8
+ nearTokenDecimals: number;
6
9
  accountContractId: string;
7
10
  bridgeContractId: string;
8
11
  walletUrl: string;
@@ -20,8 +23,19 @@ export interface AccountInfo {
20
23
  amount?: string;
21
24
  };
22
25
  }
23
- export declare function getAccountInfo(csna: string, accountContractId: string): Promise<AccountInfo | undefined>;
24
- export declare function checkGasTokenBalance(csna: string, gasToken: string, minAmount: string, env: ENV): Promise<void>;
26
+ export declare function getAccountInfo({ csna, env }: {
27
+ csna: string;
28
+ env: ENV;
29
+ }): Promise<AccountInfo | undefined>;
30
+ export declare function getTokenBalance({ csna, tokenId, env, }: {
31
+ csna: string;
32
+ tokenId: string;
33
+ env: ENV;
34
+ }): Promise<{
35
+ balance: number;
36
+ rawBalance: string;
37
+ }>;
38
+ export declare function checkGasTokenBalance(csna: string, minAmount: string, env: ENV): Promise<void>;
25
39
  type CheckGasTokenDebtReturnType<T extends boolean> = T extends true ? void : {
26
40
  receiver_id: string;
27
41
  amount: string;
@@ -34,12 +48,6 @@ export declare function getBtcBalance(): Promise<{
34
48
  balance: number;
35
49
  availableBalance: number;
36
50
  }>;
37
- export declare function getNBTCBalance(address: string, env?: ENV): Promise<{
38
- balance: number;
39
- availableBalance: number;
40
- rawBalance: string;
41
- rawAvailableBalance: number;
42
- }>;
43
51
  export declare function sendBitcoin(address: string, amount: number, feeRate: number): Promise<string>;
44
52
  /** estimate deposit receive amount, deduct protocol fee and repay amount */
45
53
  export declare function estimateDepositAmount(amount: string, option?: {
package/dist/index.js CHANGED
@@ -102,7 +102,7 @@ __export(src_exports, {
102
102
  getConfig: () => getConfig,
103
103
  getCsnaAccountId: () => getCsnaAccountId,
104
104
  getDepositAmount: () => getDepositAmount,
105
- getNBTCBalance: () => getNBTCBalance,
105
+ getTokenBalance: () => getTokenBalance,
106
106
  getVersion: () => getVersion,
107
107
  getWithdrawTransaction: () => getWithdrawTransaction,
108
108
  sendBitcoin: () => sendBitcoin,
@@ -432,11 +432,11 @@ var MobileWalletConnect = class {
432
432
  }
433
433
  static redirectToWallet(walletId) {
434
434
  return __async(this, null, function* () {
435
- var _a;
436
435
  if (isMobile()) {
437
436
  const currentUrl = window.location.href;
438
437
  const universalLink = this.getUniversalLink(walletId, currentUrl);
439
- if (!universalLink) {
438
+ const showGuideDialog = () => __async(this, null, function* () {
439
+ var _a;
440
440
  try {
441
441
  yield (_a = navigator.clipboard) == null ? void 0 : _a.writeText(currentUrl);
442
442
  } catch (error) {
@@ -454,9 +454,23 @@ var MobileWalletConnect = class {
454
454
  `,
455
455
  dangerouslyUseHTML: true
456
456
  });
457
+ });
458
+ if (!universalLink) {
459
+ yield showGuideDialog();
457
460
  return false;
458
461
  }
462
+ const openWallet = () => {
463
+ const iframe = document.createElement("iframe");
464
+ iframe.style.display = "none";
465
+ iframe.src = universalLink;
466
+ document.body.appendChild(iframe);
467
+ setTimeout(() => __async(this, null, function* () {
468
+ document.body.removeChild(iframe);
469
+ yield showGuideDialog();
470
+ }), 2e3);
471
+ };
459
472
  window.location.href = universalLink;
473
+ setTimeout(openWallet, 100);
460
474
  return true;
461
475
  }
462
476
  return false;
@@ -2870,7 +2884,10 @@ var import_js_sha256 = require("js-sha256");
2870
2884
  var walletConfig = {
2871
2885
  dev: {
2872
2886
  base_url: "https://api.dev.satoshibridge.top",
2873
- token: "nbtc-dev.testnet",
2887
+ btcToken: "nbtc-dev.testnet",
2888
+ btcTokenDecimals: 8,
2889
+ nearToken: "wrap.testnet",
2890
+ nearTokenDecimals: 24,
2874
2891
  accountContractId: "acc-dev.testnet",
2875
2892
  bridgeContractId: "brg-dev.testnet",
2876
2893
  walletUrl: "https://wallet-dev.satoshibridge.top",
@@ -2878,7 +2895,10 @@ var walletConfig = {
2878
2895
  },
2879
2896
  testnet: {
2880
2897
  base_url: "https://api.testnet.satoshibridge.top",
2881
- token: "nbtc2-nsp.testnet",
2898
+ btcToken: "nbtc2-nsp.testnet",
2899
+ btcTokenDecimals: 8,
2900
+ nearToken: "wrap.testnet",
2901
+ nearTokenDecimals: 24,
2882
2902
  accountContractId: "acc2-nsp.testnet",
2883
2903
  bridgeContractId: "brg2-nsp.testnet",
2884
2904
  walletUrl: "https://wallet-test.satoshibridge.top",
@@ -2886,7 +2906,10 @@ var walletConfig = {
2886
2906
  },
2887
2907
  private_mainnet: {
2888
2908
  base_url: "https://api.stg.satoshibridge.top",
2889
- token: "nbtc.toalice.near",
2909
+ btcToken: "nbtc.toalice.near",
2910
+ btcTokenDecimals: 8,
2911
+ nearToken: "wrap.near",
2912
+ nearTokenDecimals: 24,
2890
2913
  accountContractId: "acc.toalice.near",
2891
2914
  bridgeContractId: "brg.toalice.near",
2892
2915
  walletUrl: "https://wallet-stg.satoshibridge.top",
@@ -2894,7 +2917,10 @@ var walletConfig = {
2894
2917
  },
2895
2918
  mainnet: {
2896
2919
  base_url: "https://api.satos.network",
2897
- token: "nbtc.bridge.near",
2920
+ btcToken: "nbtc.bridge.near",
2921
+ btcTokenDecimals: 8,
2922
+ nearToken: "wrap.near",
2923
+ nearTokenDecimals: 24,
2898
2924
  accountContractId: "acc.ref-labs.near",
2899
2925
  bridgeContractId: "btc-connector.bridge.near",
2900
2926
  walletUrl: "https://wallet.satoshibridge.top",
@@ -2920,69 +2946,24 @@ var import_big = __toESM(require("big.js"), 1);
2920
2946
 
2921
2947
  // src/utils/nearUtils.ts
2922
2948
  var import_near_api_js = require("near-api-js");
2923
- function nearCallFunction(contractId, methodName, args, options) {
2924
- return __async(this, null, function* () {
2925
- const nearProvider = (options == null ? void 0 : options.provider) || new import_near_api_js.providers.FailoverRpcProvider(
2926
- nearRpcUrls[options == null ? void 0 : options.network].map(
2927
- (url) => new import_near_api_js.providers.JsonRpcProvider({ url })
2928
- )
2929
- );
2930
- const res = yield nearProvider.query({
2931
- request_type: "call_function",
2932
- account_id: contractId,
2933
- method_name: methodName,
2934
- args_base64: Buffer.from(JSON.stringify(args)).toString("base64"),
2935
- finality: "final"
2936
- });
2937
- return JSON.parse(Buffer.from(res.result).toString());
2938
- });
2939
- }
2940
- function pollTransactionStatuses(network, hashes) {
2941
- return __async(this, null, function* () {
2942
- const provider = new import_near_api_js.providers.FailoverRpcProvider(
2943
- Object.values(nearRpcUrls[network]).map(
2944
- (url) => new import_near_api_js.providers.JsonRpcProvider({ url })
2945
- )
2946
- );
2947
- const maxAttempts = 30;
2948
- let currentAttempt = 0;
2949
- const pendingHashes = new Set(hashes);
2950
- const results = /* @__PURE__ */ new Map();
2951
- while (pendingHashes.size > 0 && currentAttempt < maxAttempts) {
2952
- currentAttempt++;
2953
- const promises = Array.from(pendingHashes).map((hash) => __async(this, null, function* () {
2954
- try {
2955
- const result2 = yield provider.txStatus(hash, "unused", "FINAL");
2956
- if (result2 && result2.status) {
2957
- console.log(`Transaction ${hash} result:`, result2);
2958
- results.set(hash, result2);
2959
- pendingHashes.delete(hash);
2960
- }
2961
- } catch (error) {
2962
- console.error(`Failed to fetch transaction status for ${hash}: ${error.message}`);
2963
- }
2964
- }));
2965
- yield Promise.all(promises);
2966
- if (pendingHashes.size > 0) {
2967
- if (currentAttempt === maxAttempts) {
2968
- throw new Error(
2969
- `Transactions not found after max attempts: ${Array.from(pendingHashes).join(", ")}`
2970
- );
2971
- }
2972
- console.log(
2973
- `Waiting for ${pendingHashes.size} transactions, retrying ${maxAttempts - currentAttempt} more times`
2974
- );
2975
- yield delay(1e4);
2976
- }
2977
- }
2978
- const result = hashes.map((hash) => results.get(hash)).filter(Boolean);
2979
- return result;
2980
- });
2981
- }
2982
2949
 
2983
2950
  // src/utils/request.ts
2984
2951
  var cache = /* @__PURE__ */ new Map();
2985
2952
  var defaultCacheTimeout = 3e3;
2953
+ function withCache(key, fetcher, timeout = defaultCacheTimeout) {
2954
+ const cached = cache.get(key);
2955
+ const isCacheValid = cached && Date.now() - cached.timestamp < timeout;
2956
+ if (isCacheValid) {
2957
+ return Promise.resolve(cached.data);
2958
+ }
2959
+ return fetcher().then((data) => {
2960
+ cache.set(key, { timestamp: Date.now(), data });
2961
+ setTimeout(() => {
2962
+ cache.delete(key);
2963
+ }, timeout);
2964
+ return data;
2965
+ });
2966
+ }
2986
2967
  function request(url, options) {
2987
2968
  return __async(this, null, function* () {
2988
2969
  var _a;
@@ -3024,13 +3005,7 @@ function request(url, options) {
3024
3005
  if (options.shouldStopPolling(data)) {
3025
3006
  return data;
3026
3007
  }
3027
- if (options.maxPollingAttempts && options.maxPollingAttempts > 0) {
3028
- yield new Promise((resolve) => setTimeout(resolve, options.pollingInterval));
3029
- return request(url, __spreadProps(__spreadValues({}, options), {
3030
- maxPollingAttempts: options.maxPollingAttempts - 1
3031
- }));
3032
- }
3033
- throw new Error("Polling failed: maximum attempts reached without meeting the condition");
3008
+ throw new Error("Polling should continue");
3034
3009
  }
3035
3010
  if (cacheKey) {
3036
3011
  cache.set(cacheKey, { timestamp: Date.now(), data });
@@ -3040,6 +3015,7 @@ function request(url, options) {
3040
3015
  }
3041
3016
  return data;
3042
3017
  } catch (err) {
3018
+ console.error(err);
3043
3019
  if (retryCount > 0) {
3044
3020
  console.log(`Retrying... attempts left: ${retryCount}`);
3045
3021
  return request(url, __spreadProps(__spreadValues({}, options), { retryCount: retryCount - 1 }));
@@ -3053,8 +3029,85 @@ function request(url, options) {
3053
3029
  }));
3054
3030
  }
3055
3031
  }
3056
- throw err;
3032
+ return Promise.reject(err);
3033
+ }
3034
+ });
3035
+ }
3036
+
3037
+ // src/utils/nearUtils.ts
3038
+ function getNearProvider(option) {
3039
+ return option.provider || new import_near_api_js.providers.FailoverRpcProvider(
3040
+ nearRpcUrls[option == null ? void 0 : option.network].map(
3041
+ (url) => new import_near_api_js.providers.JsonRpcProvider({ url })
3042
+ )
3043
+ );
3044
+ }
3045
+ function nearCallFunction(_0, _1, _2) {
3046
+ return __async(this, arguments, function* (contractId, methodName, args, options = {}) {
3047
+ if (!options.skipCache) {
3048
+ const cacheKey = `near:${contractId}:${methodName}:${args ? JSON.stringify(args) : ""}`;
3049
+ return withCache(
3050
+ cacheKey,
3051
+ () => executeNearCall(contractId, methodName, args, options),
3052
+ options.cacheTimeout
3053
+ );
3054
+ }
3055
+ return executeNearCall(contractId, methodName, args, options);
3056
+ });
3057
+ }
3058
+ function executeNearCall(contractId, methodName, args, options) {
3059
+ return __async(this, null, function* () {
3060
+ const nearProvider = getNearProvider(options);
3061
+ const res = yield nearProvider.query({
3062
+ request_type: "call_function",
3063
+ account_id: contractId,
3064
+ method_name: methodName,
3065
+ args_base64: Buffer.from(JSON.stringify(args)).toString("base64"),
3066
+ finality: "final"
3067
+ });
3068
+ return JSON.parse(Buffer.from(res.result).toString());
3069
+ });
3070
+ }
3071
+ function pollTransactionStatuses(network, hashes) {
3072
+ return __async(this, null, function* () {
3073
+ const provider = new import_near_api_js.providers.FailoverRpcProvider(
3074
+ Object.values(nearRpcUrls[network]).map(
3075
+ (url) => new import_near_api_js.providers.JsonRpcProvider({ url })
3076
+ )
3077
+ );
3078
+ const maxAttempts = 30;
3079
+ let currentAttempt = 0;
3080
+ const pendingHashes = new Set(hashes);
3081
+ const results = /* @__PURE__ */ new Map();
3082
+ while (pendingHashes.size > 0 && currentAttempt < maxAttempts) {
3083
+ currentAttempt++;
3084
+ const promises = Array.from(pendingHashes).map((hash) => __async(this, null, function* () {
3085
+ try {
3086
+ const result2 = yield provider.txStatus(hash, "unused", "FINAL");
3087
+ if (result2 && result2.status) {
3088
+ console.log(`Transaction ${hash} result:`, result2);
3089
+ results.set(hash, result2);
3090
+ pendingHashes.delete(hash);
3091
+ }
3092
+ } catch (error) {
3093
+ console.error(`Failed to fetch transaction status for ${hash}: ${error.message}`);
3094
+ }
3095
+ }));
3096
+ yield Promise.all(promises);
3097
+ if (pendingHashes.size > 0) {
3098
+ if (currentAttempt === maxAttempts) {
3099
+ throw new Error(
3100
+ `Transactions not found after max attempts: ${Array.from(pendingHashes).join(", ")}`
3101
+ );
3102
+ }
3103
+ console.log(
3104
+ `Waiting for ${pendingHashes.size} transactions, retrying ${maxAttempts - currentAttempt} more times`
3105
+ );
3106
+ yield delay(1e4);
3107
+ }
3057
3108
  }
3109
+ const result = hashes.map((hash) => results.get(hash)).filter(Boolean);
3110
+ return result;
3058
3111
  });
3059
3112
  }
3060
3113
 
@@ -3211,9 +3264,10 @@ function nearCall(contractId, methodName, args) {
3211
3264
  return nearCallFunction(contractId, methodName, args, { network });
3212
3265
  });
3213
3266
  }
3214
- function getAccountInfo(csna, accountContractId) {
3215
- return __async(this, null, function* () {
3216
- const accountInfo = yield nearCall(accountContractId, "get_account", {
3267
+ function getAccountInfo(_0) {
3268
+ return __async(this, arguments, function* ({ csna, env }) {
3269
+ const config = yield getConfig(env);
3270
+ const accountInfo = yield nearCall(config.accountContractId, "get_account", {
3217
3271
  account_id: csna
3218
3272
  }).catch((error) => {
3219
3273
  return void 0;
@@ -3222,16 +3276,46 @@ function getAccountInfo(csna, accountContractId) {
3222
3276
  return accountInfo;
3223
3277
  });
3224
3278
  }
3225
- function checkGasTokenBalance(csna, gasToken, minAmount, env) {
3279
+ function getTokenBalance(_0) {
3280
+ return __async(this, arguments, function* ({
3281
+ csna,
3282
+ tokenId,
3283
+ env
3284
+ }) {
3285
+ const network = yield getNetwork();
3286
+ const config = yield getConfig(env);
3287
+ const nearProvider = getNearProvider({ network });
3288
+ try {
3289
+ if (tokenId === config.nearToken) {
3290
+ const nearAccount = yield nearProvider.query({
3291
+ request_type: "view_account",
3292
+ account_id: csna,
3293
+ finality: "final"
3294
+ });
3295
+ const balance = parseFloat(nearAccount.amount) / __pow(10, config.nearTokenDecimals);
3296
+ return { balance, rawBalance: nearAccount.amount };
3297
+ } else {
3298
+ const res = yield nearCall(tokenId, "ft_balance_of", { account_id: csna });
3299
+ const decimals = tokenId === config.btcToken ? config.btcTokenDecimals : (yield nearCall(tokenId, "ft_metadata", {})).decimals;
3300
+ const balance = parseFloat(res) / __pow(10, decimals);
3301
+ return { balance, rawBalance: res };
3302
+ }
3303
+ } catch (error) {
3304
+ console.error("getTokenBalance error:", error);
3305
+ return { balance: 0, rawBalance: "0" };
3306
+ }
3307
+ });
3308
+ }
3309
+ function checkGasTokenBalance(csna, minAmount, env) {
3226
3310
  return __async(this, null, function* () {
3227
- const amount = yield nearCall(gasToken, "ft_balance_of", { account_id: csna });
3228
- console.log("gas token balance:", amount);
3229
- if (new import_big.default(amount).lt(minAmount)) {
3311
+ const config = yield getConfig(env);
3312
+ const { rawBalance } = yield getTokenBalance({ csna, tokenId: config.btcToken, env });
3313
+ console.log("gas token balance:", rawBalance);
3314
+ if (new import_big.default(rawBalance).lt(minAmount)) {
3230
3315
  yield Dialog.confirm({
3231
3316
  title: "Gas token balance is insufficient",
3232
3317
  message: "Please deposit gas token to continue, will open bridge website."
3233
3318
  });
3234
- const config = yield getConfig(env);
3235
3319
  window.open(config.bridgeUrl, "_blank");
3236
3320
  throw new Error("Gas token balance is insufficient");
3237
3321
  }
@@ -3312,18 +3396,6 @@ function getBtcBalance() {
3312
3396
  };
3313
3397
  });
3314
3398
  }
3315
- function getNBTCBalance(address, env) {
3316
- return __async(this, null, function* () {
3317
- const config = yield getConfig(env || "mainnet");
3318
- const rawBalance = yield nearCall(config.token, "ft_balance_of", {
3319
- account_id: address
3320
- });
3321
- const balance = new import_big.default(rawBalance).div(__pow(10, 8)).round(8, import_big.default.roundDown).toNumber();
3322
- const rawAvailableBalance = new import_big.default(rawBalance).minus(1e3).toNumber();
3323
- const availableBalance = new import_big.default(rawAvailableBalance).div(__pow(10, 8)).round(8, import_big.default.roundDown).toNumber();
3324
- return { balance, availableBalance, rawBalance, rawAvailableBalance };
3325
- });
3326
- }
3327
3399
  function sendBitcoin(address, amount, feeRate) {
3328
3400
  return __async(this, null, function* () {
3329
3401
  const { sendBitcoin: sendBitcoin2 } = getBtcProvider();
@@ -3343,7 +3415,7 @@ function getDepositAmount(amount, option) {
3343
3415
  const _newAccountMinDepositAmount = (_a = option == null ? void 0 : option.newAccountMinDepositAmount) != null ? _a : true;
3344
3416
  const config = yield getConfig(env);
3345
3417
  const csna = yield getCsnaAccountId(env);
3346
- const accountInfo = yield getAccountInfo(csna, config.accountContractId);
3418
+ const accountInfo = yield getAccountInfo({ csna, env });
3347
3419
  const debtAction = yield checkGasTokenDebt(accountInfo, env, false);
3348
3420
  const repayAmount = (debtAction == null ? void 0 : debtAction.amount) || 0;
3349
3421
  const {
@@ -3422,7 +3494,7 @@ function executeBTCDepositAndAction(_0) {
3422
3494
  env,
3423
3495
  newAccountMinDepositAmount
3424
3496
  });
3425
- const accountInfo = yield getAccountInfo(csna, config.accountContractId);
3497
+ const accountInfo = yield getAccountInfo({ csna, env });
3426
3498
  const newActions = [];
3427
3499
  const debtAction = yield checkGasTokenDebt(accountInfo, env, false);
3428
3500
  if (debtAction) {
@@ -3436,12 +3508,12 @@ function executeBTCDepositAndAction(_0) {
3436
3508
  }));
3437
3509
  }
3438
3510
  const storageDepositMsg = {};
3439
- const registerRes = yield nearCall((action == null ? void 0 : action.receiver_id) || config.token, "storage_balance_of", {
3511
+ const registerRes = yield nearCall((action == null ? void 0 : action.receiver_id) || config.btcToken, "storage_balance_of", {
3440
3512
  account_id: csna
3441
3513
  });
3442
3514
  if (!(registerRes == null ? void 0 : registerRes.available)) {
3443
3515
  storageDepositMsg.storage_deposit_msg = {
3444
- contract_id: (action == null ? void 0 : action.receiver_id) || config.token,
3516
+ contract_id: (action == null ? void 0 : action.receiver_id) || config.btcToken,
3445
3517
  deposit: registerDeposit || NEAR_STORAGE_DEPOSIT_AMOUNT,
3446
3518
  registration_only: true
3447
3519
  };
@@ -3647,7 +3719,7 @@ function getWithdrawTransaction(_0) {
3647
3719
  };
3648
3720
  const csna = yield getCsnaAccountId(env);
3649
3721
  const transaction = {
3650
- receiverId: config.token,
3722
+ receiverId: config.btcToken,
3651
3723
  signerId: csna,
3652
3724
  actions: [
3653
3725
  {
@@ -4191,20 +4263,16 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4191
4263
  throw new Error("Wallet state is invalid, please reconnect your wallet.");
4192
4264
  }
4193
4265
  const btcContext = window.btcContext;
4194
- const accountId = state.getAccount();
4195
- const accountInfo = yield getAccountInfo(accountId, currentConfig.accountContractId);
4266
+ const csna = state.getAccount();
4267
+ const accountInfo = yield getAccountInfo({ csna, env });
4196
4268
  yield checkGasTokenDebt(accountInfo, env, true);
4197
4269
  const trans = [...params.transactions];
4198
4270
  console.log("signAndSendTransactions raw trans:", trans);
4199
- const gasTokenBalance = (accountInfo == null ? void 0 : accountInfo.gas_token[currentConfig.token]) || "0";
4200
- const { transferGasTransaction, useNearPayGas, gasLimit } = yield calculateGasStrategy(
4201
- gasTokenBalance,
4202
- trans
4203
- );
4271
+ const { transferGasTransaction, useNearPayGas, gasLimit } = yield calculateGasStrategy(trans);
4204
4272
  console.log("transferGasTransaction:", transferGasTransaction);
4205
4273
  console.log("useNearPayGas:", useNearPayGas);
4206
4274
  console.log("gasLimit:", gasLimit);
4207
- yield checkGasTokenBalance(accountId, currentConfig.token, gasLimit, env);
4275
+ yield checkGasTokenBalance(csna, gasLimit, env);
4208
4276
  if (transferGasTransaction) {
4209
4277
  trans.unshift(transferGasTransaction);
4210
4278
  }
@@ -4212,14 +4280,14 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4212
4280
  const newTrans = yield Promise.all(
4213
4281
  trans.map((transaction, index) => convertTransactionToTxHex(transaction, index))
4214
4282
  );
4215
- const nonceFromApi = yield getNonce(currentConfig.base_url, accountId);
4283
+ const nonceFromApi = yield getNonce(currentConfig.base_url, csna);
4216
4284
  const nonceFromContract = (accountInfo == null ? void 0 : accountInfo.nonce) || 0;
4217
4285
  const nonce = Number(nonceFromApi) > Number(nonceFromContract) ? String(nonceFromApi) : String(nonceFromContract);
4218
4286
  const intention = {
4219
4287
  chain_id: "397",
4220
- csna: accountId,
4288
+ csna,
4221
4289
  near_transactions: newTrans.map((t) => t.txHex),
4222
- gas_token: currentConfig.token,
4290
+ gas_token: currentConfig.btcToken,
4223
4291
  gas_limit: gasLimit,
4224
4292
  use_near_pay_gas: useNearPayGas,
4225
4293
  nonce
@@ -4232,7 +4300,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4232
4300
  data: toHex(strIntention)
4233
4301
  });
4234
4302
  yield checkBtcTransactionStatus(currentConfig.base_url, signature);
4235
- const hash = newTrans.map((t) => t.hash);
4303
+ const hash = newTrans.slice(1).map((t) => t.hash);
4236
4304
  console.log("txHash:", hash);
4237
4305
  const result = yield pollTransactionStatuses(options.network.networkId, hash);
4238
4306
  return result;
@@ -4240,12 +4308,9 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4240
4308
  }
4241
4309
  function calculateGasLimit(params) {
4242
4310
  return __async(this, null, function* () {
4243
- const accountId = state.getAccount();
4244
- const accountInfo = yield getAccountInfo(accountId, currentConfig.accountContractId);
4245
4311
  const trans = [...params.transactions];
4246
4312
  console.log("raw trans:", trans);
4247
- const gasTokenBalance = (accountInfo == null ? void 0 : accountInfo.gas_token[currentConfig.token]) || "0";
4248
- const { gasLimit } = yield calculateGasStrategy(gasTokenBalance, trans);
4313
+ const { gasLimit } = yield calculateGasStrategy(trans);
4249
4314
  return gasLimit;
4250
4315
  });
4251
4316
  }
@@ -4253,7 +4318,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4253
4318
  return __async(this, null, function* () {
4254
4319
  return {
4255
4320
  signerId: accountId,
4256
- receiverId: currentConfig.token,
4321
+ receiverId: currentConfig.btcToken,
4257
4322
  actions: [
4258
4323
  {
4259
4324
  type: "FunctionCall",
@@ -4281,7 +4346,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4281
4346
  } else {
4282
4347
  newGasLimit = yield getPredictedGasAmount(
4283
4348
  currentConfig.accountContractId,
4284
- currentConfig.token,
4349
+ currentConfig.btcToken,
4285
4350
  [transferTxHex, ...transactions2.map((t) => t.txHex)]
4286
4351
  );
4287
4352
  }
@@ -4302,31 +4367,61 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4302
4367
  return gasAmount.toString();
4303
4368
  });
4304
4369
  }
4305
- function calculateGasStrategy(gasTokenBalance, transactions2) {
4370
+ function calculateGasStrategy(transactions2) {
4306
4371
  return __async(this, null, function* () {
4307
4372
  var _a;
4308
4373
  const accountId = state.getAccount();
4309
- const nearAccount = yield provider.query({
4310
- request_type: "view_account",
4311
- account_id: accountId,
4312
- finality: "final"
4374
+ const accountInfo = yield getAccountInfo({ csna: accountId, env });
4375
+ const gasTokenBalance = (accountInfo == null ? void 0 : accountInfo.gas_token[currentConfig.btcToken]) || "0";
4376
+ const { balance: nearBalance } = yield getTokenBalance({
4377
+ csna: accountId,
4378
+ tokenId: currentConfig.nearToken,
4379
+ env
4313
4380
  });
4314
- const availableBalance = parseFloat(nearAccount.amount) / __pow(10, 24);
4315
- console.log("available near balance:", availableBalance);
4381
+ const { balance: btcBalance } = yield getTokenBalance({
4382
+ csna: accountId,
4383
+ tokenId: currentConfig.btcToken,
4384
+ env
4385
+ });
4386
+ const transferAmount = transactions2.reduce(
4387
+ (acc, tx) => {
4388
+ tx.actions.forEach((action) => {
4389
+ if (action.params.deposit) {
4390
+ const amount = Number(action.params.deposit) / __pow(10, currentConfig.nearTokenDecimals);
4391
+ console.log("near deposit amount:", amount);
4392
+ acc.near = acc.near.plus(amount);
4393
+ }
4394
+ if (tx.receiverId === currentConfig.btcToken && ["ft_transfer_call", "ft_transfer"].includes(action.params.methodName)) {
4395
+ const amount = Number(action.params.args.amount) / __pow(10, currentConfig.btcTokenDecimals);
4396
+ console.log("btc transfer amount:", amount);
4397
+ acc.btc = acc.btc.plus(amount);
4398
+ }
4399
+ });
4400
+ return acc;
4401
+ },
4402
+ { near: new import_big2.default(0), btc: new import_big2.default(0) }
4403
+ );
4404
+ const nearAvailableBalance = new import_big2.default(nearBalance).minus(transferAmount.near).toNumber();
4405
+ const btcAvailableBalance = new import_big2.default(btcBalance).minus(transferAmount.btc).toNumber();
4406
+ if (btcAvailableBalance < 8e-6) {
4407
+ throw new Error("BTC balance is not enough, please deposit more BTC.");
4408
+ }
4409
+ console.log("available near balance:", nearAvailableBalance);
4410
+ console.log("available btc balance:", btcAvailableBalance);
4316
4411
  console.log("available gas token balance:", gasTokenBalance);
4317
4412
  const convertTx = yield Promise.all(
4318
4413
  transactions2.map((transaction, index) => convertTransactionToTxHex(transaction, index))
4319
4414
  );
4320
- if (availableBalance > 0.5) {
4415
+ if (nearAvailableBalance > 0.5) {
4321
4416
  console.log("near balance is enough, get the protocol fee of each transaction");
4322
4417
  const gasTokens = yield nearCall2(
4323
4418
  currentConfig.accountContractId,
4324
4419
  "list_gas_token",
4325
- { token_ids: [currentConfig.token] }
4420
+ { token_ids: [currentConfig.btcToken] }
4326
4421
  );
4327
4422
  console.log("list_gas_token gas tokens:", gasTokens);
4328
4423
  const perTxFee = Math.max(
4329
- Number(((_a = gasTokens[currentConfig.token]) == null ? void 0 : _a.per_tx_protocol_fee) || 0),
4424
+ Number(((_a = gasTokens[currentConfig.btcToken]) == null ? void 0 : _a.per_tx_protocol_fee) || 0),
4330
4425
  100
4331
4426
  );
4332
4427
  console.log("perTxFee:", perTxFee);
@@ -4344,7 +4439,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4344
4439
  console.log("near balance is not enough, predict the gas token amount required");
4345
4440
  const adjustedGas = yield getPredictedGasAmount(
4346
4441
  currentConfig.accountContractId,
4347
- currentConfig.token,
4442
+ currentConfig.btcToken,
4348
4443
  convertTx.map((t) => t.txHex)
4349
4444
  );
4350
4445
  if (new import_big2.default(gasTokenBalance).gte(adjustedGas)) {
@@ -4460,7 +4555,7 @@ function setupBTCWallet({
4460
4555
 
4461
4556
  // src/index.ts
4462
4557
  var getVersion = () => {
4463
- return "0.5.11-beta";
4558
+ return "0.5.12-beta";
4464
4559
  };
4465
4560
  if (typeof window !== "undefined") {
4466
4561
  window.__BTC_WALLET_VERSION = getVersion();