@sodax/wallet-sdk-core 1.3.1-beta-rc1 → 1.3.1-beta-rc2

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/index.cjs CHANGED
@@ -11,6 +11,13 @@ var sdkTs = require('@injectivelabs/sdk-ts');
11
11
  var splToken = require('@solana/spl-token');
12
12
  var web3_js = require('@solana/web3.js');
13
13
  var stellarSdk = require('@stellar/stellar-sdk');
14
+ var bitcoin = require('bitcoinjs-lib');
15
+ var ecc = require('@bitcoinerlab/secp256k1');
16
+ var ecpair = require('ecpair');
17
+ var secp256k1 = require('secp256k1');
18
+ var bip322 = require('bip322-js');
19
+
20
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
21
 
15
22
  function _interopNamespace(e) {
16
23
  if (e && e.__esModule) return e;
@@ -31,6 +38,10 @@ function _interopNamespace(e) {
31
38
  }
32
39
 
33
40
  var IconSdkRaw__namespace = /*#__PURE__*/_interopNamespace(IconSdkRaw);
41
+ var bitcoin__namespace = /*#__PURE__*/_interopNamespace(bitcoin);
42
+ var ecc__namespace = /*#__PURE__*/_interopNamespace(ecc);
43
+ var secp256k1__default = /*#__PURE__*/_interopDefault(secp256k1);
44
+ var bip322__namespace = /*#__PURE__*/_interopNamespace(bip322);
34
45
 
35
46
  // src/wallet-providers/EvmWalletProvider.ts
36
47
 
@@ -51,6 +62,7 @@ var HYPEREVM_MAINNET_CHAIN_ID = "hyper";
51
62
  var LIGHTLINK_MAINNET_CHAIN_ID = "lightlink";
52
63
  var NEAR_MAINNET_CHAIN_ID = "near";
53
64
  var ETHEREUM_MAINNET_CHAIN_ID = "ethereum";
65
+ var BITCOIN_MAINNET_CHAIN_ID = "bitcoin";
54
66
  var REDBELLY_MAINNET_CHAIN_ID = "redbelly";
55
67
  var KAIA_MAINNET_CHAIN_ID = "0x2019.kaia";
56
68
  var baseChainInfo = {
@@ -150,6 +162,12 @@ var baseChainInfo = {
150
162
  type: "EVM",
151
163
  chainId: 1
152
164
  },
165
+ [BITCOIN_MAINNET_CHAIN_ID]: {
166
+ name: "Bitcoin",
167
+ id: BITCOIN_MAINNET_CHAIN_ID,
168
+ type: "BITCOIN",
169
+ chainId: "bitcoin"
170
+ },
153
171
  [REDBELLY_MAINNET_CHAIN_ID]: {
154
172
  name: "Redbelly",
155
173
  id: REDBELLY_MAINNET_CHAIN_ID,
@@ -1028,6 +1046,42 @@ var spokeChainConfig = {
1028
1046
  rpcUrl: "https://injective-rpc.publicnode.com:443",
1029
1047
  walletAddress: ""
1030
1048
  },
1049
+ [BITCOIN_MAINNET_CHAIN_ID]: {
1050
+ addresses: {
1051
+ assetManager: "bc1p4z9555xw0266vhq2x5un4zdmm9dt9zyet32fs7wa7u5ckdxusd9qsw4xfx"
1052
+ },
1053
+ chain: baseChainInfo[BITCOIN_MAINNET_CHAIN_ID],
1054
+ bnUSD: "no",
1055
+ nativeToken: "BTC",
1056
+ supportedTokens: {
1057
+ BTC: {
1058
+ symbol: "BTC",
1059
+ name: "Bitcoin",
1060
+ decimals: 8,
1061
+ address: "0:0",
1062
+ xChainId: BITCOIN_MAINNET_CHAIN_ID
1063
+ },
1064
+ bnUSD: {
1065
+ symbol: "bnUSD",
1066
+ name: "bnUSD",
1067
+ decimals: 18,
1068
+ address: "0:0",
1069
+ xChainId: BITCOIN_MAINNET_CHAIN_ID
1070
+ },
1071
+ BUSD: {
1072
+ symbol: "BUSD",
1073
+ name: "BUSDSTABLECOIN",
1074
+ decimals: 6,
1075
+ address: "897442:43",
1076
+ xChainId: BITCOIN_MAINNET_CHAIN_ID
1077
+ }
1078
+ },
1079
+ radfiApiUrl: "https://staging.api.radfi.co/api",
1080
+ radfiApiKey: "",
1081
+ radfiUmsUrl: "https://staging.ums.radfi.co/api",
1082
+ network: "MAINNET",
1083
+ rpcUrl: "https://mempool.space/api"
1084
+ },
1031
1085
  [STELLAR_MAINNET_CHAIN_ID]: {
1032
1086
  addresses: {
1033
1087
  connection: "CDFQDDPUPAM3XPGORHDOEFRNLMKOH3N3X6XTXNLSXJQXIU3RVCM3OPEP",
@@ -1957,8 +2011,7 @@ var spokeChainConfig = {
1957
2011
  [spokeChainConfig[REDBELLY_MAINNET_CHAIN_ID].supportedTokens.rPOL.address]: {
1958
2012
  vault: SodaTokens.sodaPOL.address
1959
2013
  }
1960
- }
1961
- });
2014
+ }});
1962
2015
  var moneyMarketConfig = {
1963
2016
  [SONIC_MAINNET_CHAIN_ID]: {
1964
2017
  lendingPool: "0x553434896D39F867761859D0FE7189d2Af70514E",
@@ -1994,6 +2047,17 @@ var InjectiveExecuteResponse = class _InjectiveExecuteResponse {
1994
2047
  }
1995
2048
  };
1996
2049
 
2050
+ // ../types/dist/btc/index.js
2051
+ function detectBitcoinAddressType(address) {
2052
+ if (address.startsWith("bc1p") || address.startsWith("tb1p"))
2053
+ return "P2TR";
2054
+ if (address.startsWith("bc1") || address.startsWith("tb1"))
2055
+ return "P2WPKH";
2056
+ if (address.startsWith("1") || address.startsWith("m") || address.startsWith("n"))
2057
+ return "P2PKH";
2058
+ throw new Error(`Unknown Bitcoin address type: ${address}`);
2059
+ }
2060
+
1997
2061
  // src/wallet-providers/EvmWalletProvider.ts
1998
2062
  var hyper = /* @__PURE__ */ viem.defineChain({
1999
2063
  id: 999,
@@ -2721,6 +2785,161 @@ var StellarWalletProvider = class {
2721
2785
  );
2722
2786
  }
2723
2787
  };
2788
+ bitcoin__namespace.initEccLib(ecc__namespace);
2789
+ var ECPair = ecpair.ECPairFactory(ecc__namespace);
2790
+ var BitcoinWalletError = class extends Error {
2791
+ constructor(message) {
2792
+ super(message);
2793
+ this.name = "BitcoinWalletError";
2794
+ }
2795
+ };
2796
+ function isPkConfig(config) {
2797
+ return config.type === "PRIVATE_KEY";
2798
+ }
2799
+ function isPkWallet(wallet) {
2800
+ return wallet.type === "PRIVATE_KEY";
2801
+ }
2802
+ var NETWORKS = {
2803
+ TESTNET: bitcoin__namespace.networks.testnet,
2804
+ MAINNET: bitcoin__namespace.networks.bitcoin
2805
+ };
2806
+ var BitcoinWalletProvider = class {
2807
+ wallet;
2808
+ network;
2809
+ constructor(config) {
2810
+ this.network = NETWORKS[config.network];
2811
+ if (isPkConfig(config)) {
2812
+ const keyHex = config.privateKey.startsWith("0x") ? config.privateKey.slice(2) : config.privateKey;
2813
+ const keyPair = ECPair.fromPrivateKey(Buffer.from(keyHex, "hex"), {
2814
+ network: this.network
2815
+ });
2816
+ this.wallet = {
2817
+ type: "PRIVATE_KEY",
2818
+ keyPair,
2819
+ addressType: config.addressType ?? "P2WPKH"
2820
+ };
2821
+ return;
2822
+ }
2823
+ this.wallet = {
2824
+ type: "BROWSER_EXTENSION",
2825
+ walletsKit: config.walletsKit
2826
+ };
2827
+ }
2828
+ async getWalletAddress() {
2829
+ if (isPkWallet(this.wallet)) {
2830
+ const payment = this.getPayment(
2831
+ this.wallet.keyPair,
2832
+ this.wallet.addressType
2833
+ // optional if you already pass type
2834
+ );
2835
+ if (!payment.address) {
2836
+ throw new BitcoinWalletError("Failed to derive address");
2837
+ }
2838
+ return payment.address;
2839
+ }
2840
+ const accounts = await this.wallet.walletsKit.getAccounts();
2841
+ const address = accounts?.[0];
2842
+ if (!address) {
2843
+ throw new BitcoinWalletError("No wallet accounts found");
2844
+ }
2845
+ return address;
2846
+ }
2847
+ async getPublicKey() {
2848
+ if (isPkWallet(this.wallet)) {
2849
+ if (this.wallet.addressType === "P2TR") {
2850
+ return this.wallet.keyPair.publicKey.slice(1, 33).toString("hex");
2851
+ }
2852
+ return this.wallet.keyPair.publicKey.toString("hex");
2853
+ }
2854
+ return this.wallet.walletsKit.getPublicKey();
2855
+ }
2856
+ async getAddressType(address) {
2857
+ return detectBitcoinAddressType(address);
2858
+ }
2859
+ /**
2860
+ * Sign PSBT and return fully signed transaction hex
2861
+ */
2862
+ async signTransaction(psbtBase64, finalize = true) {
2863
+ if (isPkWallet(this.wallet)) {
2864
+ const psbt2 = bitcoin__namespace.Psbt.fromBase64(psbtBase64, { network: this.network });
2865
+ if (this.wallet.addressType === "P2TR" && finalize) {
2866
+ const xOnlyPubkey = this.wallet.keyPair.publicKey.slice(1, 33);
2867
+ const tweakedKey = this.wallet.keyPair.tweak(bitcoin__namespace.crypto.taggedHash("TapTweak", xOnlyPubkey));
2868
+ psbt2.signAllInputs(tweakedKey);
2869
+ } else {
2870
+ psbt2.signAllInputs(this.wallet.keyPair);
2871
+ }
2872
+ if (!finalize) {
2873
+ return psbt2.toBase64();
2874
+ }
2875
+ psbt2.finalizeAllInputs();
2876
+ return psbt2.extractTransaction().toHex();
2877
+ }
2878
+ const { psbtHex: signedPsbt } = await this.wallet.walletsKit.signPsbt(psbtBase64);
2879
+ if (!finalize) {
2880
+ return signedPsbt;
2881
+ }
2882
+ const psbt = bitcoin__namespace.Psbt.fromHex(signedPsbt, { network: this.network });
2883
+ return psbt.extractTransaction().toHex();
2884
+ }
2885
+ /**
2886
+ * Sign arbitrary message using ECDSA
2887
+ * Used for withdrawals
2888
+ */
2889
+ async signEcdsaMessage(message) {
2890
+ if (isPkWallet(this.wallet)) {
2891
+ const privateKey = this.wallet.keyPair.privateKey;
2892
+ if (!privateKey) {
2893
+ throw new BitcoinWalletError("Private key not available");
2894
+ }
2895
+ const hash = Buffer.from(viem.keccak256(Buffer.from(message)).slice(2), "hex");
2896
+ const { signature, recid } = secp256k1__default.default.ecdsaSign(hash, Uint8Array.from(privateKey));
2897
+ return Buffer.concat([Buffer.from(signature), Buffer.from([recid])]).toString("hex");
2898
+ }
2899
+ return this.wallet.walletsKit.signEcdsaMessage(message);
2900
+ }
2901
+ async signBip322Message(message) {
2902
+ if (isPkWallet(this.wallet)) {
2903
+ const privateKey = this.wallet.keyPair.privateKey;
2904
+ if (!privateKey) {
2905
+ throw new BitcoinWalletError("Private key not available");
2906
+ }
2907
+ const signature = bip322__namespace.Signer.sign(this.wallet.keyPair.toWIF(), await this.getWalletAddress(), message);
2908
+ return signature;
2909
+ }
2910
+ return this.wallet.walletsKit.signBip322Message(message);
2911
+ }
2912
+ getPayment(keyPair, addressType) {
2913
+ switch (addressType) {
2914
+ case "P2PKH":
2915
+ return bitcoin__namespace.payments.p2pkh({
2916
+ pubkey: keyPair.publicKey,
2917
+ network: this.network
2918
+ });
2919
+ case "P2WPKH":
2920
+ return bitcoin__namespace.payments.p2wpkh({
2921
+ pubkey: keyPair.publicKey,
2922
+ network: this.network
2923
+ });
2924
+ case "P2TR":
2925
+ return bitcoin__namespace.payments.p2tr({
2926
+ internalPubkey: keyPair.publicKey.slice(1, 33),
2927
+ network: this.network
2928
+ });
2929
+ default:
2930
+ throw new BitcoinWalletError(`Unsupported address type: ${addressType}`);
2931
+ }
2932
+ }
2933
+ async sendBitcoin(toAddress, satoshis) {
2934
+ if (isPkWallet(this.wallet)) {
2935
+ throw new BitcoinWalletError("sendBitcoin not implemented for PRIVATE_KEY wallet");
2936
+ }
2937
+ if (!this.wallet.walletsKit.sendBitcoin) {
2938
+ throw new BitcoinWalletError("sendBitcoin not supported by this browser extension");
2939
+ }
2940
+ return this.wallet.walletsKit.sendBitcoin(toAddress, Number(satoshis));
2941
+ }
2942
+ };
2724
2943
 
2725
2944
  // ../../node_modules/.pnpm/near-api-js@7.2.0/node_modules/near-api-js/lib/crypto/constants.js
2726
2945
  var KeyType;
@@ -5988,7 +6207,7 @@ var Pointk1 = /* @__PURE__ */ weierstrass(secp256k1_CURVE, {
5988
6207
  Fp: Fpk1,
5989
6208
  endo: secp256k1_ENDO
5990
6209
  });
5991
- var secp256k1 = /* @__PURE__ */ ecdsa(Pointk1, sha256);
6210
+ var secp256k12 = /* @__PURE__ */ ecdsa(Pointk1, sha256);
5992
6211
 
5993
6212
  // ../../node_modules/.pnpm/near-api-js@7.2.0/node_modules/near-api-js/lib/crypto/public_key.js
5994
6213
  function key_type_to_str(keyType) {
@@ -6114,7 +6333,7 @@ var PublicKey2 = class _PublicKey extends Enum {
6114
6333
  case KeyType.ED25519:
6115
6334
  return ed25519.verify(signature, message, data);
6116
6335
  case KeyType.SECP256K1:
6117
- return secp256k1.verify(signature.subarray(0, 64), message, new Uint8Array([4, ...data]), {
6336
+ return secp256k12.verify(signature.subarray(0, 64), message, new Uint8Array([4, ...data]), {
6118
6337
  prehash: false
6119
6338
  });
6120
6339
  default:
@@ -6213,7 +6432,7 @@ var KeyPairSecp256k1 = class _KeyPairSecp256k1 extends KeyPairBase {
6213
6432
  super();
6214
6433
  const decoded = baseDecode(extendedSecretKey);
6215
6434
  const secretKey = new Uint8Array(decoded.slice(0, KeySize.SECRET_KEY));
6216
- const withHeader = secp256k1.getPublicKey(new Uint8Array(secretKey), false);
6435
+ const withHeader = secp256k12.getPublicKey(new Uint8Array(secretKey), false);
6217
6436
  const data = withHeader.subarray(1);
6218
6437
  this.publicKey = new PublicKey2({
6219
6438
  keyType: KeyType.SECP256K1,
@@ -6234,13 +6453,13 @@ var KeyPairSecp256k1 = class _KeyPairSecp256k1 extends KeyPairBase {
6234
6453
  */
6235
6454
  static fromRandom() {
6236
6455
  const secretKey = crypto.getRandomValues(new Uint8Array(KeySize.SECRET_KEY));
6237
- const withHeader = secp256k1.getPublicKey(secretKey, false);
6456
+ const withHeader = secp256k12.getPublicKey(secretKey, false);
6238
6457
  const publicKey = withHeader.subarray(1);
6239
6458
  const extendedSecretKey = new Uint8Array([...secretKey, ...publicKey]);
6240
6459
  return new _KeyPairSecp256k1(baseEncode(extendedSecretKey));
6241
6460
  }
6242
6461
  sign(message) {
6243
- const raw = secp256k1.sign(message, baseDecode(this.secretKey), { prehash: false, format: "recovered" });
6462
+ const raw = secp256k12.sign(message, baseDecode(this.secretKey), { prehash: false, format: "recovered" });
6244
6463
  const signature = new Uint8Array(65);
6245
6464
  signature.set(raw.subarray(1), 0);
6246
6465
  signature[64] = raw[0];
@@ -9380,7 +9599,7 @@ function serializeMessage(payload) {
9380
9599
  }
9381
9600
 
9382
9601
  // ../../node_modules/.pnpm/near-api-js@7.2.0/node_modules/near-api-js/lib/signers/signer.js
9383
- var Signer = class {
9602
+ var Signer2 = class {
9384
9603
  /**
9385
9604
  * Signs given message according to NEP-413 requirements
9386
9605
  * @see https://github.com/near/NEPs/blob/master/neps/nep-0413.md
@@ -9445,7 +9664,7 @@ var Signer = class {
9445
9664
  };
9446
9665
 
9447
9666
  // ../../node_modules/.pnpm/near-api-js@7.2.0/node_modules/near-api-js/lib/signers/key_pair_signer.js
9448
- var KeyPairSigner = class _KeyPairSigner extends Signer {
9667
+ var KeyPairSigner = class _KeyPairSigner extends Signer2 {
9449
9668
  constructor(key) {
9450
9669
  super();
9451
9670
  this.key = key;
@@ -10350,6 +10569,8 @@ var NearWalletProvider = class {
10350
10569
  */
10351
10570
 
10352
10571
  exports.BigNumberToBigInt = BigNumberToBigInt;
10572
+ exports.BitcoinWalletError = BitcoinWalletError;
10573
+ exports.BitcoinWalletProvider = BitcoinWalletProvider;
10353
10574
  exports.EvmWalletProvider = EvmWalletProvider;
10354
10575
  exports.IconWalletProvider = IconWalletProvider;
10355
10576
  exports.InjectiveWalletProvider = InjectiveWalletProvider;