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.
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;
@@ -505,24 +519,6 @@ var InjectedConnector = class extends BaseConnector {
505
519
  return accounts;
506
520
  });
507
521
  }
508
- getUniversalLink(url) {
509
- url = "https://www.deltatrade.ai/";
510
- console.log(this.metadata.id);
511
- switch (this.metadata.id) {
512
- case "unisat":
513
- return `unisat://dapp?url=${encodeURIComponent(url)}`;
514
- case "okx":
515
- return `okx://wallet/dapp/url?dappUrl=${encodeURIComponent(url)}`;
516
- case "bitget":
517
- return `https://bkcode.vip?action=dapp&url=${encodeURIComponent(url)}`;
518
- case "binance":
519
- return `binance://dapp?url=${encodeURIComponent(url)}`;
520
- case "xverse":
521
- return `https://connect.xverse.app/browser?url=${encodeURIComponent(url)}`;
522
- default:
523
- return url;
524
- }
525
- }
526
522
  getAccounts() {
527
523
  return __async(this, null, function* () {
528
524
  const accounts = yield this.getProviderOrThrow().getAccounts();
@@ -801,18 +797,10 @@ var XverseConnector = class extends BaseConnector {
801
797
  message: signStr,
802
798
  protocol: "ECDSA"
803
799
  });
804
- const modifiedSig = Buffer.from(result.signature, "base64");
805
800
  console.log("xverse walletType", address.walletType);
806
- console.log("xverse raw sig", result.signature, modifiedSig.toString("base64"));
807
- if (address.walletType === "ledger") {
808
- if (address.addressType === "p2wpkh") {
809
- modifiedSig[0] = 31 + (modifiedSig[0] - 39);
810
- } else if (address.addressType === "p2sh") {
811
- modifiedSig[0] = 31 + (modifiedSig[0] - 35);
812
- }
813
- } else {
814
- modifiedSig[0] = 31 + (modifiedSig[0] - 31) % 4;
815
- }
801
+ console.log("xverse raw sig", result.signature);
802
+ const modifiedSig = Buffer.from(result.signature, "base64");
803
+ modifiedSig[0] = 31 + (modifiedSig[0] - 31) % 4;
816
804
  const sig = modifiedSig.toString("base64");
817
805
  console.log("xverse modified sig", sig);
818
806
  return sig;
@@ -2896,7 +2884,10 @@ var import_js_sha256 = require("js-sha256");
2896
2884
  var walletConfig = {
2897
2885
  dev: {
2898
2886
  base_url: "https://api.dev.satoshibridge.top",
2899
- token: "nbtc-dev.testnet",
2887
+ btcToken: "nbtc-dev.testnet",
2888
+ btcTokenDecimals: 8,
2889
+ nearToken: "wrap.testnet",
2890
+ nearTokenDecimals: 24,
2900
2891
  accountContractId: "acc-dev.testnet",
2901
2892
  bridgeContractId: "brg-dev.testnet",
2902
2893
  walletUrl: "https://wallet-dev.satoshibridge.top",
@@ -2904,7 +2895,10 @@ var walletConfig = {
2904
2895
  },
2905
2896
  testnet: {
2906
2897
  base_url: "https://api.testnet.satoshibridge.top",
2907
- token: "nbtc2-nsp.testnet",
2898
+ btcToken: "nbtc2-nsp.testnet",
2899
+ btcTokenDecimals: 8,
2900
+ nearToken: "wrap.testnet",
2901
+ nearTokenDecimals: 24,
2908
2902
  accountContractId: "acc2-nsp.testnet",
2909
2903
  bridgeContractId: "brg2-nsp.testnet",
2910
2904
  walletUrl: "https://wallet-test.satoshibridge.top",
@@ -2912,7 +2906,10 @@ var walletConfig = {
2912
2906
  },
2913
2907
  private_mainnet: {
2914
2908
  base_url: "https://api.stg.satoshibridge.top",
2915
- token: "nbtc.toalice.near",
2909
+ btcToken: "nbtc.toalice.near",
2910
+ btcTokenDecimals: 8,
2911
+ nearToken: "wrap.near",
2912
+ nearTokenDecimals: 24,
2916
2913
  accountContractId: "acc.toalice.near",
2917
2914
  bridgeContractId: "brg.toalice.near",
2918
2915
  walletUrl: "https://wallet-stg.satoshibridge.top",
@@ -2920,7 +2917,10 @@ var walletConfig = {
2920
2917
  },
2921
2918
  mainnet: {
2922
2919
  base_url: "https://api.satos.network",
2923
- token: "nbtc.bridge.near",
2920
+ btcToken: "nbtc.bridge.near",
2921
+ btcTokenDecimals: 8,
2922
+ nearToken: "wrap.near",
2923
+ nearTokenDecimals: 24,
2924
2924
  accountContractId: "acc.ref-labs.near",
2925
2925
  bridgeContractId: "btc-connector.bridge.near",
2926
2926
  walletUrl: "https://wallet.satoshibridge.top",
@@ -2946,69 +2946,24 @@ var import_big = __toESM(require("big.js"), 1);
2946
2946
 
2947
2947
  // src/utils/nearUtils.ts
2948
2948
  var import_near_api_js = require("near-api-js");
2949
- function nearCallFunction(contractId, methodName, args, options) {
2950
- return __async(this, null, function* () {
2951
- const nearProvider = (options == null ? void 0 : options.provider) || new import_near_api_js.providers.FailoverRpcProvider(
2952
- nearRpcUrls[options == null ? void 0 : options.network].map(
2953
- (url) => new import_near_api_js.providers.JsonRpcProvider({ url })
2954
- )
2955
- );
2956
- const res = yield nearProvider.query({
2957
- request_type: "call_function",
2958
- account_id: contractId,
2959
- method_name: methodName,
2960
- args_base64: Buffer.from(JSON.stringify(args)).toString("base64"),
2961
- finality: "final"
2962
- });
2963
- return JSON.parse(Buffer.from(res.result).toString());
2964
- });
2965
- }
2966
- function pollTransactionStatuses(network, hashes) {
2967
- return __async(this, null, function* () {
2968
- const provider = new import_near_api_js.providers.FailoverRpcProvider(
2969
- Object.values(nearRpcUrls[network]).map(
2970
- (url) => new import_near_api_js.providers.JsonRpcProvider({ url })
2971
- )
2972
- );
2973
- const maxAttempts = 30;
2974
- let currentAttempt = 0;
2975
- const pendingHashes = new Set(hashes);
2976
- const results = /* @__PURE__ */ new Map();
2977
- while (pendingHashes.size > 0 && currentAttempt < maxAttempts) {
2978
- currentAttempt++;
2979
- const promises = Array.from(pendingHashes).map((hash) => __async(this, null, function* () {
2980
- try {
2981
- const result2 = yield provider.txStatus(hash, "unused", "FINAL");
2982
- if (result2 && result2.status) {
2983
- console.log(`Transaction ${hash} result:`, result2);
2984
- results.set(hash, result2);
2985
- pendingHashes.delete(hash);
2986
- }
2987
- } catch (error) {
2988
- console.error(`Failed to fetch transaction status for ${hash}: ${error.message}`);
2989
- }
2990
- }));
2991
- yield Promise.all(promises);
2992
- if (pendingHashes.size > 0) {
2993
- if (currentAttempt === maxAttempts) {
2994
- throw new Error(
2995
- `Transactions not found after max attempts: ${Array.from(pendingHashes).join(", ")}`
2996
- );
2997
- }
2998
- console.log(
2999
- `Waiting for ${pendingHashes.size} transactions, retrying ${maxAttempts - currentAttempt} more times`
3000
- );
3001
- yield delay(1e4);
3002
- }
3003
- }
3004
- const result = hashes.map((hash) => results.get(hash)).filter(Boolean);
3005
- return result;
3006
- });
3007
- }
3008
2949
 
3009
2950
  // src/utils/request.ts
3010
2951
  var cache = /* @__PURE__ */ new Map();
3011
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
+ }
3012
2967
  function request(url, options) {
3013
2968
  return __async(this, null, function* () {
3014
2969
  var _a;
@@ -3050,13 +3005,7 @@ function request(url, options) {
3050
3005
  if (options.shouldStopPolling(data)) {
3051
3006
  return data;
3052
3007
  }
3053
- if (options.maxPollingAttempts && options.maxPollingAttempts > 0) {
3054
- yield new Promise((resolve) => setTimeout(resolve, options.pollingInterval));
3055
- return request(url, __spreadProps(__spreadValues({}, options), {
3056
- maxPollingAttempts: options.maxPollingAttempts - 1
3057
- }));
3058
- }
3059
- throw new Error("Polling failed: maximum attempts reached without meeting the condition");
3008
+ throw new Error("Polling should continue");
3060
3009
  }
3061
3010
  if (cacheKey) {
3062
3011
  cache.set(cacheKey, { timestamp: Date.now(), data });
@@ -3066,6 +3015,7 @@ function request(url, options) {
3066
3015
  }
3067
3016
  return data;
3068
3017
  } catch (err) {
3018
+ console.error(err);
3069
3019
  if (retryCount > 0) {
3070
3020
  console.log(`Retrying... attempts left: ${retryCount}`);
3071
3021
  return request(url, __spreadProps(__spreadValues({}, options), { retryCount: retryCount - 1 }));
@@ -3079,8 +3029,85 @@ function request(url, options) {
3079
3029
  }));
3080
3030
  }
3081
3031
  }
3082
- 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
+ }
3083
3108
  }
3109
+ const result = hashes.map((hash) => results.get(hash)).filter(Boolean);
3110
+ return result;
3084
3111
  });
3085
3112
  }
3086
3113
 
@@ -3237,9 +3264,10 @@ function nearCall(contractId, methodName, args) {
3237
3264
  return nearCallFunction(contractId, methodName, args, { network });
3238
3265
  });
3239
3266
  }
