btc-wallet 0.3.3 → 0.3.5
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/core/btcUtils.d.ts +16 -0
- package/dist/core/btcWalletSelectorContext.d.ts +3 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.js +182 -118
- package/dist/index.js.map +4 -4
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/request.d.ts +1 -1
- package/esm/index.js +180 -116
- package/esm/index.js.map +4 -4
- package/package.json +1 -1
- package/dist/core/bridgeSupplyUtils.d.ts +0 -10
package/dist/utils/index.d.ts
CHANGED
@@ -5,3 +5,7 @@ export declare const defaultTokenIcon = "https://static.particle.network/token-l
|
|
5
5
|
export declare const ipfsToSrc: (ipfs: string) => string;
|
6
6
|
export declare const checkBTCVersion: (accountContracts: AAOptions["accountContracts"], accountContractKey: string, version: string) => boolean;
|
7
7
|
export declare const delay: (ms: number) => Promise<unknown>;
|
8
|
+
export declare function retryOperation<T>(operation: () => Promise<T> | T, shouldStop: (result: T) => boolean, { maxRetries, delayMs, }?: {
|
9
|
+
maxRetries?: number;
|
10
|
+
delayMs?: number;
|
11
|
+
}): Promise<T>;
|
package/dist/utils/request.d.ts
CHANGED
@@ -7,5 +7,5 @@ interface RequestOptions<T> extends RequestInit {
|
|
7
7
|
maxPollingAttempts?: number;
|
8
8
|
shouldStopPolling?: (response: T) => boolean;
|
9
9
|
}
|
10
|
-
export default function request<T>(url: string, options?: RequestOptions<T>): Promise<T>;
|
10
|
+
export default function request<T = any>(url: string, options?: RequestOptions<T>): Promise<T>;
|
11
11
|
export {};
|
package/esm/index.js
CHANGED
@@ -270,7 +270,7 @@ var _network, _event;
|
|
270
270
|
var XverseConnector = class extends BaseConnector {
|
271
271
|
constructor() {
|
272
272
|
super();
|
273
|
-
__privateAdd(this, _network, "
|
273
|
+
__privateAdd(this, _network, "Testnet");
|
274
274
|
__privateAdd(this, _event, new EventEmitter());
|
275
275
|
this.metadata = {
|
276
276
|
id: "xverse",
|
@@ -690,7 +690,16 @@ var useAccounts = () => {
|
|
690
690
|
// src/hooks/useBTCProvider.ts
|
691
691
|
import { useCallback } from "react";
|
692
692
|
var useBTCProvider = () => {
|
693
|
-
const {
|
693
|
+
const {
|
694
|
+
connector,
|
695
|
+
provider,
|
696
|
+
accounts,
|
697
|
+
getPublicKey,
|
698
|
+
signMessage,
|
699
|
+
getNetwork: getNetwork2,
|
700
|
+
switchNetwork,
|
701
|
+
sendBitcoin: sendBitcoin2
|
702
|
+
} = useConnectProvider();
|
694
703
|
const sendInscription = useCallback(
|
695
704
|
(address, inscriptionId, options) => __async(void 0, null, function* () {
|
696
705
|
if (!connector) {
|
@@ -701,7 +710,17 @@ var useBTCProvider = () => {
|
|
701
710
|
}),
|
702
711
|
[connector]
|
703
712
|
);
|
704
|
-
return {
|
713
|
+
return {
|
714
|
+
provider,
|
715
|
+
accounts,
|
716
|
+
getPublicKey,
|
717
|
+
signMessage,
|
718
|
+
getNetwork: getNetwork2,
|
719
|
+
switchNetwork,
|
720
|
+
sendBitcoin: sendBitcoin2,
|
721
|
+
sendInscription,
|
722
|
+
connector
|
723
|
+
};
|
705
724
|
};
|
706
725
|
|
707
726
|
// src/hooks/useConnectModal.ts
|
@@ -1290,6 +1309,27 @@ var checkBTCVersion = (accountContracts, accountContractKey, version) => {
|
|
1290
1309
|
return accountContracts[accountContractKey].some((item) => item.version === version);
|
1291
1310
|
};
|
1292
1311
|
var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
1312
|
+
function retryOperation(_0, _1) {
|
1313
|
+
return __async(this, arguments, function* (operation, shouldStop, {
|
1314
|
+
maxRetries = 3,
|
1315
|
+
delayMs = 1e3
|
1316
|
+
} = {}) {
|
1317
|
+
let retries = 0;
|
1318
|
+
while (retries <= maxRetries) {
|
1319
|
+
const result = yield operation();
|
1320
|
+
if (shouldStop(result)) {
|
1321
|
+
return result;
|
1322
|
+
}
|
1323
|
+
if (retries === maxRetries) {
|
1324
|
+
console.warn("Max retries reached");
|
1325
|
+
return result;
|
1326
|
+
}
|
1327
|
+
retries++;
|
1328
|
+
yield delay(delayMs);
|
1329
|
+
}
|
1330
|
+
throw new Error("Unexpected execution path");
|
1331
|
+
});
|
1332
|
+
}
|
1293
1333
|
|
1294
1334
|
// src/utils/ethereumUtils.ts
|
1295
1335
|
import {
|
@@ -2069,7 +2109,7 @@ var ConnectProvider = ({
|
|
2069
2109
|
}),
|
2070
2110
|
[connector]
|
2071
2111
|
);
|
2072
|
-
const
|
2112
|
+
const getNetwork2 = useCallback7(() => __async(void 0, null, function* () {
|
2073
2113
|
if (!connector) {
|
2074
2114
|
throw new Error("Wallet not connected!");
|
2075
2115
|
}
|
@@ -2253,7 +2293,7 @@ var ConnectProvider = ({
|
|
2253
2293
|
signMessage,
|
2254
2294
|
evmAccount,
|
2255
2295
|
smartAccount,
|
2256
|
-
getNetwork,
|
2296
|
+
getNetwork: getNetwork2,
|
2257
2297
|
switchNetwork,
|
2258
2298
|
sendBitcoin: sendBitcoin2,
|
2259
2299
|
accountContract,
|
@@ -2407,21 +2447,18 @@ function InitBtcWalletSelectorContext() {
|
|
2407
2447
|
}
|
2408
2448
|
function useBtcWalletSelector() {
|
2409
2449
|
const { openConnectModal, openConnectModalAsync, disconnect, requestDirectAccount } = useConnectModal();
|
2410
|
-
const { accounts, sendBitcoin: sendBitcoin2, getPublicKey, provider, signMessage, connector } = useBTCProvider();
|
2450
|
+
const { accounts, sendBitcoin: sendBitcoin2, getPublicKey, provider, signMessage, connector, getNetwork: getNetwork2 } = useBTCProvider();
|
2411
2451
|
const publicKey = useRef(null);
|
2412
2452
|
const signMessageFn = useRef(null);
|
2413
2453
|
const connectorRef = useRef(null);
|
2414
|
-
const providerRef = useRef(null);
|
2415
|
-
const [updater, setUpdater] = useState8(1);
|
2416
2454
|
const context = useContext2(WalletSelectorContext);
|
2417
2455
|
useEffect6(() => {
|
2418
2456
|
if (provider) {
|
2419
2457
|
getPublicKey().then((res) => {
|
2420
2458
|
publicKey.current = res;
|
2421
2459
|
});
|
2422
|
-
providerRef.current = provider;
|
2423
2460
|
}
|
2424
|
-
}, [provider
|
2461
|
+
}, [provider]);
|
2425
2462
|
useEffect6(() => {
|
2426
2463
|
signMessageFn.current = signMessage;
|
2427
2464
|
}, [signMessage]);
|
@@ -2444,67 +2481,53 @@ function useBtcWalletSelector() {
|
|
2444
2481
|
}
|
2445
2482
|
};
|
2446
2483
|
}, [connector]);
|
2447
|
-
|
2448
|
-
|
2449
|
-
|
2450
|
-
|
2451
|
-
|
2452
|
-
|
2453
|
-
setUpdater(updater + 1);
|
2454
|
-
if (openConnectModal) {
|
2455
|
-
yield openConnectModal();
|
2456
|
-
}
|
2457
|
-
return null;
|
2458
|
-
}),
|
2459
|
-
autoConnect: () => __async(this, null, function* () {
|
2460
|
-
let times = 0;
|
2461
|
-
while (!connectorRef.current) {
|
2462
|
-
yield delay(500);
|
2463
|
-
if (times++ > 10) {
|
2464
|
-
return null;
|
2465
|
-
}
|
2466
|
-
}
|
2467
|
-
requestDirectAccount(connectorRef.current).catch((e) => {
|
2468
|
-
context.emit("btcLoginError");
|
2469
|
-
});
|
2470
|
-
}),
|
2471
|
-
logout: () => {
|
2472
|
-
const accountId = accounts && accounts.length ? accounts[0] : null;
|
2473
|
-
if (!accountId)
|
2474
|
-
return;
|
2475
|
-
disconnect == null ? void 0 : disconnect();
|
2476
|
-
context.emit("btcLogOut");
|
2477
|
-
},
|
2478
|
-
account: accounts && accounts.length ? accounts[0] : null,
|
2479
|
-
getPublicKey: () => __async(this, null, function* () {
|
2480
|
-
let times = 0;
|
2481
|
-
while (!publicKey.current) {
|
2482
|
-
yield delay(1e3);
|
2483
|
-
if (times++ > 10) {
|
2484
|
-
return null;
|
2484
|
+
const hook = useMemo6(() => {
|
2485
|
+
return {
|
2486
|
+
login: () => __async(this, null, function* () {
|
2487
|
+
const account = accounts && accounts.length ? accounts[0] : null;
|
2488
|
+
if (account) {
|
2489
|
+
return account;
|
2485
2490
|
}
|
2486
|
-
|
2487
|
-
|
2488
|
-
}),
|
2489
|
-
signMessage: (msg) => {
|
2490
|
-
return signMessageFn.current(msg);
|
2491
|
-
},
|
2492
|
-
getContext: () => {
|
2493
|
-
return context;
|
2494
|
-
},
|
2495
|
-
getBalance: () => __async(this, null, function* () {
|
2496
|
-
let times = 0;
|
2497
|
-
while (!providerRef.current) {
|
2498
|
-
yield delay(500);
|
2499
|
-
if (times++ > 10) {
|
2500
|
-
return null;
|
2491
|
+
if (openConnectModal) {
|
2492
|
+
yield openConnectModal();
|
2501
2493
|
}
|
2502
|
-
|
2503
|
-
|
2504
|
-
|
2505
|
-
|
2506
|
-
|
2507
|
-
|
2494
|
+
return null;
|
2495
|
+
}),
|
2496
|
+
autoConnect: () => __async(this, null, function* () {
|
2497
|
+
requestDirectAccount(connectorRef.current).catch((e) => {
|
2498
|
+
context.emit("btcLoginError");
|
2499
|
+
});
|
2500
|
+
}),
|
2501
|
+
logout: () => {
|
2502
|
+
const accountId = accounts && accounts.length ? accounts[0] : null;
|
2503
|
+
if (!accountId)
|
2504
|
+
return;
|
2505
|
+
disconnect == null ? void 0 : disconnect();
|
2506
|
+
context.emit("btcLogOut");
|
2507
|
+
},
|
2508
|
+
account: accounts && accounts.length ? accounts[0] : null,
|
2509
|
+
getPublicKey: () => {
|
2510
|
+
return publicKey.current;
|
2511
|
+
},
|
2512
|
+
signMessage: (msg) => {
|
2513
|
+
return signMessageFn.current(msg);
|
2514
|
+
},
|
2515
|
+
getContext: () => {
|
2516
|
+
return context;
|
2517
|
+
},
|
2518
|
+
getNetwork: getNetwork2,
|
2519
|
+
sendBitcoin: sendBitcoin2
|
2520
|
+
};
|
2521
|
+
}, [
|
2522
|
+
accounts,
|
2523
|
+
context,
|
2524
|
+
disconnect,
|
2525
|
+
getNetwork2,
|
2526
|
+
openConnectModal,
|
2527
|
+
requestDirectAccount,
|
2528
|
+
sendBitcoin2
|
2529
|
+
]);
|
2530
|
+
return hook;
|
2508
2531
|
}
|
2509
2532
|
|
2510
2533
|
// src/core/setupBTCWallet.ts
|
@@ -2910,8 +2933,15 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
|
2910
2933
|
}
|
2911
2934
|
];
|
2912
2935
|
}
|
2913
|
-
|
2914
|
-
const btcPublicKey = yield btcContext.getPublicKey()
|
2936
|
+
yield btcContext.login();
|
2937
|
+
const btcPublicKey = yield retryOperation(btcContext.getPublicKey, (res) => !!res, {
|
2938
|
+
maxRetries: 40,
|
2939
|
+
delayMs: 3e3
|
2940
|
+
});
|
2941
|
+
console.log("btcPublicKey:", btcPublicKey);
|
2942
|
+
if (!btcPublicKey) {
|
2943
|
+
throw new Error("No connected BTC wallet, please connect your BTC wallet first.");
|
2944
|
+
}
|
2915
2945
|
const { nearTempAddress, nearTempPublicKey } = yield getNearAccountByBtcPublicKey(btcPublicKey);
|
2916
2946
|
return [
|
2917
2947
|
{
|
@@ -3146,11 +3176,31 @@ function pollTransactionStatuses(network, hashes) {
|
|
3146
3176
|
});
|
3147
3177
|
}
|
3148
3178
|
|
3149
|
-
// src/core/
|
3179
|
+
// src/core/btcUtils.ts
|
3150
3180
|
import { providers as providers2 } from "near-api-js";
|
3151
3181
|
import Big from "big.js";
|
3152
|
-
function
|
3182
|
+
function getBtcProvider() {
|
3183
|
+
if (typeof window === "undefined" || !window.btcContext) {
|
3184
|
+
throw new Error("BTC Provider is not initialized.");
|
3185
|
+
}
|
3186
|
+
return window.btcContext;
|
3187
|
+
}
|
3188
|
+
function getNetwork() {
|
3153
3189
|
return __async(this, null, function* () {
|
3190
|
+
const network = yield getBtcProvider().getNetwork();
|
3191
|
+
console.log("btc network:", network);
|
3192
|
+
return network === "livenet" ? "mainnet" : "testnet";
|
3193
|
+
});
|
3194
|
+
}
|
3195
|
+
function getBtcRpcUrl() {
|
3196
|
+
return __async(this, null, function* () {
|
3197
|
+
const network = yield getNetwork();
|
3198
|
+
return btcRpcUrls[network];
|
3199
|
+
});
|
3200
|
+
}
|
3201
|
+
function nearViewMethod(contractId, methodName, args) {
|
3202
|
+
return __async(this, null, function* () {
|
3203
|
+
const network = yield getNetwork();
|
3154
3204
|
const nearProvider = new providers2.FailoverRpcProvider(
|
3155
3205
|
nearRpcUrls[network].map(
|
3156
3206
|
(url) => new providers2.JsonRpcProvider({ url })
|
@@ -3166,41 +3216,16 @@ function nearViewMethod(contractId, methodName, args, network) {
|
|
3166
3216
|
return JSON.parse(Buffer.from(res.result).toString());
|
3167
3217
|
});
|
3168
3218
|
}
|
3169
|
-
function getDepositAddress(btcPublicKey, contractId
|
3219
|
+
function getDepositAddress(btcPublicKey, contractId) {
|
3170
3220
|
return __async(this, null, function* () {
|
3171
|
-
const res = yield nearViewMethod(
|
3172
|
-
|
3173
|
-
|
3174
|
-
|
3175
|
-
|
3176
|
-
BtcPublicKey: { btc_public_key: btcPublicKey, dapp_operation: "Burrowland->Supply" }
|
3177
|
-
}
|
3178
|
-
},
|
3179
|
-
network
|
3180
|
-
);
|
3221
|
+
const res = yield nearViewMethod(contractId, "get_user_dapp_deposit_address", {
|
3222
|
+
deposit_type: {
|
3223
|
+
BtcPublicKey: { btc_public_key: btcPublicKey, dapp_operation: "Burrowland->Supply" }
|
3224
|
+
}
|
3225
|
+
});
|
3181
3226
|
return res;
|
3182
3227
|
});
|
3183
3228
|
}
|
3184
|
-
function getGasPrice(network) {
|
3185
|
-
return __async(this, null, function* () {
|
3186
|
-
const defaultFeeRate = 100;
|
3187
|
-
try {
|
3188
|
-
const btcRpcUrl = btcRpcUrls[network];
|
3189
|
-
const res = yield fetch(`${btcRpcUrl}/v1/fees/recommended`).then((res2) => res2.json());
|
3190
|
-
const feeRate = res.fastestFee;
|
3191
|
-
return feeRate || defaultFeeRate;
|
3192
|
-
} catch (error) {
|
3193
|
-
return defaultFeeRate;
|
3194
|
-
}
|
3195
|
-
});
|
3196
|
-
}
|
3197
|
-
function sendBitcoin(btcProvider, address, amount, feeRate) {
|
3198
|
-
return __async(this, null, function* () {
|
3199
|
-
const satoshis = new Big(amount).mul(__pow(10, 8)).toNumber();
|
3200
|
-
const txHash = yield btcProvider.sendBitcoin(address, satoshis, { feeRate });
|
3201
|
-
return txHash;
|
3202
|
-
});
|
3203
|
-
}
|
3204
3229
|
function receiveDepositMsg(_0, _1) {
|
3205
3230
|
return __async(this, arguments, function* (baseUrl, {
|
3206
3231
|
btcPublicKey,
|
@@ -3225,27 +3250,63 @@ function checkTransactionStatus(baseUrl, txHash) {
|
|
3225
3250
|
return res;
|
3226
3251
|
});
|
3227
3252
|
}
|
3253
|
+
function getBtcGasPrice() {
|
3254
|
+
return __async(this, null, function* () {
|
3255
|
+
const defaultFeeRate = 100;
|
3256
|
+
try {
|
3257
|
+
const btcRpcUrl = yield getBtcRpcUrl();
|
3258
|
+
const res = yield fetch(`${btcRpcUrl}/v1/fees/recommended`).then((res2) => res2.json());
|
3259
|
+
const feeRate = res.fastestFee;
|
3260
|
+
return feeRate || defaultFeeRate;
|
3261
|
+
} catch (error) {
|
3262
|
+
return defaultFeeRate;
|
3263
|
+
}
|
3264
|
+
});
|
3265
|
+
}
|
3266
|
+
function getBtcBalance() {
|
3267
|
+
return __async(this, null, function* () {
|
3268
|
+
var _a;
|
3269
|
+
const { account } = yield retryOperation(getBtcProvider, (res2) => !!res2.account);
|
3270
|
+
if (!account) {
|
3271
|
+
console.error("BTC Account is not available.");
|
3272
|
+
return { rawBalance: 0, balance: 0 };
|
3273
|
+
}
|
3274
|
+
const btcRpcUrl = yield getBtcRpcUrl();
|
3275
|
+
const res = yield fetch(`${btcRpcUrl}/address/${account}/utxo`).then((res2) => res2.json());
|
3276
|
+
const rawBalance = (_a = res.filter((item) => {
|
3277
|
+
var _a2;
|
3278
|
+
return (_a2 = item == null ? void 0 : item.status) == null ? void 0 : _a2.confirmed;
|
3279
|
+
})) == null ? void 0 : _a.reduce((acc, cur) => acc + cur.value, 0);
|
3280
|
+
const balance = rawBalance / __pow(10, 8);
|
3281
|
+
return { rawBalance, balance };
|
3282
|
+
});
|
3283
|
+
}
|
3284
|
+
function sendBitcoin(address, amount, feeRate) {
|
3285
|
+
return __async(this, null, function* () {
|
3286
|
+
const { sendBitcoin: sendBitcoin2 } = getBtcProvider();
|
3287
|
+
const satoshis = new Big(amount).mul(__pow(10, 8)).toNumber();
|
3288
|
+
const txHash = yield sendBitcoin2(address, satoshis, { feeRate });
|
3289
|
+
return txHash;
|
3290
|
+
});
|
3291
|
+
}
|
3228
3292
|
function executeBurrowSupply(_0) {
|
3229
3293
|
return __async(this, arguments, function* ({
|
3230
3294
|
amount,
|
3231
3295
|
feeRate,
|
3232
|
-
|
3296
|
+
isDev = false
|
3233
3297
|
}) {
|
3234
3298
|
try {
|
3235
|
-
|
3236
|
-
|
3237
|
-
|
3238
|
-
const
|
3239
|
-
const network = environment === "dev" ? "testnet" : environment;
|
3240
|
-
const config = walletConfig[environment];
|
3241
|
-
const btcPublicKey = yield btcProvider.getPublicKey();
|
3299
|
+
const { getPublicKey } = getBtcProvider();
|
3300
|
+
const network = yield getNetwork();
|
3301
|
+
const config = walletConfig[isDev ? "dev" : network];
|
3302
|
+
const btcPublicKey = yield getPublicKey();
|
3242
3303
|
if (!btcPublicKey) {
|
3243
3304
|
throw new Error("BTC Public Key is not available.");
|
3244
3305
|
}
|
3245
|
-
const address = yield getDepositAddress(btcPublicKey, config.contractId
|
3246
|
-
const _feeRate = feeRate || (yield
|
3306
|
+
const address = yield getDepositAddress(btcPublicKey, config.contractId);
|
3307
|
+
const _feeRate = feeRate || (yield getBtcGasPrice());
|
3247
3308
|
console.log("feeRate", _feeRate);
|
3248
|
-
const txHash = yield sendBitcoin(
|
3309
|
+
const txHash = yield sendBitcoin(address, amount, _feeRate);
|
3249
3310
|
const receiveDepositMsgRes = yield receiveDepositMsg(config.base_url, { btcPublicKey, txHash });
|
3250
3311
|
console.log("receiveDepositMsg resp:", receiveDepositMsgRes);
|
3251
3312
|
const checkTransactionStatusRes = yield checkTransactionStatus(config.base_url, txHash);
|
@@ -3258,7 +3319,7 @@ function executeBurrowSupply(_0) {
|
|
3258
3319
|
|
3259
3320
|
// src/index.ts
|
3260
3321
|
var getVersion = () => {
|
3261
|
-
return "0.3.
|
3322
|
+
return "0.3.5";
|
3262
3323
|
};
|
3263
3324
|
if (typeof window !== "undefined") {
|
3264
3325
|
window.__PARTICLE_BTC_CONNECT_VERSION = getVersion();
|
@@ -3277,7 +3338,10 @@ export {
|
|
3277
3338
|
WizzConnector,
|
3278
3339
|
XverseConnector,
|
3279
3340
|
executeBurrowSupply,
|
3341
|
+
getBtcBalance,
|
3342
|
+
getBtcGasPrice,
|
3280
3343
|
getVersion,
|
3344
|
+
sendBitcoin,
|
3281
3345
|
setupBTCWallet,
|
3282
3346
|
useAccountContract,
|
3283
3347
|
useAccounts,
|