@sodax/wallet-sdk-core 1.3.1-beta-rc1 → 1.3.1-beta-rc3
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 +230 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +52 -2
- package/dist/index.d.ts +52 -2
- package/dist/index.mjs +224 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +16 -10
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: "bc1pxguu2r4p9jcxp3gj7dh4r4jd9qzccwpyap3nj5nlapy28s76lhrqw522fz"
|
|
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://api.canary.radfi.co/api",
|
|
1080
|
+
radfiApiKey: "",
|
|
1081
|
+
radfiUmsUrl: "https://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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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;
|