btc-wallet 0.3.11 → 0.3.13

Sign up to get free protection for your applications and to get access to all the features.
package/esm/index.js CHANGED
@@ -2686,24 +2686,21 @@ var walletConfig = {
2686
2686
  token: "nbtc-dev.testnet",
2687
2687
  accountContractId: "acc-dev.testnet",
2688
2688
  bridgeContractId: "brg-dev.testnet",
2689
- walletUrl: "https://wallet-dev.satoshibridge.top",
2690
- gasTokenLimit: "3000"
2689
+ walletUrl: "https://wallet-dev.satoshibridge.top"
2691
2690
  },
2692
2691
  testnet: {
2693
2692
  base_url: "https://api.testnet.satoshibridge.top",
2694
2693
  token: "nbtc2-nsp.testnet",
2695
2694
  accountContractId: "dev2-nsp.testnet",
2696
2695
  bridgeContractId: "brg2-nsp.testnet",
2697
- walletUrl: "https://wallet-test.satoshibridge.top",
2698
- gasTokenLimit: "3000"
2696
+ walletUrl: "https://wallet-test.satoshibridge.top"
2699
2697
  },
2700
2698
  mainnet: {
2701
2699
  base_url: "https://api.mainnet.satoshibridge.top",
2702
2700
  token: "",
2703
2701
  accountContractId: "",
2704
2702
  bridgeContractId: "",
2705
- walletUrl: "https://wallet.satoshibridge.top",
2706
- gasTokenLimit: "3000"
2703
+ walletUrl: "https://wallet.satoshibridge.top"
2707
2704
  }
2708
2705
  };
2709
2706
  var nearRpcUrls = {
@@ -2713,15 +2710,80 @@ var nearRpcUrls = {
2713
2710
  "https://free.rpc.fastnear.com",
2714
2711
  "https://near.drpc.org"
2715
2712
  ],
2716
- testnet: [
2717
- "https://rpc.testnet.near.org"
2718
- ]
2713
+ testnet: ["https://rpc.testnet.near.org"]
2719
2714
  };
2720
2715
  var btcRpcUrls = {
2721
2716
  mainnet: "https://mempool.space/api",
2722
2717
  testnet: "https://mempool.space/testnet/api"
2723
2718
  };
2724
2719
 
2720
+ // src/utils/nearUtils.ts
2721
+ import { providers } from "near-api-js";
2722
+ function nearCallFunction(contractId, methodName, args, options) {
2723
+ return __async(this, null, function* () {
2724
+ const nearProvider = (options == null ? void 0 : options.provider) || new providers.FailoverRpcProvider(
2725
+ nearRpcUrls[options == null ? void 0 : options.network].map(
2726
+ (url) => new providers.JsonRpcProvider({ url })
2727
+ )
2728
+ );
2729
+ const res = yield nearProvider.query({
2730
+ request_type: "call_function",
2731
+ account_id: contractId,
2732
+ method_name: methodName,
2733
+ args_base64: Buffer.from(JSON.stringify(args)).toString("base64"),
2734
+ finality: "final"
2735
+ });
2736
+ return JSON.parse(Buffer.from(res.result).toString());
2737
+ });
2738
+ }
2739
+ function pollTransactionStatuses(network, hashes) {
2740
+ return __async(this, null, function* () {
2741
+ const provider = new providers.FailoverRpcProvider(
2742
+ Object.values(nearRpcUrls[network]).map(
2743
+ (url) => new providers.JsonRpcProvider({ url })
2744
+ )
2745
+ );
2746
+ const maxAttempts = 30;
2747
+ let currentAttempt = 0;
2748
+ const pendingHashes = new Set(hashes);
2749
+ const results = /* @__PURE__ */ new Map();
2750
+ while (pendingHashes.size > 0 && currentAttempt < maxAttempts) {
2751
+ currentAttempt++;
2752
+ const promises = Array.from(pendingHashes).map((hash) => __async(this, null, function* () {
2753
+ try {
2754
+ const result = yield provider.txStatus(hash, "unused", "FINAL");
2755
+ if (result && result.status) {
2756
+ console.log(`Transaction ${hash} result:`, result);
2757
+ results.set(hash, result);
2758
+ pendingHashes.delete(hash);
2759
+ }
2760
+ } catch (error) {
2761
+ console.error(`Failed to fetch transaction status for ${hash}: ${error.message}`);
2762
+ }
2763
+ }));
2764
+ yield Promise.all(promises);
2765
+ if (pendingHashes.size > 0) {
2766
+ if (currentAttempt === maxAttempts) {
2767
+ throw new Error(
2768
+ `Transactions not found after max attempts: ${Array.from(pendingHashes).join(", ")}`
2769
+ );
2770
+ }
2771
+ console.log(
2772
+ `Waiting for ${pendingHashes.size} transactions, retrying ${maxAttempts - currentAttempt} more times`
2773
+ );
2774
+ yield delay(1e4);
2775
+ }
2776
+ }
2777
+ return hashes.map((hash) => results.get(hash));
2778
+ });
2779
+ }
2780
+
2781
+ // src/core/setupBTCWallet.ts
2782
+ import Big2 from "big.js";
2783
+
2784
+ // src/core/btcUtils.ts
2785
+ import Big from "big.js";
2786
+
2725
2787
  // src/utils/request.ts
2726
2788
  var cache = /* @__PURE__ */ new Map();
2727
2789
  var defaultCacheTimeout = 3e3;
@@ -2762,18 +2824,20 @@ function request(url, options) {
2762
2824
  if (!res.ok)
2763
2825
  throw new Error(res.statusText);
2764
2826
  const data = yield res.json();
2827
+ if (options == null ? void 0 : options.shouldStopPolling) {
2828
+ if (options.shouldStopPolling(data)) {
2829
+ return data;
2830
+ }
2831
+ throw new Error("Polling should continue");
2832
+ }
2765
2833
  if (cacheKey) {
2766
2834
  cache.set(cacheKey, { timestamp: Date.now(), data });
2767
2835
  setTimeout(() => {
2768
2836
  cache.delete(cacheKey);
2769
2837
  }, cacheTimeout);
2770
2838
  }
2771
- if ((options == null ? void 0 : options.shouldStopPolling) && options.shouldStopPolling(data)) {
2772
- return data;
2773
- }
2774
2839
  return data;
2775
2840
  } catch (err) {
2776
- console.error(err);
2777
2841
  if (retryCount > 0) {
2778
2842
  console.log(`Retrying... attempts left: ${retryCount}`);
2779
2843
  return request(url, __spreadProps(__spreadValues({}, options), { retryCount: retryCount - 1 }));
@@ -2787,74 +2851,533 @@ function request(url, options) {
2787
2851
  }));
