btc-wallet 0.4.4-beta → 0.4.6-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.
- package/README.md +0 -1
- package/dist/core/btcUtils.d.ts +26 -16
- package/dist/index.js +195 -49
- package/dist/index.js.map +3 -3
- package/dist/utils/satoshi.d.ts +1 -0
- package/esm/index.js +195 -49
- package/esm/index.js.map +2 -2
- package/package.json +3 -1
package/README.md
CHANGED
@@ -66,7 +66,6 @@ interface ExecuteBTCDepositAndActionParams<T extends boolean = true> {
|
|
66
66
|
|
67
67
|
// Common optional parameters
|
68
68
|
feeRate?: number; // optional: custom fee rate for the BTC transaction
|
69
|
-
fixedAmount?: boolean; // optional: whether to use fixed amount
|
70
69
|
env?: 'mainnet' | 'testnet' | 'private_mainnet' | 'dev'; // optional: defaults to NEAR network environment
|
71
70
|
pollResult?: T; // optional: whether to poll for transaction result
|
72
71
|
registerDeposit?: string; // optional: whether to register deposit,default 0.000125 NEAR
|
package/dist/core/btcUtils.d.ts
CHANGED
@@ -1,27 +1,25 @@
|
|
1
1
|
import type { ENV } from '../config';
|
2
|
-
import type { FinalExecutionOutcome } from '@near-wallet-selector/core';
|
2
|
+
import type { FinalExecutionOutcome, Transaction } from '@near-wallet-selector/core';
|
3
3
|
export interface AccountInfo {
|
4
4
|
nonce: string;
|
5
5
|
gas_token: Record<string, string>;
|
6
|
-
debt_info?:
|
6
|
+
debt_info?: {
|
7
|
+
gas_token_id: string;
|
8
|
+
near_gas_debt_amount: string;
|
9
|
+
protocol_fee_debt_amount: string;
|
10
|
+
};
|
7
11
|
relayer_fee?: {
|
8
12
|
amount?: string;
|
9
13
|
};
|
10
14
|
}
|
11
|
-
export interface DebtInfo {
|
12
|
-
gas_token_id: string;
|
13
|
-
near_gas_debt_amount: string;
|
14
|
-
protocol_fee_debt_amount: string;
|
15
|
-
}
|
16
15
|
export declare function getAccountInfo(csna: string, accountContractId: string): Promise<AccountInfo | undefined>;
|
17
16
|
export declare function checkGasTokenBalance(csna: string, gasToken: string, minAmount: string, env: ENV): Promise<void>;
|
18
|
-
type
|
17
|
+
type CheckGasTokenDebtReturnType<T extends boolean> = T extends true ? void : {
|
19
18
|
receiver_id: string;
|
20
19
|
amount: string;
|
21
20
|
msg: string;
|
22
21
|
} | undefined;
|
23
|
-
export declare function
|
24
|
-
export declare function queryGasTokenArrears(env: ENV): Promise<DebtInfo | undefined>;
|
22
|
+
export declare function checkGasTokenDebt<T extends boolean>(accountInfo: AccountInfo | undefined, env: ENV, autoDeposit?: T): Promise<CheckGasTokenDebtReturnType<T>>;
|
25
23
|
export declare function getBtcGasPrice(): Promise<number>;
|
26
24
|
export declare function getBtcBalance(): Promise<{
|
27
25
|
rawBalance: number;
|
@@ -34,17 +32,24 @@ export declare function getBtcBalance(): Promise<{
|
|
34
32
|
availableBalance: number;
|
35
33
|
maxSpendableBalance?: undefined;
|
36
34
|
}>;
|
35
|
+
export declare function getNBTCBalance(address: string, env?: ENV): Promise<{
|
36
|
+
balance: number;
|
37
|
+
availableBalance: number;
|
38
|
+
rawBalance: string;
|
39
|
+
rawAvailableBalance: number;
|
40
|
+
}>;
|
37
41
|
export declare function sendBitcoin(address: string, amount: number, feeRate: number): Promise<string>;
|
42
|
+
/** estimate deposit receive amount, deduct protocol fee and repay amount */
|
38
43
|
export declare function estimateDepositAmount(amount: string, option?: {
|
39
44
|
env?: ENV;
|
40
|
-
}): Promise<
|
45
|
+
}): Promise<string>;
|
41
46
|
export declare function getDepositAmount(amount: string, option?: {
|
42
|
-
isEstimate?: boolean;
|
43
47
|
env?: ENV;
|
44
48
|
}): Promise<{
|
45
49
|
depositAmount: number;
|
46
|
-
|
47
|
-
|
50
|
+
totalDepositAmount: number;
|
51
|
+
protocolFee: number;
|
52
|
+
repayAmount: string | number;
|
48
53
|
}>;
|
49
54
|
export declare function getCsnaAccountId(env: ENV): Promise<string>;
|
50
55
|
interface ExecuteBTCDepositAndActionParams<T extends boolean = true> {
|
@@ -57,7 +62,6 @@ interface ExecuteBTCDepositAndActionParams<T extends boolean = true> {
|
|
57
62
|
/** if registerDeposit is true, It will consume the deposit, otherwise it will be 0.000125 NEAR */
|
58
63
|
registerDeposit?: string;
|
59
64
|
feeRate?: number;
|
60
|
-
fixedAmount?: boolean;
|
61
65
|
env?: ENV;
|
62
66
|
pollResult?: T;
|
63
67
|
}
|
@@ -65,6 +69,12 @@ interface ExecuteBTCDepositAndActionParams<T extends boolean = true> {
|
|
65
69
|
* @param T - if true, return the poll result, otherwise return the btcTxHash
|
66
70
|
*/
|
67
71
|
type ExecuteBTCDepositAndActionReturn<T extends boolean> = T extends true ? FinalExecutionOutcome[] : string;
|
68
|
-
export declare function executeBTCDepositAndAction<T extends boolean = true>({ action, amount, feeRate,
|
72
|
+
export declare function executeBTCDepositAndAction<T extends boolean = true>({ action, amount, feeRate, pollResult, registerDeposit, env, }: ExecuteBTCDepositAndActionParams<T>): Promise<ExecuteBTCDepositAndActionReturn<T>>;
|
69
73
|
export declare function checkSatoshiWhitelist(btcAccountId: string, env?: ENV): Promise<void>;
|
74
|
+
interface WithdrawParams {
|
75
|
+
amount: string | number;
|
76
|
+
feeRate?: number;
|
77
|
+
env?: ENV;
|
78
|
+
}
|
79
|
+
export declare function getWithdrawTransaction({ amount, feeRate, env, }: WithdrawParams): Promise<Transaction>;
|
70
80
|
export {};
|
package/dist/index.js
CHANGED
@@ -90,8 +90,8 @@ __export(src_exports, {
|
|
90
90
|
UnisatConnector: () => UnisatConnector,
|
91
91
|
WizzConnector: () => WizzConnector,
|
92
92
|
XverseConnector: () => XverseConnector,
|
93
|
-
checkGasTokenArrears: () => checkGasTokenArrears,
|
94
93
|
checkGasTokenBalance: () => checkGasTokenBalance,
|
94
|
+
checkGasTokenDebt: () => checkGasTokenDebt,
|
95
95
|
checkSatoshiWhitelist: () => checkSatoshiWhitelist,
|
96
96
|
estimateDepositAmount: () => estimateDepositAmount,
|
97
97
|
executeBTCDepositAndAction: () => executeBTCDepositAndAction,
|
@@ -100,8 +100,9 @@ __export(src_exports, {
|
|
100
100
|
getBtcGasPrice: () => getBtcGasPrice,
|
101
101
|
getCsnaAccountId: () => getCsnaAccountId,
|
102
102
|
getDepositAmount: () => getDepositAmount,
|
103
|
+
getNBTCBalance: () => getNBTCBalance,
|
103
104
|
getVersion: () => getVersion,
|
104
|
-
|
105
|
+
getWithdrawTransaction: () => getWithdrawTransaction,
|
105
106
|
sendBitcoin: () => sendBitcoin,
|
106
107
|
setupBTCWallet: () => setupBTCWallet,
|
107
108
|
useAccountContract: () => useAccountContract,
|
@@ -2401,6 +2402,7 @@ function BtcWalletSelectorContextProvider({
|
|
2401
2402
|
const [isProcessing, setIsProcessing] = (0, import_react11.useState)(false);
|
2402
2403
|
const connectors = [
|
2403
2404
|
new UnisatConnector(),
|
2405
|
+
new XverseConnector(),
|
2404
2406
|
new OKXConnector(),
|
2405
2407
|
new BitgetConnector()
|
2406
2408
|
];
|
@@ -3240,9 +3242,10 @@ Dialog.style = `
|
|
3240
3242
|
`;
|
3241
3243
|
|
3242
3244
|
// src/core/btcUtils.ts
|
3243
|
-
var
|
3245
|
+
var import_bitcoinjs_lib = __toESM(require("bitcoinjs-lib"), 1);
|
3246
|
+
var import_coinselect = __toESM(require("coinselect"), 1);
|
3244
3247
|
var NEAR_STORAGE_DEPOSIT_AMOUNT = "1250000000000000000000";
|
3245
|
-
var NBTC_STORAGE_DEPOSIT_AMOUNT =
|
3248
|
+
var NBTC_STORAGE_DEPOSIT_AMOUNT = "3000";
|
3246
3249
|
var GAS_LIMIT = "50000000000000";
|
3247
3250
|
function getBtcProvider() {
|
3248
3251
|
if (typeof window === "undefined" || !window.btcContext) {
|
@@ -3300,11 +3303,11 @@ function checkGasTokenBalance(csna, gasToken, minAmount, env) {
|
|
3300
3303
|
}
|
3301
3304
|
});
|
3302
3305
|
}
|
3303
|
-
function
|
3306
|
+
function checkGasTokenDebt(accountInfo, env, autoDeposit) {
|
3304
3307
|
return __async(this, null, function* () {
|
3305
3308
|
var _a, _b, _c;
|
3306
3309
|
const debtAmount = new import_big.default(((_a = accountInfo == null ? void 0 : accountInfo.debt_info) == null ? void 0 : _a.near_gas_debt_amount) || 0).plus(((_b = accountInfo == null ? void 0 : accountInfo.debt_info) == null ? void 0 : _b.protocol_fee_debt_amount) || 0).toString();
|
3307
|
-
const relayerFeeAmount = ((_c = accountInfo == null ? void 0 : accountInfo.relayer_fee) == null ? void 0 : _c.amount) ||
|
3310
|
+
const relayerFeeAmount = !(accountInfo == null ? void 0 : accountInfo.nonce) ? NBTC_STORAGE_DEPOSIT_AMOUNT : ((_c = accountInfo == null ? void 0 : accountInfo.relayer_fee) == null ? void 0 : _c.amount) || 0;
|
3308
3311
|
const hasDebtArrears = new import_big.default(debtAmount).gt(0);
|
3309
3312
|
const hasRelayerFeeArrears = new import_big.default(relayerFeeAmount).gt(0);
|
3310
3313
|
if (!hasDebtArrears && !hasRelayerFeeArrears)
|
@@ -3314,7 +3317,7 @@ function checkGasTokenArrears(accountInfo, env, autoDeposit) {
|
|
3314
3317
|
console.log("get_account:", accountInfo);
|
3315
3318
|
const action = {
|
3316
3319
|
receiver_id: config.accountContractId,
|
3317
|
-
amount: transferAmount,
|
3320
|
+
amount: transferAmount.toString(),
|
3318
3321
|
msg: JSON.stringify(hasDebtArrears ? "Repay" : "RelayerFee")
|
3319
3322
|
};
|
3320
3323
|
if (!autoDeposit)
|
@@ -3334,14 +3337,6 @@ function checkGasTokenArrears(accountInfo, env, autoDeposit) {
|
|
3334
3337
|
}
|
3335
3338
|
});
|
3336
3339
|
}
|
3337
|
-
function queryGasTokenArrears(env) {
|
3338
|
-
return __async(this, null, function* () {
|
3339
|
-
const config = yield getConfig(env);
|
3340
|
-
const csna = yield getCsnaAccountId(env);
|
3341
|
-
const accountInfo = yield getAccountInfo(csna, config.accountContractId);
|
3342
|
-
return accountInfo == null ? void 0 : accountInfo.debt_info;
|
3343
|
-
});
|
3344
|
-
}
|
3345
3340
|
function getBtcGasPrice() {
|
3346
3341
|
return __async(this, null, function* () {
|
3347
3342
|
const network = yield getNetwork();
|
@@ -3383,6 +3378,18 @@ function getBtcBalance() {
|
|
3383
3378
|
};
|
3384
3379
|
});
|
3385
3380
|
}
|
3381
|
+
function getNBTCBalance(address, env) {
|
3382
|
+
return __async(this, null, function* () {
|
3383
|
+
const config = yield getConfig(env || "mainnet");
|
3384
|
+
const rawBalance = yield nearCall(config.token, "ft_balance_of", {
|
3385
|
+
account_id: address
|
3386
|
+
});
|
3387
|
+
const balance = new import_big.default(rawBalance).div(__pow(10, 8)).round(8, import_big.default.roundDown).toNumber();
|
3388
|
+
const rawAvailableBalance = new import_big.default(rawBalance).minus(1e3).toNumber();
|
3389
|
+
const availableBalance = new import_big.default(rawAvailableBalance).div(__pow(10, 8)).round(8, import_big.default.roundDown).toNumber();
|
3390
|
+
return { balance, availableBalance, rawBalance, rawAvailableBalance };
|
3391
|
+
});
|
3392
|
+
}
|
3386
3393
|
function sendBitcoin(address, amount, feeRate) {
|
3387
3394
|
return __async(this, null, function* () {
|
3388
3395
|
const { sendBitcoin: sendBitcoin2 } = getBtcProvider();
|
@@ -3392,28 +3399,29 @@ function sendBitcoin(address, amount, feeRate) {
|
|
3392
3399
|
}
|
3393
3400
|
function estimateDepositAmount(amount, option) {
|
3394
3401
|
return __async(this, null, function* () {
|
3395
|
-
|
3396
|
-
const csna = yield getCsnaAccountId((option == null ? void 0 : option.env) || "mainnet");
|
3397
|
-
const accountInfo = yield getAccountInfo(csna, config.accountContractId);
|
3398
|
-
const { receiveAmount } = yield getDepositAmount(amount, __spreadProps(__spreadValues({}, option), { isEstimate: true }));
|
3399
|
-
return (accountInfo == null ? void 0 : accountInfo.nonce) ? receiveAmount : new import_big.default(receiveAmount).minus(NBTC_STORAGE_DEPOSIT_AMOUNT).round(0, import_big.default.roundDown).toNumber();
|
3402
|
+
return amount;
|
3400
3403
|
});
|
3401
3404
|
}
|
3402
3405
|
function getDepositAmount(amount, option) {
|
3403
3406
|
return __async(this, null, function* () {
|
3404
|
-
const
|
3407
|
+
const env = (option == null ? void 0 : option.env) || "mainnet";
|
3408
|
+
const config = yield getConfig(env);
|
3409
|
+
const csna = yield getCsnaAccountId(env);
|
3410
|
+
const accountInfo = yield getAccountInfo(csna, config.accountContractId);
|
3411
|
+
const debtAction = yield checkGasTokenDebt(accountInfo, env, false);
|
3412
|
+
const repayAmount = (debtAction == null ? void 0 : debtAction.amount) || 0;
|
3405
3413
|
const {
|
3406
3414
|
deposit_bridge_fee: { fee_min, fee_rate },
|
3407
3415
|
min_deposit_amount
|
3408
3416
|
} = yield nearCall(config.bridgeContractId, "get_config", {});
|
3409
|
-
const depositAmount =
|
3410
|
-
const
|
3411
|
-
const
|
3412
|
-
console.log("getDepositAmount:", { depositAmount, receiveAmount, fee });
|
3417
|
+
const depositAmount = Math.max(Number(min_deposit_amount), Number(amount));
|
3418
|
+
const protocolFee = Math.max(Number(fee_min), Number(depositAmount) * fee_rate);
|
3419
|
+
const totalDepositAmount = new import_big.default(depositAmount).plus(protocolFee).plus(repayAmount).round(0, import_big.default.roundDown).toNumber();
|
3413
3420
|
return {
|
3414
3421
|
depositAmount,
|
3415
|
-
|
3416
|
-
|
3422
|
+
totalDepositAmount,
|
3423
|
+
protocolFee,
|
3424
|
+
repayAmount
|
3417
3425
|
};
|
3418
3426
|
});
|
3419
3427
|
}
|
@@ -3437,7 +3445,6 @@ function executeBTCDepositAndAction(_0) {
|
|
3437
3445
|
action,
|
3438
3446
|
amount,
|
3439
3447
|
feeRate,
|
3440
|
-
fixedAmount = true,
|
3441
3448
|
pollResult = true,
|
3442
3449
|
registerDeposit,
|
3443
3450
|
env = "mainnet"
|
@@ -3454,24 +3461,23 @@ function executeBTCDepositAndAction(_0) {
|
|
3454
3461
|
throw new Error("amount or action is required");
|
3455
3462
|
}
|
3456
3463
|
const csna = yield getCsnaAccountId(env);
|
3457
|
-
const
|
3458
|
-
if (new import_big.default(
|
3464
|
+
const depositAmount = (_a = action ? action.amount : amount) != null ? _a : "0";
|
3465
|
+
if (new import_big.default(depositAmount).lt(0)) {
|
3459
3466
|
throw new Error("amount must be greater than 0");
|
3460
3467
|
}
|
3461
|
-
const {
|
3468
|
+
const { totalDepositAmount, protocolFee, repayAmount } = yield getDepositAmount(depositAmount, {
|
3462
3469
|
env
|
3463
3470
|
});
|
3464
3471
|
const accountInfo = yield getAccountInfo(csna, config.accountContractId);
|
3465
3472
|
const newActions = [];
|
3466
|
-
const
|
3467
|
-
if (
|
3468
|
-
newActions.push(__spreadProps(__spreadValues({},
|
3473
|
+
const debtAction = yield checkGasTokenDebt(accountInfo, env, false);
|
3474
|
+
if (debtAction) {
|
3475
|
+
newActions.push(__spreadProps(__spreadValues({}, debtAction), {
|
3469
3476
|
gas: GAS_LIMIT
|
3470
3477
|
}));
|
3471
3478
|
}
|
3472
3479
|
if (action) {
|
3473
3480
|
newActions.push(__spreadProps(__spreadValues({}, action), {
|
3474
|
-
amount: (arrearsAction == null ? void 0 : arrearsAction.amount) && !fixedAmount ? new import_big.default(receiveAmount).minus(arrearsAction.amount).toString() : receiveAmount.toString(),
|
3475
3481
|
gas: GAS_LIMIT
|
3476
3482
|
}));
|
3477
3483
|
}
|
@@ -3488,12 +3494,6 @@ function executeBTCDepositAndAction(_0) {
|
|
3488
3494
|
}
|
3489
3495
|
if (!(accountInfo == null ? void 0 : accountInfo.nonce)) {
|
3490
3496
|
storageDepositMsg.btc_public_key = btcPublicKey;
|
3491
|
-
newActions.push({
|
3492
|
-
receiver_id: config.accountContractId,
|
3493
|
-
amount: NBTC_STORAGE_DEPOSIT_AMOUNT.toString(),
|
3494
|
-
msg: JSON.stringify("RelayerFee"),
|
3495
|
-
gas: GAS_LIMIT
|
3496
|
-
});
|
3497
3497
|
}
|
3498
3498
|
const depositMsg = {
|
3499
3499
|
recipient_id: csna,
|
@@ -3507,10 +3507,14 @@ function executeBTCDepositAndAction(_0) {
|
|
3507
3507
|
{ deposit_msg: depositMsg }
|
3508
3508
|
);
|
3509
3509
|
const _feeRate = feeRate || (yield getBtcGasPrice());
|
3510
|
-
|
3511
|
-
|
3512
|
-
|
3513
|
-
|
3510
|
+
console.table({
|
3511
|
+
"User Deposit Address": userDepositAddress,
|
3512
|
+
"Deposit Amount": depositAmount,
|
3513
|
+
"Protocol Fee": protocolFee,
|
3514
|
+
"Repay Amount": repayAmount,
|
3515
|
+
"Total Deposit Amount": totalDepositAmount,
|
3516
|
+
"Fee Rate": _feeRate
|
3517
|
+
});
|
3514
3518
|
const postActionsStr = newActions.length > 0 ? JSON.stringify(newActions) : void 0;
|
3515
3519
|
yield preReceiveDepositMsg(config.base_url, {
|
3516
3520
|
btcPublicKey,
|
@@ -3518,7 +3522,7 @@ function executeBTCDepositAndAction(_0) {
|
|
3518
3522
|
postActions: postActionsStr,
|
3519
3523
|
extraMsg: depositMsg.extra_msg
|
3520
3524
|
});
|
3521
|
-
const txHash = yield sendBitcoin(userDepositAddress,
|
3525
|
+
const txHash = yield sendBitcoin(userDepositAddress, totalDepositAmount, _feeRate);
|
3522
3526
|
yield receiveDepositMsg(config.base_url, {
|
3523
3527
|
btcPublicKey,
|
3524
3528
|
txHash,
|
@@ -3563,6 +3567,148 @@ Sign up now: <a style="color: #ff7a00; text-decoration: underline;" href="https:
|
|
3563
3567
|
}
|
3564
3568
|
});
|
3565
3569
|
}
|
3570
|
+
function getWithdrawTransaction(_0) {
|
3571
|
+
return __async(this, arguments, function* ({
|
3572
|
+
amount,
|
3573
|
+
feeRate,
|
3574
|
+
env = "mainnet"
|
3575
|
+
}) {
|
3576
|
+
const provider = getBtcProvider();
|
3577
|
+
const btcAddress = yield provider.account;
|
3578
|
+
const config = yield getConfig(env);
|
3579
|
+
const brgConfig = yield nearCall(config.bridgeContractId, "get_config", {});
|
3580
|
+
if (brgConfig.min_withdraw_amount) {
|
3581
|
+
if (Number(amount) < Number(brgConfig.min_withdraw_amount)) {
|
3582
|
+
throw new Error("Mini withdraw amount is " + brgConfig.min_withdraw_amount);
|
3583
|
+
}
|
3584
|
+
}
|
3585
|
+
const feePercent = Number(brgConfig.withdraw_bridge_fee.fee_rate) * Number(amount);
|
3586
|
+
const withdrawFee = feePercent > Number(brgConfig.withdraw_bridge_fee.fee_min) ? feePercent : Number(brgConfig.withdraw_bridge_fee.fee_min);
|
3587
|
+
const allUTXO = yield nearCall(config.bridgeContractId, "get_utxos_paged", {});
|
3588
|
+
if (!allUTXO || Object.keys(allUTXO).length === 0) {
|
3589
|
+
throw new Error("The network is busy, please try again later.");
|
3590
|
+
}
|
3591
|
+
const utxos = Object.keys(allUTXO).map((key) => {
|
3592
|
+
const txid = key.split("@");
|
3593
|
+
return {
|
3594
|
+
txid: txid[0],
|
3595
|
+
vout: allUTXO[key].vout,
|
3596
|
+
value: Number(allUTXO[key].balance),
|
3597
|
+
script: allUTXO[key].script
|
3598
|
+
};
|
3599
|
+
});
|
3600
|
+
const _feeRate = feeRate || (yield getBtcGasPrice());
|
3601
|
+
const { inputs, outputs, fee } = (0, import_coinselect.default)(
|
3602
|
+
utxos,
|
3603
|
+
[{ address: btcAddress, value: Number(amount) }],
|
3604
|
+
Math.ceil(_feeRate)
|
3605
|
+
);
|
3606
|
+
if (!outputs || !inputs) {
|
3607
|
+
throw new Error("The network is busy, please try again later.");
|
3608
|
+
}
|
3609
|
+
const maxBtcFee = Number(brgConfig.max_btc_gas_fee);
|
3610
|
+
const newFee = fee;
|
3611
|
+
const withdrawChangeAddress = brgConfig.change_address;
|
3612
|
+
if (newFee > maxBtcFee) {
|
3613
|
+
throw new Error("Gas exceeds maximum value");
|
3614
|
+
}
|
3615
|
+
let userOutput, noUserOutput;
|
3616
|
+
for (let i = 0; i < outputs.length; i++) {
|
3617
|
+
const output = outputs[i];
|
3618
|
+
if (output.value.toString() === amount.toString()) {
|
3619
|
+
userOutput = output;
|
3620
|
+
} else {
|
3621
|
+
noUserOutput = output;
|
3622
|
+
}
|
3623
|
+
if (!output.address) {
|
3624
|
+
output.address = withdrawChangeAddress;
|
3625
|
+
}
|
3626
|
+
}
|
3627
|
+
userOutput.value = new import_big.default(userOutput.value).minus(newFee).minus(withdrawFee).toNumber();
|
3628
|
+
if (noUserOutput) {
|
3629
|
+
noUserOutput.value = new import_big.default(noUserOutput.value).plus(newFee).plus(withdrawFee).toNumber();
|
3630
|
+
} else {
|
3631
|
+
noUserOutput = {
|
3632
|
+
address: withdrawChangeAddress,
|
3633
|
+
value: new import_big.default(newFee).plus(withdrawFee).toNumber()
|
3634
|
+
};
|
3635
|
+
outputs.push(noUserOutput);
|
3636
|
+
}
|
3637
|
+
const insufficientOutput = outputs.some((item) => item.value < 0);
|
3638
|
+
if (insufficientOutput) {
|
3639
|
+
throw new Error("Not enough gas");
|
3640
|
+
}
|
3641
|
+
const inputSum = inputs.reduce((sum, cur) => sum + Number(cur.value), 0);
|
3642
|
+
const outputSum = outputs.reduce((sum, cur) => sum + Number(cur.value), 0);
|
3643
|
+
if (newFee + outputSum !== inputSum) {
|
3644
|
+
throw new Error("compute error");
|
3645
|
+
}
|
3646
|
+
const network = yield getNetwork();
|
3647
|
+
const btcNetwork = network === "mainnet" ? import_bitcoinjs_lib.default.networks.bitcoin : import_bitcoinjs_lib.default.networks.testnet;
|
3648
|
+
const psbt = new import_bitcoinjs_lib.default.Psbt({ network: btcNetwork });
|
3649
|
+
const btcRpcUrl = yield getBtcRpcUrl();
|
3650
|
+
for (let i = 0; i < inputs.length; i++) {
|
3651
|
+
const input = inputs[i];
|
3652
|
+
const txData = yield fetch(`${btcRpcUrl}/tx/${input.txid}`).then((res) => res.json());
|
3653
|
+
const inputOptions = {
|
3654
|
+
hash: input.txid,
|
3655
|
+
index: input.vout,
|
3656
|
+
sequence: 4294967293,
|
3657
|
+
witnessUtxo: {
|
3658
|
+
script: Buffer.from(txData.vout[input.vout].scriptpubkey, "hex"),
|
3659
|
+
value: input.value
|
3660
|
+
}
|
3661
|
+
};
|
3662
|
+
psbt.addInput(inputOptions);
|
3663
|
+
}
|
3664
|
+
outputs.forEach((output) => {
|
3665
|
+
psbt.addOutput({
|
3666
|
+
address: output.address,
|
3667
|
+
value: output.value
|
3668
|
+
});
|
3669
|
+
});
|
3670
|
+
const _inputs = inputs.map((item) => {
|
3671
|
+
return `${item.txid}:${item.vout}`;
|
3672
|
+
});
|
3673
|
+
const txOutputs = psbt.txOutputs.map((item) => {
|
3674
|
+
return {
|
3675
|
+
script_pubkey: uint8ArrayToHex(item.script),
|
3676
|
+
value: item.value
|
3677
|
+
};
|
3678
|
+
});
|
3679
|
+
const msg = {
|
3680
|
+
Withdraw: {
|
3681
|
+
target_btc_address: btcAddress,
|
3682
|
+
input: _inputs,
|
3683
|
+
output: txOutputs
|
3684
|
+
}
|
3685
|
+
};
|
3686
|
+
const csna = yield getCsnaAccountId(env);
|
3687
|
+
const transaction = {
|
3688
|
+
receiverId: config.token,
|
3689
|
+
signerId: csna,
|
3690
|
+
actions: [
|
3691
|
+
{
|
3692
|
+
type: "FunctionCall",
|
3693
|
+
params: {
|
3694
|
+
methodName: "ft_transfer_call",
|
3695
|
+
args: {
|
3696
|
+
receiver_id: config.bridgeContractId,
|
3697
|
+
amount: amount.toString(),
|
3698
|
+
msg: JSON.stringify(msg)
|
3699
|
+
},
|
3700
|
+
gas: "300000000000000",
|
3701
|
+
deposit: "1"
|
3702
|
+
}
|
3703
|
+
}
|
3704
|
+
]
|
3705
|
+
};
|
3706
|
+
return transaction;
|
3707
|
+
});
|
3708
|
+
}
|
3709
|
+
function uint8ArrayToHex(uint8Array) {
|
3710
|
+
return Array.from(uint8Array).map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
3711
|
+
}
|
3566
3712
|
|
3567
3713
|
// src/core/setupBTCWallet.ts
|
3568
3714
|
var { transfer, functionCall } = import_transactions.actionCreators;
|
@@ -3788,7 +3934,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
|
3788
3934
|
const btcContext = window.btcContext;
|
3789
3935
|
const accountId = state.getAccount();
|
3790
3936
|
const accountInfo = yield getAccountInfo(accountId, currentConfig.accountContractId);
|
3791
|
-
yield
|
3937
|
+
yield checkGasTokenDebt(accountInfo, env, true);
|
3792
3938
|
const trans = [...params.transactions];
|
3793
3939
|
console.log("raw trans:", trans);
|
3794
3940
|
const gasTokenBalance = (accountInfo == null ? void 0 : accountInfo.gas_token[currentConfig.token]) || "0";
|
@@ -3997,7 +4143,7 @@ function setupBTCWallet({
|
|
3997
4143
|
if (!hasShownNotice) {
|
3998
4144
|
Dialog.alert({
|
3999
4145
|
title: "Notice",
|
4000
|
-
message: "You are currently using Satoshi Private Mainnet. This is a private version for testing. Please try a small amount of assets in
|
4146
|
+
message: "You are currently using Satoshi Private Mainnet. This is a private version for testing. Please try a small amount of assets in Ramp"
|
4001
4147
|
});
|
4002
4148
|
localStorage.setItem("satoshi_private_mainnet_notice", "true");
|
4003
4149
|
}
|
@@ -4026,7 +4172,7 @@ function setupBTCWallet({
|
|
4026
4172
|
|
4027
4173
|
// src/index.ts
|
4028
4174
|
var getVersion = () => {
|
4029
|
-
return "0.4.
|
4175
|
+
return "0.4.6-beta";
|
4030
4176
|
};
|
4031
4177
|
if (typeof window !== "undefined") {
|
4032
4178
|
window.__BTC_WALLET_VERSION = getVersion();
|