3240
- function getAccountInfo(csna, accountContractId) {
3241
- return __async(this, null, function* () {
3242
- 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", {
3243
3271
  account_id: csna
3244
3272
  }).catch((error) => {
3245
3273
  return void 0;
@@ -3248,16 +3276,46 @@ function getAccountInfo(csna, accountContractId) {
3248
3276
  return accountInfo;
3249
3277
  });
3250
3278
  }
3251
- 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) {
3252
3310
  return __async(this, null, function* () {
3253
- const amount = yield nearCall(gasToken, "ft_balance_of", { account_id: csna });
3254
- console.log("gas token balance:", amount);
3255
- 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)) {
3256
3315
  yield Dialog.confirm({
3257
3316
  title: "Gas token balance is insufficient",
3258
3317
  message: "Please deposit gas token to continue, will open bridge website."
3259
3318
  });
3260
- const config = yield getConfig(env);
3261
3319
  window.open(config.bridgeUrl, "_blank");
3262
3320
  throw new Error("Gas token balance is insufficient");
3263
3321
  }
@@ -3338,18 +3396,6 @@ function getBtcBalance() {
3338
3396
  };
3339
3397
  });
3340
3398
  }
3341
- function getNBTCBalance(address, env) {
3342
- return __async(this, null, function* () {
3343
- const config = yield getConfig(env || "mainnet");
3344
- const rawBalance = yield nearCall(config.token, "ft_balance_of", {
3345
- account_id: address
3346
- });
3347
- const balance = new import_big.default(rawBalance).div(__pow(10, 8)).round(8, import_big.default.roundDown).toNumber();
3348
- const rawAvailableBalance = new import_big.default(rawBalance).minus(1e3).toNumber();
3349
- const availableBalance = new import_big.default(rawAvailableBalance).div(__pow(10, 8)).round(8, import_big.default.roundDown).toNumber();
3350
- return { balance, availableBalance, rawBalance, rawAvailableBalance };
3351
- });
3352
- }
3353
3399
  function sendBitcoin(address, amount, feeRate) {
3354
3400
  return __async(this, null, function* () {
3355
3401
  const { sendBitcoin: sendBitcoin2 } = getBtcProvider();
@@ -3369,7 +3415,7 @@ function getDepositAmount(amount, option) {
3369
3415
  const _newAccountMinDepositAmount = (_a = option == null ? void 0 : option.newAccountMinDepositAmount) != null ? _a : true;
3370
3416
  const config = yield getConfig(env);
3371
3417
  const csna = yield getCsnaAccountId(env);
3372
- const accountInfo = yield getAccountInfo(csna, config.accountContractId);
3418
+ const accountInfo = yield getAccountInfo({ csna, env });
3373
3419
  const debtAction = yield checkGasTokenDebt(accountInfo, env, false);
3374
3420
  const repayAmount = (debtAction == null ? void 0 : debtAction.amount) || 0;
3375
3421
  const {
@@ -3448,7 +3494,7 @@ function executeBTCDepositAndAction(_0) {
3448
3494
  env,
3449
3495
  newAccountMinDepositAmount
3450
3496
  });
3451
- const accountInfo = yield getAccountInfo(csna, config.accountContractId);
3497
+ const accountInfo = yield getAccountInfo({ csna, env });
3452
3498
  const newActions = [];
3453
3499
  const debtAction = yield checkGasTokenDebt(accountInfo, env, false);
3454
3500
  if (debtAction) {
@@ -3462,12 +3508,12 @@ function executeBTCDepositAndAction(_0) {
3462
3508
  }));
3463
3509
  }
3464
3510
  const storageDepositMsg = {};
3465
- 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", {
3466
3512
  account_id: csna
3467
3513
  });