2788
2852
  }
2789
2853
  }
2790
- return Promise.reject(err);
2854
+ throw err;
2791
2855
  }
2792
2856
  });
2793
2857
  }
2794
2858
 
2795
- // src/utils/nearUtils.ts
2796
- import { providers } from "near-api-js";
2797
- function nearCallFunction(contractId, methodName, args, options) {
2859
+ // src/utils/satoshi.ts
2860
+ function getNonce(url, accountId) {
2798
2861
  return __async(this, null, function* () {
2799
- const nearProvider = (options == null ? void 0 : options.provider) || new providers.FailoverRpcProvider(
2800
- nearRpcUrls[options == null ? void 0 : options.network].map(
2801
- (url) => new providers.JsonRpcProvider({ url })
2802
- )
2862
+ const { result_code, result_message, result_data } = yield request(
2863
+ `${url}/v1/nonce?csna=${accountId}`
2803
2864
  );
2804
- const res = yield nearProvider.query({
2805
- request_type: "call_function",
2806
- account_id: contractId,
2807
- method_name: methodName,
2808
- args_base64: Buffer.from(JSON.stringify(args)).toString("base64"),
2809
- finality: "final"
2865
+ if (result_code !== 0) {
2866
+ throw new Error(result_message);
2867
+ }
2868
+ return result_data;
2869
+ });
2870
+ }
2871
+ function getNearNonce(url, accountId) {
2872
+ return __async(this, null, function* () {
2873
+ const { result_code, result_message, result_data } = yield request(
2874
+ `${url}/v1/nonceNear?csna=${accountId}`
2875
+ );
2876
+ if (result_code !== 0) {
2877
+ throw new Error(result_message);
2878
+ }
2879
+ return result_data;
2880
+ });
2881
+ }
2882
+ function receiveTransaction(url, data) {
2883
+ return __async(this, null, function* () {
2884
+ const { result_code, result_message, result_data } = yield request(
2885
+ `${url}/v1/receiveTransaction`,
2886
+ {
2887
+ method: "POST",
2888
+ body: data
2889
+ }
2890
+ );
2891
+ if (result_code !== 0) {
2892
+ throw new Error(result_message);
2893
+ }
2894
+ return result_data;
2895
+ });
2896
+ }
2897
+ function receiveDepositMsg(_0, _1) {
2898
+ return __async(this, arguments, function* (url, {
2899
+ btcPublicKey,
2900
+ txHash,
2901
+ depositType = 1,
2902
+ postActions,
2903
+ extraMsg
2904
+ }) {
2905
+ const { result_code, result_message, result_data } = yield request(
2906
+ `${url}/v1/receiveDepositMsg`,
2907
+ {
2908
+ method: "POST",
2909
+ body: { btcPublicKey, txHash, depositType, postActions, extraMsg }
2910
+ }
2911
+ );
2912
+ console.log("receiveDepositMsg resp:", { result_code, result_message, result_data });
2913
+ if (result_code !== 0) {
2914
+ throw new Error(result_message);
2915
+ }
2916
+ return result_data;
2917
+ });
2918
+ }
2919
+ function checkBridgeTransactionStatus(url, txHash) {
2920
+ return __async(this, null, function* () {
2921
+ const { result_code, result_message, result_data } = yield request(`${url}/v1/bridgeFromTx?fromTxHash=${txHash}&fromChainId=1`, {
2922
+ timeout: 3e5,
2923
+ pollingInterval: 5e3,
2924
+ maxPollingAttempts: 60,
2925
+ shouldStopPolling: (res) => {
2926
+ var _a;
2927
+ return res.result_code === 0 && [4, 102].includes(((_a = res.result_data) == null ? void 0 : _a.Status) || 0);
2928
+ }
2810
2929
  });
2811
- return JSON.parse(Buffer.from(res.result).toString());
2930
+ console.log("checkTransactionStatus resp:", { result_code, result_message, result_data });
2931
+ if ((result_data == null ? void 0 : result_data.Status) !== 4) {
2932
+ throw new Error(result_message);
2933
+ }
2934
+ return result_data;
2812
2935
  });
2813
2936
  }
2814
- function pollTransactionStatuses(network, hashes) {
2937
+ function checkBtcTransactionStatus(url, sig) {
2815
2938
  return __async(this, null, function* () {
2816
- const provider = new providers.FailoverRpcProvider(
2817
- Object.values(nearRpcUrls[network]).map(
2818
- (url) => new providers.JsonRpcProvider({ url })
2819
- )
2939
+ const { result_code, result_message, result_data } = yield request(`${url}/v1/btcTx?sig=${sig}`, {
2940
+ timeout: 3e5,
2941
+ pollingInterval: 5e3,
2942
+ maxPollingAttempts: 60,
2943
+ shouldStopPolling: (res) => {
2944
+ var _a;
2945
+ return res.result_code === 0 && [3, 101, 102].includes(((_a = res.result_data) == null ? void 0 : _a.Status) || 0);
2946
+ }
2947
+ });
2948
+ console.log("checkBtcTransactionStatus resp:", { result_code, result_message, result_data });
2949
+ if ((result_data == null ? void 0 : result_data.Status) !== 3) {
2950
+ throw new Error(result_message);
2951
+ }
2952
+ return result_data;
2953
+ });
2954
+ }
2955
+
2956
+ // src/utils/Dialog.ts
2957
+ var Dialog = class {
2958
+ static injectStyles() {
2959
+ if (!document.querySelector("#dialog-styles")) {
2960
+ const styleSheet = document.createElement("style");
2961
+ styleSheet.id = "dialog-styles";
2962
+ styleSheet.textContent = this.style;
2963
+ document.head.appendChild(styleSheet);
2964
+ }
2965
+ }
2966
+ static confirm(options) {
2967
+ return new Promise((resolve) => {
2968
+ this.injectStyles();
2969
+ const container = document.createElement("div");
2970
+ container.innerHTML = this.template;
2971
+ document.body.appendChild(container);
2972
+ const titleEl = container.querySelector(".dialog-title");
2973
+ const messageEl = container.querySelector(".dialog-message");
2974
+ const confirmBtn = container.querySelector(".dialog-confirm-btn");
2975
+ const cancelBtn = container.querySelector(".dialog-cancel-btn");
2976
+ if (options.title) {
2977
+ titleEl.textContent = options.title;
2978
+ } else {
2979
+ titleEl.style.display = "none";
2980
+ }
2981
+ messageEl.textContent = options.message;
2982
+ const cleanup = () => {
2983
+ document.body.removeChild(container);
2984
+ };
2985
+ confirmBtn.addEventListener("click", () => {
2986
+ cleanup();
2987
+ resolve(true);
2988
+ });
2989
+ cancelBtn.addEventListener("click", () => {
2990
+ cleanup();
2991
+ resolve(false);
2992
+ });
2993
+ });
2994
+ }
2995
+ static alert(options) {
2996
+ return new Promise((resolve) => {
2997
+ this.injectStyles();
2998
+ const container = document.createElement("div");
2999
+ container.innerHTML = this.template;
3000
+ document.body.appendChild(container);
3001
+ const titleEl = container.querySelector(".dialog-title");
3002
+ const messageEl = container.querySelector(".dialog-message");
3003
+ const confirmBtn = container.querySelector(".dialog-confirm-btn");
3004
+ const cancelBtn = container.querySelector(".dialog-cancel-btn");
3005
+ if (options.title) {
3006
+ titleEl.textContent = options.title;
3007
+ } else {
3008
+ titleEl.style.display = "none";
3009
+ }
3010
+ messageEl.textContent = options.message;
3011
+ cancelBtn.style.display = "none";
3012
+ const cleanup = () => {
3013
+ document.body.removeChild(container);
3014
+ };
3015
+ confirmBtn.addEventListener("click", () => {
3016
+ cleanup();
3017
+ resolve();
3018
+ });
3019
+ });
3020
+ }
3021
+ };
3022
+ Dialog.template = `
3023
+ <div class="dialog-overlay">
3024
+ <div class="dialog-container">
3025
+ <div class="dialog-content">
3026
+ <div class="dialog-title"></div>
3027
+ <div class="dialog-message"></div>
3028
+ <div class="dialog-buttons">
3029
+ <button class="dialog-cancel-btn">Cancel</button>
3030
+ <button class="dialog-confirm-btn">Confirm</button>
3031
+ </div>
3032
+ </div>
3033
+ </div>
3034
+ </div>
3035
+ `;
3036
+ Dialog.style = `
3037
+ .dialog-overlay {
3038
+ position: fixed;
3039
+ top: 0;
3040
+ left: 0;
3041
+ right: 0;
3042
+ bottom: 0;
3043
+ background-color: rgba(0, 0, 0, 0.75);
3044
+ display: flex;
3045
+ align-items: center;
3046
+ justify-content: center;
3047
+ z-index: 999999;
3048
+ backdrop-filter: blur(4px);
3049
+ }
3050
+ .dialog-container {
3051
+ background: #21232f;
3052
+ border-radius: 12px;
3053
+ padding: 24px;
3054
+ width: 350px;
3055
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
3056
+ }
3057
+ .dialog-title {
3058
+ font-size: 18px;
3059
+ font-weight: 600;
3060
+ margin-bottom: 16px;
3061
+ color: #ffffff;
3062
+ }
3063
+ .dialog-message {
3064
+ margin-bottom: 24px;
3065
+ line-height: 1.6;
3066
+ color: rgba(255, 255, 255, 0.8);
3067
+ font-size: 14px;
3068
+ }
3069
+ .dialog-buttons {
3070
+ display: flex;
3071
+ justify-content: flex-end;
3072
+ gap: 12px;
3073
+ }
3074
+ .dialog-confirm-btn {
3075
+ padding: 8px 24px;
3076
+ background-color: #ff7a00;
3077
+ color: white;
3078
+ border: none;
3079
+ border-radius: 6px;
3080
+ cursor: pointer;
3081
+ font-size: 14px;
3082
+ font-weight: 500;
3083
+ transition: all 0.2s ease;
3084
+ }
3085
+ .dialog-confirm-btn:hover {
3086
+ background-color: #ff8f1f;
3087
+ transform: translateY(-1px);
3088
+ }
3089
+ .dialog-confirm-btn:active {
3090
+ transform: translateY(0);
3091
+ }
3092
+ .dialog-cancel-btn {
3093
+ padding: 8px 24px;
3094
+ background-color: rgba(255, 255, 255, 0.1);
3095
+ color: rgba(255, 255, 255, 0.8);
3096
+ border: none;
3097
+ border-radius: 6px;
3098
+ cursor: pointer;
3099
+ font-size: 14px;
3100
+ font-weight: 500;
3101
+ transition: all 0.2s ease;
3102
+ }
3103
+ .dialog-cancel-btn:hover {
3104
+ background-color: rgba(255, 255, 255, 0.15);
3105
+ transform: translateY(-1px);
3106
+ }
3107
+ .dialog-cancel-btn:active {
3108
+ transform: translateY(0);
3109
+ }
3110
+
3111
+ .dialog-overlay {
3112
+ animation: fadeIn 0.2s ease;
3113
+ }
3114
+ .dialog-container {
3115
+ animation: slideIn 0.2s ease;
3116
+ }
3117
+ @keyframes fadeIn {
3118
+ from {
3119
+ opacity: 0;
3120
+ }
3121
+ to {
3122
+ opacity: 1;
3123
+ }
3124
+ }
3125
+ @keyframes slideIn {
3126
+ from {
3127
+ transform: translateY(-20px);
3128
+ opacity: 0;
3129
+ }
3130
+ to {
3131
+ transform: translateY(0);
3132
+ opacity: 1;
3133
+ }
3134
+ }
3135
+ `;
3136
+
3137
+ // src/core/btcUtils.ts
3138
+ function getBtcProvider() {
3139
+ if (typeof window === "undefined" || !window.btcContext) {
3140
+ throw new Error("BTC Provider is not initialized.");
3141
+ }
3142
+ return window.btcContext;
3143
+ }
3144
+ function getNetwork() {
3145
+ return __async(this, null, function* () {
3146
+ const network = yield getBtcProvider().getNetwork();
3147
+ console.log("btc network:", network);
3148
+ return network === "livenet" ? "mainnet" : "testnet";
3149
+ });
3150
+ }
3151
+ function getBtcRpcUrl() {
3152
+ return __async(this, null, function* () {
3153
+ const network = yield getNetwork();
3154
+ return btcRpcUrls[network];
3155
+ });
3156
+ }
3157
+ function getConfig(isDev) {
3158
+ return __async(this, null, function* () {
3159
+ const network = yield getNetwork();
3160
+ return walletConfig[isDev ? "dev" : network];
3161
+ });
3162
+ }
3163
+ function nearCall(contractId, methodName, args) {
3164
+ return __async(this, null, function* () {
3165
+ const network = yield getNetwork();
3166
+ return nearCallFunction(contractId, methodName, args, { network });
3167
+ });
3168
+ }
3169
+ function getAccountInfo(csna, accountContractId) {
3170
+ return __async(this, null, function* () {
3171
+ const accountInfo = yield nearCall(accountContractId, "get_account", { account_id: csna });
3172
+ return accountInfo;
3173
+ });
3174
+ }
3175
+ function checkGasTokenArrears(debtInfo, isDev, autoDeposit) {
3176
+ return __async(this, null, function* () {
3177
+ const config = yield getConfig(isDev);
3178
+ const transferAmount = debtInfo.transfer_amount || "0";
3179
+ console.log("get_account debtInfo:", debtInfo);
3180
+ if (transferAmount === "0")
3181
+ return;
3182
+ const action = {
3183
+ receiver_id: config.token,
3184
+ amount: transferAmount,
3185
+ msg: JSON.stringify("Deposit")
3186
+ };
3187
+ if (!autoDeposit)
3188
+ return action;
3189
+ const confirmed = yield Dialog.confirm({
3190
+ title: "Has gas token arrears",
3191
+ message: "You have gas token arrears, please deposit gas token to continue."
3192
+ });
3193
+ if (confirmed) {
3194
+ yield executeBTCDepositAndAction({ action, isDev });
3195
+ yield Dialog.alert({
3196
+ title: "Deposit success",
3197
+ message: "Deposit success, will continue to execute transaction."
3198
+ });
3199
+ } else {
3200
+ throw new Error("Deposit failed, please deposit gas token first.");
3201
+ }
3202
+ });
3203
+ }
3204
+ function getBtcGasPrice() {
3205
+ return __async(this, null, function* () {
3206
+ const network = yield getNetwork();
3207
+ const defaultFeeRate = network === "mainnet" ? 5 : 2500;
3208
+ try {
3209
+ const btcRpcUrl = yield getBtcRpcUrl();
3210
+ const res = yield fetch(`${btcRpcUrl}/v1/fees/recommended`).then((res2) => res2.json());
3211
+ const feeRate = res.fastestFee;
3212
+ return feeRate || defaultFeeRate;
3213
+ } catch (error) {
3214
+ return defaultFeeRate;
3215
+ }
3216
+ });
3217
+ }
3218
+ function getBtcBalance() {
3219
+ return __async(this, null, function* () {
3220
+ const { account } = yield retryOperation(getBtcProvider, (res) => !!res.account);
3221
+ if (!account) {
3222
+ console.error("BTC Account is not available.");
3223
+ return { rawBalance: 0, balance: 0, maxSpendableBalance: 0 };
3224
+ }
3225
+ const btcRpcUrl = yield getBtcRpcUrl();
3226
+ const utxos = yield fetch(`${btcRpcUrl}/address/${account}/utxo`).then((res) => res.json());
3227
+ const rawBalance = (utxos == null ? void 0 : utxos.reduce((acc, cur) => acc + cur.value, 0)) || 0;
3228
+ const balance = rawBalance / __pow(10, 8);
3229
+ const feeRate = yield getBtcGasPrice();
3230
+ const inputSize = ((utxos == null ? void 0 : utxos.length) || 0) * 66;
3231
+ const outputSize = 34;
3232
+ const overheadSize = 10;
3233
+ const estimatedTxSize = inputSize + outputSize + overheadSize;
3234
+ const estimatedFee = estimatedTxSize * feeRate / __pow(10, 8);
3235
+ console.log("estimated fee:", estimatedFee);
3236
+ const availableBalance = Math.max(0, balance - estimatedFee);
3237
+ return {
3238
+ rawBalance,
3239
+ balance,
3240
+ availableBalance
3241
+ };
3242
+ });
3243
+ }
3244
+ function sendBitcoin(address, amount, feeRate) {
3245
+ return __async(this, null, function* () {
3246
+ const { sendBitcoin: sendBitcoin2 } = getBtcProvider();
3247
+ const txHash = yield sendBitcoin2(address, amount, { feeRate });
3248
+ return txHash;
3249
+ });
3250
+ }
3251
+ var MINIMUM_DEPOSIT_AMOUNT = 5e3;
3252
+ var MINIMUM_DEPOSIT_AMOUNT_BASE = 1e3;
3253
+ function estimateDepositAmount(amount, option) {
3254
+ return __async(this, null, function* () {
3255
+ const { receiveAmount } = yield getDepositAmount(amount, __spreadProps(__spreadValues({}, option), { isEstimate: true }));
3256
+ return receiveAmount;
3257
+ });
3258
+ }
3259
+ function getDepositAmount(amount, option) {
3260
+ return __async(this, null, function* () {
3261
+ const config = yield getConfig((option == null ? void 0 : option.isDev) || false);
3262
+ const {
3263
+ deposit_bridge_fee: { fee_min, fee_rate }
3264
+ } = yield nearCall(
3265
+ config.bridgeContractId,
3266
+ "get_config",
3267
+ {}
2820
3268
  );
2821
- const maxAttempts = 30;
2822
- let currentAttempt = 0;
2823
- const pendingHashes = new Set(hashes);
2824
- const results = /* @__PURE__ */ new Map();
2825
- while (pendingHashes.size > 0 && currentAttempt < maxAttempts) {
2826
- currentAttempt++;
2827
- const promises = Array.from(pendingHashes).map((hash) => __async(this, null, function* () {
2828
- try {
2829
- const result = yield provider.txStatus(hash, "unused", "FINAL");
2830
- if (result && result.status) {
2831
- console.log(`Transaction ${hash} result:`, result);
2832
- results.set(hash, result);
2833
- pendingHashes.delete(hash);
2834
- }
2835
- } catch (error) {
2836
- console.error(`Failed to fetch transaction status for ${hash}: ${error.message}`);
2837
- }
2838
- }));
2839
- yield Promise.all(promises);
2840
- if (pendingHashes.size > 0) {
2841
- if (currentAttempt === maxAttempts) {
2842
- throw new Error(
2843
- `Transactions not found after max attempts: ${Array.from(pendingHashes).join(", ")}`
2844
- );
3269
+ const depositAmount = (option == null ? void 0 : option.isEstimate) ? Number(amount) : Math.max(MINIMUM_DEPOSIT_AMOUNT + MINIMUM_DEPOSIT_AMOUNT_BASE, Number(amount));
3270
+ const fee = Math.max(Number(fee_min), Number(depositAmount) * fee_rate);
3271
+ const receiveAmount = new Big(depositAmount).minus(fee).round(0, Big.roundDown).toNumber();
3272
+ return {
3273
+ depositAmount,
3274
+ receiveAmount: Math.max(receiveAmount, 0),
3275
+ fee
3276
+ };
3277
+ });
3278
+ }
3279
+ function executeBTCDepositAndAction(_0) {
3280
+ return __async(this, arguments, function* ({
3281
+ action,
3282
+ amount,
3283
+ feeRate,
3284
+ fixedAmount = true,
3285
+ isDev = false
3286
+ }) {
3287
+ var _a;
3288
+ try {
3289
+ const { getPublicKey } = getBtcProvider();
3290
+ const config = yield getConfig(isDev);
3291
+ const btcPublicKey = yield getPublicKey();
3292
+ if (!btcPublicKey) {
3293
+ throw new Error("BTC Public Key is not available.");
3294
+ }
3295
+ if (!amount && !action) {
3296
+ throw new Error("amount or action is required");
3297
+ }
3298
+ const csna = yield nearCall(
3299
+ config.accountContractId,
3300
+ "get_chain_signature_near_account_id",
3301
+ {
3302
+ btc_public_key: btcPublicKey
2845
3303
  }
2846
- console.log(
2847
- `Waiting for ${pendingHashes.size} transactions, retrying ${maxAttempts - currentAttempt} more times`
2848
- );
2849
- yield delay(1e4);
3304
+ );
3305
+ const rawDepositAmount = (_a = action ? action.amount : amount) != null ? _a : "0";
3306
+ if (new Big(rawDepositAmount).lt(0)) {
3307
+ throw new Error("amount must be greater than 0");
3308
+ }
3309
+ const { depositAmount } = yield getDepositAmount(rawDepositAmount, {
3310
+ isDev
3311
+ });
3312
+ const accountInfo = yield getAccountInfo(csna, config.accountContractId);
3313
+ const newActions = [];
3314
+ const gasLimit = new Big(50).mul(__pow(10, 12)).toFixed(0);
3315
+ const repayAction = yield checkGasTokenArrears(accountInfo.debt_info, isDev);
3316
+ if (repayAction) {
3317
+ newActions.push(__spreadProps(__spreadValues({}, repayAction), {
3318
+ gas: gasLimit
3319
+ }));
3320
+ }
3321
+ if (action) {
3322
+ newActions.push(__spreadProps(__spreadValues({}, action), {
3323
+ amount: (repayAction == null ? void 0 : repayAction.amount) && !fixedAmount ? new Big(depositAmount).minus(repayAction.amount).toString() : depositAmount.toString(),
3324
+ gas: gasLimit
3325
+ }));
3326
+ }
3327
+ const depositMsg = {
3328
+ recipient_id: csna,
3329
+ post_actions: newActions.length > 0 ? newActions : void 0
3330
+ };
3331
+ const storageDepositMsg = {};
3332
+ if (!(accountInfo == null ? void 0 : accountInfo.nonce)) {
3333
+ storageDepositMsg.btc_public_key = btcPublicKey;
3334
+ }
3335
+ const registerRes = yield nearCall((action == null ? void 0 : action.receiver_id) || config.token, "storage_balance_of", {
3336
+ account_id: csna
3337
+ });
3338
+ if (!(registerRes == null ? void 0 : registerRes.available)) {
3339
+ storageDepositMsg.storage_deposit_msg = {
3340
+ contract_id: (action == null ? void 0 : action.receiver_id) || config.token,
3341
+ deposit: new Big(0.25).mul(__pow(10, 24)).toFixed(0),
3342
+ registration_only: true
3343
+ };
2850
3344
  }
3345
+ if (Object.keys(storageDepositMsg).length > 0) {
3346
+ depositMsg.extra_msg = JSON.stringify(storageDepositMsg);
3347
+ }
3348
+ console.log("get_user_deposit_address params:", { deposit_msg: depositMsg });
3349
+ const userDepositAddress = yield nearCall(
3350
+ config.bridgeContractId,
3351
+ "get_user_deposit_address",
3352
+ { deposit_msg: depositMsg }
3353
+ );
3354
+ const _feeRate = feeRate || (yield getBtcGasPrice());
3355
+ const sendAmount = (repayAction == null ? void 0 : repayAction.amount) && fixedAmount ? new Big(depositAmount).plus((repayAction == null ? void 0 : repayAction.amount) || 0).toString() : depositAmount;
3356
+ console.log("user deposit address:", userDepositAddress);
3357
+ console.log("send amount:", sendAmount);
3358
+ console.log("fee rate:", _feeRate);
3359
+ const txHash = yield sendBitcoin(userDepositAddress, Number(sendAmount), _feeRate);
3360
+ const postActionsStr = newActions.length > 0 ? JSON.stringify(newActions) : void 0;
3361
+ yield receiveDepositMsg(config.base_url, {
3362
+ btcPublicKey,
3363
+ txHash,
3364
+ depositType: postActionsStr || depositMsg.extra_msg ? 1 : 0,
3365
+ postActions: postActionsStr,
3366
+ extraMsg: depositMsg.extra_msg
3367
+ });
3368
+ const checkTransactionStatusRes = yield checkBridgeTransactionStatus(config.base_url, txHash);
3369
+ console.log("checkBridgeTransactionStatus resp:", checkTransactionStatusRes);
3370
+ const network = yield getNetwork();
3371
+ const result = yield pollTransactionStatuses(network, [checkTransactionStatusRes.ToTxHash]);
3372
+ return result;
3373
+ } catch (error) {
3374
+ console.error("executeBTCDepositAndAction error:", error);
3375
+ throw error;
2851
3376
  }
2852
- return hashes.map((hash) => results.get(hash));
2853
3377
  });
2854
3378
  }
2855
3379
 
2856
3380
  // src/core/setupBTCWallet.ts
2857
- import Big from "big.js";
2858
3381
  var { transfer, functionCall } = actionCreators;
2859
3382
  var state = {
2860
3383
  saveAccount(account) {
@@ -2904,6 +3427,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
2904
3427
  id,
2905
3428
  provider
2906
3429
  }) {
3430
+ var _a;
2907
3431
  const wallet = {
2908
3432
  signIn,
2909
3433
  signOut,
@@ -2913,8 +3437,9 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
2913
3437
  signAndSendTransaction,
2914
3438
  signAndSendTransactions
2915
3439
  };
2916
- const currentConfig = "isDev" in metadata && metadata.isDev ? walletConfig.dev : walletConfig[options.network.networkId];
2917
- const walletNetwork = "isDev" in metadata && metadata.isDev ? "dev" : options.network.networkId;
3440
+ const isDev = (_a = "isDev" in metadata && metadata.isDev) != null ? _a : false;
3441
+ const currentConfig = isDev ? walletConfig.dev : walletConfig[options.network.networkId];
3442
+ const walletNetwork = isDev ? "dev" : options.network.networkId;
2918
3443
  initWalletButton(walletNetwork, wallet);
2919
3444
  if (!inter) {
2920
3445
  inter = setInterval(() => __async(void 0, null, function* () {
@@ -3055,9 +3580,15 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3055
3580
  return __async(this, null, function* () {
3056
3581
  const btcContext = window.btcContext;
3057
3582
  const accountId = state.getAccount();
3583
+ const accountInfo = yield getAccountInfo(accountId, currentConfig.accountContractId);
3584
+ yield checkGasTokenArrears(accountInfo.debt_info, isDev, true);
3058
3585
  const trans = [...params.transactions];
3059
3586
  console.log("raw trans:", trans);
3060
- const { transferGasTransaction, useNearPayGas, gasLimit } = yield calculateGasStrategy(trans);
3587
+ const gasTokenBalance = accountInfo.gas_token[currentConfig.token] || "0";
3588
+ const { transferGasTransaction, useNearPayGas, gasLimit } = yield calculateGasStrategy(
3589
+ gasTokenBalance,
3590
+ trans
3591
+ );
3061
3592
  console.log("transferGasTransaction:", transferGasTransaction);
3062
3593
  console.log("useNearPayGas:", useNearPayGas);
3063
3594
  console.log("gasLimit:", gasLimit);
@@ -3068,11 +3599,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3068
3599
  const newTrans = yield Promise.all(
3069
3600
  trans.map((transaction, index) => convertTransactionToTxHex(transaction, index))
3070
3601
  );
3071
- const { result_data: nonceFromApi } = yield getNonceFromApi(
3072
- currentConfig.base_url,
3073
- accountId
3074
- );
3075
- const accountInfo = yield getAccountInfo();
3602
+ const nonceFromApi = yield getNonce(currentConfig.base_url, accountId);
3076
3603
  const nonce = Number(nonceFromApi) > Number(accountInfo.nonce) ? String(nonceFromApi) : String(accountInfo.nonce);
3077
3604
  const intention = {
3078
3605
  chain_id: "397",
@@ -3085,30 +3612,16 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3085
3612
  };
3086
3613
  const strIntention = JSON.stringify(intention);
3087
3614
  const signature = yield btcContext.signMessage(strIntention);
3088
- const result = yield uploadBTCTx(currentConfig.base_url, {
3615
+ yield receiveTransaction(currentConfig.base_url, {
3089
3616
  sig: signature,
3090
3617
  btcPubKey: state.getBtcPublicKey(),
3091
3618
  data: toHex(strIntention)
3092
3619
  });
3093
- if (result.result_code === 0) {
3094
- const hash = newTrans.map((t) => t.hash);
3095
- console.log("txHash:", hash);
3096
- const result2 = yield pollTransactionStatuses(options.network.networkId, hash);
3097
- return result2;
3098
- } else {
3099
- return null;
3100
- }
3101
- });
3102
- }
3103
- function getAccountInfo() {
3104
- return __async(this, null, function* () {
3105
- const accountId = state.getAccount();
3106
- const accountInfo = yield nearCall2(
3107
- currentConfig.accountContractId,
3108
- "get_account",
3109
- { account_id: accountId }
3110
- );
3111
- return accountInfo;
3620
+ yield checkBtcTransactionStatus(currentConfig.base_url, signature);
3621
+ const hash = newTrans.map((t) => t.hash);
3622
+ console.log("txHash:", hash);
3623
+ const result = yield pollTransactionStatuses(options.network.networkId, hash);
3624
+ return result;
3112
3625
  });
3113
3626
  }
3114
3627
  function createGasTokenTransfer(accountId, amount) {
@@ -3126,7 +3639,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3126
3639
  amount,
3127
3640
  msg: JSON.stringify("Deposit")
3128
3641
  },
3129
- gas: new Big(50).mul(__pow(10, 12)).toFixed(0),
3642
+ gas: new Big2(50).mul(__pow(10, 12)).toFixed(0),
3130
3643
  deposit: "1"
3131
3644
  }
3132
3645
  }
@@ -3139,7 +3652,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3139
3652
  const { txHex: transferTxHex } = yield convertTransactionToTxHex(transferTx);
3140
3653
  let newGasLimit;
3141
3654
  if (useNearPayGas && perTxFee) {
3142
- newGasLimit = new Big(perTxFee).mul(transactions2.length + 1).toFixed(0);
3655
+ newGasLimit = new Big2(perTxFee).mul(transactions2.length + 1).toFixed(0);
3143
3656
  } else {
3144
3657
  newGasLimit = yield getPredictedGasAmount(
3145
3658
  currentConfig.accountContractId,
@@ -3157,14 +3670,14 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3157
3670
  gas_token_id: tokenId,
3158
3671
  near_transactions: transactions2
3159
3672
  });
3160
- const predictedGasAmount = new Big(predictedGas).mul(1.2).toFixed(0);
3673
+ const predictedGasAmount = new Big2(predictedGas).mul(1.2).toFixed(0);
3161
3674
  console.log("predictedGas:", predictedGasAmount);
3162
3675
  return predictedGasAmount;
3163
3676
  });
3164
3677
  }
3165
- function calculateGasStrategy(transactions2) {
3678
+ function calculateGasStrategy(gasTokenBalance, transactions2) {
3166
3679
  return __async(this, null, function* () {
3167
- var _a;
3680
+ var _a2;
3168
3681
  const accountId = state.getAccount();
3169
3682
  const nearAccount = yield provider.query({
3170
3683
  request_type: "view_account",
@@ -3173,13 +3686,12 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3173
3686
  });
3174
3687
  const availableBalance = parseFloat(nearAccount.amount) / __pow(10, 24);
3175
3688
  console.log("available near balance:", availableBalance);
3176
- const accountInfo = yield getAccountInfo();
3177
- const gasTokenBalance = accountInfo.gas_token[currentConfig.token] || "0";
3178
3689
  console.log("available gas token balance:", gasTokenBalance);
3179
3690
  const convertTx = yield Promise.all(
3180
3691
  transactions2.map((transaction, index) => convertTransactionToTxHex(transaction, index))
3181
3692
  );
3182
3693
  if (availableBalance > 0.2) {
3694
+ console.log("near balance is enough, get the protocol fee of each transaction");
3183
3695
  const gasTokens = yield nearCall2(
3184
3696
  currentConfig.accountContractId,
3185
3697
  "list_gas_token",
@@ -3187,13 +3699,13 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3187
3699
  );
3188
3700
  console.log("list_gas_token gas tokens:", gasTokens);
3189
3701
  const perTxFee = Math.max(
3190
- Number(((_a = gasTokens[currentConfig.token]) == null ? void 0 : _a.per_tx_protocol_fee) || 0),
3702
+ Number(((_a2 = gasTokens[currentConfig.token]) == null ? void 0 : _a2.per_tx_protocol_fee) || 0),
3191
3703
  100
3192
3704
  );
3193
3705
  console.log("perTxFee:", perTxFee);
3194
- const protocolFee = new Big(perTxFee || "0").mul(convertTx.length).toFixed(0);
3706
+ const protocolFee = new Big2(perTxFee || "0").mul(convertTx.length).toFixed(0);
3195
3707
  console.log("protocolFee:", protocolFee);
3196
- if (new Big(gasTokenBalance).gte(protocolFee)) {
3708
+ if (new Big2(gasTokenBalance).gte(protocolFee)) {
3197
3709
  console.log("use near pay gas and enough gas token balance");
3198
3710
  return { useNearPayGas: true, gasLimit: protocolFee };
3199
3711
  } else {
@@ -3208,7 +3720,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3208
3720
  currentConfig.token,
3209
3721
  convertTx.map((t) => t.txHex)
3210
3722
  );
3211
- if (new Big(gasTokenBalance).gte(adjustedGas)) {
3723
+ if (new Big2(gasTokenBalance).gte(adjustedGas)) {
3212
3724
  console.log("use gas token and gas token balance is enough");
3213
3725
  return { useNearPayGas: false, gasLimit: adjustedGas };
3214
3726
  } else {
@@ -3236,10 +3748,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3236
3748
  const accessKey = __spreadProps(__spreadValues({}, rawAccessKey), {
3237
3749
  nonce: BigInt(rawAccessKey.nonce || 0)
3238
3750
  });
3239
- const { result_data: nearNonceFromApi } = yield getNearNonceFromApi(
3240
- currentConfig.base_url,
3241
- accountId
3242
- );
3751
+ const nearNonceFromApi = yield getNearNonce(currentConfig.base_url, accountId);
3243
3752
  let nearNonceNumber = accessKey.nonce + BigInt(1);
3244
3753
  if (nearNonceFromApi) {
3245
3754
  nearNonceNumber = BigInt(nearNonceFromApi) > nearNonceNumber ? BigInt(nearNonceFromApi) : nearNonceNumber;
@@ -3293,18 +3802,6 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
3293
3802
  }
3294
3803
  return wallet;
3295
3804
  });
3296
- function getNonceFromApi(url, accountId) {
3297
- return request(`${url}/v1/nonce?csna=${accountId}`);
3298
- }
3299
- function getNearNonceFromApi(url, accountId) {
3300
- return request(`${url}/v1/nonceNear?csna=${accountId}`);
3301
- }
3302
- function uploadBTCTx(url, data) {
3303
- return request(`${url}/v1/receiveTransaction`, {
3304
- method: "POST",
3305
- body: data
3306
- });
3307
- }
3308
3805
  function toHex(originalString) {
3309
3806
  const charArray = originalString.split("");
3310
3807
  const asciiArray = charArray.map((char) => char.charCodeAt(0));
@@ -3341,228 +3838,9 @@ function setupBTCWallet({
3341
3838
  return btcWallet;
3342
3839
  }
3343
3840
 
3344
- // src/core/btcUtils.ts
3345
- import Big2 from "big.js";
3346
- function getBtcProvider() {
3347
- if (typeof window === "undefined" || !window.btcContext) {
3348
- throw new Error("BTC Provider is not initialized.");
3349
- }
3350
- return window.btcContext;
3351
- }
3352
- function getNetwork() {
3353
- return __async(this, null, function* () {
3354
- const network = yield getBtcProvider().getNetwork();
3355
- console.log("btc network:", network);
3356
- return network === "livenet" ? "mainnet" : "testnet";
3357
- });
3358
- }
3359
- function getBtcRpcUrl() {
3360
- return __async(this, null, function* () {
3361
- const network = yield getNetwork();
3362
- return btcRpcUrls[network];
3363
- });
3364
- }
3365
- function getConfig(isDev) {
3366
- return __async(this, null, function* () {
3367
- const network = yield getNetwork();
3368
- return walletConfig[isDev ? "dev" : network];
3369
- });
3370
- }
3371
- function nearCall(contractId, methodName, args) {
3372
- return __async(this, null, function* () {
3373
- const network = yield getNetwork();
3374
- return nearCallFunction(contractId, methodName, args, { network });
3375
- });
3376
- }
3377
- function receiveDepositMsg(_0, _1) {
3378
- return __async(this, arguments, function* (baseUrl, {
3379
- btcPublicKey,
3380
- txHash,
3381
- depositType = 1,
3382
- postActions,
3383
- extraMsg
3384
- }) {
3385
- const res = yield request(`${baseUrl}/v1/receiveDepositMsg`, {
3386
- method: "POST",
3387
- body: { btcPublicKey, txHash, depositType, postActions, extraMsg }
3388
- });
3389
- console.log("receiveDepositMsg resp:", res);
3390
- return res;
3391
- });
3392
- }
3393
- function checkTransactionStatus(baseUrl, txHash) {
3394
- return __async(this, null, function* () {
3395
- const res = yield request(
3396
- `${baseUrl}/v1/bridgeFromTx?fromTxHash=${txHash}&fromChainId=1`,
3397
- {
3398
- timeout: 6e4,
3399
- pollingInterval: 5e3,
3400
- maxPollingAttempts: 10,
3401
- shouldStopPolling: (res2) => res2.result_code === 0
3402
- }
3403
- );
3404
- return res;
3405
- });
3406
- }
3407
- function getBtcGasPrice() {
3408
- return __async(this, null, function* () {
3409
- const defaultFeeRate = 100;
3410
- try {
3411
- const btcRpcUrl = yield getBtcRpcUrl();
3412
- const res = yield fetch(`${btcRpcUrl}/v1/fees/recommended`).then((res2) => res2.json());
3413
- const feeRate = res.fastestFee;
3414
- return feeRate || defaultFeeRate;
3415
- } catch (error) {
3416
- return defaultFeeRate;
3417
- }
3418
- });
3419
- }
3420
- function getBtcBalance() {
3421
- return __async(this, null, function* () {
3422
- const { account } = yield retryOperation(getBtcProvider, (res) => !!res.account);
3423
- if (!account) {
3424
- console.error("BTC Account is not available.");
3425
- return { rawBalance: 0, balance: 0, maxSpendableBalance: 0 };
3426
- }
3427
- const btcRpcUrl = yield getBtcRpcUrl();
3428
- const utxos = yield fetch(`${btcRpcUrl}/address/${account}/utxo`).then((res) => res.json());
3429
- const rawBalance = (utxos == null ? void 0 : utxos.reduce((acc, cur) => acc + cur.value, 0)) || 0;
3430
- const balance = rawBalance / __pow(10, 8);
3431
- const feeRate = yield getBtcGasPrice();
3432
- const inputSize = ((utxos == null ? void 0 : utxos.length) || 0) * 66;
3433
- const outputSize = 34;
3434
- const overheadSize = 10;
3435
- const estimatedTxSize = inputSize + outputSize + overheadSize;
3436
- const estimatedFee = estimatedTxSize * feeRate / __pow(10, 8);
3437
- console.log("estimated fee:", estimatedFee);
3438
- const availableBalance = Math.max(0, balance - estimatedFee);
3439
- return {
3440
- rawBalance,
3441
- balance,
3442
- availableBalance
3443
- };
3444
- });
3445
- }
3446
- function sendBitcoin(address, amount, feeRate) {
3447
- return __async(this, null, function* () {
3448
- const { sendBitcoin: sendBitcoin2 } = getBtcProvider();
3449
- const txHash = yield sendBitcoin2(address, amount, { feeRate });
3450
- return txHash;
3451
- });
3452
- }
3453
- function estimateDepositAmount(amount, option) {
3454
- return __async(this, null, function* () {
3455
- const config = yield getConfig((option == null ? void 0 : option.isDev) || false);
3456
- const {
3457
- deposit_bridge_fee: { fee_min, fee_rate }
3458
- } = yield nearCall(
3459
- config.bridgeContractId,
3460
- "get_config",
3461
- {}
3462
- );
3463
- const fee = Math.max(Number(fee_min), Number(amount) * fee_rate);
3464
- return new Big2(amount).minus(fee).toFixed(0);
3465
- });
3466
- }
3467
- function executeBTCDepositAndAction(_0) {
3468
- return __async(this, arguments, function* ({
3469
- action,
3470
- feeRate,
3471
- isDev = false
3472
- }) {
3473
- try {
3474
- const { getPublicKey } = getBtcProvider();
3475
- const config = yield getConfig(isDev);
3476
- const btcPublicKey = yield getPublicKey();
3477
- const _action = Object.assign(
3478
- {},
3479
- __spreadProps(__spreadValues({}, action), {
3480
- gas: new Big2(100).mul(__pow(10, 12)).toFixed(0)
3481
- })
3482
- );
3483
- if (!btcPublicKey) {
3484
- throw new Error("BTC Public Key is not available.");
3485
- }
3486
- if (!_action.receiver_id) {
3487
- throw new Error("action.receiver_id is required");
3488
- }
3489
- const amountWithFee = yield estimateDepositAmount(_action.amount, {
3490
- isDev
3491
- });
3492
- _action.amount = amountWithFee;
3493
- if (!_action.amount || !new Big2(_action.amount || 0).gt(0)) {
3494
- throw new Error("action.amount is required or deposit amount is not enough");
3495
- }
3496
- const csna = yield nearCall(
3497
- config.accountContractId,
3498
- "get_chain_signature_near_account_id",
3499
- {
3500
- btc_public_key: btcPublicKey
3501
- }
3502
- );
3503
- const depositMsg = {
3504
- recipient_id: csna,
3505
- post_actions: [_action]
3506
- };
3507
- const storageDepositMsg = {};
3508
- const accountInfo = yield nearCall(
3509
- config.accountContractId,
3510
- "get_account",
3511
- {
3512
- account_id: csna
3513
- }
3514
- );
3515
- if (!(accountInfo == null ? void 0 : accountInfo.nonce)) {
3516
- storageDepositMsg.btc_public_key = btcPublicKey;
3517
- }
3518
- const registerRes = yield nearCall(action.receiver_id, "storage_balance_of", {
3519
- account_id: csna
3520
- });
3521
- if (!(registerRes == null ? void 0 : registerRes.available)) {
3522
- storageDepositMsg.storage_deposit_msg = {
3523
- contract_id: action.receiver_id,
3524
- deposit: new Big2(0.25).mul(__pow(10, 24)).toFixed(0),
3525
- registration_only: true
3526
- };
3527
- }
3528
- if (Object.keys(storageDepositMsg).length > 0) {
3529
- depositMsg.extra_msg = JSON.stringify(storageDepositMsg);
3530
- }
3531
- console.log("get_user_deposit_address params:", { deposit_msg: depositMsg });
3532
- const userDepositAddress = yield nearCall(
3533
- config.bridgeContractId,
3534
- "get_user_deposit_address",
3535
- { deposit_msg: depositMsg }
3536
- );
3537
- const _feeRate = feeRate || (yield getBtcGasPrice());
3538
- console.log("user deposit address:", userDepositAddress);
3539
- console.log("deposit amount:", new Big2(action.amount).toNumber());
3540
- console.log("receive amount:", new Big2(_action.amount).toNumber());
3541
- console.log("fee rate:", _feeRate);
3542
- const txHash = yield sendBitcoin(
3543
- userDepositAddress,
3544
- new Big2(action.amount).toNumber(),
3545
- _feeRate
3546
- );
3547
- yield receiveDepositMsg(config.base_url, {
3548
- btcPublicKey,
3549
- txHash,
3550
- postActions: JSON.stringify(depositMsg.post_actions),
3551
- extraMsg: depositMsg.extra_msg
3552
- });
3553
- const checkTransactionStatusRes = yield checkTransactionStatus(config.base_url, txHash);
3554
- console.log("checkTransactionStatus resp:", checkTransactionStatusRes);
3555
- return checkTransactionStatusRes.result_code === 0 ? { result: "success" } : { result: "failed", error: checkTransactionStatusRes.result_message };
3556
- } catch (error) {
3557
- console.error("Error executing Bridge+BurrowSupply:", error);
3558
- return { result: "failed", error: error.message };
3559
- }
3560
- });
3561
- }
3562
-
3563
3841
  // src/index.ts
3564
3842
  var getVersion = () => {
3565
- return "0.3.11";
3843
+ return "0.3.13";
3566
3844
  };
3567
3845
  if (typeof window !== "undefined") {
3568
3846
  window.__PARTICLE_BTC_CONNECT_VERSION = getVersion();
@@ -3580,10 +3858,13 @@ export {
3580
3858
  UnisatConnector,
3581
3859
  WizzConnector,
3582
3860
  XverseConnector,
3861
+ checkGasTokenArrears,
3583
3862
  estimateDepositAmount,
3584
3863
  executeBTCDepositAndAction,
3864
+ getAccountInfo,
3585
3865
  getBtcBalance,
3586
3866
  getBtcGasPrice,
3867
+ getDepositAmount,
3587
3868
  getVersion,
3588
3869
  sendBitcoin,
3589
3870
  setupBTCWallet,