btc-wallet 0.3.6 → 0.3.7

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/esm/index.js CHANGED
@@ -3229,6 +3229,12 @@ function getBtcRpcUrl() {
3229
3229
  return btcRpcUrls[network];
3230
3230
  });
3231
3231
  }
3232
+ function getConfig(isDev) {
3233
+ return __async(this, null, function* () {
3234
+ const network = yield getNetwork();
3235
+ return walletConfig[isDev ? "dev" : network];
3236
+ });
3237
+ }
3232
3238
  function nearCall(contractId, methodName, args) {
3233
3239
  return __async(this, null, function* () {
3234
3240
  const network = yield getNetwork();
@@ -3283,13 +3289,20 @@ function getBtcBalance() {
3283
3289
  const { account } = yield retryOperation(getBtcProvider, (res2) => !!res2.account);
3284
3290
  if (!account) {
3285
3291
  console.error("BTC Account is not available.");
3286
- return { rawBalance: 0, balance: 0 };
3292
+ return { rawBalance: 0, balance: 0, maxSpendableBalance: 0 };
3287
3293
  }
3288
3294
  const btcRpcUrl = yield getBtcRpcUrl();
3289
3295
  const res = yield fetch(`${btcRpcUrl}/address/${account}/utxo`).then((res2) => res2.json());
3290
3296
  const rawBalance = res == null ? void 0 : res.reduce((acc, cur) => acc + cur.value, 0);
3291
3297
  const balance = rawBalance / __pow(10, 8);
3292
- return { rawBalance, balance };
3298
+ const feeRate = yield getBtcGasPrice();
3299
+ const maxGasFee = feeRate * 250 / __pow(10, 8);
3300
+ const availableBalance = Math.max(0, balance - maxGasFee);
3301
+ return {
3302
+ rawBalance,
3303
+ balance,
3304
+ availableBalance
3305
+ };
3293
3306
  });
3294
3307
  }
3295
3308
  function sendBitcoin(address, amount, feeRate) {
@@ -3299,6 +3312,20 @@ function sendBitcoin(address, amount, feeRate) {
3299
3312
  return txHash;
3300
3313
  });
3301
3314
  }
