btc-wallet 0.5.20-beta → 0.5.21-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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();