3468
3514
  if (!(registerRes == null ? void 0 : registerRes.available)) {
3469
3515
  storageDepositMsg.storage_deposit_msg = {
3470
- contract_id: (action == null ? void 0 : action.receiver_id) || config.token,
3516
+ contract_id: (action == null ? void 0 : action.receiver_id) || config.btcToken,
3471
3517
  deposit: registerDeposit || NEAR_STORAGE_DEPOSIT_AMOUNT,
3472
3518
  registration_only: true
3473
3519
  };
@@ -3673,7 +3719,7 @@ function getWithdrawTransaction(_0) {
3673
3719
  };
3674
3720
  const csna = yield getCsnaAccountId(env);
3675
3721
  const transaction = {
3676
- receiverId: config.token,
3722
+ receiverId: config.btcToken,
3677
3723
  signerId: csna,
3678
3724
  actions: [
3679
3725
  {
@@ -4217,20 +4263,16 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4217
4263
  throw new Error("Wallet state is invalid, please reconnect your wallet.");
4218
4264
  }
4219
4265
  const btcContext = window.btcContext;
4220
- const accountId = state.getAccount();
4221
- const accountInfo = yield getAccountInfo(accountId, currentConfig.accountContractId);
4266
+ const csna = state.getAccount();
4267
+ const accountInfo = yield getAccountInfo({ csna, env });
4222
4268
  yield checkGasTokenDebt(accountInfo, env, true);
4223
4269
  const trans = [...params.transactions];
4224
4270
  console.log("signAndSendTransactions raw trans:", trans);
4225
- const gasTokenBalance = (accountInfo == null ? void 0 : accountInfo.gas_token[currentConfig.token]) || "0";
4226
- const { transferGasTransaction, useNearPayGas, gasLimit } = yield calculateGasStrategy(
4227
- gasTokenBalance,
4228
- trans
4229
- );
4271
+ const { transferGasTransaction, useNearPayGas, gasLimit } = yield calculateGasStrategy(trans);
4230
4272
  console.log("transferGasTransaction:", transferGasTransaction);
4231
4273
  console.log("useNearPayGas:", useNearPayGas);
4232
4274
  console.log("gasLimit:", gasLimit);
4233
- yield checkGasTokenBalance(accountId, currentConfig.token, gasLimit, env);
4275
+ yield checkGasTokenBalance(csna, gasLimit, env);
4234
4276
  if (transferGasTransaction) {
4235
4277
  trans.unshift(transferGasTransaction);
4236
4278
  }
@@ -4238,14 +4280,14 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4238
4280
  const newTrans = yield Promise.all(
4239
4281
  trans.map((transaction, index) => convertTransactionToTxHex(transaction, index))
4240
4282
  );
4241
- const nonceFromApi = yield getNonce(currentConfig.base_url, accountId);
4283
+ const nonceFromApi = yield getNonce(currentConfig.base_url, csna);
4242
4284
  const nonceFromContract = (accountInfo == null ? void 0 : accountInfo.nonce) || 0;
4243
4285
  const nonce = Number(nonceFromApi) > Number(nonceFromContract) ? String(nonceFromApi) : String(nonceFromContract);
4244
4286
  const intention = {
4245
4287
  chain_id: "397",
4246
- csna: accountId,
4288
+ csna,
4247
4289
  near_transactions: newTrans.map((t) => t.txHex),
4248
- gas_token: currentConfig.token,
4290
+ gas_token: currentConfig.btcToken,
4249
4291
  gas_limit: gasLimit,
4250
4292
  use_near_pay_gas: useNearPayGas,
4251
4293
  nonce
@@ -4258,7 +4300,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4258
4300
  data: toHex(strIntention)
4259
4301
  });
4260
4302
  yield checkBtcTransactionStatus(currentConfig.base_url, signature);
4261
- const hash = newTrans.map((t) => t.hash);
4303
+ const hash = newTrans.slice(1).map((t) => t.hash);
4262
4304
  console.log("txHash:", hash);
4263
4305
  const result = yield pollTransactionStatuses(options.network.networkId, hash);
4264
4306
  return result;
@@ -4266,12 +4308,9 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4266
4308
  }
4267
4309
  function calculateGasLimit(params) {
4268
4310
  return __async(this, null, function* () {
4269
- const accountId = state.getAccount();
4270
- const accountInfo = yield getAccountInfo(accountId, currentConfig.accountContractId);
4271
4311
  const trans = [...params.transactions];
4272
4312
  console.log("raw trans:", trans);
4273
- const gasTokenBalance = (accountInfo == null ? void 0 : accountInfo.gas_token[currentConfig.token]) || "0";
4274
- const { gasLimit } = yield calculateGasStrategy(gasTokenBalance, trans);
4313
+ const { gasLimit } = yield calculateGasStrategy(trans);
4275
4314
  return gasLimit;
4276
4315
  });
4277
4316
  }
@@ -4279,7 +4318,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4279
4318
  return __async(this, null, function* () {
4280
4319
  return {
4281
4320
  signerId: accountId,
4282
- receiverId: currentConfig.token,
4321
+ receiverId: currentConfig.btcToken,
4283
4322
  actions: [
4284
4323
  {
4285
4324
  type: "FunctionCall",
@@ -4307,7 +4346,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4307
4346
  } else {
4308
4347
  newGasLimit = yield getPredictedGasAmount(
4309
4348
  currentConfig.accountContractId,
4310
- currentConfig.token,
4349
+ currentConfig.btcToken,
4311
4350
  [transferTxHex, ...transactions2.map((t) => t.txHex)]
4312
4351
  );
4313
4352
  }
@@ -4328,31 +4367,61 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4328
4367
  return gasAmount.toString();
4329
4368
  });
4330
4369
  }
4331
- function calculateGasStrategy(gasTokenBalance, transactions2) {
4370
+ function calculateGasStrategy(transactions2) {
4332
4371
  return __async(this, null, function* () {
4333
4372
  var _a;
4334
4373
  const accountId = state.getAccount();
4335
- const nearAccount = yield provider.query({
4336
- request_type: "view_account",
4337
- account_id: accountId,
4338
- 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
4380
+ });
4381
+ const { balance: btcBalance } = yield getTokenBalance({
4382
+ csna: accountId,
4383
+ tokenId: currentConfig.btcToken,
4384
+ env
4339
4385
  });
4340
- const availableBalance = parseFloat(nearAccount.amount) / __pow(10, 24);
4341
- console.log("available near balance:", availableBalance);
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);
4342
4411
  console.log("available gas token balance:", gasTokenBalance);
4343
4412
  const convertTx = yield Promise.all(
4344
4413
  transactions2.map((transaction, index) => convertTransactionToTxHex(transaction, index))
4345
4414
  );
4346
- if (availableBalance > 0.5) {
4415
+ if (nearAvailableBalance > 0.5) {
4347
4416
  console.log("near balance is enough, get the protocol fee of each transaction");
4348
4417
  const gasTokens = yield nearCall2(
4349
4418
  currentConfig.accountContractId,
4350
4419
  "list_gas_token",
4351
- { token_ids: [currentConfig.token] }
4420
+ { token_ids: [currentConfig.btcToken] }
4352
4421
  );
4353
4422
  console.log("list_gas_token gas tokens:", gasTokens);
4354
4423
  const perTxFee = Math.max(
4355
- 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),
4356
4425
  100
4357
4426
  );
4358
4427
  console.log("perTxFee:", perTxFee);
@@ -4370,7 +4439,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
4370
4439
  console.log("near balance is not enough, predict the gas token amount required");
4371
4440
  const adjustedGas = yield getPredictedGasAmount(
4372
4441
  currentConfig.accountContractId,
4373
- currentConfig.token,
4442
+ currentConfig.btcToken,
4374
4443
  convertTx.map((t) => t.txHex)
4375
4444
  );
4376
4445
  if (new import_big2.default(gasTokenBalance).gte(adjustedGas)) {
@@ -4486,7 +4555,7 @@ function setupBTCWallet({
4486
4555
 
4487
4556
  // src/index.ts
4488
4557
  var getVersion = () => {
4489
- return "0.5.10-beta";
4558
+ return "0.5.12-beta";
4490
4559
  };
4491
4560
  if (typeof window !== "undefined") {
4492
4561
  window.__BTC_WALLET_VERSION = getVersion();