btc-wallet 0.5.20-beta → 0.5.21-beta

Sign up to get free protection for your applications and to get access to all the features.
@@ -38,6 +38,23 @@ export declare function getAccountInfo({ csna, env }: {
38
38
  csna: string;
39
39
  env: ENV;
40
40
  }): Promise<AccountInfo | undefined>;
41
+ export declare function getBridgeConfig({ env }: {
42
+ env: ENV;
43
+ }): Promise<{
44
+ min_withdraw_amount: string;
45
+ withdraw_bridge_fee: {
46
+ fee_rate: number;
47
+ fee_min: string;
48
+ };
49
+ max_btc_gas_fee: string;
50
+ change_address: string;
51
+ min_change_amount: string;
52
+ deposit_bridge_fee: {
53
+ fee_rate: number;
54
+ fee_min: string;
55
+ };
56
+ min_deposit_amount: string;
57
+ }>;
41
58
  export declare function getTokenBalance({ csna, tokenId, env, }: {
42
59
  csna: string;
43
60
  tokenId: string;
@@ -69,4 +86,22 @@ export declare function calculateGasStrategy({ csna, transactions, env, }: Calcu
69
86
  useNearPayGas: boolean;
70
87
  gasLimit: string;
71
88
  }>;
89
+ interface CalculateWithdrawParams {
90
+ amount: string | number;
91
+ feeRate?: number;
92
+ csna: string;
93
+ btcAddress: string;
94
+ env: ENV;
95
+ }
96
+ interface CalculateWithdrawResult {
97
+ withdrawFee: number;
98
+ gasFee?: number;
99
+ inputs?: any[];
100
+ outputs?: any[];
101
+ fromAmount?: number;
102
+ receiveAmount?: string;
103
+ isError: boolean;
104
+ errorMsg?: string;
105
+ }
106
+ export declare function calculateWithdraw({ amount, feeRate, csna, btcAddress, env, }: CalculateWithdrawParams): Promise<CalculateWithdrawResult>;
72
107
  export {};
package/esm/index.js CHANGED
@@ -19,6 +19,18 @@ var __spreadValues = (a, b) => {
19
19
  return a;
20
20
  };
21
21
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
22
+ var __objRest = (source, exclude) => {
23
+ var target = {};
24
+ for (var prop in source)
25
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
26
+ target[prop] = source[prop];
27
+ if (source != null && __getOwnPropSymbols)
28
+ for (var prop of __getOwnPropSymbols(source)) {
29
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
30
+ target[prop] = source[prop];
31
+ }
32
+ return target;
33
+ };
22
34
  var __accessCheck = (obj, member, msg) => {
23
35
  if (!member.has(obj))
24
36
  throw TypeError("Cannot " + msg);
@@ -2963,7 +2975,6 @@ function request(url, options) {
2963
2975
  }
2964
2976
  return data;
2965
2977
  } catch (err) {
2966
- console.error(err);
2967
2978
  if (retryCount > 0) {
2968
2979
  console.log(`Retrying... attempts left: ${retryCount}`);
2969
2980
  return request(url, __spreadProps(__spreadValues({}, options), { retryCount: retryCount - 1 }));
@@ -2977,6 +2988,7 @@ function request(url, options) {
2977
2988
  }));
2978
2989
  }
2979
2990
  }
2991
+ console.error(err);
2980
2992
  return Promise.reject(err);
2981
2993
  }
2982
2994
  });
@@ -3149,6 +3161,7 @@ var state_default = {
3149
3161
  };
3150
3162
 
3151
3163
  // src/utils/satoshi.ts
