btc-wallet 0.3.12 → 0.3.14
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/dist/config.d.ts +0 -1
- package/dist/core/btcUtils.d.ts +32 -4
- package/dist/index.js +260 -232
- package/dist/index.js.map +2 -2
- package/dist/utils/satoshi.d.ts +3 -3
- package/esm/index.js +260 -232
- package/esm/index.js.map +2 -2
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
package/dist/core/btcUtils.d.ts
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
export interface DebtInfo {
|
2
|
+
gas_token_id: string;
|
3
|
+
transfer_amount: string;
|
4
|
+
near_gas_debt_amount: string;
|
5
|
+
protocol_fee_debt_amount: string;
|
6
|
+
}
|
7
|
+
export declare function getAccountInfo(csna: string, accountContractId: string): Promise<{
|
8
|
+
nonce: string;
|
9
|
+
gas_token: Record<string, string>;
|
10
|
+
debt_info: DebtInfo;
|
11
|
+
}>;
|
12
|
+
type CheckGasTokenArrearsReturnType<T extends boolean> = T extends true ? void : {
|
13
|
+
receiver_id: string;
|
14
|
+
amount: string;
|
15
|
+
msg: string;
|
16
|
+
} | undefined;
|
17
|
+
export declare function checkGasTokenArrears<T extends boolean>(debtInfo: DebtInfo | undefined, isDev: boolean, autoDeposit?: T): Promise<CheckGasTokenArrearsReturnType<T>>;
|
1
18
|
export declare function getBtcGasPrice(): Promise<number>;
|
2
19
|
export declare function getBtcBalance(): Promise<{
|
3
20
|
rawBalance: number;
|
@@ -12,18 +29,29 @@ export declare function getBtcBalance(): Promise<{
|
|
12
29
|
}>;
|
13
30
|
export declare function sendBitcoin(address: string, amount: number, feeRate: number): Promise<string>;
|
14
31
|
export declare function estimateDepositAmount(amount: string, option?: {
|
15
|
-
isDev
|
16
|
-
}): Promise<
|
32
|
+
isDev?: boolean;
|
33
|
+
}): Promise<number>;
|
34
|
+
export declare function getDepositAmount(amount: string, option?: {
|
35
|
+
isEstimate?: boolean;
|
36
|
+
isDev?: boolean;
|
37
|
+
}): Promise<{
|
38
|
+
depositAmount: number;
|
39
|
+
receiveAmount: number;
|
40
|
+
fee: number;
|
41
|
+
}>;
|
17
42
|
interface ExecuteBTCDepositAndActionParams {
|
18
|
-
action
|
43
|
+
action?: {
|
19
44
|
receiver_id: string;
|
20
45
|
amount: string;
|
21
46
|
msg: string;
|
22
47
|
};
|
48
|
+
amount?: string;
|
23
49
|
/** fee rate, if not provided, will use the recommended fee rate from the btc node */
|
24
50
|
feeRate?: number;
|
51
|
+
/** fixed amount, if true, in arrears mode, amount is fixed, otherwise it is depositAmount-repayAction.amount */
|
52
|
+
fixedAmount?: boolean;
|
25
53
|
/** is dev environment */
|
26
54
|
isDev?: boolean;
|
27
55
|
}
|
28
|
-
export declare function executeBTCDepositAndAction({ action, feeRate, isDev, }: ExecuteBTCDepositAndActionParams): Promise<any[]>;
|
56
|
+
export declare function executeBTCDepositAndAction({ action, amount, feeRate, fixedAmount, isDev, }: ExecuteBTCDepositAndActionParams): Promise<any[]>;
|
29
57
|
export {};
|
package/dist/index.js
CHANGED
@@ -90,10 +90,13 @@ __export(src_exports, {
|
|
90
90
|
UnisatConnector: () => UnisatConnector,
|
91
91
|
WizzConnector: () => WizzConnector,
|
92
92
|
XverseConnector: () => XverseConnector,
|
93
|
+
checkGasTokenArrears: () => checkGasTokenArrears,
|
93
94
|
estimateDepositAmount: () => estimateDepositAmount,
|
94
95
|
executeBTCDepositAndAction: () => executeBTCDepositAndAction,
|
96
|
+
getAccountInfo: () => getAccountInfo,
|
95
97
|
getBtcBalance: () => getBtcBalance,
|
96
98
|
getBtcGasPrice: () => getBtcGasPrice,
|
99
|
+
getDepositAmount: () => getDepositAmount,
|
97
100
|
getVersion: () => getVersion,
|
98
101
|
sendBitcoin: () => sendBitcoin,
|
99
102
|
setupBTCWallet: () => setupBTCWallet,
|
@@ -2726,24 +2729,21 @@ var walletConfig = {
|
|
2726
2729
|
token: "nbtc-dev.testnet",
|
2727
2730
|
accountContractId: "acc-dev.testnet",
|
2728
2731
|
bridgeContractId: "brg-dev.testnet",
|
2729
|
-
walletUrl: "https://wallet-dev.satoshibridge.top"
|
2730
|
-
gasTokenLimit: "3000"
|
2732
|
+
walletUrl: "https://wallet-dev.satoshibridge.top"
|
2731
2733
|
},
|
2732
2734
|
testnet: {
|
2733
2735
|
base_url: "https://api.testnet.satoshibridge.top",
|
2734
2736
|
token: "nbtc2-nsp.testnet",
|
2735
2737
|
accountContractId: "dev2-nsp.testnet",
|
2736
2738
|
bridgeContractId: "brg2-nsp.testnet",
|
2737
|
-
walletUrl: "https://wallet-test.satoshibridge.top"
|
2738
|
-
gasTokenLimit: "3000"
|
2739
|
+
walletUrl: "https://wallet-test.satoshibridge.top"
|
2739
2740
|
},
|
2740
2741
|
mainnet: {
|
2741
2742
|
base_url: "https://api.mainnet.satoshibridge.top",
|
2742
2743
|
token: "",
|
2743
2744
|
accountContractId: "",
|
2744
2745
|
bridgeContractId: "",
|
2745
|
-
walletUrl: "https://wallet.satoshibridge.top"
|
2746
|
-
gasTokenLimit: "3000"
|
2746
|
+
walletUrl: "https://wallet.satoshibridge.top"
|
2747
2747
|
}
|
2748
2748
|
};
|
2749
2749
|
var nearRpcUrls = {
|
@@ -2753,9 +2753,7 @@ var nearRpcUrls = {
|
|
2753
2753
|
"https://free.rpc.fastnear.com",
|
2754
2754
|
"https://near.drpc.org"
|
2755
2755
|
],
|
2756
|
-
testnet: [
|
2757
|
-
"https://rpc.testnet.near.org"
|
2758
|
-
]
|
2756
|
+
testnet: ["https://rpc.testnet.near.org"]
|
2759
2757
|
};
|
2760
2758
|
var btcRpcUrls = {
|
2761
2759
|
mainnet: "https://mempool.space/api",
|
@@ -2966,14 +2964,14 @@ function checkBridgeTransactionStatus(url, txHash) {
|
|
2966
2964
|
const { result_code, result_message, result_data } = yield request(`${url}/v1/bridgeFromTx?fromTxHash=${txHash}&fromChainId=1`, {
|
2967
2965
|
timeout: 3e5,
|
2968
2966
|
pollingInterval: 5e3,
|
2969
|
-
maxPollingAttempts:
|
2967
|
+
maxPollingAttempts: 60,
|
2970
2968
|
shouldStopPolling: (res) => {
|
2971
2969
|
var _a;
|
2972
|
-
return res.result_code === 0 && [4, 102].includes(((_a = res.result_data) == null ? void 0 : _a.
|
2970
|
+
return res.result_code === 0 && [4, 102].includes(((_a = res.result_data) == null ? void 0 : _a.Status) || 0);
|
2973
2971
|
}
|
2974
2972
|
});
|
2975
2973
|
console.log("checkTransactionStatus resp:", { result_code, result_message, result_data });
|
2976
|
-
if ((result_data == null ? void 0 : result_data.
|
2974
|
+
if ((result_data == null ? void 0 : result_data.Status) !== 4) {
|
2977
2975
|
throw new Error(result_message);
|
2978
2976
|
}
|
2979
2977
|
return result_data;
|
@@ -2984,201 +2982,20 @@ function checkBtcTransactionStatus(url, sig) {
|
|
2984
2982
|
const { result_code, result_message, result_data } = yield request(`${url}/v1/btcTx?sig=${sig}`, {
|
2985
2983
|
timeout: 3e5,
|
2986
2984
|
pollingInterval: 5e3,
|
2987
|
-
maxPollingAttempts:
|
2985
|
+
maxPollingAttempts: 60,
|
2988
2986
|
shouldStopPolling: (res) => {
|
2989
2987
|
var _a;
|
2990
|
-
return res.result_code === 0 && [3, 101, 102].includes(((_a = res.result_data) == null ? void 0 : _a.
|
2988
|
+
return res.result_code === 0 && [3, 101, 102].includes(((_a = res.result_data) == null ? void 0 : _a.Status) || 0);
|
2991
2989
|
}
|
2992
2990
|
});
|
2993
2991
|
console.log("checkBtcTransactionStatus resp:", { result_code, result_message, result_data });
|
2994
|
-
if ((result_data == null ? void 0 : result_data.
|
2992
|
+
if ((result_data == null ? void 0 : result_data.Status) !== 3) {
|
2995
2993
|
throw new Error(result_message);
|
2996
2994
|
}
|
2997
2995
|
return result_data;
|
2998
2996
|
});
|
2999
2997
|
}
|
3000
2998
|
|
3001
|
-
// src/core/btcUtils.ts
|
3002
|
-
function getBtcProvider() {
|
3003
|
-
if (typeof window === "undefined" || !window.btcContext) {
|
3004
|
-
throw new Error("BTC Provider is not initialized.");
|
3005
|
-
}
|
3006
|
-
return window.btcContext;
|
3007
|
-
}
|
3008
|
-
function getNetwork() {
|
3009
|
-
return __async(this, null, function* () {
|
3010
|
-
const network = yield getBtcProvider().getNetwork();
|
3011
|
-
console.log("btc network:", network);
|
3012
|
-
return network === "livenet" ? "mainnet" : "testnet";
|
3013
|
-
});
|
3014
|
-
}
|
3015
|
-
function getBtcRpcUrl() {
|
3016
|
-
return __async(this, null, function* () {
|
3017
|
-
const network = yield getNetwork();
|
3018
|
-
return btcRpcUrls[network];
|
3019
|
-
});
|
3020
|
-
}
|
3021
|
-
function getConfig(isDev) {
|
3022
|
-
return __async(this, null, function* () {
|
3023
|
-
const network = yield getNetwork();
|
3024
|
-
return walletConfig[isDev ? "dev" : network];
|
3025
|
-
});
|
3026
|
-
}
|
3027
|
-
function nearCall(contractId, methodName, args) {
|
3028
|
-
return __async(this, null, function* () {
|
3029
|
-
const network = yield getNetwork();
|
3030
|
-
return nearCallFunction(contractId, methodName, args, { network });
|
3031
|
-
});
|
3032
|
-
}
|
3033
|
-
function getBtcGasPrice() {
|
3034
|
-
return __async(this, null, function* () {
|
3035
|
-
const defaultFeeRate = 100;
|
3036
|
-
try {
|
3037
|
-
const btcRpcUrl = yield getBtcRpcUrl();
|
3038
|
-
const res = yield fetch(`${btcRpcUrl}/v1/fees/recommended`).then((res2) => res2.json());
|
3039
|
-
const feeRate = res.fastestFee;
|
3040
|
-
return feeRate || defaultFeeRate;
|
3041
|
-
} catch (error) {
|
3042
|
-
return defaultFeeRate;
|
3043
|
-
}
|
3044
|
-
});
|
3045
|
-
}
|
3046
|
-
function getBtcBalance() {
|
3047
|
-
return __async(this, null, function* () {
|
3048
|
-
const { account } = yield retryOperation(getBtcProvider, (res) => !!res.account);
|
3049
|
-
if (!account) {
|
3050
|
-
console.error("BTC Account is not available.");
|
3051
|
-
return { rawBalance: 0, balance: 0, maxSpendableBalance: 0 };
|
3052
|
-
}
|
3053
|
-
const btcRpcUrl = yield getBtcRpcUrl();
|
3054
|
-
const utxos = yield fetch(`${btcRpcUrl}/address/${account}/utxo`).then((res) => res.json());
|
3055
|
-
const rawBalance = (utxos == null ? void 0 : utxos.reduce((acc, cur) => acc + cur.value, 0)) || 0;
|
3056
|
-
const balance = rawBalance / __pow(10, 8);
|
3057
|
-
const feeRate = yield getBtcGasPrice();
|
3058
|
-
const inputSize = ((utxos == null ? void 0 : utxos.length) || 0) * 66;
|
3059
|
-
const outputSize = 34;
|
3060
|
-
const overheadSize = 10;
|
3061
|
-
const estimatedTxSize = inputSize + outputSize + overheadSize;
|
3062
|
-
const estimatedFee = estimatedTxSize * feeRate / __pow(10, 8);
|
3063
|
-
console.log("estimated fee:", estimatedFee);
|
3064
|
-
const availableBalance = Math.max(0, balance - estimatedFee);
|
3065
|
-
return {
|
3066
|
-
rawBalance,
|
3067
|
-
balance,
|
3068
|
-
availableBalance
|
3069
|
-
};
|
3070
|
-
});
|
3071
|
-
}
|
3072
|
-
function sendBitcoin(address, amount, feeRate) {
|
3073
|
-
return __async(this, null, function* () {
|
3074
|
-
const { sendBitcoin: sendBitcoin2 } = getBtcProvider();
|
3075
|
-
const txHash = yield sendBitcoin2(address, amount, { feeRate });
|
3076
|
-
return txHash;
|
3077
|
-
});
|
3078
|
-
}
|
3079
|
-
function estimateDepositAmount(amount, option) {
|
3080
|
-
return __async(this, null, function* () {
|
3081
|
-
const config = yield getConfig((option == null ? void 0 : option.isDev) || false);
|
3082
|
-
const {
|
3083
|
-
deposit_bridge_fee: { fee_min, fee_rate }
|
3084
|
-
} = yield nearCall(
|
3085
|
-
config.bridgeContractId,
|
3086
|
-
"get_config",
|
3087
|
-
{}
|
3088
|
-
);
|
3089
|
-
const fee = Math.max(Number(fee_min), Number(amount) * fee_rate);
|
3090
|
-
return new import_big.default(amount).minus(fee).toFixed(0);
|
3091
|
-
});
|
3092
|
-
}
|
3093
|
-
function executeBTCDepositAndAction(_0) {
|
3094
|
-
return __async(this, arguments, function* ({
|
3095
|
-
action,
|
3096
|
-
feeRate,
|
3097
|
-
isDev = false
|
3098
|
-
}) {
|
3099
|
-
try {
|
3100
|
-
const { getPublicKey } = getBtcProvider();
|
3101
|
-
const config = yield getConfig(isDev);
|
3102
|
-
const btcPublicKey = yield getPublicKey();
|
3103
|
-
if (!btcPublicKey) {
|
3104
|
-
throw new Error("BTC Public Key is not available.");
|
3105
|
-
}
|
3106
|
-
if (!action.receiver_id) {
|
3107
|
-
throw new Error("receiver_id is required");
|
3108
|
-
}
|
3109
|
-
if (!action.amount) {
|
3110
|
-
throw new Error("amount is required");
|
3111
|
-
}
|
3112
|
-
const csna = yield nearCall(
|
3113
|
-
config.accountContractId,
|
3114
|
-
"get_chain_signature_near_account_id",
|
3115
|
-
{
|
3116
|
-
btc_public_key: btcPublicKey
|
3117
|
-
}
|
3118
|
-
);
|
3119
|
-
const depositMsg = {
|
3120
|
-
recipient_id: csna,
|
3121
|
-
post_actions: [
|
3122
|
-
__spreadProps(__spreadValues({}, action), {
|
3123
|
-
gas: new import_big.default(100).mul(__pow(10, 12)).toFixed(0)
|
3124
|
-
})
|
3125
|
-
]
|
3126
|
-
};
|
3127
|
-
const storageDepositMsg = {};
|
3128
|
-
const accountInfo = yield nearCall(
|
3129
|
-
config.accountContractId,
|
3130
|
-
"get_account",
|
3131
|
-
{
|
3132
|
-
account_id: csna
|
3133
|
-
}
|
3134
|
-
);
|
3135
|
-
if (!(accountInfo == null ? void 0 : accountInfo.nonce)) {
|
3136
|
-
storageDepositMsg.btc_public_key = btcPublicKey;
|
3137
|
-
}
|
3138
|
-
const registerRes = yield nearCall(action.receiver_id, "storage_balance_of", {
|
3139
|
-
account_id: csna
|
3140
|
-
});
|
3141
|
-
if (!(registerRes == null ? void 0 : registerRes.available)) {
|
3142
|
-
storageDepositMsg.storage_deposit_msg = {
|
3143
|
-
contract_id: action.receiver_id,
|
3144
|
-
deposit: new import_big.default(0.25).mul(__pow(10, 24)).toFixed(0),
|
3145
|
-
registration_only: true
|
3146
|
-
};
|
3147
|
-
}
|
3148
|
-
if (Object.keys(storageDepositMsg).length > 0) {
|
3149
|
-
depositMsg.extra_msg = JSON.stringify(storageDepositMsg);
|
3150
|
-
}
|
3151
|
-
console.log("get_user_deposit_address params:", { deposit_msg: depositMsg });
|
3152
|
-
const userDepositAddress = yield nearCall(
|
3153
|
-
config.bridgeContractId,
|
3154
|
-
"get_user_deposit_address",
|
3155
|
-
{ deposit_msg: depositMsg }
|
3156
|
-
);
|
3157
|
-
const _feeRate = feeRate || (yield getBtcGasPrice());
|
3158
|
-
const minDepositAmount = 5e3;
|
3159
|
-
const sendAmount = Math.max(minDepositAmount, new import_big.default(action.amount).toNumber());
|
3160
|
-
console.log("user deposit address:", userDepositAddress);
|
3161
|
-
console.log("send amount:", sendAmount);
|
3162
|
-
console.log("fee rate:", _feeRate);
|
3163
|
-
const txHash = yield sendBitcoin(userDepositAddress, sendAmount, _feeRate);
|
3164
|
-
yield receiveDepositMsg(config.base_url, {
|
3165
|
-
btcPublicKey,
|
3166
|
-
txHash,
|
3167
|
-
postActions: JSON.stringify(depositMsg.post_actions),
|
3168
|
-
extraMsg: depositMsg.extra_msg
|
3169
|
-
});
|
3170
|
-
const checkTransactionStatusRes = yield checkBridgeTransactionStatus(config.base_url, txHash);
|
3171
|
-
console.log("checkBridgeTransactionStatus resp:", checkTransactionStatusRes);
|
3172
|
-
const network = yield getNetwork();
|
3173
|
-
const result = yield pollTransactionStatuses(network, [checkTransactionStatusRes.ToTxHash]);
|
3174
|
-
return result;
|
3175
|
-
} catch (error) {
|
3176
|
-
console.error("executeBTCDepositAndAction error:", error);
|
3177
|
-
throw error;
|
3178
|
-
}
|
3179
|
-
});
|
3180
|
-
}
|
3181
|
-
|
3182
2999
|
// src/utils/Dialog.ts
|
3183
3000
|
var Dialog = class {
|
3184
3001
|
static injectStyles() {
|
@@ -3360,6 +3177,249 @@ Dialog.style = `
|
|
3360
3177
|
}
|
3361
3178
|
`;
|
3362
3179
|
|
3180
|
+
// src/core/btcUtils.ts
|
3181
|
+
function getBtcProvider() {
|
3182
|
+
if (typeof window === "undefined" || !window.btcContext) {
|
3183
|
+
throw new Error("BTC Provider is not initialized.");
|
3184
|
+
}
|
3185
|
+
return window.btcContext;
|
3186
|
+
}
|
3187
|
+
function getNetwork() {
|
3188
|
+
return __async(this, null, function* () {
|
3189
|
+
const network = yield getBtcProvider().getNetwork();
|
3190
|
+
console.log("btc network:", network);
|
3191
|
+
return network === "livenet" ? "mainnet" : "testnet";
|
3192
|
+
});
|
3193
|
+
}
|
3194
|
+
function getBtcRpcUrl() {
|
3195
|
+
return __async(this, null, function* () {
|
3196
|
+
const network = yield getNetwork();
|
3197
|
+
return btcRpcUrls[network];
|
3198
|
+
});
|
3199
|
+
}
|
3200
|
+
function getConfig(isDev) {
|
3201
|
+
return __async(this, null, function* () {
|
3202
|
+
const network = yield getNetwork();
|
3203
|
+
return walletConfig[isDev ? "dev" : network];
|
3204
|
+
});
|
3205
|
+
}
|
3206
|
+
function nearCall(contractId, methodName, args) {
|
3207
|
+
return __async(this, null, function* () {
|
3208
|
+
const network = yield getNetwork();
|
3209
|
+
return nearCallFunction(contractId, methodName, args, { network });
|
3210
|
+
});
|
3211
|
+
}
|
3212
|
+
function getAccountInfo(csna, accountContractId) {
|
3213
|
+
return __async(this, null, function* () {
|
3214
|
+
const accountInfo = yield nearCall(accountContractId, "get_account", { account_id: csna });
|
3215
|
+
return accountInfo;
|
3216
|
+
});
|
3217
|
+
}
|
3218
|
+
function checkGasTokenArrears(debtInfo, isDev, autoDeposit) {
|
3219
|
+
return __async(this, null, function* () {
|
3220
|
+
if (!debtInfo)
|
3221
|
+
return;
|
3222
|
+
const config = yield getConfig(isDev);
|
3223
|
+
const transferAmount = debtInfo.transfer_amount;
|
3224
|
+
console.log("get_account debtInfo:", debtInfo);
|
3225
|
+
const action = {
|
3226
|
+
receiver_id: config.accountContractId,
|
3227
|
+
amount: transferAmount,
|
3228
|
+
msg: JSON.stringify("Deposit")
|
3229
|
+
};
|
3230
|
+
if (!autoDeposit)
|
3231
|
+
return action;
|
3232
|
+
const confirmed = yield Dialog.confirm({
|
3233
|
+
title: "Has gas token arrears",
|
3234
|
+
message: "You have gas token arrears, please deposit gas token to continue."
|
3235
|
+
});
|
3236
|
+
if (confirmed) {
|
3237
|
+
yield executeBTCDepositAndAction({ action, isDev });
|
3238
|
+
yield Dialog.alert({
|
3239
|
+
title: "Deposit success",
|
3240
|
+
message: "Deposit success, will continue to execute transaction."
|
3241
|
+
});
|
3242
|
+
} else {
|
3243
|
+
throw new Error("Deposit failed, please deposit gas token first.");
|
3244
|
+
}
|
3245
|
+
});
|
3246
|
+
}
|
3247
|
+
function getBtcGasPrice() {
|
3248
|
+
return __async(this, null, function* () {
|
3249
|
+
const network = yield getNetwork();
|
3250
|
+
const defaultFeeRate = network === "mainnet" ? 5 : 2500;
|
3251
|
+
try {
|
3252
|
+
const btcRpcUrl = yield getBtcRpcUrl();
|
3253
|
+
const res = yield fetch(`${btcRpcUrl}/v1/fees/recommended`).then((res2) => res2.json());
|
3254
|
+
const feeRate = res.fastestFee;
|
3255
|
+
return feeRate || defaultFeeRate;
|
3256
|
+
} catch (error) {
|
3257
|
+
return defaultFeeRate;
|
3258
|
+
}
|
3259
|
+
});
|
3260
|
+
}
|
3261
|
+
function getBtcBalance() {
|
3262
|
+
return __async(this, null, function* () {
|
3263
|
+
const { account } = yield retryOperation(getBtcProvider, (res) => !!res.account);
|
3264
|
+
if (!account) {
|
3265
|
+
console.error("BTC Account is not available.");
|
3266
|
+
return { rawBalance: 0, balance: 0, maxSpendableBalance: 0 };
|
3267
|
+
}
|
3268
|
+
const btcRpcUrl = yield getBtcRpcUrl();
|
3269
|
+
const utxos = yield fetch(`${btcRpcUrl}/address/${account}/utxo`).then((res) => res.json());
|
3270
|
+
const rawBalance = (utxos == null ? void 0 : utxos.reduce((acc, cur) => acc + cur.value, 0)) || 0;
|
3271
|
+
const balance = rawBalance / __pow(10, 8);
|
3272
|
+
const feeRate = yield getBtcGasPrice();
|
3273
|
+
const inputSize = ((utxos == null ? void 0 : utxos.length) || 0) * 66;
|
3274
|
+
const outputSize = 34;
|
3275
|
+
const overheadSize = 10;
|
3276
|
+
const estimatedTxSize = inputSize + outputSize + overheadSize;
|
3277
|
+
const estimatedFee = estimatedTxSize * feeRate / __pow(10, 8);
|
3278
|
+
console.log("estimated fee:", estimatedFee);
|
3279
|
+
const availableBalance = Math.max(0, balance - estimatedFee);
|
3280
|
+
return {
|
3281
|
+
rawBalance,
|
3282
|
+
balance,
|
3283
|
+
availableBalance
|
3284
|
+
};
|
3285
|
+
});
|
3286
|
+
}
|
3287
|
+
function sendBitcoin(address, amount, feeRate) {
|
3288
|
+
return __async(this, null, function* () {
|
3289
|
+
const { sendBitcoin: sendBitcoin2 } = getBtcProvider();
|
3290
|
+
const txHash = yield sendBitcoin2(address, amount, { feeRate });
|
3291
|
+
return txHash;
|
3292
|
+
});
|
3293
|
+
}
|
3294
|
+
var MINIMUM_DEPOSIT_AMOUNT = 5e3;
|
3295
|
+
var MINIMUM_DEPOSIT_AMOUNT_BASE = 1e3;
|
3296
|
+
function estimateDepositAmount(amount, option) {
|
3297
|
+
return __async(this, null, function* () {
|
3298
|
+
const { receiveAmount } = yield getDepositAmount(amount, __spreadProps(__spreadValues({}, option), { isEstimate: true }));
|
3299
|
+
return receiveAmount;
|
3300
|
+
});
|
3301
|
+
}
|
3302
|
+
function getDepositAmount(amount, option) {
|
3303
|
+
return __async(this, null, function* () {
|
3304
|
+
const config = yield getConfig((option == null ? void 0 : option.isDev) || false);
|
3305
|
+
const {
|
3306
|
+
deposit_bridge_fee: { fee_min, fee_rate }
|
3307
|
+
} = yield nearCall(
|
3308
|
+
config.bridgeContractId,
|
3309
|
+
"get_config",
|
3310
|
+
{}
|
3311
|
+
);
|
3312
|
+
const depositAmount = (option == null ? void 0 : option.isEstimate) ? Number(amount) : Math.max(MINIMUM_DEPOSIT_AMOUNT + MINIMUM_DEPOSIT_AMOUNT_BASE, Number(amount));
|
3313
|
+
const fee = Math.max(Number(fee_min), Number(depositAmount) * fee_rate);
|
3314
|
+
const receiveAmount = new import_big.default(depositAmount).minus(fee).round(0, import_big.default.roundDown).toNumber();
|
3315
|
+
return {
|
3316
|
+
depositAmount,
|
3317
|
+
receiveAmount: Math.max(receiveAmount, 0),
|
3318
|
+
fee
|
3319
|
+
};
|
3320
|
+
});
|
3321
|
+
}
|
3322
|
+
function executeBTCDepositAndAction(_0) {
|
3323
|
+
return __async(this, arguments, function* ({
|
3324
|
+
action,
|
3325
|
+
amount,
|
3326
|
+
feeRate,
|
3327
|
+
fixedAmount = true,
|
3328
|
+
isDev = false
|
3329
|
+
}) {
|
3330
|
+
var _a;
|
3331
|
+
try {
|
3332
|
+
const { getPublicKey } = getBtcProvider();
|
3333
|
+
const config = yield getConfig(isDev);
|
3334
|
+
const btcPublicKey = yield getPublicKey();
|
3335
|
+
if (!btcPublicKey) {
|
3336
|
+
throw new Error("BTC Public Key is not available.");
|
3337
|
+
}
|
3338
|
+
if (!amount && !action) {
|
3339
|
+
throw new Error("amount or action is required");
|
3340
|
+
}
|
3341
|
+
const csna = yield nearCall(
|
3342
|
+
config.accountContractId,
|
3343
|
+
"get_chain_signature_near_account_id",
|
3344
|
+
{
|
3345
|
+
btc_public_key: btcPublicKey
|
3346
|
+
}
|
3347
|
+
);
|
3348
|
+
const rawDepositAmount = (_a = action ? action.amount : amount) != null ? _a : "0";
|
3349
|
+
if (new import_big.default(rawDepositAmount).lt(0)) {
|
3350
|
+
throw new Error("amount must be greater than 0");
|
3351
|
+
}
|
3352
|
+
const { depositAmount, receiveAmount } = yield getDepositAmount(rawDepositAmount, {
|
3353
|
+
isDev
|
3354
|
+
});
|
3355
|
+
const accountInfo = yield getAccountInfo(csna, config.accountContractId);
|
3356
|
+
const newActions = [];
|
3357
|
+
const gasLimit = new import_big.default(50).mul(__pow(10, 12)).toFixed(0);
|
3358
|
+
const repayAction = yield checkGasTokenArrears(accountInfo.debt_info, isDev, false);
|
3359
|
+
if (repayAction) {
|
3360
|
+
newActions.push(__spreadProps(__spreadValues({}, repayAction), {
|
3361
|
+
gas: gasLimit
|
3362
|
+
}));
|
3363
|
+
}
|
3364
|
+
if (action) {
|
3365
|
+
newActions.push(__spreadProps(__spreadValues({}, action), {
|
3366
|
+
amount: (repayAction == null ? void 0 : repayAction.amount) && !fixedAmount ? new import_big.default(receiveAmount).minus(repayAction.amount).toString() : receiveAmount.toString(),
|
3367
|
+
gas: gasLimit
|
3368
|
+
}));
|
3369
|
+
}
|
3370
|
+
const depositMsg = {
|
3371
|
+
recipient_id: csna,
|
3372
|
+
post_actions: newActions.length > 0 ? newActions : void 0
|
3373
|
+
};
|
3374
|
+
const storageDepositMsg = {};
|
3375
|
+
if (!(accountInfo == null ? void 0 : accountInfo.nonce)) {
|
3376
|
+
storageDepositMsg.btc_public_key = btcPublicKey;
|
3377
|
+
}
|
3378
|
+
const registerRes = yield nearCall((action == null ? void 0 : action.receiver_id) || config.token, "storage_balance_of", {
|
3379
|
+
account_id: csna
|
3380
|
+
});
|
3381
|
+
if (!(registerRes == null ? void 0 : registerRes.available)) {
|
3382
|
+
storageDepositMsg.storage_deposit_msg = {
|
3383
|
+
contract_id: (action == null ? void 0 : action.receiver_id) || config.token,
|
3384
|
+
deposit: new import_big.default(0.25).mul(__pow(10, 24)).toFixed(0),
|
3385
|
+
registration_only: true
|
3386
|
+
};
|
3387
|
+
}
|
3388
|
+
if (Object.keys(storageDepositMsg).length > 0) {
|
3389
|
+
depositMsg.extra_msg = JSON.stringify(storageDepositMsg);
|
3390
|
+
}
|
3391
|
+
console.log("get_user_deposit_address params:", { deposit_msg: depositMsg });
|
3392
|
+
const userDepositAddress = yield nearCall(
|
3393
|
+
config.bridgeContractId,
|
3394
|
+
"get_user_deposit_address",
|
3395
|
+
{ deposit_msg: depositMsg }
|
3396
|
+
);
|
3397
|
+
const _feeRate = feeRate || (yield getBtcGasPrice());
|
3398
|
+
const sendAmount = (repayAction == null ? void 0 : repayAction.amount) && fixedAmount ? new import_big.default(depositAmount).plus((repayAction == null ? void 0 : repayAction.amount) || 0).toString() : depositAmount;
|
3399
|
+
console.log("user deposit address:", userDepositAddress);
|
3400
|
+
console.log("send amount:", sendAmount);
|
3401
|
+
console.log("fee rate:", _feeRate);
|
3402
|
+
const txHash = yield sendBitcoin(userDepositAddress, Number(sendAmount), _feeRate);
|
3403
|
+
const postActionsStr = newActions.length > 0 ? JSON.stringify(newActions) : void 0;
|
3404
|
+
yield receiveDepositMsg(config.base_url, {
|
3405
|
+
btcPublicKey,
|
3406
|
+
txHash,
|
3407
|
+
depositType: postActionsStr || depositMsg.extra_msg ? 1 : 0,
|
3408
|
+
postActions: postActionsStr,
|
3409
|
+
extraMsg: depositMsg.extra_msg
|
3410
|
+
});
|
3411
|
+
const checkTransactionStatusRes = yield checkBridgeTransactionStatus(config.base_url, txHash);
|
3412
|
+
console.log("checkBridgeTransactionStatus resp:", checkTransactionStatusRes);
|
3413
|
+
const network = yield getNetwork();
|
3414
|
+
const result = yield pollTransactionStatuses(network, [checkTransactionStatusRes.ToTxHash]);
|
3415
|
+
return result;
|
3416
|
+
} catch (error) {
|
3417
|
+
console.error("executeBTCDepositAndAction error:", error);
|
3418
|
+
throw error;
|
3419
|
+
}
|
3420
|
+
});
|
3421
|
+
}
|
3422
|
+
|
3363
3423
|
// src/core/setupBTCWallet.ts
|
3364
3424
|
var { transfer, functionCall } = import_transactions.actionCreators;
|
3365
3425
|
var state = {
|
@@ -3563,8 +3623,8 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
|
3563
3623
|
return __async(this, null, function* () {
|
3564
3624
|
const btcContext = window.btcContext;
|
3565
3625
|
const accountId = state.getAccount();
|
3566
|
-
const accountInfo = yield getAccountInfo();
|
3567
|
-
yield checkGasTokenArrears(accountInfo.debt_info);
|
3626
|
+
const accountInfo = yield getAccountInfo(accountId, currentConfig.accountContractId);
|
3627
|
+
yield checkGasTokenArrears(accountInfo.debt_info, isDev, true);
|
3568
3628
|
const trans = [...params.transactions];
|
3569
3629
|
console.log("raw trans:", trans);
|
3570
3630
|
const gasTokenBalance = accountInfo.gas_token[currentConfig.token] || "0";
|
@@ -3607,39 +3667,6 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
|
3607
3667
|
return result;
|
3608
3668
|
});
|
3609
3669
|
}
|
3610
|
-
function checkGasTokenArrears(debtInfo) {
|
3611
|
-
return __async(this, null, function* () {
|
3612
|
-
const transferAmount = (debtInfo == null ? void 0 : debtInfo.transfer_amount) || "0";
|
3613
|
-
console.log("get_account debtInfo:", debtInfo);
|
3614
|
-
if (transferAmount === "0")
|
3615
|
-
return;
|
3616
|
-
const confirmed = yield Dialog.confirm({
|
3617
|
-
title: "Has gas token arrears",
|
3618
|
-
message: "You have gas token arrears, please deposit gas token to continue."
|
3619
|
-
});
|
3620
|
-
if (confirmed) {
|
3621
|
-
const action = {
|
3622
|
-
receiver_id: currentConfig.token,
|
3623
|
-
amount: transferAmount,
|
3624
|
-
msg: JSON.stringify("Deposit")
|
3625
|
-
};
|
3626
|
-
yield executeBTCDepositAndAction({ action, isDev });
|
3627
|
-
yield Dialog.alert({
|
3628
|
-
title: "Deposit success",
|
3629
|
-
message: "Deposit success, will continue to execute transaction."
|
3630
|
-
});
|
3631
|
-
} else {
|
3632
|
-
throw new Error("Deposit failed, please deposit gas token first.");
|
3633
|
-
}
|
3634
|
-
});
|
3635
|
-
}
|
3636
|
-
function getAccountInfo() {
|
3637
|
-
return __async(this, null, function* () {
|
3638
|
-
const accountId = state.getAccount();
|
3639
|
-
const accountInfo = yield nearCall2(currentConfig.accountContractId, "get_account", { account_id: accountId });
|
3640
|
-
return accountInfo;
|
3641
|
-
});
|
3642
|
-
}
|
3643
3670
|
function createGasTokenTransfer(accountId, amount) {
|
3644
3671
|
return __async(this, null, function* () {
|
3645
3672
|
return {
|
@@ -3707,6 +3734,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
|
3707
3734
|
transactions2.map((transaction, index) => convertTransactionToTxHex(transaction, index))
|
3708
3735
|
);
|
3709
3736
|
if (availableBalance > 0.2) {
|
3737
|
+
console.log("near balance is enough, get the protocol fee of each transaction");
|
3710
3738
|
const gasTokens = yield nearCall2(
|
3711
3739
|
currentConfig.accountContractId,
|
3712
3740
|
"list_gas_token",
|
@@ -3855,7 +3883,7 @@ function setupBTCWallet({
|
|
3855
3883
|
|
3856
3884
|
// src/index.ts
|
3857
3885
|
var getVersion = () => {
|
3858
|
-
return "0.3.
|
3886
|
+
return "0.3.14";
|
3859
3887
|
};
|
3860
3888
|
if (typeof window !== "undefined") {
|
3861
3889
|
window.__PARTICLE_BTC_CONNECT_VERSION = getVersion();
|