btc-wallet 0.3.12 → 0.3.13
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/config.d.ts +0 -1
- package/dist/core/btcUtils.d.ts +31 -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,19 @@
|
|
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
|
+
export declare function checkGasTokenArrears(debtInfo: DebtInfo, isDev: boolean, autoDeposit?: boolean): Promise<{
|
13
|
+
receiver_id: string;
|
14
|
+
amount: string;
|
15
|
+
msg: string;
|
16
|
+
} | undefined>;
|
1
17
|
export declare function getBtcGasPrice(): Promise<number>;
|
2
18
|
export declare function getBtcBalance(): Promise<{
|
3
19
|
rawBalance: number;
|
@@ -12,18 +28,29 @@ export declare function getBtcBalance(): Promise<{
|
|
12
28
|
}>;
|
13
29
|
export declare function sendBitcoin(address: string, amount: number, feeRate: number): Promise<string>;
|
14
30
|
export declare function estimateDepositAmount(amount: string, option?: {
|
15
|
-
isDev
|
16
|
-
}): Promise<
|
31
|
+
isDev?: boolean;
|
32
|
+
}): Promise<number>;
|
33
|
+
export declare function getDepositAmount(amount: string, option?: {
|
34
|
+
isEstimate?: boolean;
|
35
|
+
isDev?: boolean;
|
36
|
+
}): Promise<{
|
37
|
+
depositAmount: number;
|
38
|
+
receiveAmount: number;
|
39
|
+
fee: number;
|
40
|
+
}>;
|
17
41
|
interface ExecuteBTCDepositAndActionParams {
|
18
|
-
action
|
42
|
+
action?: {
|
19
43
|
receiver_id: string;
|
20
44
|
amount: string;
|
21
45
|
msg: string;
|
22
46
|
};
|
47
|
+
amount?: string;
|
23
48
|
/** fee rate, if not provided, will use the recommended fee rate from the btc node */
|
24
49
|
feeRate?: number;
|
50
|
+
/** fixed amount, if true, in arrears mode, amount is fixed, otherwise it is depositAmount-repayAction.amount */
|
51
|
+
fixedAmount?: boolean;
|
25
52
|
/** is dev environment */
|
26
53
|
isDev?: boolean;
|
27
54
|
}
|
28
|
-
export declare function executeBTCDepositAndAction({ action, feeRate, isDev, }: ExecuteBTCDepositAndActionParams): Promise<any[]>;
|
55
|
+
export declare function executeBTCDepositAndAction({ action, amount, feeRate, fixedAmount, isDev, }: ExecuteBTCDepositAndActionParams): Promise<any[]>;
|
29
56
|
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
|
+
const config = yield getConfig(isDev);
|
3221
|
+
const transferAmount = debtInfo.transfer_amount || "0";
|
3222
|
+
console.log("get_account debtInfo:", debtInfo);
|
3223
|
+
if (transferAmount === "0")
|
3224
|
+
return;
|
3225
|
+
const action = {
|
3226
|
+
receiver_id: config.token,
|
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 } = 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);
|
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(depositAmount).minus(repayAction.amount).toString() : depositAmount.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.13";
|
3859
3887
|
};
|
3860
3888
|
if (typeof window !== "undefined") {
|
3861
3889
|
window.__PARTICLE_BTC_CONNECT_VERSION = getVersion();
|