3164
+ import coinselect from "coinselect";
3152
3165
  function getNonce(url, accountId) {
3153
3166
  return __async(this, null, function* () {
3154
3167
  const { result_code, result_message, result_data } = yield request(
@@ -3278,10 +3291,16 @@ function getAccountInfo(_0) {
3278
3291
  ).catch((error) => {
3279
3292
  return void 0;
3280
3293
  });
3281
- console.log("get_account accountInfo:", accountInfo);
3282
3294
  return accountInfo;
3283
3295
  });
3284
3296
  }
3297
+ function getBridgeConfig(_0) {
3298
+ return __async(this, arguments, function* ({ env }) {
3299
+ const config = getWalletConfig(env);
3300
+ const bridgeConfig = yield nearCallFunction(config.bridgeContractId, "get_config", {}, { network: config.network });
3301
+ return bridgeConfig;
3302
+ });
3303
+ }
3285
3304
  function getTokenBalance(_0) {
3286
3305
  return __async(this, arguments, function* ({
3287
3306
  csna,
@@ -3580,11 +3599,196 @@ function getPredictedGasAmount(_0) {
3580
3599
  return gasAmount.toString();
3581
3600
  });
3582
3601
  }
3602
+ function calculateWithdraw(_0) {
3603
+ return __async(this, arguments, function* ({
3604
+ amount,
3605
+ feeRate,
3606
+ csna,
3607
+ btcAddress,
3608
+ env
3609
+ }) {
3610
+ console.log("calculateWithdraw feeRate:", feeRate);
3611
+ try {
3612
+ const config = getWalletConfig(env);
3613
+ const gasLimit = yield calculateGasLimit({
3614
+ csna,
3615
+ transactions: [
3616
+ {
3617
+ signerId: "",
3618
+ receiverId: config.btcToken,
3619
+ actions: [
3620
+ {
3621
+ type: "FunctionCall",
3622
+ params: {
3623
+ methodName: "ft_transfer_call",
3624
+ args: {
3625
+ receiver_id: config.btcToken,
3626
+ amount: "100",
3627
+ msg: ""
3628
+ },
3629
+ gas: "300000000000000",
3630
+ deposit: "1"
3631
+ }
3632
+ }
3633
+ ]
3634
+ }
3635
+ ],
3636
+ env
3637
+ });
3638
+ let satoshis = Number(amount);
3639
+ if (Number(gasLimit) > 0) {
3640
+ satoshis = new Big(amount).minus(gasLimit).toNumber();
3641
+ }
3642
+ const brgConfig = yield getBridgeConfig({ env });
3643
+ const allUTXO = yield nearCallFunction(config.bridgeContractId, "get_utxos_paged", {}, { network: config.network });
3644
+ if (brgConfig.min_withdraw_amount) {
3645
+ if (Number(satoshis) < Number(brgConfig.min_withdraw_amount)) {
3646
+ return {
3647
+ withdrawFee: 0,
3648
+ isError: true,
3649
+ errorMsg: "Mini withdraw amount is " + (Number(brgConfig.min_withdraw_amount) + Number(gasLimit))
3650
+ };
3651
+ }
3652
+ }
3653
+ const feePercent = Number(brgConfig.withdraw_bridge_fee.fee_rate) * Number(satoshis);
3654
+ const withdrawFee = feePercent > Number(brgConfig.withdraw_bridge_fee.fee_min) ? feePercent : Number(brgConfig.withdraw_bridge_fee.fee_min);
3655
+ const withdrawChangeAddress = brgConfig.change_address;
3656
+ const utxos = Object.keys(allUTXO).map((key) => {
3657
+ const txid = key.split("@");
3658
+ return {
3659
+ txid: txid[0],
3660
+ vout: allUTXO[key].vout,
3661
+ value: Number(allUTXO[key].balance),
3662
+ script: allUTXO[key].script
3663
+ };
3664
+ }).filter((utxo) => utxo.value > Number(brgConfig.min_change_amount));
3665
+ if (!utxos || utxos.length === 0) {
3666
+ return {
3667
+ withdrawFee,
3668
+ isError: true,
3669
+ errorMsg: "The network is busy, please try again later."
3670
+ };
3671
+ }
3672
+ const userSatoshis = Number(satoshis);
3673
+ const maxBtcFee = Number(brgConfig.max_btc_gas_fee);
3674
+ const { inputs, outputs, fee } = coinselect(
3675
+ utxos,
3676
+ [{ address: btcAddress, value: userSatoshis }],
3677
+ Math.ceil(feeRate || 0)
3678
+ );
3679
+ const newInputs = inputs;
3680
+ let newOutputs = outputs;
3681
+ let newFee = fee;
3682
+ if (!newOutputs || newOutputs.length === 0) {
3683
+ return {
3684
+ withdrawFee,
3685
+ isError: true,
3686
+ errorMsg: "The network is busy, please try again later."
3687
+ };
3688
+ }
3689
+ let userOutput, noUserOutput;
3690
+ for (let i = 0; i < newOutputs.length; i++) {
3691
+ const output = newOutputs[i];
3692
+ if (output.value.toString() === userSatoshis.toString()) {
3693
+ userOutput = output;
3694
+ } else {
3695
+ noUserOutput = output;
3696
+ }
3697
+ if (!output.address) {
3698
+ output.address = withdrawChangeAddress;
3699
+ }
3700
+ }
3701
+ let dis = 0;
3702
+ if (newFee > maxBtcFee) {
3703
+ dis = newFee - maxBtcFee;
3704
+ newFee = maxBtcFee;
3705
+ return {
3706
+ gasFee: newFee,
3707
+ withdrawFee,
3708
+ isError: true,
3709
+ errorMsg: "Gas exceeds maximum value"
3710
+ };
3711
+ }
3712
+ userOutput.value = new Big(userOutput.value).minus(newFee).minus(withdrawFee).toNumber();
3713
+ if (userOutput.value < 0) {
3714
+ return {
3715
+ gasFee: newFee,
3716
+ withdrawFee,
3717
+ isError: true,
3718
+ errorMsg: "Not enough gas"
3719
+ };
3720
+ }
3721
+ if (noUserOutput) {
3722
+ if (!noUserOutput.address) {
3723
+ noUserOutput.address = withdrawChangeAddress;
3724
+ }
3725
+ noUserOutput.value = new Big(noUserOutput.value).plus(newFee).plus(withdrawFee).plus(dis).toNumber();
3726
+ } else {
3727
+ noUserOutput = {
3728
+ address: withdrawChangeAddress,
3729
+ value: new Big(newFee).plus(withdrawFee).plus(dis).toNumber()
3730
+ };
3731
+ newOutputs.push(noUserOutput);
3732
+ }
3733
+ let minValue = Math.min(...newInputs.map((input) => input.value));
3734
+ let totalNoUserOutputValue = noUserOutput.value;
3735
+ while (totalNoUserOutputValue >= minValue && minValue > 0 && newInputs.length > 0) {
3736
+ totalNoUserOutputValue -= minValue;
3737
+ noUserOutput.value = totalNoUserOutputValue;
3738
+ const minValueIndex = newInputs.findIndex((input) => input.value === minValue);
3739
+ if (minValueIndex > -1) {
3740
+ newInputs.splice(minValueIndex, 1);
3741
+ }
3742
+ minValue = Math.min(...newInputs.map((input) => input.value));
3743
+ }
3744
+ let gasMore = 0;
3745
+ if (noUserOutput.value === 0) {
3746
+ newOutputs = newOutputs.filter((item) => item.value !== 0);
3747
+ } else if (noUserOutput.value < Number(brgConfig.min_change_amount)) {
3748
+ gasMore = Number(brgConfig.min_change_amount) - noUserOutput.value;
3749
+ userOutput.value -= gasMore;
3750
+ noUserOutput.value = Number(brgConfig.min_change_amount);
3751
+ }
3752
+ const insufficientOutput = newOutputs.some((item) => item.value < 0);
3753
+ if (insufficientOutput) {
3754
+ return {
3755
+ gasFee: newFee,
3756
+ withdrawFee,
3757
+ isError: true,
3758
+ errorMsg: "Not enough gas"
3759
+ };
3760
+ }
3761
+ const inputSum = newInputs.reduce((sum, cur) => sum + Number(cur.value), 0);
3762
+ const outputSum = newOutputs.reduce((sum, cur) => sum + Number(cur.value), 0);
3763
+ if (newFee + outputSum !== inputSum) {
3764
+ return {
3765
+ withdrawFee,
3766
+ isError: true,
3767
+ errorMsg: "Service busy, please try again later"
3768
+ };
3769
+ }
3770
+ return {
3771
+ withdrawFee: new Big(withdrawFee).plus(gasLimit).plus(gasMore).toNumber(),
3772
+ gasFee: new Big(newFee).toNumber(),
3773
+ inputs: newInputs,
3774
+ outputs: newOutputs,
3775
+ fromAmount: satoshis,
3776
+ receiveAmount: userOutput.value,
3777
+ isError: false
3778
+ };
3779
+ } catch (error) {
3780
+ return {
3781
+ withdrawFee: 0,
3782
+ isError: true,
3783
+ errorMsg: error.message
3784
+ };
3785
+ }
3786
+ });
3787
+ }
3583
3788
 
3584
3789
  // src/core/btcUtils.ts
3585
3790
  import bitcoin from "bitcoinjs-lib";
3586
3791
  import * as ecc from "@bitcoinerlab/secp256k1";
3587
- import coinselect from "coinselect";
3588
3792
  bitcoin.initEccLib(ecc);
3589
3793
  var NEAR_STORAGE_DEPOSIT_AMOUNT = "1250000000000000000000";
3590
3794
  var NBTC_STORAGE_DEPOSIT_AMOUNT = "3000";
@@ -3708,7 +3912,6 @@ function getDepositAmount(amount, option) {
3708
3912
  var _a;
3709
3913
  const env = (option == null ? void 0 : option.env) || "mainnet";
3710
3914
  const _newAccountMinDepositAmount = (_a = option == null ? void 0 : option.newAccountMinDepositAmount) != null ? _a : true;
3711
- const config = getWalletConfig(env);
3712
3915
  const csna = yield getCsnaAccountId(env);
3713
3916
  const accountInfo = yield getAccountInfo({ csna, env });
3714
3917
  const debtAction = yield checkGasTokenDebt(csna, env, false);
@@ -3716,7 +3919,7 @@ function getDepositAmount(amount, option) {
3716
3919
  const {
3717
3920
  deposit_bridge_fee: { fee_min, fee_rate },
3718
3921
  min_deposit_amount
3719
- } = yield nearCall(config.bridgeContractId, "get_config", {});
3922
+ } = yield getBridgeConfig({ env });
3720
3923
  const depositAmount = Math.max(Number(min_deposit_amount), Number(amount));
3721
3924
  const protocolFee = Math.max(Number(fee_min), Number(depositAmount) * fee_rate);
3722
3925
  const newAccountMinDepositAmount = !(accountInfo == null ? void 0 : accountInfo.nonce) && _newAccountMinDepositAmount ? NEW_ACCOUNT_MIN_DEPOSIT_AMOUNT : 0;
@@ -3908,190 +4111,52 @@ function getWithdrawTransaction(_0) {
3908
4111
  feeRate,
3909
4112
  env = "mainnet"
3910
4113
  }) {
3911
- console.log("=== Start getWithdrawTransaction ===");
4114
+ const config = getWalletConfig(env);
3912
4115
  const provider = getBtcProvider();
3913
4116
  const btcAddress = provider.account;
3914
- const config = getWalletConfig(env);
3915
4117
  const csna = yield getCsnaAccountId(env);
3916
- const brgConfig = yield nearCall(config.bridgeContractId, "get_config", {});
3917
- if (brgConfig.min_withdraw_amount) {
3918
- if (Number(amount) < Number(brgConfig.min_withdraw_amount)) {
3919
- throw new Error("Mini withdraw amount is " + brgConfig.min_withdraw_amount);
3920
- }
3921
- }
3922
- const feePercent = Number(brgConfig.withdraw_bridge_fee.fee_rate) * Number(amount);
3923
- const withdrawFee = feePercent > Number(brgConfig.withdraw_bridge_fee.fee_min) ? feePercent : Number(brgConfig.withdraw_bridge_fee.fee_min);
3924
- console.log("Withdrawal Fee:", {
3925
- feePercent,
3926
- withdrawFee,
3927
- minFee: brgConfig.withdraw_bridge_fee.fee_min
3928
- });
3929
- const gasLimit = yield calculateGasLimit({
4118
+ const _feeRate = feeRate || (yield getBtcGasPrice());
4119
+ const _a = yield calculateWithdraw({
4120
+ amount,
4121
+ feeRate: _feeRate,
3930
4122
  csna,
3931
- transactions: [
3932
- {
3933
- signerId: "",
3934
- receiverId: config.btcToken,
3935
- actions: [
3936
- {
3937
- type: "FunctionCall",
3938
- params: {
3939
- methodName: "ft_transfer_call",
3940
- args: {
3941
- receiver_id: config.btcToken,
3942
- amount: "100",
3943
- msg: ""
3944
- },
3945
- gas: "300000000000000",
3946
- deposit: "1"
3947
- }
3948
- }
3949
- ]
3950
- }
3951
- ],
4123
+ btcAddress,
3952
4124
  env
3953
- });
3954
- const finalAmount = Number(gasLimit) > 0 ? Number(amount) - Number(gasLimit) : Number(amount);
3955
- const allUTXO = yield nearCall(config.bridgeContractId, "get_utxos_paged", {});
3956
- console.log("All UTXOs:", allUTXO);
3957
- if (!allUTXO || Object.keys(allUTXO).length === 0) {
3958
- throw new Error("The network is busy, please try again later.");
4125
+ }), { inputs, outputs, isError, errorMsg } = _a, rest = __objRest(_a, ["inputs", "outputs", "isError", "errorMsg"]);
4126
+ if (isError || !inputs || !outputs) {
4127
+ throw new Error(errorMsg);
3959
4128
  }
3960
- const utxos = Object.keys(allUTXO).map((key) => {
3961
- const txid = key.split("@");
3962
- return {
3963
- txid: txid[0],
3964
- vout: allUTXO[key].vout,
3965
- value: Number(allUTXO[key].balance),
3966
- script: allUTXO[key].script
3967
- };
3968
- });
3969
- console.log("Formatted UTXOs:", utxos);
3970
- const _feeRate = feeRate || (yield getBtcGasPrice());
3971
- console.log("Fee Rate:", _feeRate);
3972
- const coinSelectResult = coinselect(
3973
- utxos,
3974
- [{ address: btcAddress, value: Number(finalAmount) }],
3975
- Math.ceil(_feeRate)
4129
+ console.log("inputs:", JSON.stringify(inputs));
4130
+ console.log("outputs:", JSON.stringify(outputs));
4131
+ console.log("inputs - outputs = gas");
4132
+ console.log(
4133
+ `(${inputs.map((item) => item.value).join(" + ")}) - (${outputs.map((item) => item.value).join(" + ")}) = ${rest.gasFee}`
3976
4134
  );
3977
- console.log("Coinselect Result:", coinSelectResult);
3978
- const { inputs, outputs, fee } = coinSelectResult;
3979
- if (!outputs || !inputs) {
3980
- throw new Error("The network is busy, please try again later.");
3981
- }
3982
- const maxBtcFee = Number(brgConfig.max_btc_gas_fee);
3983
- const transactionFee = fee;
3984
- console.log("Transaction Fee:", { transactionFee, maxBtcFee });
3985
- if (transactionFee > maxBtcFee) {
3986
- throw new Error("Gas exceeds maximum value");
3987
- }
3988
- let recipientOutput, changeOutput;
3989
- for (let i = 0; i < outputs.length; i++) {
3990
- const output = outputs[i];
3991
- if (output.value.toString() === finalAmount.toString()) {
3992
- recipientOutput = output;
3993
- } else {
3994
- changeOutput = output;
3995
- }
3996
- if (!output.address) {
3997
- output.address = brgConfig.change_address;
3998
- }
3999
- }
4000
- console.log("Initial Outputs:", { recipientOutput, changeOutput });
4001
- recipientOutput.value = new Big2(recipientOutput.value).minus(transactionFee).minus(withdrawFee).toNumber();
4002
- if (changeOutput) {
4003
- changeOutput.value = new Big2(changeOutput.value).plus(transactionFee).plus(withdrawFee).toNumber();
4004
- const remainingInputs = [...inputs];
4005
- let smallestInput = Math.min.apply(
4006
- null,
4007
- remainingInputs.map((input) => input.value)
4008
- );
4009
- let remainingChangeAmount = changeOutput.value;
4010
- console.log("Initial Change Processing:", { smallestInput, remainingChangeAmount });
4011
- while (remainingChangeAmount >= smallestInput && smallestInput > 0 && remainingInputs.length > 0) {
4012
- remainingChangeAmount -= smallestInput;
4013
- changeOutput.value = remainingChangeAmount;
4014
- const smallestInputIndex = remainingInputs.findIndex(
4015
- (input) => input.value === smallestInput
4016
- );
4017
- if (smallestInputIndex > -1) {
4018
- remainingInputs.splice(smallestInputIndex, 1);
4019
- }
4020
- smallestInput = Math.min.apply(
4021
- null,
4022
- remainingInputs.map((input) => input.value)
4023
- );
4024
- console.log("Change Processing Loop:", {
4025
- remainingChangeAmount,
4026
- smallestInput,
4027
- remainingInputsCount: remainingInputs.length
4028
- });
4029
- }
4030
- const minChangeAmount = Number(brgConfig.min_change_amount);
4031
- let additionalFee = 0;
4032
- console.log("Checking minimum change amount:", {
4033
- changeValue: changeOutput.value,
4034
- minChangeAmount
4035
- });
4036
- let finalOutputs = [...outputs];
4037
- if (changeOutput.value === 0) {
4038
- finalOutputs = finalOutputs.filter((output) => output.value !== 0);
4039
- console.log("Removed zero-value change output", finalOutputs);
4040
- } else if (changeOutput.value < minChangeAmount) {
4041
- additionalFee = minChangeAmount - changeOutput.value;
4042
- recipientOutput.value -= additionalFee;
4043
- changeOutput.value = minChangeAmount;
4044
- console.log("Adjusted for minimum change amount:", {
4045
- additionalFee,
4046
- newRecipientValue: recipientOutput.value,
4047
- newChangeValue: changeOutput.value
4048
- });
4049
- }
4050
- } else {
4051
- changeOutput = {
4052
- address: brgConfig.change_address,
4053
- value: new Big2(transactionFee).plus(withdrawFee).toNumber()
4054
- };
4055
- outputs.push(changeOutput);
4056
- console.log("Created new change output:", changeOutput);
4057
- }
4058
- const insufficientOutput = outputs.some((item) => item.value < 0);
4059
- if (insufficientOutput) {
4060
- console.error("Negative output value detected");
4061
- throw new Error("Not enough gas");
4062
- }
4063
- const inputSum = inputs.reduce((sum, cur) => sum + Number(cur.value), 0);
4064
- const outputSum = outputs.reduce((sum, cur) => sum + Number(cur.value), 0);
4065
- console.log("Balance verification:", { inputSum, outputSum, transactionFee });
4066
- if (transactionFee + outputSum !== inputSum) {
4067
- console.error("Balance mismatch:", { inputSum, outputSum, transactionFee });
4068
- throw new Error("compute error");
4069
- }
4070
4135
  const network = yield getNetwork();
4071
4136
  const btcNetwork = network === "mainnet" ? bitcoin.networks.bitcoin : bitcoin.networks.testnet;
4072
4137
  const psbt = new bitcoin.Psbt({ network: btcNetwork });
4073
4138
  const btcRpcUrl = yield getBtcRpcUrl();
4074
- for (let i = 0; i < inputs.length; i++) {
4075
- const input = inputs[i];
4076
- const txData = yield fetch(`${btcRpcUrl}/tx/${input.txid}`).then((res) => res.json());
4077
- const inputOptions = {
4078
- hash: input.txid,
4079
- index: input.vout,
4080
- sequence: 4294967293,
4081
- witnessUtxo: {
4082
- script: Buffer.from(txData.vout[input.vout].scriptpubkey, "hex"),
4083
- value: input.value
4084
- }
4085
- };
4086
- psbt.addInput(inputOptions);
4087
- }
4139
+ Promise.all(
4140
+ inputs.map((input) => __async(this, null, function* () {
4141
+ const txData = yield fetch(`${btcRpcUrl}/tx/${input.txid}`).then((res) => res.json());
4142
+ const inputOptions = {
4143
+ hash: input.txid,
4144
+ index: input.vout,
4145
+ sequence: 4294967293,
4146
+ witnessUtxo: {
4147
+ script: Buffer.from(txData.vout[input.vout].scriptpubkey, "hex"),
4148
+ value: input.value
4149
+ }
4150
+ };
4151
+ psbt.addInput(inputOptions);
4152
+ }))
4153
+ );
4088
4154
  outputs.forEach((output) => {
4089
4155
  psbt.addOutput({
4090
4156
  address: output.address,
4091
4157
  value: output.value
4092
4158
  });
4093
4159
  });
4094
- console.log("outputs:", JSON.stringify(outputs));
4095
4160
  const _inputs = inputs.map((item) => {
4096
4161
  return `${item.txid}:${item.vout}`;
4097
4162
  });
@@ -4676,7 +4741,7 @@ function setupBTCWallet({
4676
4741
 
4677
4742
  // src/index.ts
4678
4743
  var getVersion = () => {
4679
- return "0.5.20-beta";
4744
+ return "0.5.21-beta";
4680
4745
  };
4681
4746
  if (typeof window !== "undefined") {
4682
4747
  window.__BTC_WALLET_VERSION = getVersion();