3315
+ function estimateDepositAmount(amount, option) {
3316
+ return __async(this, null, function* () {
3317
+ const config = yield getConfig((option == null ? void 0 : option.isDev) || false);
3318
+ const {
3319
+ deposit_bridge_fee: { fee_min, fee_rate }
3320
+ } = yield nearCall(
3321
+ config.bridgeContractId,
3322
+ "get_config",
3323
+ {}
3324
+ );
3325
+ const fee = Math.max(Number(fee_min), Number(amount) * fee_rate);
3326
+ return new Big(amount).minus(fee).toFixed(0);
3327
+ });
3328
+ }
3302
3329
  function executeBTCDepositAndAction(_0) {
3303
3330
  return __async(this, arguments, function* ({
3304
3331
  action,
@@ -3307,18 +3334,26 @@ function executeBTCDepositAndAction(_0) {
3307
3334
  }) {
3308
3335
  try {
3309
3336
  const { getPublicKey } = getBtcProvider();
3310
- const network = yield getNetwork();
3311
- const config = walletConfig[isDev ? "dev" : network];
3337
+ const config = yield getConfig(isDev);
3312
3338
  const btcPublicKey = yield getPublicKey();
3313
- const _action = Object.assign({}, action);
3339
+ const _action = Object.assign(
3340
+ {},
3341
+ __spreadProps(__spreadValues({}, action), {
3342
+ gas: new Big(100).mul(__pow(10, 12)).toFixed(0)
3343
+ })
3344
+ );
3314
3345
  if (!btcPublicKey) {
3315
3346
  throw new Error("BTC Public Key is not available.");
3316
3347
  }
3317
3348
  if (!_action.receiver_id) {
3318
3349
  throw new Error("action.receiver_id is required");
3319
3350
  }
3351
+ const amountWithFee = yield estimateDepositAmount(_action.amount, {
3352
+ isDev
3353
+ });
3354
+ _action.amount = amountWithFee;
3320
3355
  if (!_action.amount || !new Big(_action.amount || 0).gt(0)) {
3321
- throw new Error("action.amount is required and must be greater than 0");
3356
+ throw new Error("action.amount is required or deposit amount is not enough");
3322
3357
  }
3323
3358
  const csna = yield nearCall(
3324
3359
  config.accountContractId,
@@ -3327,34 +3362,41 @@ function executeBTCDepositAndAction(_0) {
3327
3362
  btc_public_key: btcPublicKey
3328
3363
  }
3329
3364
  );
3330
- _action.amount = new Big(_action.amount).toString();
3331
- _action.gas = new Big(100).mul(__pow(10, 12)).toFixed(0);
3332
3365
  const depositMsg = {
3333
3366
  recipient_id: csna,
3334
3367
  post_actions: [_action]
3335
3368
  };
3369
+ const storageDepositMsg = {};
3370
+ const accountInfo = yield nearCall(config.accountContractId, "get_account", {
3371
+ account_id: csna
3372
+ });
3373
+ if (!accountInfo.nonce) {
3374
+ storageDepositMsg.btc_public_key = btcPublicKey;
3375
+ }
3336
3376
  const registerRes = yield nearCall(action.receiver_id, "storage_balance_of", {
3337
3377
  account_id: csna
3338
3378
  });
3339
3379
  if (!(registerRes == null ? void 0 : registerRes.available)) {
3340
- const storageDepositMsg = {
3341
- storage_deposit_msg: {
3342
- contract_id: action.receiver_id,
3343
- deposit: new Big(0.25).mul(__pow(10, 24)).toFixed(0),
3344
- registration_only: true
3345
- },
3346
- btc_public_key: btcPublicKey
3380
+ storageDepositMsg.storage_deposit_msg = {
3381
+ contract_id: action.receiver_id,
3382
+ deposit: new Big(0.25).mul(__pow(10, 24)).toFixed(0),
3383
+ registration_only: true
3347
3384
  };
3385
+ }
3386
+ if (Object.keys(storageDepositMsg).length > 0) {
3348
3387
  depositMsg.extra_msg = JSON.stringify(storageDepositMsg);
3349
3388
  }
3350
- console.log("depositMsg", depositMsg);
3389
+ console.log("deposit msg:", depositMsg);
3351
3390
  const userDepositAddress = yield nearCall(
3352
3391
  config.bridgeContractId,
3353
3392
  "get_user_deposit_address",
3354
3393
  { deposit_msg: depositMsg }
3355
3394
  );
3356
- console.log("userDepositAddress", userDepositAddress);
3357
3395
  const _feeRate = feeRate || (yield getBtcGasPrice());
3396
+ console.log("user deposit address:", userDepositAddress);
3397
+ console.log("deposit amount:", new Big(action.amount).toNumber());
3398
+ console.log("receive amount:", new Big(_action.amount).toNumber());
3399
+ console.log("fee rate:", _feeRate);
3358
3400
  const txHash = yield sendBitcoin(
3359
3401
  userDepositAddress,
3360
3402
  new Big(action.amount).toNumber(),
@@ -3378,7 +3420,7 @@ function executeBTCDepositAndAction(_0) {
3378
3420
 
3379
3421
  // src/index.ts
3380
3422
  var getVersion = () => {
3381
- return "0.3.6";
3423
+ return "0.3.7";
3382
3424
  };
3383
3425
  if (typeof window !== "undefined") {
3384
3426
  window.__PARTICLE_BTC_CONNECT_VERSION = getVersion();
@@ -3396,6 +3438,7 @@ export {
3396
3438
  UnisatConnector,
3397
3439
  WizzConnector,
3398
3440
  XverseConnector,
3441
+ estimateDepositAmount,
3399
3442
  executeBTCDepositAndAction,
3400
3443
  getBtcBalance,
3401
3444
  getBtcGasPrice,