btc-wallet 0.5.10-beta → 0.5.12-beta

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,13 @@
1
1
  import type { ProviderService } from '@near-wallet-selector/core/src/lib/services';
2
2
  import { providers } from 'near-api-js';
3
- export declare function nearCallFunction<T>(contractId: string, methodName: string, args: any, options: {
3
+ export declare function getNearProvider(option: {
4
4
  network?: string;
5
5
  provider?: ProviderService;
6
+ }): ProviderService | providers.FailoverRpcProvider;
7
+ export declare function nearCallFunction<T>(contractId: string, methodName: string, args: any, options?: {
8
+ network?: string;
9
+ provider?: ProviderService;
10
+ cacheTimeout?: number;
11
+ skipCache?: boolean;
6
12
  }): Promise<T>;
7
13
  export declare function pollTransactionStatuses(network: string, hashes: string[]): Promise<providers.FinalExecutionOutcome[]>;
@@ -7,5 +7,6 @@ interface RequestOptions<T> extends RequestInit {
7
7
  maxPollingAttempts?: number;
8
8
  shouldStopPolling?: (response: T) => boolean;
9
9
  }
10
+ export declare function withCache<T>(key: string, fetcher: () => Promise<T>, timeout?: number): Promise<T>;
10
11
  export default function request<T>(url: string, options?: RequestOptions<T>): Promise<T>;
11
12
  export {};
package/esm/index.js CHANGED
@@ -368,11 +368,11 @@ var MobileWalletConnect = class {
368
368
  }
369
369
  static redirectToWallet(walletId) {
370
370
  return __async(this, null, function* () {
371
- var _a;
372
371
  if (isMobile()) {
373
372
  const currentUrl = window.location.href;
374
373
  const universalLink = this.getUniversalLink(walletId, currentUrl);
375
- if (!universalLink) {
374
+ const showGuideDialog = () => __async(this, null, function* () {
375
+ var _a;
376
376
  try {
377
377
  yield (_a = navigator.clipboard) == null ? void 0 : _a.writeText(currentUrl);
378
378
  } catch (error) {
@@ -390,9 +390,23 @@ var MobileWalletConnect = class {
390
390
  `,
391
391
  dangerouslyUseHTML: true
392
392
  });
393
+ });
394
+ if (!universalLink) {
395
+ yield showGuideDialog();
393
396
  return false;
394
397
  }
398
+ const openWallet = () => {
399
+ const iframe = document.createElement("iframe");
400
+ iframe.style.display = "none";
401
+ iframe.src = universalLink;
402
+ document.body.appendChild(iframe);
403
+ setTimeout(() => __async(this, null, function* () {
404
+ document.body.removeChild(iframe);
405
+ yield showGuideDialog();
406
+ }), 2e3);
407
+ };
395
408
  window.location.href = universalLink;
409
+ setTimeout(openWallet, 100);
396
410
  return true;
397
411
  }
398
412
  return false;
@@ -441,24 +455,6 @@ var InjectedConnector = class extends BaseConnector {
441
455
  return accounts;
442
456
  });
443
457
  }
444
- getUniversalLink(url) {
445
- url = "https://www.deltatrade.ai/";
446
- console.log(this.metadata.id);
447
- switch (this.metadata.id) {
448
- case "unisat":
449
- return `unisat://dapp?url=${encodeURIComponent(url)}`;
450
- case "okx":
451
- return `okx://wallet/dapp/url?dappUrl=${encodeURIComponent(url)}`;
452
- case "bitget":
453
- return `https://bkcode.vip?action=dapp&url=${encodeURIComponent(url)}`;
454
- case "binance":
455
- return `binance://dapp?url=${encodeURIComponent(url)}`;
456
- case "xverse":
457
- return `https://connect.xverse.app/browser?url=${encodeURIComponent(url)}`;
458
- default:
459
- return url;
460
- }
461
- }
462
458
  getAccounts() {
463
459
  return __async(this, null, function* () {
464
460
  const accounts = yield this.getProviderOrThrow().getAccounts();
@@ -737,18 +733,10 @@ var XverseConnector = class extends BaseConnector {
737
733
  message: signStr,
738
734
  protocol: "ECDSA"
739
735
  });
740
- const modifiedSig = Buffer.from(result.signature, "base64");
741
736
  console.log("xverse walletType", address.walletType);
742
- console.log("xverse raw sig", result.signature, modifiedSig.toString("base64"));
743
- if (address.walletType === "ledger") {
744
- if (address.addressType === "p2wpkh") {
745
- modifiedSig[0] = 31 + (modifiedSig[0] - 39);
746
- } else if (address.addressType === "p2sh") {
747
- modifiedSig[0] = 31 + (modifiedSig[0] - 35);
748
- }
749
- } else {
750
- modifiedSig[0] = 31 + (modifiedSig[0] - 31) % 4;
751
- }
737
+ console.log("xverse raw sig", result.signature);
738
+ const modifiedSig = Buffer.from(result.signature, "base64");
739
+ modifiedSig[0] = 31 + (modifiedSig[0] - 31) % 4;
752
740
  const sig = modifiedSig.toString("base64");
753
741
  console.log("xverse modified sig", sig);
754
742
  return sig;
@@ -2846,7 +2834,10 @@ import { sha256 } from "js-sha256";
2846
2834
  var walletConfig = {
2847
2835
  dev: {
2848
2836
  base_url: "https://api.dev.satoshibridge.top",
2849
- token: "nbtc-dev.testnet",
2837
+ btcToken: "nbtc-dev.testnet",
2838
+ btcTokenDecimals: 8,
2839
+ nearToken: "wrap.testnet",
2840
+ nearTokenDecimals: 24,
2850
2841
  accountContractId: "acc-dev.testnet",
2851
2842
  bridgeContractId: "brg-dev.testnet",
2852
2843
  walletUrl: "https://wallet-dev.satoshibridge.top",
@@ -2854,7 +2845,10 @@ var walletConfig = {
2854
2845
  },
2855
2846
  testnet: {
2856
2847
  base_url: "https://api.testnet.satoshibridge.top",
2857
- token: "nbtc2-nsp.testnet",
2848
+ btcToken: "nbtc2-nsp.testnet",
2849
+ btcTokenDecimals: 8,
2850
+ nearToken: "wrap.testnet",
2851
+ nearTokenDecimals: 24,
2858
2852
  accountContractId: "acc2-nsp.testnet",
2859
2853
  bridgeContractId: "brg2-nsp.testnet",
2860
2854
  walletUrl: "https://wallet-test.satoshibridge.top",
@@ -2862,7 +2856,10 @@ var walletConfig = {
2862
2856
  },
2863
2857
  private_mainnet: {
2864
2858
  base_url: "https://api.stg.satoshibridge.top",
2865
- token: "nbtc.toalice.near",
2859
+ btcToken: "nbtc.toalice.near",
2860
+ btcTokenDecimals: 8,
2861
+ nearToken: "wrap.near",
2862
+ nearTokenDecimals: 24,
2866
2863
  accountContractId: "acc.toalice.near",
2867
2864
  bridgeContractId: "brg.toalice.near",
2868
2865
  walletUrl: "https://wallet-stg.satoshibridge.top",
@@ -2870,7 +2867,10 @@ var walletConfig = {
2870
2867
  },
2871
2868
  mainnet: {
2872
2869
  base_url: "https://api.satos.network",
2873
- token: "nbtc.bridge.near",
2870
+ btcToken: "nbtc.bridge.near",
2871
+ btcTokenDecimals: 8,
2872
+ nearToken: "wrap.near",
2873
+ nearTokenDecimals: 24,
2874
2874
  accountContractId: "acc.ref-labs.near",
2875
2875
  bridgeContractId: "btc-connector.bridge.near",
2876
2876
  walletUrl: "https://wallet.satoshibridge.top",
@@ -2896,69 +2896,24 @@ import Big from "big.js";
2896
2896
 
2897
2897
  // src/utils/nearUtils.ts
2898
2898
  import { providers } from "near-api-js";
2899
- function nearCallFunction(contractId, methodName, args, options) {
2900
- return __async(this, null, function* () {
2901
- const nearProvider = (options == null ? void 0 : options.provider) || new providers.FailoverRpcProvider(
2902
- nearRpcUrls[options == null ? void 0 : options.network].map(
2903
- (url) => new providers.JsonRpcProvider({ url })
2904
- )
2905
- );
2906
- const res = yield nearProvider.query({
2907
- request_type: "call_function",
2908
- account_id: contractId,
2909
- method_name: methodName,
2910
- args_base64: Buffer.from(JSON.stringify(args)).toString("base64"),
2911
- finality: "final"
2912
- });
2913
- return JSON.parse(Buffer.from(res.result).toString());
2914
- });
2915
- }
2916
- function pollTransactionStatuses(network, hashes) {
2917
- return __async(this, null, function* () {
2918
- const provider = new providers.FailoverRpcProvider(
2919
- Object.values(nearRpcUrls[network]).map(
2920
- (url) => new providers.JsonRpcProvider({ url })
2921
- )
2922
- );
2923
- const maxAttempts = 30;
2924
- let currentAttempt = 0;
2925
- const pendingHashes = new Set(hashes);
2926
- const results = /* @__PURE__ */ new Map();
2927
- while (pendingHashes.size > 0 && currentAttempt < maxAttempts) {
2928
- currentAttempt++;
2929
- const promises = Array.from(pendingHashes).map((hash) => __async(this, null, function* () {
2930
- try {
2931
- const result2 = yield provider.txStatus(hash, "unused", "FINAL");
2932
- if (result2 && result2.status) {
2933
- console.log(`Transaction ${hash} result:`, result2);
2934
- results.set(hash, result2);
2935
- pendingHashes.delete(hash);
2936
- }
2937
- } catch (error) {
2938
- console.error(`Failed to fetch transaction status for ${hash}: ${error.message}`);
2939
- }
2940
- }));
2941
- yield Promise.all(promises);
2942
- if (pendingHashes.size > 0) {
2943
- if (currentAttempt === maxAttempts) {
2944
- throw new Error(
2945
- `Transactions not found after max attempts: ${Array.from(pendingHashes).join(", ")}`
2946
- );
2947
- }
2948
- console.log(
2949
- `Waiting for ${pendingHashes.size} transactions, retrying ${maxAttempts - currentAttempt} more times`
2950
- );
2951
- yield delay(1e4);
2952
- }
2953
- }
2954
- const result = hashes.map((hash) => results.get(hash)).filter(Boolean);
2955
- return result;
2956
- });
2957
- }
2958
2899
 
2959
2900
  // src/utils/request.ts
2960
2901
  var cache = /* @__PURE__ */ new Map();
2961
2902
  var defaultCacheTimeout = 3e3;
2903
+ function withCache(key, fetcher, timeout = defaultCacheTimeout) {
2904
+ const cached = cache.get(key);
2905
+ const isCacheValid = cached && Date.now() - cached.timestamp < timeout;
2906
+ if (isCacheValid) {
2907
+ return Promise.resolve(cached.data);
2908
+ }
2909
+ return fetcher().then((data) => {
2910
+ cache.set(key, { timestamp: Date.now(), data });
2911
+ setTimeout(() => {
2912
+ cache.delete(key);
2913
+ }, timeout);
2914
+ return data;
2915
+ });
2916
+ }
2962
2917
  function request(url, options) {
2963
2918
  return __async(this, null, function* () {
2964
2919
  var _a;
@@ -3000,13 +2955,7 @@ function request(url, options) {
3000
2955
  if (options.shouldStopPolling(data)) {
3001
2956
  return data;
3002
2957
  }
3003
- if (options.maxPollingAttempts && options.maxPollingAttempts > 0) {
3004
- yield new Promise((resolve) => setTimeout(resolve, options.pollingInterval));
3005
- return request(url, __spreadProps(__spreadValues({}, options), {
3006
- maxPollingAttempts: options.maxPollingAttempts - 1
3007
- }));
3008
- }
3009
- throw new Error("Polling failed: maximum attempts reached without meeting the condition");
2958
+ throw new Error("Polling should continue");
3010
2959
  }
3011
2960
  if (cacheKey) {
3012
2961
  cache.set(cacheKey, { timestamp: Date.now(), data });
@@ -3016,6 +2965,7 @@ function request(url, options) {
3016
2965
  }
3017
2966
  return data;
3018
2967
  } catch (err) {
2968
+ console.error(err);
3019
2969
  if (retryCount > 0) {
3020
2970
  console.log(`Retrying... attempts left: ${retryCount}`);
3021
2971
  return request(url, __spreadProps(__spreadValues({}, options), { retryCount: retryCount - 1 }));
@@ -3029,8 +2979,85 @@ function request(url, options) {
3029
2979
  }));
3030
2980
  }
3031
2981
  }
3032
- throw err;
2982
+ return Promise.reject(err);
2983
+ }
2984
+ });
2985
+ }
2986
+
2987
+ // src/utils/nearUtils.ts
2988
+ function getNearProvider(option) {
2989
+ return option.provider || new providers.FailoverRpcProvider(
2990
+ nearRpcUrls[option == null ? void 0 : option.network].map(
2991
+ (url) => new providers.JsonRpcProvider({ url })
2992
+ )
2993
+ );
2994
+ }
2995
+ function nearCallFunction(_0, _1, _2) {
2996
+ return __async(this, arguments, function* (contractId, methodName, args, options = {}) {
2997
+ if (!options.skipCache) {
2998
+ const cacheKey = `near:${contractId}:${methodName}:${args ? JSON.stringify(args) : ""}`;
2999
+ return withCache(
3000
+ cacheKey,
3001
+ () => executeNearCall(contractId, methodName, args, options),
3002
+ options.cacheTimeout
3003
+ );
3004
+ }
3005
+ return executeNearCall(contractId, methodName, args, options);
3006
+ });
3007
+ }
3008
+ function executeNearCall(contractId, methodName, args, options) {
3009
+ return __async(this, null, function* () {
3010
+ const nearProvider = getNearProvider(options);
3011
+ const res = yield nearProvider.query({
3012
+ request_type: "call_function",
3013
+ account_id: contractId,
3014
+ method_name: methodName,
3015
+ args_base64: Buffer.from(JSON.stringify(args)).toString("base64"),
3016
+ finality: "final"
3017
+ });
3018
+ return JSON.parse(Buffer.from(res.result).toString());
3019
+ });
3020
+ }
3021
+ function pollTransactionStatuses(network, hashes) {
3022
+ return __async(this, null, function* () {
3023
+ const provider = new providers.FailoverRpcProvider(
3024
+ Object.values(nearRpcUrls[network]).map(
3025
+ (url) => new providers.JsonRpcProvider({ url })
3026
+ )
3027
+ );
3028
+ const maxAttempts = 30;
3029
+ let currentAttempt = 0;
3030
+ const pendingHashes = new Set(hashes);
3031
+ const results = /* @__PURE__ */ new Map();
3032
+ while (pendingHashes.size > 0 && currentAttempt < maxAttempts) {
3033
+ currentAttempt++;
3034
+ const promises = Array.from(pendingHashes).map((hash) => __async(this, null, function* () {
3035
+ try {
3036
+ const result2 = yield provider.txStatus(hash, "unused", "FINAL");
3037
+ if (result2 && result2.status) {
3038
+ console.log(`Transaction ${hash} result:`, result2);
3039
+ results.set(hash, result2);
3040
+ pendingHashes.delete(hash);
3041
+ }
3042
+ } catch (error) {
3043
+ console.error(`Failed to fetch transaction status for ${hash}: ${error.message}`);
3044
+ }
3045
+ }));
3046
+ yield Promise.all(promises);
3047
+ if (pendingHashes.size > 0) {
3048
+ if (currentAttempt === maxAttempts) {
3049
+ throw new Error(
3050
+ `Transactions not found after max attempts: ${Array.from(pendingHashes).join(", ")}`
3051
+ );
3052
+ }
3053
+ console.log(
3054
+ `Waiting for ${pendingHashes.size} transactions, retrying ${maxAttempts - currentAttempt} more times`
3055
+ );
3056
+ yield delay(1e4);
3057
+ }
3033
3058
  }
3059
+ const result = hashes.map((hash) => results.get(hash)).filter(Boolean);
3060
+ return result;
3034
3061
  });
3035
3062
  }
3036
3063
 
@@ -3187,9 +3214,10 @@ function nearCall(contractId, methodName, args) {
3187
3214
  return nearCallFunction(contractId, methodName, args, { network });
3188
3215
  });
3189
3216
  }
3190
- function getAccountInfo(csna, accountContractId) {
3191
- return __async(this, null, function* () {
3192
- const accountInfo = yield nearCall(accountContractId, "get_account", {
3217
+ function getAccountInfo(_0) {
3218
+ return __async(this, arguments, function* ({ csna, env }) {
3219
+ const config = yield getConfig(env);
3220
+ const accountInfo = yield nearCall(config.accountContractId, "get_account", {
3193
3221
  account_id: csna
3194
3222
  }).catch((error) => {
3195
3223
  return void 0;
@@ -3198,16 +3226,46 @@ function getAccountInfo(csna, accountContractId) {
3198
3226
  return accountInfo;
3199
3227
  });
3200
3228
  }
3201
- function checkGasTokenBalance(csna, gasToken, minAmount, env) {
3229
+ function getTokenBalance(_0) {
3230
+ return __async(this, arguments, function* ({
3231
+ csna,
3232
+ tokenId,
3233
+ env
3234
+ }) {
3235
+ const network = yield getNetwork();
3236
+ const config = yield getConfig(env);
3237
+ const nearProvider = getNearProvider({ network });
3238
+ try {
3239
+ if (tokenId === config.nearToken) {
3240
+ const nearAccount = yield nearProvider.query({
3241
+ request_type: "view_account",
3242
+ account_id: csna,
3243
+ finality: "final"
3244
+ });
3245
+ const balance = parseFloat(nearAccount.amount) / __pow(10, config.nearTokenDecimals);
3246
+ return { balance, rawBalance: nearAccount.amount };
3247
+ } else {
3248
+ const res = yield nearCall(tokenId, "ft_balance_of", { account_id: csna });
3249
+ const decimals = tokenId === config.btcToken ? config.btcTokenDecimals : (yield nearCall(tokenId, "ft_metadata", {})).decimals;
3250
+ const balance = parseFloat(res) / __pow(10, decimals);
3251
+ return { balance, rawBalance: res };
3252
+ }
3253
+ } catch (error) {
3254
+ console.error("getTokenBalance error:", error);
3255
+ return { balance: 0, rawBalance: "0" };
3256
+ }
3257
+ });
3258
+ }
3259
+ function checkGasTokenBalance(csna, minAmount, env) {
3202
3260
  return __async(this, null, function* () {
3203
- const amount = yield nearCall(gasToken, "ft_balance_of", { account_id: csna });
3204
- console.log("gas token balance:", amount);
3205
- if (new Big(amount).lt(minAmount)) {
3261
+ const config = yield getConfig(env);
3262
+ const { rawBalance } = yield getTokenBalance({ csna, tokenId: config.btcToken, env });
3263
+ console.log("gas token balance:", rawBalance);
3264
+ if (new Big(rawBalance).lt(minAmount)) {
3206
3265
  yield Dialog.confirm({
3207
3266
  title: "Gas token balance is insufficient",
3208
3267
  message: "Please deposit gas token to continue, will open bridge website."
3209
3268
  });
3210
- const config = yield getConfig(env);
3211
3269
  window.open(config.bridgeUrl, "_blank");
3212
3270
  throw new Error("Gas token balance is insufficient");
3213
3271
  }
@@ -3288,18 +3346,6 @@ function getBtcBalance() {
3288
3346
  };
3289
3347
  });
3290
3348
  }
3291
- function getNBTCBalance(address, env) {
3292
- return __async(this, null, function* () {
3293
- const config = yield getConfig(env || "mainnet");
3294
- const rawBalance = yield nearCall(config.token, "ft_balance_of", {
3295
- account_id: address
3296
- });
3297
- const balance = new Big(rawBalance).div(__pow(10, 8)).round(8, Big.roundDown).toNumber();
3298
- const rawAvailableBalance = new Big(rawBalance).minus(1e3).toNumber();
3299
- const availableBalance = new Big(rawAvailableBalance).div(__pow(10, 8)).round(8, Big.roundDown).toNumber();
3300
- return { balance, availableBalance, rawBalance, rawAvailableBalance };
3301
- });
3302
- }
3303
3349
  function sendBitcoin(address, amount, feeRate) {
3304
3350
  return __async(this, null, function* () {
3305
3351
  const { sendBitcoin: sendBitcoin2 } = getBtcProvider();
@@ -3319,7 +3365,7 @@ function getDepositAmount(amount, option) {
3319
3365
  const _newAccountMinDepositAmount = (_a = option == null ? void 0 : option.newAccountMinDepositAmount) != null ? _a : true;
3320
3366
  const config = yield getConfig(env);
3321
3367
  const csna = yield getCsnaAccountId(env);
3322
- const accountInfo = yield getAccountInfo(csna, config.accountContractId);
3368
+ const accountInfo = yield getAccountInfo({ csna, env });
3323
3369
  const debtAction = yield checkGasTokenDebt(accountInfo, env, false);
3324
3370
  const repayAmount = (debtAction == null ? void 0 : debtAction.amount) || 0;
3325
3371
  const {
@@ -3398,7 +3444,7 @@ function executeBTCDepositAndAction(_0) {
3398
3444
  env,
3399
3445
  newAccountMinDepositAmount
3400
3446
  });
3401
- const accountInfo = yield getAccountInfo(csna, config.accountContractId);
3447
+ const accountInfo = yield getAccountInfo({ csna, env });
3402
3448
  const newActions = [];
3403
3449
  const debtAction = yield checkGasTokenDebt(accountInfo, env, false);
3404
3450
  if (debtAction) {
@@ -3412,12 +3458,12 @@ function executeBTCDepositAndAction(_0) {
3412
3458
  }));
3413
3459
  }
3414
3460
  const storageDepositMsg = {};
3415
- const registerRes = yield nearCall((action == null ? void 0 : action.receiver_id) || config.token, "storage_balance_of", {
3461
+ const registerRes = yield nearCall((action == null ? void 0 : action.receiver_id) || config.btcToken, "storage_balance_of", {
3416
3462
  account_id: csna
3417
3463
  });
3418
3464
  if (!(registerRes == null ? void 0 : registerRes.available)) {
3419
3465
  storageDepositMsg.storage_deposit_msg = {
3420
- contract_id: (action == null ? void 0 : action.receiver_id) || config.token,
3466
+ contract_id: (action == null ? void 0 : action.receiver_id) || config.btcToken,
3421
3467
  deposit: registerDeposit || NEAR_STORAGE_DEPOSIT_AMOUNT,
3422
3468
  registration_only: true
3423
3469
  };
@@ -3623,7 +3669,7 @@ function getWithdrawTransaction(_0) {
3623
3669
  };
3624
3670
  const csna = yield getCsnaAccountId(env);
3625
3671
  const transaction = {
3626
- receiverId: config.token,
3672
+ receiverId: config.btcToken,
3627
3673
  signerId: csna,
3628
3674
  actions: [
3629
3675
  {
@@ -4167,20 +4213,16 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4167
4213
  throw new Error("Wallet state is invalid, please reconnect your wallet.");
4168
4214
  }
4169
4215
  const btcContext = window.btcContext;
4170
- const accountId = state.getAccount();
4171
- const accountInfo = yield getAccountInfo(accountId, currentConfig.accountContractId);
4216
+ const csna = state.getAccount();
4217
+ const accountInfo = yield getAccountInfo({ csna, env });
4172
4218
  yield checkGasTokenDebt(accountInfo, env, true);
4173
4219
  const trans = [...params.transactions];
4174
4220
  console.log("signAndSendTransactions raw trans:", trans);
4175
- const gasTokenBalance = (accountInfo == null ? void 0 : accountInfo.gas_token[currentConfig.token]) || "0";
4176
- const { transferGasTransaction, useNearPayGas, gasLimit } = yield calculateGasStrategy(
4177
- gasTokenBalance,
4178
- trans
4179
- );
4221
+ const { transferGasTransaction, useNearPayGas, gasLimit } = yield calculateGasStrategy(trans);
4180
4222
  console.log("transferGasTransaction:", transferGasTransaction);
4181
4223
  console.log("useNearPayGas:", useNearPayGas);
4182
4224
  console.log("gasLimit:", gasLimit);
4183
- yield checkGasTokenBalance(accountId, currentConfig.token, gasLimit, env);
4225
+ yield checkGasTokenBalance(csna, gasLimit, env);
4184
4226
  if (transferGasTransaction) {
4185
4227
  trans.unshift(transferGasTransaction);
4186
4228
  }
@@ -4188,14 +4230,14 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4188
4230
  const newTrans = yield Promise.all(
4189
4231
  trans.map((transaction, index) => convertTransactionToTxHex(transaction, index))
4190
4232
  );
4191
- const nonceFromApi = yield getNonce(currentConfig.base_url, accountId);
4233
+ const nonceFromApi = yield getNonce(currentConfig.base_url, csna);
4192
4234
  const nonceFromContract = (accountInfo == null ? void 0 : accountInfo.nonce) || 0;
4193
4235
  const nonce = Number(nonceFromApi) > Number(nonceFromContract) ? String(nonceFromApi) : String(nonceFromContract);
4194
4236
  const intention = {
4195
4237
  chain_id: "397",
4196
- csna: accountId,
4238
+ csna,
4197
4239
  near_transactions: newTrans.map((t) => t.txHex),
4198
- gas_token: currentConfig.token,
4240
+ gas_token: currentConfig.btcToken,
4199
4241
  gas_limit: gasLimit,
4200
4242
  use_near_pay_gas: useNearPayGas,
4201
4243
  nonce
@@ -4208,7 +4250,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4208
4250
  data: toHex(strIntention)
4209
4251
  });
4210
4252
  yield checkBtcTransactionStatus(currentConfig.base_url, signature);
4211
- const hash = newTrans.map((t) => t.hash);
4253
+ const hash = newTrans.slice(1).map((t) => t.hash);
4212
4254
  console.log("txHash:", hash);
4213
4255
  const result = yield pollTransactionStatuses(options.network.networkId, hash);
4214
4256
  return result;
@@ -4216,12 +4258,9 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4216
4258
  }
4217
4259
  function calculateGasLimit(params) {
4218
4260
  return __async(this, null, function* () {
4219
- const accountId = state.getAccount();
4220
- const accountInfo = yield getAccountInfo(accountId, currentConfig.accountContractId);
4221
4261
  const trans = [...params.transactions];
4222
4262
  console.log("raw trans:", trans);
4223
- const gasTokenBalance = (accountInfo == null ? void 0 : accountInfo.gas_token[currentConfig.token]) || "0";
4224
- const { gasLimit } = yield calculateGasStrategy(gasTokenBalance, trans);
4263
+ const { gasLimit } = yield calculateGasStrategy(trans);
4225
4264
  return gasLimit;
4226
4265
  });
4227
4266
  }
@@ -4229,7 +4268,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4229
4268
  return __async(this, null, function* () {
4230
4269
  return {
4231
4270
  signerId: accountId,
4232
- receiverId: currentConfig.token,
4271
+ receiverId: currentConfig.btcToken,
4233
4272
  actions: [
4234
4273
  {
4235
4274
  type: "FunctionCall",
@@ -4257,7 +4296,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4257
4296
  } else {
4258
4297
  newGasLimit = yield getPredictedGasAmount(
4259
4298
  currentConfig.accountContractId,
4260
- currentConfig.token,
4299
+ currentConfig.btcToken,
4261
4300
  [transferTxHex, ...transactions2.map((t) => t.txHex)]
4262
4301
  );
4263
4302
  }
@@ -4278,31 +4317,61 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4278
4317
  return gasAmount.toString();
4279
4318
  });
4280
4319
  }
4281
- function calculateGasStrategy(gasTokenBalance, transactions2) {
4320
+ function calculateGasStrategy(transactions2) {
4282
4321
  return __async(this, null, function* () {
4283
4322
  var _a;
4284
4323
  const accountId = state.getAccount();
4285
- const nearAccount = yield provider.query({
4286
- request_type: "view_account",
4287
- account_id: accountId,
4288
- finality: "final"
4324
+ const accountInfo = yield getAccountInfo({ csna: accountId, env });
4325
+ const gasTokenBalance = (accountInfo == null ? void 0 : accountInfo.gas_token[currentConfig.btcToken]) || "0";
4326
+ const { balance: nearBalance } = yield getTokenBalance({
4327
+ csna: accountId,
4328
+ tokenId: currentConfig.nearToken,
4329
+ env
4330
+ });
4331
+ const { balance: btcBalance } = yield getTokenBalance({
4332
+ csna: accountId,
4333
+ tokenId: currentConfig.btcToken,
4334
+ env
4289
4335
  });
4290
- const availableBalance = parseFloat(nearAccount.amount) / __pow(10, 24);
4291
- console.log("available near balance:", availableBalance);
4336
+ const transferAmount = transactions2.reduce(
4337
+ (acc, tx) => {
4338
+ tx.actions.forEach((action) => {
4339
+ if (action.params.deposit) {
4340
+ const amount = Number(action.params.deposit) / __pow(10, currentConfig.nearTokenDecimals);
4341
+ console.log("near deposit amount:", amount);
4342
+ acc.near = acc.near.plus(amount);
4343
+ }
4344
+ if (tx.receiverId === currentConfig.btcToken && ["ft_transfer_call", "ft_transfer"].includes(action.params.methodName)) {
4345
+ const amount = Number(action.params.args.amount) / __pow(10, currentConfig.btcTokenDecimals);
4346
+ console.log("btc transfer amount:", amount);
4347
+ acc.btc = acc.btc.plus(amount);
4348
+ }
4349
+ });
4350
+ return acc;
4351
+ },
4352
+ { near: new Big2(0), btc: new Big2(0) }
4353
+ );
4354
+ const nearAvailableBalance = new Big2(nearBalance).minus(transferAmount.near).toNumber();
4355
+ const btcAvailableBalance = new Big2(btcBalance).minus(transferAmount.btc).toNumber();
4356
+ if (btcAvailableBalance < 8e-6) {
4357
+ throw new Error("BTC balance is not enough, please deposit more BTC.");
4358
+ }
4359
+ console.log("available near balance:", nearAvailableBalance);
4360
+ console.log("available btc balance:", btcAvailableBalance);
4292
4361
  console.log("available gas token balance:", gasTokenBalance);
4293
4362
  const convertTx = yield Promise.all(
4294
4363
  transactions2.map((transaction, index) => convertTransactionToTxHex(transaction, index))
4295
4364
  );
4296
- if (availableBalance > 0.5) {
4365
+ if (nearAvailableBalance > 0.5) {
4297
4366
  console.log("near balance is enough, get the protocol fee of each transaction");
4298
4367
  const gasTokens = yield nearCall2(
4299
4368
  currentConfig.accountContractId,
4300
4369
  "list_gas_token",
4301
- { token_ids: [currentConfig.token] }
4370
+ { token_ids: [currentConfig.btcToken] }
4302
4371
  );
4303
4372
  console.log("list_gas_token gas tokens:", gasTokens);
4304
4373
  const perTxFee = Math.max(
4305
- Number(((_a = gasTokens[currentConfig.token]) == null ? void 0 : _a.per_tx_protocol_fee) || 0),
4374
+ Number(((_a = gasTokens[currentConfig.btcToken]) == null ? void 0 : _a.per_tx_protocol_fee) || 0),
4306
4375
  100
4307
4376
  );
4308
4377
  console.log("perTxFee:", perTxFee);
@@ -4320,7 +4389,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4320
4389
  console.log("near balance is not enough, predict the gas token amount required");
4321
4390
  const adjustedGas = yield getPredictedGasAmount(
4322
4391
  currentConfig.accountContractId,
4323
- currentConfig.token,
4392
+ currentConfig.btcToken,
4324
4393
  convertTx.map((t) => t.txHex)
4325
4394
  );
4326
4395
  if (new Big2(gasTokenBalance).gte(adjustedGas)) {
@@ -4436,7 +4505,7 @@ function setupBTCWallet({
4436
4505
 
4437
4506
  // src/index.ts
4438
4507
  var getVersion = () => {
4439
- return "0.5.10-beta";
4508
+ return "0.5.12-beta";
4440
4509
  };
4441
4510
  if (typeof window !== "undefined") {
4442
4511
  window.__BTC_WALLET_VERSION = getVersion();
@@ -4466,7 +4535,7 @@ export {
4466
4535
  getConfig,
4467
4536
  getCsnaAccountId,
4468
4537
  getDepositAmount,
4469
- getNBTCBalance,
4538
+ getTokenBalance,
4470
4539
  getVersion,
4471
4540
  getWithdrawTransaction,
4472
4541
  sendBitcoin,