@lombard.finance/sdk 0.5.0 → 0.7.0
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/README.md +5 -2
- package/dist/index.js +148 -146
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/src/common/const.ts +6 -0
- package/src/provider/Provider.ts +0 -12
- package/src/provider/rpcUrlConfig.ts +1 -1
- package/src/sdk/generateDepositBtcAddress/generateDepositBtcAddress.stories.tsx +1 -0
- package/src/sdk/generateDepositBtcAddress/generateDepositBtcAddress.ts +2 -2
- package/src/sdk/getDepositBtcAddress/getDepositBtcAddress.stories.tsx +1 -0
- package/src/sdk/getDepositBtcAddress/getDepositBtcAddress.ts +13 -1
- package/src/sdk/getDepositsByAddress/getDepositsByAddress.ts +1 -1
- package/src/web3Sdk/approveLBTC/approveLBTC.ts +1 -1
- package/src/web3Sdk/claimLBTC/claimLBTC.ts +1 -1
- package/src/web3Sdk/index.ts +1 -0
- package/src/web3Sdk/lbtcAddressConfig.ts +8 -2
- package/src/web3Sdk/signLbtcDestionationAddr/signLbtcDestionationAddr.ts +1 -1
- package/src/web3Sdk/unstakeLBTC/unstakeLBTC.ts +1 -1
- /package/src/web3Sdk/{internalTypes.ts → types.ts} +0 -0
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ npm i @lombard.finance/sdk
|
|
|
15
15
|
Install Dependencies
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
npm i web3@^4 axios@^1 bignumber.js@^9 @bitcoin-js/tiny-secp256k1-asmjs
|
|
18
|
+
npm i web3@^4 axios@^1 bignumber.js@^9 @bitcoin-js/tiny-secp256k1-asmjs@2.2.3 bitcoinjs-lib@6.1.5
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
## Usage
|
|
@@ -46,6 +46,7 @@ Parameters:
|
|
|
46
46
|
|-----------|----------|--------------------------------------------------------------|
|
|
47
47
|
| `address` | `string` | The destination EVM user address where LBTC will be claimed. |
|
|
48
48
|
| `chainId` | `TChainId` | The destination chain ID where LBTC will be claimed. |
|
|
49
|
+
| `referralId` | `string` | The referral ID. |
|
|
49
50
|
| `env` | `TEnv` | Environment (optional, default: 'prod') |
|
|
50
51
|
|
|
51
52
|
Usage
|
|
@@ -56,6 +57,7 @@ import { getDepositBtcAddress } from '@lombard.finance/sdk';
|
|
|
56
57
|
const depositBtcAddress = await getDepositBtcAddress({
|
|
57
58
|
address: '0x...',
|
|
58
59
|
chainId: 1,
|
|
60
|
+
referralId: 'YOUR_REFERRAL_ID',
|
|
59
61
|
}); // bc1q...
|
|
60
62
|
```
|
|
61
63
|
|
|
@@ -82,7 +84,7 @@ Parameters:
|
|
|
82
84
|
| `address` | `string` | The destination EVM user address where LBTC will be claimed. |
|
|
83
85
|
| `chainId` | `TChainId` | The destination chain ID where LBTC will be claimed. |
|
|
84
86
|
| `signature` | `string` | The signature of the address. The signature is generated by signing the address using EVM wallet. |
|
|
85
|
-
| `referralId` | `string` | The referral ID.
|
|
87
|
+
| `referralId` | `string` | The referral ID. |
|
|
86
88
|
| `env` | `TEnv` | Environment (optional, default: 'prod') |
|
|
87
89
|
|
|
88
90
|
Usage
|
|
@@ -94,6 +96,7 @@ const depositBtcAddress = await generateDepositBtcAddress({
|
|
|
94
96
|
address: '0x...',
|
|
95
97
|
chainId: 1,
|
|
96
98
|
signature: 'SIGNATURE',
|
|
99
|
+
referralId: 'YOUR_REFERRAL_ID',
|
|
97
100
|
}); // bc1q...
|
|
98
101
|
```
|
|
99
102
|
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var c = (e, t, n) => (
|
|
1
|
+
var W = Object.defineProperty;
|
|
2
|
+
var V = (e, t, n) => t in e ? W(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
|
|
3
|
+
var c = (e, t, n) => (V(e, typeof t != "symbol" ? t + "" : t, n), n);
|
|
4
4
|
import g from "axios";
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import * as
|
|
8
|
-
import { initEccLib as
|
|
5
|
+
import T, { utils as m } from "web3";
|
|
6
|
+
import x from "bignumber.js";
|
|
7
|
+
import * as j from "@bitcoin-js/tiny-secp256k1-asmjs";
|
|
8
|
+
import { initEccLib as $, payments as Z, networks as D, address as z } from "bitcoinjs-lib";
|
|
9
9
|
const l = {
|
|
10
10
|
prod: "prod",
|
|
11
11
|
testnet: "testnet",
|
|
@@ -13,52 +13,52 @@ const l = {
|
|
|
13
13
|
}, r = {
|
|
14
14
|
ethereum: 1,
|
|
15
15
|
holesky: 17e3
|
|
16
|
-
},
|
|
16
|
+
}, C = l.prod, A = "0x0000000000000000000000000000000000000000", K = {
|
|
17
17
|
baseApiUrl: "https://staging.prod.lombard.finance"
|
|
18
|
-
},
|
|
18
|
+
}, q = {
|
|
19
19
|
baseApiUrl: "https://gastald-testnet.prod.lombard.finance"
|
|
20
|
-
},
|
|
20
|
+
}, J = {
|
|
21
21
|
baseApiUrl: "https://mainnet.prod.lombard.finance"
|
|
22
|
-
}, w = (e =
|
|
22
|
+
}, w = (e = C) => {
|
|
23
23
|
switch (e) {
|
|
24
24
|
case l.prod:
|
|
25
|
-
return X;
|
|
26
|
-
case l.testnet:
|
|
27
25
|
return J;
|
|
28
|
-
|
|
26
|
+
case l.testnet:
|
|
29
27
|
return q;
|
|
28
|
+
default:
|
|
29
|
+
return K;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
32
|
function B(e) {
|
|
33
|
-
return typeof e == "string" ? e : e instanceof Error ?
|
|
33
|
+
return typeof e == "string" ? e : e instanceof Error ? X(e) : Y(e);
|
|
34
34
|
}
|
|
35
|
-
function
|
|
35
|
+
function X(e) {
|
|
36
36
|
return e.response ? e.response.data.message : e.message;
|
|
37
37
|
}
|
|
38
|
-
function
|
|
38
|
+
function Y(e) {
|
|
39
39
|
return e != null && e.message ? e.message : "Unknown error";
|
|
40
40
|
}
|
|
41
|
-
const
|
|
41
|
+
const Q = {
|
|
42
42
|
eth: "DESTINATION_BLOCKCHAIN_ETHEREUM"
|
|
43
43
|
};
|
|
44
|
-
function
|
|
44
|
+
function M(e) {
|
|
45
45
|
switch (e) {
|
|
46
46
|
case r.holesky:
|
|
47
47
|
case r.ethereum:
|
|
48
|
-
return
|
|
48
|
+
return Q.eth;
|
|
49
49
|
default:
|
|
50
50
|
throw new Error(`Unknown chain ID: ${e}`);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
const
|
|
54
|
-
async function
|
|
53
|
+
const ee = "sanctioned_address", te = "api/v1/address/generate", ne = "destination address is under sanctions";
|
|
54
|
+
async function _e({
|
|
55
55
|
address: e,
|
|
56
56
|
chainId: t,
|
|
57
57
|
signature: n,
|
|
58
58
|
referralId: a,
|
|
59
59
|
env: s
|
|
60
60
|
}) {
|
|
61
|
-
const { baseApiUrl: i } = w(s), o =
|
|
61
|
+
const { baseApiUrl: i } = w(s), o = M(t), p = {
|
|
62
62
|
to_address: e,
|
|
63
63
|
to_address_signature: n,
|
|
64
64
|
to_chain: o,
|
|
@@ -67,61 +67,69 @@ async function Be({
|
|
|
67
67
|
};
|
|
68
68
|
try {
|
|
69
69
|
const { data: y } = await g.post(
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
te,
|
|
71
|
+
p,
|
|
72
72
|
{ baseURL: i }
|
|
73
73
|
);
|
|
74
74
|
return y.address;
|
|
75
75
|
} catch (y) {
|
|
76
76
|
const f = B(y);
|
|
77
|
-
if (
|
|
78
|
-
return
|
|
77
|
+
if (ae(f))
|
|
78
|
+
return ee;
|
|
79
79
|
throw new Error(f);
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
|
-
function
|
|
83
|
-
return !!e.includes(
|
|
82
|
+
function ae(e) {
|
|
83
|
+
return !!e.includes(ne);
|
|
84
84
|
}
|
|
85
|
-
const
|
|
86
|
-
async function
|
|
85
|
+
const se = "api/v1/address";
|
|
86
|
+
async function De({
|
|
87
87
|
address: e,
|
|
88
88
|
chainId: t,
|
|
89
|
-
env: n
|
|
89
|
+
env: n,
|
|
90
|
+
referralId: a
|
|
90
91
|
}) {
|
|
91
|
-
const
|
|
92
|
-
|
|
92
|
+
const s = await re({
|
|
93
|
+
address: e,
|
|
94
|
+
chainId: t,
|
|
95
|
+
env: n,
|
|
96
|
+
referralId: a
|
|
97
|
+
}), i = ie(s);
|
|
98
|
+
if (!i)
|
|
93
99
|
throw new Error("No address");
|
|
94
|
-
return
|
|
100
|
+
return i.btc_address;
|
|
95
101
|
}
|
|
96
|
-
function
|
|
102
|
+
function ie(e) {
|
|
97
103
|
const t = e.reduce((n, a) => n.created_at < a.created_at ? a : n);
|
|
98
104
|
return t.deprecated ? void 0 : t;
|
|
99
105
|
}
|
|
100
|
-
async function
|
|
106
|
+
async function re({
|
|
101
107
|
address: e,
|
|
102
108
|
chainId: t,
|
|
103
|
-
env: n
|
|
109
|
+
env: n,
|
|
110
|
+
referralId: a
|
|
104
111
|
}) {
|
|
105
|
-
const { baseApiUrl:
|
|
112
|
+
const { baseApiUrl: s } = w(n), i = M(t), o = {
|
|
106
113
|
to_address: e,
|
|
107
|
-
to_blockchain:
|
|
114
|
+
to_blockchain: i,
|
|
108
115
|
limit: 1,
|
|
109
116
|
offset: 0,
|
|
110
|
-
asc: !1
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
117
|
+
asc: !1,
|
|
118
|
+
referral_id: a
|
|
119
|
+
}, { data: p } = await g.get(se, {
|
|
120
|
+
baseURL: s,
|
|
121
|
+
params: o
|
|
114
122
|
});
|
|
115
|
-
return (
|
|
123
|
+
return (p == null ? void 0 : p.addresses) || [];
|
|
116
124
|
}
|
|
117
|
-
const
|
|
118
|
-
function
|
|
125
|
+
const oe = 8, F = 10 ** oe;
|
|
126
|
+
function pe(e) {
|
|
119
127
|
return +e / F;
|
|
120
128
|
}
|
|
121
129
|
function U(e) {
|
|
122
130
|
return Math.floor(+e * F);
|
|
123
131
|
}
|
|
124
|
-
function
|
|
132
|
+
function ue(e, t = C) {
|
|
125
133
|
switch (e) {
|
|
126
134
|
case "DESTINATION_BLOCKCHAIN_ETHEREUM":
|
|
127
135
|
return t === l.prod ? r.ethereum : r.holesky;
|
|
@@ -129,7 +137,7 @@ function ye(e, t = M) {
|
|
|
129
137
|
return r.ethereum;
|
|
130
138
|
}
|
|
131
139
|
}
|
|
132
|
-
async function
|
|
140
|
+
async function Be({
|
|
133
141
|
address: e,
|
|
134
142
|
env: t
|
|
135
143
|
}) {
|
|
@@ -137,17 +145,17 @@ async function Ue({
|
|
|
137
145
|
`api/v1/address/outputs/${e}`,
|
|
138
146
|
{ baseURL: n }
|
|
139
147
|
);
|
|
140
|
-
return ((a == null ? void 0 : a.outputs) ?? []).map(
|
|
148
|
+
return ((a == null ? void 0 : a.outputs) ?? []).map(ye(t));
|
|
141
149
|
}
|
|
142
|
-
function
|
|
150
|
+
function ye(e) {
|
|
143
151
|
return (t) => ({
|
|
144
152
|
txid: t.txid,
|
|
145
153
|
index: t.index ?? 0,
|
|
146
154
|
blockHeight: t.block_height ? Number(t.block_height) : void 0,
|
|
147
155
|
blockTime: t.block_time ? Number(t.block_time) : void 0,
|
|
148
|
-
value:
|
|
156
|
+
value: pe(t.value),
|
|
149
157
|
address: t.address,
|
|
150
|
-
chainId:
|
|
158
|
+
chainId: ue(t.to_chain, e),
|
|
151
159
|
// todo: return claiming tx from the API when it's available
|
|
152
160
|
isClaimed: !!t.claim_tx,
|
|
153
161
|
rawPayload: t.raw_payload,
|
|
@@ -155,7 +163,7 @@ function de(e) {
|
|
|
155
163
|
isRestricted: !!t.sanctioned
|
|
156
164
|
});
|
|
157
165
|
}
|
|
158
|
-
const
|
|
166
|
+
const Fe = [
|
|
159
167
|
{
|
|
160
168
|
txid: "txid0",
|
|
161
169
|
index: 0,
|
|
@@ -214,22 +222,22 @@ const Le = [
|
|
|
214
222
|
signature: "signature1"
|
|
215
223
|
}
|
|
216
224
|
];
|
|
217
|
-
async function
|
|
225
|
+
async function Ue({
|
|
218
226
|
env: e,
|
|
219
227
|
chainId: t,
|
|
220
228
|
amount: n
|
|
221
229
|
}) {
|
|
222
|
-
const { baseApiUrl: a } = w(e), s =
|
|
230
|
+
const { baseApiUrl: a } = w(e), s = M(t), { data: i } = await g.get(
|
|
223
231
|
`api/v1/exchange/rate/${s}`,
|
|
224
232
|
{ baseURL: a, params: { amount: n } }
|
|
225
233
|
);
|
|
226
234
|
return i.amount_out;
|
|
227
235
|
}
|
|
228
236
|
const L = {
|
|
229
|
-
[r.ethereum]: "https://
|
|
237
|
+
[r.ethereum]: "https://ethereum-rpc.publicnode.com",
|
|
230
238
|
[r.holesky]: "https://ethereum-holesky-rpc.publicnode.com"
|
|
231
239
|
};
|
|
232
|
-
async function
|
|
240
|
+
async function de(e) {
|
|
233
241
|
const n = await (await fetch(e, {
|
|
234
242
|
method: "POST",
|
|
235
243
|
headers: {
|
|
@@ -241,11 +249,11 @@ async function le(e) {
|
|
|
241
249
|
method: "eth_maxPriorityFeePerGas",
|
|
242
250
|
params: []
|
|
243
251
|
})
|
|
244
|
-
})).json(), a =
|
|
245
|
-
return new
|
|
252
|
+
})).json(), a = T.utils.hexToNumber(n == null ? void 0 : n.result);
|
|
253
|
+
return new x(Number(a));
|
|
246
254
|
}
|
|
247
|
-
const
|
|
248
|
-
class
|
|
255
|
+
const le = 2, me = 25e3;
|
|
256
|
+
class ce {
|
|
249
257
|
constructor({ chainId: t, rpcUrlConfig: n }) {
|
|
250
258
|
c(this, "chainId");
|
|
251
259
|
c(this, "rpcConfig");
|
|
@@ -258,7 +266,7 @@ class fe {
|
|
|
258
266
|
* @returns {Web3} Web3 instance.
|
|
259
267
|
*/
|
|
260
268
|
getReadWeb3() {
|
|
261
|
-
const t = this.getRpcUrl(), n = new
|
|
269
|
+
const t = this.getRpcUrl(), n = new T(), a = new T.providers.HttpProvider(t);
|
|
262
270
|
return n.setProvider(a), n;
|
|
263
271
|
}
|
|
264
272
|
/**
|
|
@@ -286,10 +294,10 @@ class fe {
|
|
|
286
294
|
async getMaxFees() {
|
|
287
295
|
const t = this.getReadWeb3(), n = this.getRpcUrl(), [a, s] = await Promise.all([
|
|
288
296
|
t.eth.getBlock("latest"),
|
|
289
|
-
|
|
297
|
+
de(n)
|
|
290
298
|
]);
|
|
291
299
|
return !(a != null && a.baseFeePerGas) && typeof (a == null ? void 0 : a.baseFeePerGas) != "bigint" ? {} : {
|
|
292
|
-
maxFeePerGas: +new
|
|
300
|
+
maxFeePerGas: +new x(a.baseFeePerGas.toString(10)).multipliedBy(le).plus(s),
|
|
293
301
|
maxPriorityFeePerGas: +s
|
|
294
302
|
};
|
|
295
303
|
}
|
|
@@ -301,8 +309,8 @@ class fe {
|
|
|
301
309
|
*/
|
|
302
310
|
async getSafeGasPriceWei() {
|
|
303
311
|
const t = await this.getReadWeb3().eth.getGasPrice();
|
|
304
|
-
return new
|
|
305
|
-
|
|
312
|
+
return new x(t.toString(10)).plus(
|
|
313
|
+
me
|
|
306
314
|
);
|
|
307
315
|
}
|
|
308
316
|
/**
|
|
@@ -318,13 +326,13 @@ class fe {
|
|
|
318
326
|
return new a.eth.Contract(t, n);
|
|
319
327
|
}
|
|
320
328
|
}
|
|
321
|
-
class v extends
|
|
329
|
+
class v extends ce {
|
|
322
330
|
constructor({ provider: n, account: a, chainId: s, rpcUrlConfig: i }) {
|
|
323
331
|
super({ chainId: s, rpcUrlConfig: i });
|
|
324
332
|
c(this, "web3");
|
|
325
333
|
c(this, "account");
|
|
326
334
|
c(this, "rpcConfig");
|
|
327
|
-
this.web3 = new
|
|
335
|
+
this.web3 = new T(n), this.account = a, this.chainId = s, this.rpcConfig = { ...L, ...i };
|
|
328
336
|
}
|
|
329
337
|
/**
|
|
330
338
|
* Signs a message using the current provider and account.
|
|
@@ -349,7 +357,7 @@ class v extends fe {
|
|
|
349
357
|
* @returns {Promise<IWeb3SendResult>} Promise with transaction hash and receipt promise.
|
|
350
358
|
*/
|
|
351
359
|
async sendTransactionAsync(n, a, s) {
|
|
352
|
-
const { chainId: i, web3: o } = this,
|
|
360
|
+
const { chainId: i, web3: o } = this, p = this.getReadWeb3(), {
|
|
353
361
|
data: y,
|
|
354
362
|
estimate: f = !1,
|
|
355
363
|
estimateFee: O = !1,
|
|
@@ -359,8 +367,8 @@ class v extends fe {
|
|
|
359
367
|
gasLimitMultiplier: H = 1
|
|
360
368
|
} = s;
|
|
361
369
|
let { nonce: b } = s;
|
|
362
|
-
b || (b = await
|
|
363
|
-
const
|
|
370
|
+
b || (b = await p.eth.getTransactionCount(n)), console.log(`Nonce: ${b}`);
|
|
371
|
+
const u = {
|
|
364
372
|
from: n,
|
|
365
373
|
to: a,
|
|
366
374
|
value: m.numberToHex(G),
|
|
@@ -371,48 +379,39 @@ class v extends fe {
|
|
|
371
379
|
};
|
|
372
380
|
if (f)
|
|
373
381
|
try {
|
|
374
|
-
const d = await
|
|
382
|
+
const d = await p.eth.estimateGas(u), h = Math.round(
|
|
375
383
|
Number(d) * H
|
|
376
384
|
);
|
|
377
|
-
E ?
|
|
385
|
+
E ? u.gas = m.numberToHex(h + E) : u.gas = m.numberToHex(h);
|
|
378
386
|
} catch (d) {
|
|
379
387
|
throw new Error(
|
|
380
388
|
d.message ?? "Failed to estimate gas limit for transaction."
|
|
381
389
|
);
|
|
382
390
|
}
|
|
383
|
-
const { maxFeePerGas: R, maxPriorityFeePerGas:
|
|
384
|
-
if (
|
|
391
|
+
const { maxFeePerGas: R, maxPriorityFeePerGas: S } = O ? await this.getMaxFees().catch(() => s) : s;
|
|
392
|
+
if (S !== void 0 && (u.maxPriorityFeePerGas = m.numberToHex(S)), R !== void 0 && (u.maxFeePerGas = m.numberToHex(R)), !u.maxFeePerGas && !u.maxPriorityFeePerGas) {
|
|
385
393
|
const d = await this.getSafeGasPriceWei();
|
|
386
|
-
|
|
394
|
+
u.gasPrice = d.toString(10);
|
|
387
395
|
}
|
|
388
|
-
if (!
|
|
396
|
+
if (!u.maxFeePerGas && !u.maxPriorityFeePerGas) {
|
|
389
397
|
const d = await this.getSafeGasPriceWei();
|
|
390
|
-
|
|
398
|
+
u.gasPrice = d.toString(10);
|
|
391
399
|
}
|
|
392
|
-
return console.log("Sending transaction via Web3: ",
|
|
393
|
-
const
|
|
394
|
-
|
|
395
|
-
console.log(`Just signed transaction has is: ${
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
"Found transaction in node: ",
|
|
399
|
-
JSON.stringify(
|
|
400
|
-
W,
|
|
401
|
-
(Se, C) => typeof C == "bigint" ? C.toString() : C,
|
|
402
|
-
2
|
|
403
|
-
)
|
|
404
|
-
), d({
|
|
405
|
-
receiptPromise: _,
|
|
406
|
-
transactionHash: x
|
|
400
|
+
return console.log("Sending transaction via Web3: ", u), new Promise((d, h) => {
|
|
401
|
+
const k = o.eth.sendTransaction(u);
|
|
402
|
+
k.once("transactionHash", async (_) => {
|
|
403
|
+
console.log(`Just signed transaction has is: ${_}`), d({
|
|
404
|
+
receiptPromise: k,
|
|
405
|
+
transactionHash: _
|
|
407
406
|
});
|
|
408
|
-
}).catch(
|
|
407
|
+
}).catch(h);
|
|
409
408
|
});
|
|
410
409
|
}
|
|
411
410
|
createContract(n, a) {
|
|
412
411
|
return new this.web3.eth.Contract(n, a);
|
|
413
412
|
}
|
|
414
413
|
}
|
|
415
|
-
function
|
|
414
|
+
function I(e) {
|
|
416
415
|
switch (e) {
|
|
417
416
|
case r.ethereum:
|
|
418
417
|
return 1.3;
|
|
@@ -422,27 +421,30 @@ function P(e) {
|
|
|
422
421
|
return 1.3;
|
|
423
422
|
}
|
|
424
423
|
}
|
|
425
|
-
function
|
|
424
|
+
function fe(e) {
|
|
426
425
|
return Object.values(r).includes(e);
|
|
427
426
|
}
|
|
428
|
-
const
|
|
429
|
-
[r.holesky]: "0xED7bfd5C1790576105Af4649817f6d35A75CD818"
|
|
427
|
+
const be = {
|
|
428
|
+
[r.holesky]: "0xED7bfd5C1790576105Af4649817f6d35A75CD818",
|
|
429
|
+
[r.ethereum]: A
|
|
430
430
|
}, he = {
|
|
431
|
-
[r.holesky]: "0x38A13AB20D15ffbE5A7312d2336EF1552580a4E2"
|
|
432
|
-
|
|
431
|
+
[r.holesky]: "0x38A13AB20D15ffbE5A7312d2336EF1552580a4E2",
|
|
432
|
+
[r.ethereum]: A
|
|
433
|
+
}, Te = {
|
|
434
|
+
[r.holesky]: A,
|
|
433
435
|
[r.ethereum]: "0x8236a87084f8b84306f72007f36f2618a5634494"
|
|
434
436
|
};
|
|
435
|
-
function
|
|
437
|
+
function ge(e = C) {
|
|
436
438
|
switch (e) {
|
|
437
439
|
case l.prod:
|
|
438
|
-
return
|
|
440
|
+
return Te;
|
|
439
441
|
case l.testnet:
|
|
440
442
|
return he;
|
|
441
443
|
default:
|
|
442
|
-
return
|
|
444
|
+
return be;
|
|
443
445
|
}
|
|
444
446
|
}
|
|
445
|
-
const
|
|
447
|
+
const we = [
|
|
446
448
|
{
|
|
447
449
|
constant: !0,
|
|
448
450
|
inputs: [],
|
|
@@ -663,7 +665,7 @@ const ve = [
|
|
|
663
665
|
name: "Transfer",
|
|
664
666
|
type: "event"
|
|
665
667
|
}
|
|
666
|
-
],
|
|
668
|
+
], ve = [
|
|
667
669
|
{
|
|
668
670
|
inputs: [],
|
|
669
671
|
stateMutability: "nonpayable",
|
|
@@ -2236,50 +2238,50 @@ const ve = [
|
|
|
2236
2238
|
type: "function"
|
|
2237
2239
|
}
|
|
2238
2240
|
];
|
|
2239
|
-
function
|
|
2241
|
+
function xe(e) {
|
|
2240
2242
|
switch (e) {
|
|
2241
2243
|
case "LBTC":
|
|
2242
|
-
return xe;
|
|
2243
|
-
default:
|
|
2244
2244
|
return ve;
|
|
2245
|
+
default:
|
|
2246
|
+
return we;
|
|
2245
2247
|
}
|
|
2246
2248
|
}
|
|
2247
|
-
function
|
|
2248
|
-
const n =
|
|
2249
|
-
if (!
|
|
2249
|
+
function P(e, t) {
|
|
2250
|
+
const n = ge(t), { chainId: a } = e;
|
|
2251
|
+
if (!fe(a))
|
|
2250
2252
|
throw new Error(`This chain ${a} is not supported`);
|
|
2251
2253
|
const s = n[a];
|
|
2252
2254
|
if (!s)
|
|
2253
2255
|
throw new Error(`Token address for chain ${a} is not defined`);
|
|
2254
|
-
const i =
|
|
2256
|
+
const i = xe("LBTC"), o = e.createContract(i, s);
|
|
2255
2257
|
return o.options.address || (o.options.address = s), o;
|
|
2256
2258
|
}
|
|
2257
|
-
function
|
|
2259
|
+
function Le({
|
|
2258
2260
|
spender: e,
|
|
2259
2261
|
amount: t,
|
|
2260
2262
|
env: n,
|
|
2261
2263
|
...a
|
|
2262
2264
|
}) {
|
|
2263
|
-
const s = new v(a), i =
|
|
2265
|
+
const s = new v(a), i = P(s, n), o = U(t), p = i.methods.approve(e, o);
|
|
2264
2266
|
return s.sendTransactionAsync(
|
|
2265
2267
|
s.account,
|
|
2266
2268
|
i.options.address,
|
|
2267
2269
|
{
|
|
2268
|
-
data:
|
|
2270
|
+
data: p.encodeABI(),
|
|
2269
2271
|
estimate: !0,
|
|
2270
2272
|
estimateFee: !0,
|
|
2271
|
-
gasLimitMultiplier:
|
|
2273
|
+
gasLimitMultiplier: I(s.chainId)
|
|
2272
2274
|
}
|
|
2273
2275
|
);
|
|
2274
2276
|
}
|
|
2275
|
-
const
|
|
2276
|
-
async function
|
|
2277
|
+
const Ce = "insufficient funds", Ae = "Insufficient funds for transfer";
|
|
2278
|
+
async function Oe({
|
|
2277
2279
|
data: e,
|
|
2278
2280
|
proofSignature: t,
|
|
2279
2281
|
env: n,
|
|
2280
2282
|
...a
|
|
2281
2283
|
}) {
|
|
2282
|
-
const s = new v(a), i =
|
|
2284
|
+
const s = new v(a), i = P(s, n), o = i.methods.mint(e, t);
|
|
2283
2285
|
try {
|
|
2284
2286
|
return await s.sendTransactionAsync(
|
|
2285
2287
|
s.account,
|
|
@@ -2288,22 +2290,22 @@ async function Ge({
|
|
|
2288
2290
|
data: o.encodeABI(),
|
|
2289
2291
|
estimate: !0,
|
|
2290
2292
|
estimateFee: !0,
|
|
2291
|
-
gasLimitMultiplier:
|
|
2293
|
+
gasLimitMultiplier: I(s.chainId)
|
|
2292
2294
|
}
|
|
2293
2295
|
);
|
|
2294
|
-
} catch (
|
|
2295
|
-
const y = B(
|
|
2296
|
-
throw y.includes(
|
|
2296
|
+
} catch (p) {
|
|
2297
|
+
const y = B(p);
|
|
2298
|
+
throw y.includes(Ce) ? new Error(Ae) : new Error(y);
|
|
2297
2299
|
}
|
|
2298
2300
|
}
|
|
2299
|
-
async function
|
|
2301
|
+
async function Ne(e) {
|
|
2300
2302
|
const t = new v(e), n = `destination chain id is ${e.chainId}`;
|
|
2301
2303
|
return t.signMessage(n);
|
|
2302
2304
|
}
|
|
2303
|
-
|
|
2304
|
-
function
|
|
2305
|
+
$(j);
|
|
2306
|
+
function Me(e, t = l.prod) {
|
|
2305
2307
|
var i;
|
|
2306
|
-
const n =
|
|
2308
|
+
const n = Ie(e), s = (i = Z[n]({
|
|
2307
2309
|
address: e,
|
|
2308
2310
|
network: t === l.prod ? D.bitcoin : D.testnet
|
|
2309
2311
|
}).output) == null ? void 0 : i.toString("hex");
|
|
@@ -2311,21 +2313,21 @@ function Ie(e, t = l.prod) {
|
|
|
2311
2313
|
throw new Error("Output script is not found.");
|
|
2312
2314
|
return `0x${s}`;
|
|
2313
2315
|
}
|
|
2314
|
-
function
|
|
2315
|
-
const t =
|
|
2316
|
+
function Ie(e) {
|
|
2317
|
+
const t = z.fromBech32(e);
|
|
2316
2318
|
if (t.version === 1 && t.data.length === 32)
|
|
2317
2319
|
return "p2tr";
|
|
2318
2320
|
if (t.version === 0 && t.data.length === 20)
|
|
2319
2321
|
return "p2wpkh";
|
|
2320
2322
|
throw new Error("Payment type is not supported.");
|
|
2321
2323
|
}
|
|
2322
|
-
function
|
|
2324
|
+
function Ge({
|
|
2323
2325
|
btcAddress: e,
|
|
2324
2326
|
amount: t,
|
|
2325
2327
|
env: n,
|
|
2326
2328
|
...a
|
|
2327
2329
|
}) {
|
|
2328
|
-
const s = new v(a), i =
|
|
2330
|
+
const s = new v(a), i = P(s, n), o = Me(e, n), p = U(t), y = i.methods.redeem(o, p);
|
|
2329
2331
|
return s.sendTransactionAsync(
|
|
2330
2332
|
s.account,
|
|
2331
2333
|
i.options.address,
|
|
@@ -2333,27 +2335,27 @@ function We({
|
|
|
2333
2335
|
data: y.encodeABI(),
|
|
2334
2336
|
estimate: !0,
|
|
2335
2337
|
estimateFee: !0,
|
|
2336
|
-
gasLimitMultiplier:
|
|
2338
|
+
gasLimitMultiplier: I(s.chainId)
|
|
2337
2339
|
}
|
|
2338
2340
|
);
|
|
2339
2341
|
}
|
|
2340
2342
|
export {
|
|
2341
2343
|
r as OChainId,
|
|
2342
2344
|
l as OEnv,
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2345
|
+
ee as SANCTIONED_ADDRESS,
|
|
2346
|
+
Le as approveLBTC,
|
|
2347
|
+
Oe as claimLBTC,
|
|
2348
|
+
Fe as demoDepositsByAddress,
|
|
2349
|
+
pe as fromSatoshi,
|
|
2350
|
+
_e as generateDepositBtcAddress,
|
|
2349
2351
|
w as getApiConfig,
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2352
|
+
De as getDepositBtcAddress,
|
|
2353
|
+
re as getDepositBtcAddresses,
|
|
2354
|
+
Be as getDepositsByAddress,
|
|
2355
|
+
Ue as getLBTCExchageRate,
|
|
2356
|
+
ge as getLbtcAddressConfig,
|
|
2357
|
+
Ne as signLbtcDestionationAddr,
|
|
2356
2358
|
U as toSatoshi,
|
|
2357
|
-
|
|
2359
|
+
Ge as unstakeLBTC
|
|
2358
2360
|
};
|
|
2359
2361
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/common/types/types.ts","../src/common/const.ts","../src/sdk/apiConfig.ts","../src/common/utils/getErrorMessage.ts","../src/sdk/internalTypes.ts","../src/sdk/utils/getChainNameById.ts","../src/sdk/generateDepositBtcAddress/generateDepositBtcAddress.ts","../src/sdk/getDepositBtcAddress/getDepositBtcAddress.ts","../src/common/utils/convertSatoshi.ts","../src/sdk/utils/getCainIdByName.ts","../src/sdk/getDepositsByAddress/getDepositsByAddress.ts","../src/sdk/getLBTCExchageRate/getLBTCExchageRate.ts","../src/provider/rpcUrlConfig.ts","../src/provider/utils/getMaxPriorityFeePerGas.ts","../src/provider/ReadProvider.ts","../src/provider/Provider.ts","../src/web3Sdk/utils/getGasMultiplier.ts","../src/common/utils/isValidChain.ts","../src/web3Sdk/lbtcAddressConfig.ts","../src/web3Sdk/utils/getTokenABI.ts","../src/web3Sdk/utils/getLbtcTokenContract.ts","../src/web3Sdk/approveLBTC/approveLBTC.ts","../src/web3Sdk/claimLBTC/claimLBTC.ts","../src/web3Sdk/signLbtcDestionationAddr/signLbtcDestionationAddr.ts","../src/btcSdk/utils/getOutputScript.ts","../src/web3Sdk/unstakeLBTC/unstakeLBTC.ts"],"sourcesContent":["export const OEnv = {\n prod: 'prod',\n testnet: 'testnet',\n stage: 'stage',\n} as const;\n\nexport type TEnv = (typeof OEnv)[keyof typeof OEnv];\n\nexport const OChainId = {\n ethereum: 1,\n holesky: 17000,\n} as const;\n\nexport type TChainId = (typeof OChainId)[keyof typeof OChainId];\n\n/**\n * Abstract EIP-1193 provider\n */\nexport interface IEIP1193Provider {\n request: (args: any) => Promise<any>;\n}\n","import { OEnv, TEnv } from './types/types';\n\nexport const defaultEnv: TEnv = OEnv.prod;\n","import { defaultEnv } from '../common/const';\nimport { OEnv, TEnv } from '../common/types/types';\n\ninterface IApiConfig {\n baseApiUrl: string;\n}\n\nconst stageConfig: IApiConfig = {\n baseApiUrl: 'https://staging.prod.lombard.finance',\n};\n\nconst testnetConfig: IApiConfig = {\n baseApiUrl: 'https://gastald-testnet.prod.lombard.finance',\n};\n\nconst prodConfig: IApiConfig = {\n baseApiUrl: 'https://mainnet.prod.lombard.finance',\n};\n\nexport const getApiConfig = (env: TEnv = defaultEnv): IApiConfig => {\n switch (env) {\n case OEnv.prod:\n return prodConfig;\n case OEnv.testnet:\n return testnetConfig;\n default:\n return stageConfig;\n }\n};\n","import { AxiosError } from 'axios';\n\n/**\n * Retrieves the error message from the given error object.\n *\n * @param error - The error object.\n * @returns The error message as a string.\n */\nexport function getErrorMessage(error: unknown): string {\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return getAxiosErrorMessage(error as AxiosError);\n }\n\n return getErrorMessageFromObject(error);\n}\n\nfunction getAxiosErrorMessage(error: AxiosError): string {\n if (error.response) {\n return (error.response.data as { message: string }).message;\n }\n\n return error.message;\n}\n\nfunction getErrorMessageFromObject(error: any): string {\n if (error?.message) {\n return error.message;\n }\n\n return 'Unknown error';\n}\n","export const OChainName = {\n eth: 'DESTINATION_BLOCKCHAIN_ETHEREUM',\n} as const;\n\nexport type TChainName = (typeof OChainName)[keyof typeof OChainName];\n","import { OChainId, TChainId } from '../../common/types/types';\nimport { OChainName, TChainName } from '../internalTypes';\n\n/**\n * @param chainId the chain ID\n *\n * @returns the chain name\n */\nexport function getChainNameById(chainId: TChainId): TChainName {\n switch (chainId) {\n case OChainId.holesky:\n case OChainId.ethereum:\n return OChainName.eth;\n default:\n throw new Error(`Unknown chain ID: ${chainId}`);\n }\n}\n","import axios from 'axios';\nimport { IEnvParam } from '../../common/types/internalTypes';\nimport { TChainId } from '../../common/types/types';\nimport { getErrorMessage } from '../../common/utils/getErrorMessage';\nimport { getApiConfig } from '../apiConfig';\nimport { getChainNameById } from '../utils/getChainNameById';\n\n/**\n * The address wich will be returned if the provided EVM address is sanctioned.\n */\nexport const SANCTIONED_ADDRESS = 'sanctioned_address';\nconst ADDRESS_URL = 'api/v1/address';\nconst SANCTIONS_MESSAGE = 'destination address is under sanctions';\n\ninterface IGenerateNewAddressResponse {\n address: string;\n}\n\nexport interface IGenerateDepositBtcAddressParams extends IEnvParam {\n /**\n * The destination EVM user address where LBTC will be claimed.\n */\n address: string;\n /**\n * The destination chain ID where LBTC will be claimed.\n */\n chainId: TChainId;\n /**\n * The signature of the address. The signature is generated by signing the address using EVM wallet.\n */\n signature: string;\n /**\n * The referral ID.\n */\n referralId?: string;\n}\n\n/**\n * Generates a BTC deposit address.\n *\n * If the provided EVM address is sanctioned, the function will return the `SANCTIONED_ADDRESS`.\n *\n * @param {IGenerateDepositBtcAddressParams} params - The parameters for generating the deposit address.\n * @returns {Promise<string>} The generated deposit address.\n */\nexport async function generateDepositBtcAddress({\n address,\n chainId,\n signature,\n referralId,\n env,\n}: IGenerateDepositBtcAddressParams): Promise<string> {\n const { baseApiUrl } = getApiConfig(env);\n const toChain = getChainNameById(chainId);\n\n const requestParams = {\n to_address: address,\n to_address_signature: signature,\n to_chain: toChain,\n referral_id: referralId,\n nonce: 0,\n };\n\n try {\n const { data } = await axios.post<IGenerateNewAddressResponse>(\n ADDRESS_URL,\n requestParams,\n { baseURL: baseApiUrl },\n );\n\n return data.address;\n } catch (error) {\n const errorMsg = getErrorMessage(error);\n\n if (isSanctioned(errorMsg)) {\n return SANCTIONED_ADDRESS;\n } else {\n throw new Error(errorMsg);\n }\n }\n}\n\nfunction isSanctioned(errorMsg: string): boolean {\n return !!errorMsg.includes(SANCTIONS_MESSAGE);\n}\n","import axios from 'axios';\nimport { IEnvParam } from '../../common/types/internalTypes';\nimport { TChainId } from '../../common/types/types';\nimport { getApiConfig } from '../apiConfig';\nimport { TChainName } from '../internalTypes';\nimport { getChainNameById } from '../utils/getChainNameById';\n\nconst ADDRESS_URL = 'api/v1/address';\n\ninterface IDepositAddress {\n btc_address: string;\n created_at: string;\n deprecated?: boolean;\n type: string;\n used?: boolean;\n deposit_metadata: {\n to_address: string;\n to_blockchain: TChainName;\n };\n}\n\ninterface IDepositAddressesResponse {\n addresses: IDepositAddress[];\n has_more?: boolean;\n}\n\nexport interface IGetDepositBtcAddressParams extends IEnvParam {\n /**\n * The destination EVM user address where LBTC will be claimed.\n */\n address: string;\n /**\n * The destination chain ID where LBTC will be claimed.\n */\n chainId: TChainId;\n}\n\n/**\n * Returns the address for depositing BTC.\n *\n * @param {IGetDepositBtcAddressParams} params - function parameters\n *\n * @returns {Promise<string>} the address for depositing BTC\n */\nexport async function getDepositBtcAddress({\n address,\n chainId,\n env,\n}: IGetDepositBtcAddressParams): Promise<string> {\n const addresses = await getDepositBtcAddresses({ address, chainId, env });\n\n const addressData = getActualAddress(addresses);\n\n if (!addressData) {\n throw new Error('No address');\n }\n\n return addressData.btc_address;\n}\n\n/**\n * Retrieves the actual deposit address from a list of deposit addresses.\n *\n * @param addresses - The list of deposit addresses.\n * @returns The actual deposit address or undefined if the last created address is deprecated.\n */\nfunction getActualAddress(\n addresses: IDepositAddress[],\n): IDepositAddress | undefined {\n const actualAddress = addresses.reduce((acc, address) => {\n if (acc.created_at < address.created_at) {\n return address;\n }\n return acc;\n });\n\n return actualAddress.deprecated ? undefined : actualAddress;\n}\n\n/**\n * Returns the addresses for depositing BTC.\n *\n * @param {IGetDepositBtcAddressParams} params - function parameters\n *\n * @returns {Promise<IDepositAddress[]>} the deposit addresses\n */\nexport async function getDepositBtcAddresses({\n address,\n chainId,\n env,\n}: IGetDepositBtcAddressParams): Promise<IDepositAddress[]> {\n const { baseApiUrl } = getApiConfig(env);\n const toBlockchain = getChainNameById(chainId);\n\n const requestrParams = {\n to_address: address,\n to_blockchain: toBlockchain,\n limit: 1,\n offset: 0,\n asc: false,\n };\n\n const { data } = await axios.get<IDepositAddressesResponse>(ADDRESS_URL, {\n baseURL: baseApiUrl,\n params: requestrParams,\n });\n\n return data?.addresses || [];\n}\n","const BTC_DECIMALS = 8;\nconst SATOSHI_SCALE = 10 ** BTC_DECIMALS;\n\n/**\n * Convert Satoshi to BTC\n * @param amount - Satoshi amount\n * @returns BTC amount\n */\nexport function fromSatoshi(amount: number | string) {\n return +amount / SATOSHI_SCALE;\n}\n\n/**\n * Convert BTC to Satoshi\n *\n * @param amount - BTC amount\n * @returns Satoshi amount\n */\nexport function toSatoshi(amount: number | string) {\n return Math.floor(+amount * SATOSHI_SCALE);\n}\n","import { defaultEnv } from '../../common/const';\nimport { OChainId, OEnv, TChainId, TEnv } from '../../common/types/types';\nimport { TChainName } from '../internalTypes';\n\n/**\n * @param chainId the chain ID\n *\n * @returns the chain name\n */\nexport function getCainIdByName(\n chain: string,\n env: TEnv = defaultEnv,\n): TChainId {\n switch (chain as TChainName) {\n case 'DESTINATION_BLOCKCHAIN_ETHEREUM':\n return env === OEnv.prod ? OChainId.ethereum : OChainId.holesky;\n\n default:\n return OChainId.ethereum;\n }\n}\n","import axios from 'axios';\nimport { IEnvParam } from '../../common/types/internalTypes';\nimport { OChainId, TChainId, TEnv } from '../../common/types/types';\nimport { fromSatoshi } from '../../common/utils/convertSatoshi';\nimport { getApiConfig } from '../apiConfig';\nimport { getCainIdByName } from '../utils/getCainIdByName';\n\ntype Address = string;\n\ninterface IDepositResponse {\n txid: string;\n index?: number;\n block_height?: string;\n block_time?: string;\n value: number;\n address: Address;\n to_chain: string;\n claim_tx?: string;\n raw_payload: string;\n payload: string;\n signature: string;\n sanctioned?: boolean;\n}\n\ninterface IDepositsByAddressResponse {\n outputs: IDepositResponse[];\n}\n\nexport interface IDeposit {\n txid: string;\n index?: number;\n blockHeight?: number;\n blockTime?: number;\n value: number;\n address: Address;\n chainId: TChainId;\n isClaimed: boolean;\n rawPayload?: string;\n signature?: string;\n isRestricted?: boolean;\n}\n\nexport interface IGetDepositsByAddressParams extends IEnvParam {\n /**\n * The EVM address to get deposits for\n */\n address: Address;\n}\n\n/**\n * Returns all deposits for a given address\n *\n * @param {IGetDepositsByAddressParams} params - the parameters for getting deposits\n *\n * @returns {Promise<IDeposit[]>} a list of deposits\n */\nexport async function getDepositsByAddress({\n address,\n env,\n}: IGetDepositsByAddressParams): Promise<IDeposit[]> {\n const { baseApiUrl } = getApiConfig(env);\n\n const { data } = await axios.get<IDepositsByAddressResponse | undefined>(\n `api/v1/address/outputs/${address}`,\n { baseURL: baseApiUrl },\n );\n\n const outputs = data?.outputs ?? [];\n\n return outputs.map(mapResponse(env));\n}\n\nfunction mapResponse(env?: TEnv) {\n return (data: IDepositResponse): IDeposit => ({\n txid: data.txid,\n index: data.index ?? 0,\n blockHeight: data.block_height ? Number(data.block_height) : undefined,\n blockTime: data.block_time ? Number(data.block_time) : undefined,\n value: fromSatoshi(data.value),\n address: data.address,\n chainId: getCainIdByName(data.to_chain, env),\n // todo: return claiming tx from the API when it's available\n isClaimed: !!data.claim_tx,\n rawPayload: data.raw_payload,\n signature: data.signature,\n isRestricted: !!data.sanctioned,\n });\n}\n\nexport const demoDepositsByAddress: IDeposit[] = [\n {\n txid: 'txid0',\n index: 0,\n blockHeight: 100,\n blockTime: 1715964690,\n value: 0.2,\n address: 'address0',\n chainId: OChainId.holesky,\n isClaimed: false,\n rawPayload: 'rawPayload0',\n signature: 'signature0',\n },\n {\n txid: 'dasjmnkosdfjnkdsgjnk',\n index: 0,\n blockHeight: 110,\n blockTime: 1715964690,\n value: 0.3,\n address: 'adslhjnkbsfdahbk',\n chainId: OChainId.holesky,\n isClaimed: false,\n rawPayload: 'rawPayload0',\n signature: 'signature0',\n },\n {\n txid: '0xfsmkfdskm',\n index: 0,\n blockHeight: 102,\n blockTime: 1715964690,\n value: 0.55,\n address: 'dgfgfasd',\n chainId: OChainId.holesky,\n isClaimed: false,\n },\n {\n txid: 'kmgnjkofejnadwnjdasljmnkjgsdklmn',\n index: 0,\n blockHeight: 102,\n blockTime: 1715964691,\n value: 0.77,\n address: 'hgjhyewadwss',\n chainId: OChainId.holesky,\n isClaimed: false,\n isRestricted: true,\n },\n {\n txid: 'f6b6d0e1e77df21e406bd730c32b05c3fae8296491a1d946925eff07d02d5825',\n index: 1,\n blockHeight: 100,\n blockTime: 1715789138,\n value: 0.2,\n address: 'address1',\n chainId: OChainId.holesky,\n isClaimed: true,\n rawPayload: 'rawPayload1',\n signature: 'signature1',\n },\n];\n","import axios from 'axios';\nimport { IEnvParam } from '../../common/types/internalTypes';\nimport { TChainId } from '../../common/types/types';\nimport { getApiConfig } from '../apiConfig';\nimport { getChainNameById } from '../utils/getChainNameById';\n\ntype ExchangeRateResponse = {\n amount_out: string;\n};\n\nexport interface IGetLBTCExchageRateParams extends IEnvParam {\n /**\n * The chain id of the asset to get the exchange rate for\n */\n chainId: TChainId;\n /**\n * The amount of the asset to get the exchange rate for\n */\n amount: number;\n}\n\n/**\n * Retrieves the exchange rate for LBTC.\n *\n * @param {IGetLBTCExchageRateParams} params\n *\n * @returns {Promise<string>} - The exchange rate.\n */\nexport async function getLBTCExchageRate({\n env,\n chainId,\n amount,\n}: IGetLBTCExchageRateParams): Promise<string> {\n const { baseApiUrl } = getApiConfig(env);\n const chainIdName = getChainNameById(chainId);\n\n const { data } = await axios.get<ExchangeRateResponse>(\n `api/v1/exchange/rate/${chainIdName}`,\n { baseURL: baseApiUrl, params: { amount } },\n );\n\n return data.amount_out;\n}\n","import { OChainId } from '../common/types/types';\n\nexport type TRpcUrlConfig = Record<number, string>;\n\nexport const rpcUrlConfig: TRpcUrlConfig = {\n [OChainId.ethereum]: 'https://eth.llamarpc.com',\n [OChainId.holesky]: 'https://ethereum-holesky-rpc.publicnode.com',\n};\n","import BigNumber from 'bignumber.js';\nimport Web3 from 'web3';\n\nexport async function getMaxPriorityFeePerGas(\n rpcUrl: string,\n): Promise<BigNumber> {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_maxPriorityFeePerGas',\n params: [],\n }),\n });\n\n const data = await response.json();\n\n const convertedHexValue = Web3.utils.hexToNumber(data?.result);\n\n return new BigNumber(Number(convertedHexValue));\n}\n","import BigNumber from 'bignumber.js';\nimport Web3, { Contract, ContractAbi } from 'web3';\nimport {\n TRpcUrlConfig,\n rpcUrlConfig as defaultRpcUrlConfig,\n} from './rpcUrlConfig';\nimport { IGetMaxFeesResult } from './types';\nimport { getMaxPriorityFeePerGas } from './utils/getMaxPriorityFeePerGas';\n\nconst FEE_MULTIPLIER = 2;\nconst ADDITIONAL_SAFE_GAS_PRICE_WEI = 25_000;\n\nexport interface IReadProviderParams {\n /**\n * Chain ID of the network to interact with.\n */\n chainId: number;\n /**\n * The RPC URL configuration. If not provided, the default configuration will be used.\n */\n rpcUrlConfig?: TRpcUrlConfig;\n}\n\nexport class ReadProvider {\n chainId: number;\n rpcConfig: TRpcUrlConfig;\n\n constructor({ chainId, rpcUrlConfig }: IReadProviderParams) {\n this.chainId = chainId;\n this.rpcConfig = { ...defaultRpcUrlConfig, ...rpcUrlConfig };\n }\n\n /**\n * Returns web3 instance for read operations.\n *\n * @public\n * @returns {Web3} Web3 instance.\n */\n public getReadWeb3(): Web3 {\n const rpcUrl = this.getRpcUrl();\n const readWeb3 = new Web3();\n const provider = new Web3.providers.HttpProvider(rpcUrl);\n readWeb3.setProvider(provider);\n return readWeb3;\n }\n\n /**\n * Retrieves the RPC URL based on the current chain ID.\n * @returns The RPC URL for the current chain ID.\n * @throws Error if the RPC URL for the current chain ID is not found.\n */\n getRpcUrl(): string {\n const { chainId } = this;\n const rpcUrl = this.rpcConfig?.[chainId];\n\n if (!rpcUrl) {\n console.error(\n `You might need to add the rpcConfig for the ${chainId} chain ID when creating the provider.`,\n );\n throw new Error(`RPC URL for chainId ${chainId} not found`);\n }\n\n return rpcUrl;\n }\n\n /**\n * Calculates max fees for transaction. Thess values are available for networks\n * with EIP-1559 support.\n *\n * @public\n * @note If current network is Binance Smart Chain, will return default values.\n * @returns {Promise<IGetMaxFeesResult>} Max fees for transaction.\n */\n public async getMaxFees(): Promise<IGetMaxFeesResult> {\n const web3 = this.getReadWeb3();\n const rpcUrl = this.getRpcUrl();\n\n const [block, maxPriorityFeePerGas] = await Promise.all([\n web3.eth.getBlock('latest'),\n getMaxPriorityFeePerGas(rpcUrl),\n ]);\n\n if (!block?.baseFeePerGas && typeof block?.baseFeePerGas !== 'bigint') {\n return {};\n }\n\n const maxFeePerGas = new BigNumber(block.baseFeePerGas.toString(10))\n .multipliedBy(FEE_MULTIPLIER)\n .plus(maxPriorityFeePerGas);\n\n return {\n maxFeePerGas: +maxFeePerGas,\n maxPriorityFeePerGas: +maxPriorityFeePerGas,\n };\n }\n\n /**\n * Returns safe gas price for transaction.\n *\n * @public\n * @returns {Promise<BigNumber>} Safe gas price.\n */\n public async getSafeGasPriceWei(): Promise<BigNumber> {\n const pureGasPriceWei = await this.getReadWeb3().eth.getGasPrice();\n\n return new BigNumber(pureGasPriceWei.toString(10)).plus(\n ADDITIONAL_SAFE_GAS_PRICE_WEI,\n );\n }\n\n /**\n * Creates a contract instance with the given ABI and address.\n *\n * @template AbiType - The type of the contract ABI.\n * @param {any} abi - The ABI of the contract.\n * @param {string} address - The address of the contract.\n * @returns {Contract<AbiType>} The contract instance.\n */\n public createContract<AbiType extends ContractAbi>(\n abi: any,\n address: string,\n ): Contract<AbiType> {\n const web3 = this.getReadWeb3();\n return new web3.eth.Contract<AbiType>(abi, address);\n }\n}\n","import Web3, { Contract, ContractAbi, Transaction, utils } from 'web3';\nimport { IEIP1193Provider } from '../common/types/types';\nimport { IReadProviderParams, ReadProvider } from './ReadProvider';\nimport {\n TRpcUrlConfig,\n rpcUrlConfig as defaultRpcUrlConfig,\n} from './rpcUrlConfig';\nimport { ISendOptions, IWeb3SendResult } from './types';\n\nexport interface IProviderParams extends IReadProviderParams {\n /**\n * The EIP-1193 provider instance.\n */\n provider: IEIP1193Provider;\n /**\n * The сurrent account address.\n */\n account: string;\n}\n\n/**\n * Provider for interacting with a blockchain network.\n */\nexport class Provider extends ReadProvider {\n web3: Web3;\n account: string;\n rpcConfig: TRpcUrlConfig;\n\n constructor({ provider, account, chainId, rpcUrlConfig }: IProviderParams) {\n super({ chainId, rpcUrlConfig });\n this.web3 = new Web3(provider);\n this.account = account;\n this.chainId = chainId;\n this.rpcConfig = { ...defaultRpcUrlConfig, ...rpcUrlConfig };\n }\n\n /**\n * Signs a message using the current provider and account.\n * @public\n * @param message - The message to be signed.\n * @returns A promise that resolves to the signed message as a string.\n */\n public async signMessage(message: string): Promise<string> {\n const { account } = this;\n\n const messageHex = `0x${Buffer.from(message, 'utf8').toString('hex')}`;\n\n const ethereum = this.web3.currentProvider as any;\n\n return ethereum.request({\n method: 'personal_sign',\n params: [messageHex, account],\n });\n }\n\n /**\n * Custom replacement for web3js [send](https://docs.web3js.org/libdocs/Contract#send).\n *\n * @public\n * @param {string} from - Address of the sender.\n * @param {string} to - Address of the recipient.\n * @param {ISendOptions} sendOptions - Options for sending transaction.\n * @returns {Promise<IWeb3SendResult>} Promise with transaction hash and receipt promise.\n */\n public async sendTransactionAsync(\n from: string,\n to: string,\n sendOptions: ISendOptions,\n ): Promise<IWeb3SendResult> {\n const { chainId, web3: web3Write } = this;\n const web3Read = this.getReadWeb3();\n\n const {\n data,\n estimate = false,\n estimateFee = false,\n extendedGasLimit,\n gasLimit = '0',\n value = '0',\n gasLimitMultiplier = 1,\n } = sendOptions;\n let { nonce } = sendOptions;\n\n if (!nonce) {\n nonce = await web3Read.eth.getTransactionCount(from);\n }\n\n console.log(`Nonce: ${nonce}`);\n\n const tx: Transaction = {\n from,\n to,\n value: utils.numberToHex(value),\n gas: utils.numberToHex(gasLimit),\n data,\n nonce,\n chainId: utils.numberToHex(chainId),\n };\n\n if (estimate) {\n try {\n const estimatedGas = await web3Read.eth.estimateGas(tx);\n const multipliedGasLimit = Math.round(\n Number(estimatedGas) * gasLimitMultiplier,\n );\n\n if (extendedGasLimit) {\n tx.gas = utils.numberToHex(multipliedGasLimit + extendedGasLimit);\n } else {\n tx.gas = utils.numberToHex(multipliedGasLimit);\n }\n } catch (e) {\n throw new Error(\n (e as Partial<Error>).message ??\n 'Failed to estimate gas limit for transaction.',\n );\n }\n }\n\n const { maxFeePerGas, maxPriorityFeePerGas } = estimateFee\n ? await this.getMaxFees().catch(() => sendOptions)\n : sendOptions;\n\n if (maxPriorityFeePerGas !== undefined) {\n tx.maxPriorityFeePerGas = utils.numberToHex(maxPriorityFeePerGas);\n }\n\n if (maxFeePerGas !== undefined) {\n tx.maxFeePerGas = utils.numberToHex(maxFeePerGas);\n }\n\n if (!tx.maxFeePerGas && !tx.maxPriorityFeePerGas) {\n const safeGasPrice = await this.getSafeGasPriceWei();\n tx.gasPrice = safeGasPrice.toString(10);\n }\n\n if (!tx.maxFeePerGas && !tx.maxPriorityFeePerGas) {\n const safeGasPrice = await this.getSafeGasPriceWei();\n tx.gasPrice = safeGasPrice.toString(10);\n }\n\n console.log('Sending transaction via Web3: ', tx);\n\n return new Promise((resolve, reject) => {\n const promise = web3Write.eth.sendTransaction(tx);\n\n promise\n .once('transactionHash', async (transactionHash: string) => {\n console.log(`Just signed transaction has is: ${transactionHash}`);\n\n const rawTx = await web3Read.eth.getTransaction(transactionHash);\n\n console.log(\n 'Found transaction in node: ',\n JSON.stringify(\n rawTx,\n (_, value) =>\n typeof value === 'bigint' ? value.toString() : value,\n 2,\n ),\n );\n\n resolve({\n receiptPromise: promise,\n transactionHash,\n });\n })\n .catch(reject);\n });\n }\n\n public createContract<AbiType extends ContractAbi>(\n abi: any,\n address: string,\n ): Contract<AbiType> {\n return new this.web3.eth.Contract<AbiType>(abi, address);\n }\n}\n","import { OChainId } from '../../common/types/types';\n\n/**\n * Returns the gas multiplier for the given chain ID.\n *\n * @param chainId - Chain ID.\n *\n * @returns Gas multiplier.\n */\nexport function getGasMultiplier(chainId: number): number {\n switch (chainId) {\n case OChainId.ethereum:\n return 1.3;\n case OChainId.holesky:\n return 1.5;\n default:\n return 1.3;\n }\n}\n","import { OChainId, TChainId } from '../types/types';\n\nexport function isValidChain(chainId: number): chainId is TChainId {\n return Object.values(OChainId).includes(chainId as TChainId);\n}\n","import { defaultEnv } from '../common/const';\nimport { OChainId, OEnv, TChainId, TEnv } from '../common/types/types';\n\ntype LbtcTokenConfig = Partial<Record<TChainId, string>>;\n\nconst stageConfig: LbtcTokenConfig = {\n [OChainId.holesky]: '0xED7bfd5C1790576105Af4649817f6d35A75CD818',\n};\n\nconst testnetConfig: LbtcTokenConfig = {\n [OChainId.holesky]: '0x38A13AB20D15ffbE5A7312d2336EF1552580a4E2',\n};\n\nconst prodConfig: LbtcTokenConfig = {\n [OChainId.ethereum]: '0x8236a87084f8b84306f72007f36f2618a5634494',\n};\n\nexport function getLbtcAddressConfig(env: TEnv = defaultEnv): LbtcTokenConfig {\n switch (env) {\n case OEnv.prod:\n return prodConfig;\n case OEnv.testnet:\n return testnetConfig;\n default:\n return stageConfig;\n }\n}\n","import { IERC20, LBTCABI } from '../abi';\n\ntype Token = 'LBTC' | 'ERC20';\n\nexport function getTokenABI(token: Token) {\n switch (token) {\n case 'LBTC':\n return LBTCABI;\n default:\n return IERC20;\n }\n}\n","import { TEnv } from '../../common/types/types';\nimport { isValidChain } from '../../common/utils/isValidChain';\nimport { Provider } from '../../provider';\nimport { getLbtcAddressConfig } from '../lbtcAddressConfig';\nimport { getTokenABI } from './getTokenABI';\n\nexport function getLbtcTokenContract(provider: Provider, env?: TEnv) {\n const lbtcAddressConfig = getLbtcAddressConfig(env);\n const { chainId } = provider;\n\n if (!isValidChain(chainId)) {\n throw new Error(`This chain ${chainId} is not supported`);\n }\n\n const tokenAddress = lbtcAddressConfig[chainId];\n\n if (!tokenAddress) {\n throw new Error(`Token address for chain ${chainId} is not defined`);\n }\n\n const abi = getTokenABI('LBTC');\n\n const contract = provider.createContract(abi, tokenAddress);\n\n if (!contract.options.address) {\n contract.options.address = tokenAddress;\n }\n\n return contract as typeof contract & {\n options: typeof contract.options & { address: string };\n };\n}\n","import { IEnvParam } from '../../common/types/internalTypes';\nimport { toSatoshi } from '../../common/utils/convertSatoshi';\nimport { IWeb3SendResult, Provider } from '../../provider';\nimport { IProviderBasedParams } from '../internalTypes';\nimport { getGasMultiplier } from '../utils/getGasMultiplier';\nimport { getLbtcTokenContract } from '../utils/getLbtcTokenContract';\n\nexport interface IApproveLBTCParams extends IProviderBasedParams, IEnvParam {\n /**\n * Spender address\n */\n spender: string;\n /**\n * The amount of LBTC to approve\n */\n amount: number;\n}\n\n/**\n * Approves the transfer of a specified amount of LBTC tokens.\n *\n * @param {IApproveLBTCParams} params\n *\n * @returns {Promise<IWeb3SendResult>} transaction promise\n */\nexport function approveLBTC({\n spender,\n amount,\n env,\n ...providerParams\n}: IApproveLBTCParams): Promise<IWeb3SendResult> {\n const provider = new Provider(providerParams);\n const tokenContract = getLbtcTokenContract(provider, env);\n const amountSat = toSatoshi(amount);\n\n const tx = tokenContract.methods.approve(spender, amountSat);\n\n return provider.sendTransactionAsync(\n provider.account,\n tokenContract.options.address,\n {\n data: tx.encodeABI(),\n estimate: true,\n estimateFee: true,\n gasLimitMultiplier: getGasMultiplier(provider.chainId),\n },\n );\n}\n","import { IEnvParam } from '../../common/types/internalTypes';\nimport { getErrorMessage } from '../../common/utils/getErrorMessage';\nimport { IWeb3SendResult, Provider } from '../../provider';\nimport { IProviderBasedParams } from '../internalTypes';\nimport { getGasMultiplier } from '../utils/getGasMultiplier';\nimport { getLbtcTokenContract } from '../utils/getLbtcTokenContract';\n\nconst INSUFFICIENT_FUNDS_PARTIAL_ERROR = 'insufficient funds';\nconst INSUFFICIENT_FUNDS_ERROR = 'Insufficient funds for transfer';\n\nexport interface IClaimLBTCParams extends IProviderBasedParams, IEnvParam {\n /**\n * Raw payload from deposit notarization.\n */\n data: string;\n /**\n * Signature from deposit notarization.\n */\n proofSignature: string;\n}\n\n/**\n * Claims LBTC.\n *\n * @param {IClaimLBTCParams} params - The parameters for claiming LBTC.\n *\n * @returns {Promise<IWeb3SendResult>} transaction promise\n */\nexport async function claimLBTC({\n data,\n proofSignature,\n env,\n ...providerParams\n}: IClaimLBTCParams): Promise<IWeb3SendResult> {\n const provider = new Provider(providerParams);\n const tokenContract = getLbtcTokenContract(provider, env);\n\n const tx = tokenContract.methods.mint(data, proofSignature);\n\n try {\n const result = await provider.sendTransactionAsync(\n provider.account,\n tokenContract.options.address,\n {\n data: tx.encodeABI(),\n estimate: true,\n estimateFee: true,\n gasLimitMultiplier: getGasMultiplier(provider.chainId),\n },\n );\n\n return result;\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (errorMessage.includes(INSUFFICIENT_FUNDS_PARTIAL_ERROR)) {\n throw new Error(INSUFFICIENT_FUNDS_ERROR);\n }\n\n throw new Error(errorMessage);\n }\n}\n","import { Provider } from '../../provider';\nimport { IProviderBasedParams } from '../internalTypes';\n\nexport type SignLbtcDestionationAddrParams = IProviderBasedParams;\n\n/**\n * Signs the destination address for the LBTC in active chain\n * in the current account. Signing is necessary for the\n * generation of the deposit address.\n *\n * @param {SignLbtcDestionationAddrParams} params\n *\n * @returns {Promise<string>} The signature of the message.\n */\nexport async function signLbtcDestionationAddr(\n params: SignLbtcDestionationAddrParams,\n): Promise<string> {\n const provider = new Provider(params);\n\n const message = `destination chain id is ${params.chainId}`;\n\n return provider.signMessage(message);\n}\n","import * as ecc from '@bitcoin-js/tiny-secp256k1-asmjs';\nimport {\n address as addressUtils,\n initEccLib,\n networks,\n payments,\n} from 'bitcoinjs-lib';\nimport { OEnv, TEnv } from '../../common/types/types';\n\ninitEccLib(ecc);\n\n/**\n * Get output script from address.\n *\n * @param address - The address.\n * @param networkMode - The network mode.\n *\n * @returns The output script.\n */\nexport function getOutputScript(\n address: string,\n env: TEnv = OEnv.prod,\n): string {\n const paymentType = getPaymentType(address);\n\n const payment = payments[paymentType]({\n address,\n network: env === OEnv.prod ? networks.bitcoin : networks.testnet,\n });\n\n const paymentOutputScript = payment.output?.toString('hex');\n\n if (!paymentOutputScript) {\n throw new Error('Output script is not found.');\n }\n\n return `0x${paymentOutputScript}`;\n}\n\nfunction getPaymentType(address: string): 'p2tr' | 'p2wpkh' {\n const result = addressUtils.fromBech32(address);\n\n const isP2TR = result.version === 1 && result.data.length === 32;\n if (isP2TR) {\n return 'p2tr';\n }\n\n const isP2WPKH = result.version === 0 && result.data.length === 20;\n if (isP2WPKH) {\n return 'p2wpkh';\n }\n\n throw new Error('Payment type is not supported.');\n}\n","import { getOutputScript } from '../../btcSdk/utils/getOutputScript';\nimport { IEnvParam } from '../../common/types/internalTypes';\nimport { toSatoshi } from '../../common/utils/convertSatoshi';\nimport { IWeb3SendResult, Provider } from '../../provider';\nimport { IProviderBasedParams } from '../internalTypes';\nimport { getGasMultiplier } from '../utils/getGasMultiplier';\nimport { getLbtcTokenContract } from '../utils/getLbtcTokenContract';\n\nexport interface IUnstakeLBTCParams extends IProviderBasedParams, IEnvParam {\n /**\n * The BTC address to send the unstaked BTC to.\n */\n btcAddress: string;\n /**\n * The amount of LBTC to unstake.\n */\n amount: number;\n}\n\n/**\n * Unstakes LBTC to the specified BTC address.\n *\n * @param {IUnstakeLBTCParams} params\n *\n * @returns {Promise<IWeb3SendResult>} transaction promise\n */\nexport function unstakeLBTC({\n btcAddress,\n amount,\n env,\n ...providerParams\n}: IUnstakeLBTCParams): Promise<IWeb3SendResult> {\n const provider = new Provider(providerParams);\n const tokenContract = getLbtcTokenContract(provider, env);\n const outputScript = getOutputScript(btcAddress, env);\n\n const amountSat = toSatoshi(amount);\n\n const tx = tokenContract.methods.redeem(outputScript, amountSat);\n\n return provider.sendTransactionAsync(\n provider.account,\n tokenContract.options.address,\n {\n data: tx.encodeABI(),\n estimate: true,\n estimateFee: true,\n gasLimitMultiplier: getGasMultiplier(provider.chainId),\n },\n );\n}\n"],"names":["OEnv","OChainId","defaultEnv","stageConfig","testnetConfig","prodConfig","getApiConfig","env","getErrorMessage","error","getAxiosErrorMessage","getErrorMessageFromObject","OChainName","getChainNameById","chainId","SANCTIONED_ADDRESS","ADDRESS_URL","SANCTIONS_MESSAGE","generateDepositBtcAddress","address","signature","referralId","baseApiUrl","toChain","requestParams","data","axios","errorMsg","isSanctioned","getDepositBtcAddress","addresses","getDepositBtcAddresses","addressData","getActualAddress","actualAddress","acc","toBlockchain","requestrParams","BTC_DECIMALS","SATOSHI_SCALE","fromSatoshi","amount","toSatoshi","getCainIdByName","chain","getDepositsByAddress","mapResponse","demoDepositsByAddress","getLBTCExchageRate","chainIdName","rpcUrlConfig","getMaxPriorityFeePerGas","rpcUrl","convertedHexValue","Web3","BigNumber","FEE_MULTIPLIER","ADDITIONAL_SAFE_GAS_PRICE_WEI","ReadProvider","__publicField","defaultRpcUrlConfig","readWeb3","provider","_a","web3","block","maxPriorityFeePerGas","pureGasPriceWei","abi","Provider","account","message","messageHex","from","to","sendOptions","web3Write","web3Read","estimate","estimateFee","extendedGasLimit","gasLimit","value","gasLimitMultiplier","nonce","tx","utils","estimatedGas","multipliedGasLimit","e","maxFeePerGas","safeGasPrice","resolve","reject","promise","transactionHash","rawTx","_","getGasMultiplier","isValidChain","getLbtcAddressConfig","getTokenABI","token","LBTCABI","IERC20","getLbtcTokenContract","lbtcAddressConfig","tokenAddress","contract","approveLBTC","spender","providerParams","tokenContract","amountSat","INSUFFICIENT_FUNDS_PARTIAL_ERROR","INSUFFICIENT_FUNDS_ERROR","claimLBTC","proofSignature","errorMessage","signLbtcDestionationAddr","params","initEccLib","ecc","getOutputScript","paymentType","getPaymentType","paymentOutputScript","payments","networks","result","addressUtils","unstakeLBTC","btcAddress","outputScript"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtBO,SAASkG,GAAYC,GAAc;AACxC,UAAQA,GAAO;AAAA,IACb,KAAK;AACI,aAAAC;AAAA,IACT;AACS,aAAAC;AAAA,EACX;AACF;ACLgB,SAAAC,EAAqB3C,GAAoBvD,GAAY;AAC7D,QAAAmG,IAAoBN,GAAqB7F,CAAG,GAC5C,EAAE,SAAAO,EAAY,IAAAgD;AAEhB,MAAA,CAACqC,GAAarF,CAAO;AACvB,UAAM,IAAI,MAAM,cAAcA,CAAO,mBAAmB;AAGpD,QAAA6F,IAAeD,EAAkB5F,CAAO;AAE9C,MAAI,CAAC6F;AACH,UAAM,IAAI,MAAM,2BAA2B7F,CAAO,iBAAiB;AAG/D,QAAAsD,IAAMiC,GAAY,MAAM,GAExBO,IAAW9C,EAAS,eAAeM,GAAKuC,CAAY;AAEtD,SAACC,EAAS,QAAQ,YACpBA,EAAS,QAAQ,UAAUD,IAGtBC;AAGT;ACNO,SAASC,GAAY;AAAA,EAC1B,SAAAC;AAAA,EACA,QAAArE;AAAA,EACA,KAAAlC;AAAA,EACA,GAAGwG;AACL,GAAiD;AACzC,QAAAjD,IAAW,IAAIO,EAAS0C,CAAc,GACtCC,IAAgBP,EAAqB3C,GAAUvD,CAAG,GAClD0G,IAAYvE,EAAUD,CAAM,GAE5B4C,IAAK2B,EAAc,QAAQ,QAAQF,GAASG,CAAS;AAE3D,SAAOnD,EAAS;AAAA,IACdA,EAAS;AAAA,IACTkD,EAAc,QAAQ;AAAA,IACtB;AAAA,MACE,MAAM3B,EAAG,UAAU;AAAA,MACnB,UAAU;AAAA,MACV,aAAa;AAAA,MACb,oBAAoBa,EAAiBpC,EAAS,OAAO;AAAA,IACvD;AAAA,EAAA;AAEJ;ACxCA,MAAMoD,KAAmC,sBACnCC,KAA2B;AAoBjC,eAAsBC,GAAU;AAAA,EAC9B,MAAA3F;AAAA,EACA,gBAAA4F;AAAA,EACA,KAAA9G;AAAA,EACA,GAAGwG;AACL,GAA+C;AACvC,QAAAjD,IAAW,IAAIO,EAAS0C,CAAc,GACtCC,IAAgBP,EAAqB3C,GAAUvD,CAAG,GAElD8E,IAAK2B,EAAc,QAAQ,KAAKvF,GAAM4F,CAAc;AAEtD,MAAA;AAYK,WAXQ,MAAMvD,EAAS;AAAA,MAC5BA,EAAS;AAAA,MACTkD,EAAc,QAAQ;AAAA,MACtB;AAAA,QACE,MAAM3B,EAAG,UAAU;AAAA,QACnB,UAAU;AAAA,QACV,aAAa;AAAA,QACb,oBAAoBa,EAAiBpC,EAAS,OAAO;AAAA,MACvD;AAAA,IAAA;AAAA,WAIKrD,GAAO;AACR,UAAA6G,IAAe9G,EAAgBC,CAAK;AAEtC,UAAA6G,EAAa,SAASJ,EAAgC,IAClD,IAAI,MAAMC,EAAwB,IAGpC,IAAI,MAAMG,CAAY;AAAA,EAC9B;AACF;AC/CA,eAAsBC,GACpBC,GACiB;AACX,QAAA1D,IAAW,IAAIO,EAASmD,CAAM,GAE9BjD,IAAU,2BAA2BiD,EAAO,OAAO;AAElD,SAAA1D,EAAS,YAAYS,CAAO;AACrC;ACbAkD,EAAWC,CAAG;AAUP,SAASC,GACdxG,GACAZ,IAAYP,EAAK,MACT;;AACF,QAAA4H,IAAcC,GAAe1G,CAAO,GAOpC2G,KAAsB/D,IALZgE,EAASH,CAAW,EAAE;AAAA,IACpC,SAAAzG;AAAA,IACA,SAASZ,MAAQP,EAAK,OAAOgI,EAAS,UAAUA,EAAS;AAAA,EAAA,CAC1D,EAEmC,WAAR,gBAAAjE,EAAgB,SAAS;AAErD,MAAI,CAAC+D;AACG,UAAA,IAAI,MAAM,6BAA6B;AAG/C,SAAO,KAAKA,CAAmB;AACjC;AAEA,SAASD,GAAe1G,GAAoC;AACpD,QAAA8G,IAASC,EAAa,WAAW/G,CAAO;AAG9C,MADe8G,EAAO,YAAY,KAAKA,EAAO,KAAK,WAAW;AAErD,WAAA;AAIT,MADiBA,EAAO,YAAY,KAAKA,EAAO,KAAK,WAAW;AAEvD,WAAA;AAGH,QAAA,IAAI,MAAM,gCAAgC;AAClD;AC3BO,SAASE,GAAY;AAAA,EAC1B,YAAAC;AAAA,EACA,QAAA3F;AAAA,EACA,KAAAlC;AAAA,EACA,GAAGwG;AACL,GAAiD;AACzC,QAAAjD,IAAW,IAAIO,EAAS0C,CAAc,GACtCC,IAAgBP,EAAqB3C,GAAUvD,CAAG,GAClD8H,IAAeV,GAAgBS,GAAY7H,CAAG,GAE9C0G,IAAYvE,EAAUD,CAAM,GAE5B4C,IAAK2B,EAAc,QAAQ,OAAOqB,GAAcpB,CAAS;AAE/D,SAAOnD,EAAS;AAAA,IACdA,EAAS;AAAA,IACTkD,EAAc,QAAQ;AAAA,IACtB;AAAA,MACE,MAAM3B,EAAG,UAAU;AAAA,MACnB,UAAU;AAAA,MACV,aAAa;AAAA,MACb,oBAAoBa,EAAiBpC,EAAS,OAAO;AAAA,IACvD;AAAA,EAAA;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/common/types/types.ts","../src/common/const.ts","../src/sdk/apiConfig.ts","../src/common/utils/getErrorMessage.ts","../src/sdk/internalTypes.ts","../src/sdk/utils/getChainNameById.ts","../src/sdk/generateDepositBtcAddress/generateDepositBtcAddress.ts","../src/sdk/getDepositBtcAddress/getDepositBtcAddress.ts","../src/common/utils/convertSatoshi.ts","../src/sdk/utils/getCainIdByName.ts","../src/sdk/getDepositsByAddress/getDepositsByAddress.ts","../src/sdk/getLBTCExchageRate/getLBTCExchageRate.ts","../src/provider/rpcUrlConfig.ts","../src/provider/utils/getMaxPriorityFeePerGas.ts","../src/provider/ReadProvider.ts","../src/provider/Provider.ts","../src/web3Sdk/utils/getGasMultiplier.ts","../src/common/utils/isValidChain.ts","../src/web3Sdk/lbtcAddressConfig.ts","../src/web3Sdk/utils/getTokenABI.ts","../src/web3Sdk/utils/getLbtcTokenContract.ts","../src/web3Sdk/approveLBTC/approveLBTC.ts","../src/web3Sdk/claimLBTC/claimLBTC.ts","../src/web3Sdk/signLbtcDestionationAddr/signLbtcDestionationAddr.ts","../src/btcSdk/utils/getOutputScript.ts","../src/web3Sdk/unstakeLBTC/unstakeLBTC.ts"],"sourcesContent":["export const OEnv = {\n prod: 'prod',\n testnet: 'testnet',\n stage: 'stage',\n} as const;\n\nexport type TEnv = (typeof OEnv)[keyof typeof OEnv];\n\nexport const OChainId = {\n ethereum: 1,\n holesky: 17000,\n} as const;\n\nexport type TChainId = (typeof OChainId)[keyof typeof OChainId];\n\n/**\n * Abstract EIP-1193 provider\n */\nexport interface IEIP1193Provider {\n request: (args: any) => Promise<any>;\n}\n","import { OEnv, TEnv } from './types/types';\n\nexport const defaultEnv: TEnv = OEnv.prod;\n\n/**\n * Address of the zero account.\n * Can also be used as a placeholder for unknown addresses.\n */\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n","import { defaultEnv } from '../common/const';\nimport { OEnv, TEnv } from '../common/types/types';\n\ninterface IApiConfig {\n baseApiUrl: string;\n}\n\nconst stageConfig: IApiConfig = {\n baseApiUrl: 'https://staging.prod.lombard.finance',\n};\n\nconst testnetConfig: IApiConfig = {\n baseApiUrl: 'https://gastald-testnet.prod.lombard.finance',\n};\n\nconst prodConfig: IApiConfig = {\n baseApiUrl: 'https://mainnet.prod.lombard.finance',\n};\n\nexport const getApiConfig = (env: TEnv = defaultEnv): IApiConfig => {\n switch (env) {\n case OEnv.prod:\n return prodConfig;\n case OEnv.testnet:\n return testnetConfig;\n default:\n return stageConfig;\n }\n};\n","import { AxiosError } from 'axios';\n\n/**\n * Retrieves the error message from the given error object.\n *\n * @param error - The error object.\n * @returns The error message as a string.\n */\nexport function getErrorMessage(error: unknown): string {\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return getAxiosErrorMessage(error as AxiosError);\n }\n\n return getErrorMessageFromObject(error);\n}\n\nfunction getAxiosErrorMessage(error: AxiosError): string {\n if (error.response) {\n return (error.response.data as { message: string }).message;\n }\n\n return error.message;\n}\n\nfunction getErrorMessageFromObject(error: any): string {\n if (error?.message) {\n return error.message;\n }\n\n return 'Unknown error';\n}\n","export const OChainName = {\n eth: 'DESTINATION_BLOCKCHAIN_ETHEREUM',\n} as const;\n\nexport type TChainName = (typeof OChainName)[keyof typeof OChainName];\n","import { OChainId, TChainId } from '../../common/types/types';\nimport { OChainName, TChainName } from '../internalTypes';\n\n/**\n * @param chainId the chain ID\n *\n * @returns the chain name\n */\nexport function getChainNameById(chainId: TChainId): TChainName {\n switch (chainId) {\n case OChainId.holesky:\n case OChainId.ethereum:\n return OChainName.eth;\n default:\n throw new Error(`Unknown chain ID: ${chainId}`);\n }\n}\n","import axios from 'axios';\nimport { IEnvParam } from '../../common/types/internalTypes';\nimport { TChainId } from '../../common/types/types';\nimport { getErrorMessage } from '../../common/utils/getErrorMessage';\nimport { getApiConfig } from '../apiConfig';\nimport { getChainNameById } from '../utils/getChainNameById';\n\n/**\n * The address wich will be returned if the provided EVM address is sanctioned.\n */\nexport const SANCTIONED_ADDRESS = 'sanctioned_address';\nconst ADDRESS_URL = 'api/v1/address/generate';\nconst SANCTIONS_MESSAGE = 'destination address is under sanctions';\n\ninterface IGenerateNewAddressResponse {\n address: string;\n}\n\nexport interface IGenerateDepositBtcAddressParams extends IEnvParam {\n /**\n * The destination EVM user address where LBTC will be claimed.\n */\n address: string;\n /**\n * The destination chain ID where LBTC will be claimed.\n */\n chainId: TChainId;\n /**\n * The signature of the address. The signature is generated by signing the address using EVM wallet.\n */\n signature: string;\n /**\n * The referral ID.\n */\n referralId: string;\n}\n\n/**\n * Generates a BTC deposit address.\n *\n * If the provided EVM address is sanctioned, the function will return the `SANCTIONED_ADDRESS`.\n *\n * @param {IGenerateDepositBtcAddressParams} params - The parameters for generating the deposit address.\n * @returns {Promise<string>} The generated deposit address.\n */\nexport async function generateDepositBtcAddress({\n address,\n chainId,\n signature,\n referralId,\n env,\n}: IGenerateDepositBtcAddressParams): Promise<string> {\n const { baseApiUrl } = getApiConfig(env);\n const toChain = getChainNameById(chainId);\n\n const requestParams = {\n to_address: address,\n to_address_signature: signature,\n to_chain: toChain,\n referral_id: referralId,\n nonce: 0,\n };\n\n try {\n const { data } = await axios.post<IGenerateNewAddressResponse>(\n ADDRESS_URL,\n requestParams,\n { baseURL: baseApiUrl },\n );\n\n return data.address;\n } catch (error) {\n const errorMsg = getErrorMessage(error);\n\n if (isSanctioned(errorMsg)) {\n return SANCTIONED_ADDRESS;\n } else {\n throw new Error(errorMsg);\n }\n }\n}\n\nfunction isSanctioned(errorMsg: string): boolean {\n return !!errorMsg.includes(SANCTIONS_MESSAGE);\n}\n","import axios from 'axios';\nimport { IEnvParam } from '../../common/types/internalTypes';\nimport { TChainId } from '../../common/types/types';\nimport { getApiConfig } from '../apiConfig';\nimport { TChainName } from '../internalTypes';\nimport { getChainNameById } from '../utils/getChainNameById';\n\nconst ADDRESS_URL = 'api/v1/address';\n\ninterface IDepositAddress {\n btc_address: string;\n created_at: string;\n deprecated?: boolean;\n type: string;\n used?: boolean;\n deposit_metadata: {\n to_address: string;\n to_blockchain: TChainName;\n };\n}\n\ninterface IDepositAddressesResponse {\n addresses: IDepositAddress[];\n has_more?: boolean;\n}\n\nexport interface IGetDepositBtcAddressParams extends IEnvParam {\n /**\n * The destination EVM user address where LBTC will be claimed.\n */\n address: string;\n /**\n * The destination chain ID where LBTC will be claimed.\n */\n chainId: TChainId;\n /**\n * The referral ID.\n */\n referralId: string;\n}\n\n/**\n * Returns the address for depositing BTC.\n *\n * @param {IGetDepositBtcAddressParams} params - function parameters\n *\n * @returns {Promise<string>} the address for depositing BTC\n */\nexport async function getDepositBtcAddress({\n address,\n chainId,\n env,\n referralId,\n}: IGetDepositBtcAddressParams): Promise<string> {\n const addresses = await getDepositBtcAddresses({\n address,\n chainId,\n env,\n referralId,\n });\n\n const addressData = getActualAddress(addresses);\n\n if (!addressData) {\n throw new Error('No address');\n }\n\n return addressData.btc_address;\n}\n\n/**\n * Retrieves the actual deposit address from a list of deposit addresses.\n *\n * @param addresses - The list of deposit addresses.\n * @returns The actual deposit address or undefined if the last created address is deprecated.\n */\nfunction getActualAddress(\n addresses: IDepositAddress[],\n): IDepositAddress | undefined {\n const actualAddress = addresses.reduce((acc, address) => {\n if (acc.created_at < address.created_at) {\n return address;\n }\n return acc;\n });\n\n return actualAddress.deprecated ? undefined : actualAddress;\n}\n\n/**\n * Returns the addresses for depositing BTC.\n *\n * @param {IGetDepositBtcAddressParams} params - function parameters\n *\n * @returns {Promise<IDepositAddress[]>} the deposit addresses\n */\nexport async function getDepositBtcAddresses({\n address,\n chainId,\n env,\n referralId,\n}: IGetDepositBtcAddressParams): Promise<IDepositAddress[]> {\n const { baseApiUrl } = getApiConfig(env);\n const toBlockchain = getChainNameById(chainId);\n\n const requestrParams = {\n to_address: address,\n to_blockchain: toBlockchain,\n limit: 1,\n offset: 0,\n asc: false,\n referral_id: referralId,\n };\n\n const { data } = await axios.get<IDepositAddressesResponse>(ADDRESS_URL, {\n baseURL: baseApiUrl,\n params: requestrParams,\n });\n\n return data?.addresses || [];\n}\n","const BTC_DECIMALS = 8;\nconst SATOSHI_SCALE = 10 ** BTC_DECIMALS;\n\n/**\n * Convert Satoshi to BTC\n * @param amount - Satoshi amount\n * @returns BTC amount\n */\nexport function fromSatoshi(amount: number | string) {\n return +amount / SATOSHI_SCALE;\n}\n\n/**\n * Convert BTC to Satoshi\n *\n * @param amount - BTC amount\n * @returns Satoshi amount\n */\nexport function toSatoshi(amount: number | string) {\n return Math.floor(+amount * SATOSHI_SCALE);\n}\n","import { defaultEnv } from '../../common/const';\nimport { OChainId, OEnv, TChainId, TEnv } from '../../common/types/types';\nimport { TChainName } from '../internalTypes';\n\n/**\n * @param chainId the chain ID\n *\n * @returns the chain name\n */\nexport function getCainIdByName(\n chain: string,\n env: TEnv = defaultEnv,\n): TChainId {\n switch (chain as TChainName) {\n case 'DESTINATION_BLOCKCHAIN_ETHEREUM':\n return env === OEnv.prod ? OChainId.ethereum : OChainId.holesky;\n\n default:\n return OChainId.ethereum;\n }\n}\n","import axios from 'axios';\nimport { IEnvParam } from '../../common/types/internalTypes';\nimport { OChainId, TChainId, TEnv } from '../../common/types/types';\nimport { fromSatoshi } from '../../common/utils/convertSatoshi';\nimport { getApiConfig } from '../apiConfig';\nimport { getCainIdByName } from '../utils/getCainIdByName';\n\ntype Address = string;\n\ninterface IDepositResponse {\n txid: string;\n index?: number;\n block_height?: string;\n block_time?: string;\n value: number;\n address: Address;\n to_chain: string;\n claim_tx?: string;\n raw_payload: string;\n payload: string;\n signature: string;\n sanctioned?: boolean;\n}\n\ninterface IDepositsByAddressResponse {\n outputs: IDepositResponse[];\n}\n\nexport interface IDeposit {\n txid: string;\n index?: number;\n blockHeight?: number;\n blockTime?: number;\n value: number;\n address: Address;\n chainId: TChainId;\n isClaimed: boolean;\n rawPayload?: string;\n signature?: string;\n isRestricted?: boolean;\n}\n\nexport interface IGetDepositsByAddressParams extends IEnvParam {\n /**\n * The EVM address to get deposits for\n */\n address: Address;\n}\n\n/**\n * Returns all deposits for a given address\n *\n * @param {IGetDepositsByAddressParams} params\n *\n * @returns {Promise<IDeposit[]>} a list of deposits\n */\nexport async function getDepositsByAddress({\n address,\n env,\n}: IGetDepositsByAddressParams): Promise<IDeposit[]> {\n const { baseApiUrl } = getApiConfig(env);\n\n const { data } = await axios.get<IDepositsByAddressResponse | undefined>(\n `api/v1/address/outputs/${address}`,\n { baseURL: baseApiUrl },\n );\n\n const outputs = data?.outputs ?? [];\n\n return outputs.map(mapResponse(env));\n}\n\nfunction mapResponse(env?: TEnv) {\n return (data: IDepositResponse): IDeposit => ({\n txid: data.txid,\n index: data.index ?? 0,\n blockHeight: data.block_height ? Number(data.block_height) : undefined,\n blockTime: data.block_time ? Number(data.block_time) : undefined,\n value: fromSatoshi(data.value),\n address: data.address,\n chainId: getCainIdByName(data.to_chain, env),\n // todo: return claiming tx from the API when it's available\n isClaimed: !!data.claim_tx,\n rawPayload: data.raw_payload,\n signature: data.signature,\n isRestricted: !!data.sanctioned,\n });\n}\n\nexport const demoDepositsByAddress: IDeposit[] = [\n {\n txid: 'txid0',\n index: 0,\n blockHeight: 100,\n blockTime: 1715964690,\n value: 0.2,\n address: 'address0',\n chainId: OChainId.holesky,\n isClaimed: false,\n rawPayload: 'rawPayload0',\n signature: 'signature0',\n },\n {\n txid: 'dasjmnkosdfjnkdsgjnk',\n index: 0,\n blockHeight: 110,\n blockTime: 1715964690,\n value: 0.3,\n address: 'adslhjnkbsfdahbk',\n chainId: OChainId.holesky,\n isClaimed: false,\n rawPayload: 'rawPayload0',\n signature: 'signature0',\n },\n {\n txid: '0xfsmkfdskm',\n index: 0,\n blockHeight: 102,\n blockTime: 1715964690,\n value: 0.55,\n address: 'dgfgfasd',\n chainId: OChainId.holesky,\n isClaimed: false,\n },\n {\n txid: 'kmgnjkofejnadwnjdasljmnkjgsdklmn',\n index: 0,\n blockHeight: 102,\n blockTime: 1715964691,\n value: 0.77,\n address: 'hgjhyewadwss',\n chainId: OChainId.holesky,\n isClaimed: false,\n isRestricted: true,\n },\n {\n txid: 'f6b6d0e1e77df21e406bd730c32b05c3fae8296491a1d946925eff07d02d5825',\n index: 1,\n blockHeight: 100,\n blockTime: 1715789138,\n value: 0.2,\n address: 'address1',\n chainId: OChainId.holesky,\n isClaimed: true,\n rawPayload: 'rawPayload1',\n signature: 'signature1',\n },\n];\n","import axios from 'axios';\nimport { IEnvParam } from '../../common/types/internalTypes';\nimport { TChainId } from '../../common/types/types';\nimport { getApiConfig } from '../apiConfig';\nimport { getChainNameById } from '../utils/getChainNameById';\n\ntype ExchangeRateResponse = {\n amount_out: string;\n};\n\nexport interface IGetLBTCExchageRateParams extends IEnvParam {\n /**\n * The chain id of the asset to get the exchange rate for\n */\n chainId: TChainId;\n /**\n * The amount of the asset to get the exchange rate for\n */\n amount: number;\n}\n\n/**\n * Retrieves the exchange rate for LBTC.\n *\n * @param {IGetLBTCExchageRateParams} params\n *\n * @returns {Promise<string>} - The exchange rate.\n */\nexport async function getLBTCExchageRate({\n env,\n chainId,\n amount,\n}: IGetLBTCExchageRateParams): Promise<string> {\n const { baseApiUrl } = getApiConfig(env);\n const chainIdName = getChainNameById(chainId);\n\n const { data } = await axios.get<ExchangeRateResponse>(\n `api/v1/exchange/rate/${chainIdName}`,\n { baseURL: baseApiUrl, params: { amount } },\n );\n\n return data.amount_out;\n}\n","import { OChainId } from '../common/types/types';\n\nexport type TRpcUrlConfig = Record<number, string>;\n\nexport const rpcUrlConfig: TRpcUrlConfig = {\n [OChainId.ethereum]: 'https://ethereum-rpc.publicnode.com',\n [OChainId.holesky]: 'https://ethereum-holesky-rpc.publicnode.com',\n};\n","import BigNumber from 'bignumber.js';\nimport Web3 from 'web3';\n\nexport async function getMaxPriorityFeePerGas(\n rpcUrl: string,\n): Promise<BigNumber> {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_maxPriorityFeePerGas',\n params: [],\n }),\n });\n\n const data = await response.json();\n\n const convertedHexValue = Web3.utils.hexToNumber(data?.result);\n\n return new BigNumber(Number(convertedHexValue));\n}\n","import BigNumber from 'bignumber.js';\nimport Web3, { Contract, ContractAbi } from 'web3';\nimport {\n TRpcUrlConfig,\n rpcUrlConfig as defaultRpcUrlConfig,\n} from './rpcUrlConfig';\nimport { IGetMaxFeesResult } from './types';\nimport { getMaxPriorityFeePerGas } from './utils/getMaxPriorityFeePerGas';\n\nconst FEE_MULTIPLIER = 2;\nconst ADDITIONAL_SAFE_GAS_PRICE_WEI = 25_000;\n\nexport interface IReadProviderParams {\n /**\n * Chain ID of the network to interact with.\n */\n chainId: number;\n /**\n * The RPC URL configuration. If not provided, the default configuration will be used.\n */\n rpcUrlConfig?: TRpcUrlConfig;\n}\n\nexport class ReadProvider {\n chainId: number;\n rpcConfig: TRpcUrlConfig;\n\n constructor({ chainId, rpcUrlConfig }: IReadProviderParams) {\n this.chainId = chainId;\n this.rpcConfig = { ...defaultRpcUrlConfig, ...rpcUrlConfig };\n }\n\n /**\n * Returns web3 instance for read operations.\n *\n * @public\n * @returns {Web3} Web3 instance.\n */\n public getReadWeb3(): Web3 {\n const rpcUrl = this.getRpcUrl();\n const readWeb3 = new Web3();\n const provider = new Web3.providers.HttpProvider(rpcUrl);\n readWeb3.setProvider(provider);\n return readWeb3;\n }\n\n /**\n * Retrieves the RPC URL based on the current chain ID.\n * @returns The RPC URL for the current chain ID.\n * @throws Error if the RPC URL for the current chain ID is not found.\n */\n getRpcUrl(): string {\n const { chainId } = this;\n const rpcUrl = this.rpcConfig?.[chainId];\n\n if (!rpcUrl) {\n console.error(\n `You might need to add the rpcConfig for the ${chainId} chain ID when creating the provider.`,\n );\n throw new Error(`RPC URL for chainId ${chainId} not found`);\n }\n\n return rpcUrl;\n }\n\n /**\n * Calculates max fees for transaction. Thess values are available for networks\n * with EIP-1559 support.\n *\n * @public\n * @note If current network is Binance Smart Chain, will return default values.\n * @returns {Promise<IGetMaxFeesResult>} Max fees for transaction.\n */\n public async getMaxFees(): Promise<IGetMaxFeesResult> {\n const web3 = this.getReadWeb3();\n const rpcUrl = this.getRpcUrl();\n\n const [block, maxPriorityFeePerGas] = await Promise.all([\n web3.eth.getBlock('latest'),\n getMaxPriorityFeePerGas(rpcUrl),\n ]);\n\n if (!block?.baseFeePerGas && typeof block?.baseFeePerGas !== 'bigint') {\n return {};\n }\n\n const maxFeePerGas = new BigNumber(block.baseFeePerGas.toString(10))\n .multipliedBy(FEE_MULTIPLIER)\n .plus(maxPriorityFeePerGas);\n\n return {\n maxFeePerGas: +maxFeePerGas,\n maxPriorityFeePerGas: +maxPriorityFeePerGas,\n };\n }\n\n /**\n * Returns safe gas price for transaction.\n *\n * @public\n * @returns {Promise<BigNumber>} Safe gas price.\n */\n public async getSafeGasPriceWei(): Promise<BigNumber> {\n const pureGasPriceWei = await this.getReadWeb3().eth.getGasPrice();\n\n return new BigNumber(pureGasPriceWei.toString(10)).plus(\n ADDITIONAL_SAFE_GAS_PRICE_WEI,\n );\n }\n\n /**\n * Creates a contract instance with the given ABI and address.\n *\n * @template AbiType - The type of the contract ABI.\n * @param {any} abi - The ABI of the contract.\n * @param {string} address - The address of the contract.\n * @returns {Contract<AbiType>} The contract instance.\n */\n public createContract<AbiType extends ContractAbi>(\n abi: any,\n address: string,\n ): Contract<AbiType> {\n const web3 = this.getReadWeb3();\n return new web3.eth.Contract<AbiType>(abi, address);\n }\n}\n","import Web3, { Contract, ContractAbi, Transaction, utils } from 'web3';\nimport { IEIP1193Provider } from '../common/types/types';\nimport { IReadProviderParams, ReadProvider } from './ReadProvider';\nimport {\n TRpcUrlConfig,\n rpcUrlConfig as defaultRpcUrlConfig,\n} from './rpcUrlConfig';\nimport { ISendOptions, IWeb3SendResult } from './types';\n\nexport interface IProviderParams extends IReadProviderParams {\n /**\n * The EIP-1193 provider instance.\n */\n provider: IEIP1193Provider;\n /**\n * The сurrent account address.\n */\n account: string;\n}\n\n/**\n * Provider for interacting with a blockchain network.\n */\nexport class Provider extends ReadProvider {\n web3: Web3;\n account: string;\n rpcConfig: TRpcUrlConfig;\n\n constructor({ provider, account, chainId, rpcUrlConfig }: IProviderParams) {\n super({ chainId, rpcUrlConfig });\n this.web3 = new Web3(provider);\n this.account = account;\n this.chainId = chainId;\n this.rpcConfig = { ...defaultRpcUrlConfig, ...rpcUrlConfig };\n }\n\n /**\n * Signs a message using the current provider and account.\n * @public\n * @param message - The message to be signed.\n * @returns A promise that resolves to the signed message as a string.\n */\n public async signMessage(message: string): Promise<string> {\n const { account } = this;\n\n const messageHex = `0x${Buffer.from(message, 'utf8').toString('hex')}`;\n\n const ethereum = this.web3.currentProvider as any;\n\n return ethereum.request({\n method: 'personal_sign',\n params: [messageHex, account],\n });\n }\n\n /**\n * Custom replacement for web3js [send](https://docs.web3js.org/libdocs/Contract#send).\n *\n * @public\n * @param {string} from - Address of the sender.\n * @param {string} to - Address of the recipient.\n * @param {ISendOptions} sendOptions - Options for sending transaction.\n * @returns {Promise<IWeb3SendResult>} Promise with transaction hash and receipt promise.\n */\n public async sendTransactionAsync(\n from: string,\n to: string,\n sendOptions: ISendOptions,\n ): Promise<IWeb3SendResult> {\n const { chainId, web3: web3Write } = this;\n const web3Read = this.getReadWeb3();\n\n const {\n data,\n estimate = false,\n estimateFee = false,\n extendedGasLimit,\n gasLimit = '0',\n value = '0',\n gasLimitMultiplier = 1,\n } = sendOptions;\n let { nonce } = sendOptions;\n\n if (!nonce) {\n nonce = await web3Read.eth.getTransactionCount(from);\n }\n\n console.log(`Nonce: ${nonce}`);\n\n const tx: Transaction = {\n from,\n to,\n value: utils.numberToHex(value),\n gas: utils.numberToHex(gasLimit),\n data,\n nonce,\n chainId: utils.numberToHex(chainId),\n };\n\n if (estimate) {\n try {\n const estimatedGas = await web3Read.eth.estimateGas(tx);\n const multipliedGasLimit = Math.round(\n Number(estimatedGas) * gasLimitMultiplier,\n );\n\n if (extendedGasLimit) {\n tx.gas = utils.numberToHex(multipliedGasLimit + extendedGasLimit);\n } else {\n tx.gas = utils.numberToHex(multipliedGasLimit);\n }\n } catch (e) {\n throw new Error(\n (e as Partial<Error>).message ??\n 'Failed to estimate gas limit for transaction.',\n );\n }\n }\n\n const { maxFeePerGas, maxPriorityFeePerGas } = estimateFee\n ? await this.getMaxFees().catch(() => sendOptions)\n : sendOptions;\n\n if (maxPriorityFeePerGas !== undefined) {\n tx.maxPriorityFeePerGas = utils.numberToHex(maxPriorityFeePerGas);\n }\n\n if (maxFeePerGas !== undefined) {\n tx.maxFeePerGas = utils.numberToHex(maxFeePerGas);\n }\n\n if (!tx.maxFeePerGas && !tx.maxPriorityFeePerGas) {\n const safeGasPrice = await this.getSafeGasPriceWei();\n tx.gasPrice = safeGasPrice.toString(10);\n }\n\n if (!tx.maxFeePerGas && !tx.maxPriorityFeePerGas) {\n const safeGasPrice = await this.getSafeGasPriceWei();\n tx.gasPrice = safeGasPrice.toString(10);\n }\n\n console.log('Sending transaction via Web3: ', tx);\n\n return new Promise((resolve, reject) => {\n const promise = web3Write.eth.sendTransaction(tx);\n\n promise\n .once('transactionHash', async (transactionHash: string) => {\n console.log(`Just signed transaction has is: ${transactionHash}`);\n\n resolve({\n receiptPromise: promise,\n transactionHash,\n });\n })\n .catch(reject);\n });\n }\n\n public createContract<AbiType extends ContractAbi>(\n abi: any,\n address: string,\n ): Contract<AbiType> {\n return new this.web3.eth.Contract<AbiType>(abi, address);\n }\n}\n","import { OChainId } from '../../common/types/types';\n\n/**\n * Returns the gas multiplier for the given chain ID.\n *\n * @param chainId - Chain ID.\n *\n * @returns Gas multiplier.\n */\nexport function getGasMultiplier(chainId: number): number {\n switch (chainId) {\n case OChainId.ethereum:\n return 1.3;\n case OChainId.holesky:\n return 1.5;\n default:\n return 1.3;\n }\n}\n","import { OChainId, TChainId } from '../types/types';\n\nexport function isValidChain(chainId: number): chainId is TChainId {\n return Object.values(OChainId).includes(chainId as TChainId);\n}\n","import {\n defaultEnv,\n ZERO_ADDRESS as PLACEHOLDER_ADDRESS,\n} from '../common/const';\nimport { OChainId, OEnv, TChainId, TEnv } from '../common/types/types';\n\ntype LbtcTokenConfig = Record<TChainId, string>;\n\nconst stageConfig: LbtcTokenConfig = {\n [OChainId.holesky]: '0xED7bfd5C1790576105Af4649817f6d35A75CD818',\n [OChainId.ethereum]: PLACEHOLDER_ADDRESS,\n};\n\nconst testnetConfig: LbtcTokenConfig = {\n [OChainId.holesky]: '0x38A13AB20D15ffbE5A7312d2336EF1552580a4E2',\n [OChainId.ethereum]: PLACEHOLDER_ADDRESS,\n};\n\nconst prodConfig: LbtcTokenConfig = {\n [OChainId.holesky]: PLACEHOLDER_ADDRESS,\n [OChainId.ethereum]: '0x8236a87084f8b84306f72007f36f2618a5634494',\n};\n\nexport function getLbtcAddressConfig(env: TEnv = defaultEnv): LbtcTokenConfig {\n switch (env) {\n case OEnv.prod:\n return prodConfig;\n case OEnv.testnet:\n return testnetConfig;\n default:\n return stageConfig;\n }\n}\n","import { IERC20, LBTCABI } from '../abi';\n\ntype Token = 'LBTC' | 'ERC20';\n\nexport function getTokenABI(token: Token) {\n switch (token) {\n case 'LBTC':\n return LBTCABI;\n default:\n return IERC20;\n }\n}\n","import { TEnv } from '../../common/types/types';\nimport { isValidChain } from '../../common/utils/isValidChain';\nimport { Provider } from '../../provider';\nimport { getLbtcAddressConfig } from '../lbtcAddressConfig';\nimport { getTokenABI } from './getTokenABI';\n\nexport function getLbtcTokenContract(provider: Provider, env?: TEnv) {\n const lbtcAddressConfig = getLbtcAddressConfig(env);\n const { chainId } = provider;\n\n if (!isValidChain(chainId)) {\n throw new Error(`This chain ${chainId} is not supported`);\n }\n\n const tokenAddress = lbtcAddressConfig[chainId];\n\n if (!tokenAddress) {\n throw new Error(`Token address for chain ${chainId} is not defined`);\n }\n\n const abi = getTokenABI('LBTC');\n\n const contract = provider.createContract(abi, tokenAddress);\n\n if (!contract.options.address) {\n contract.options.address = tokenAddress;\n }\n\n return contract as typeof contract & {\n options: typeof contract.options & { address: string };\n };\n}\n","import { IEnvParam } from '../../common/types/internalTypes';\nimport { toSatoshi } from '../../common/utils/convertSatoshi';\nimport { IWeb3SendResult, Provider } from '../../provider';\nimport { IProviderBasedParams } from '../types';\nimport { getGasMultiplier } from '../utils/getGasMultiplier';\nimport { getLbtcTokenContract } from '../utils/getLbtcTokenContract';\n\nexport interface IApproveLBTCParams extends IProviderBasedParams, IEnvParam {\n /**\n * Spender address\n */\n spender: string;\n /**\n * The amount of LBTC to approve\n */\n amount: number;\n}\n\n/**\n * Approves the transfer of a specified amount of LBTC tokens.\n *\n * @param {IApproveLBTCParams} params\n *\n * @returns {Promise<IWeb3SendResult>} transaction promise\n */\nexport function approveLBTC({\n spender,\n amount,\n env,\n ...providerParams\n}: IApproveLBTCParams): Promise<IWeb3SendResult> {\n const provider = new Provider(providerParams);\n const tokenContract = getLbtcTokenContract(provider, env);\n const amountSat = toSatoshi(amount);\n\n const tx = tokenContract.methods.approve(spender, amountSat);\n\n return provider.sendTransactionAsync(\n provider.account,\n tokenContract.options.address,\n {\n data: tx.encodeABI(),\n estimate: true,\n estimateFee: true,\n gasLimitMultiplier: getGasMultiplier(provider.chainId),\n },\n );\n}\n","import { IEnvParam } from '../../common/types/internalTypes';\nimport { getErrorMessage } from '../../common/utils/getErrorMessage';\nimport { IWeb3SendResult, Provider } from '../../provider';\nimport { IProviderBasedParams } from '../types';\nimport { getGasMultiplier } from '../utils/getGasMultiplier';\nimport { getLbtcTokenContract } from '../utils/getLbtcTokenContract';\n\nconst INSUFFICIENT_FUNDS_PARTIAL_ERROR = 'insufficient funds';\nconst INSUFFICIENT_FUNDS_ERROR = 'Insufficient funds for transfer';\n\nexport interface IClaimLBTCParams extends IProviderBasedParams, IEnvParam {\n /**\n * Raw payload from deposit notarization.\n */\n data: string;\n /**\n * Signature from deposit notarization.\n */\n proofSignature: string;\n}\n\n/**\n * Claims LBTC.\n *\n * @param {IClaimLBTCParams} params - The parameters for claiming LBTC.\n *\n * @returns {Promise<IWeb3SendResult>} transaction promise\n */\nexport async function claimLBTC({\n data,\n proofSignature,\n env,\n ...providerParams\n}: IClaimLBTCParams): Promise<IWeb3SendResult> {\n const provider = new Provider(providerParams);\n const tokenContract = getLbtcTokenContract(provider, env);\n\n const tx = tokenContract.methods.mint(data, proofSignature);\n\n try {\n const result = await provider.sendTransactionAsync(\n provider.account,\n tokenContract.options.address,\n {\n data: tx.encodeABI(),\n estimate: true,\n estimateFee: true,\n gasLimitMultiplier: getGasMultiplier(provider.chainId),\n },\n );\n\n return result;\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n\n if (errorMessage.includes(INSUFFICIENT_FUNDS_PARTIAL_ERROR)) {\n throw new Error(INSUFFICIENT_FUNDS_ERROR);\n }\n\n throw new Error(errorMessage);\n }\n}\n","import { Provider } from '../../provider';\nimport { IProviderBasedParams } from '../types';\n\nexport type SignLbtcDestionationAddrParams = IProviderBasedParams;\n\n/**\n * Signs the destination address for the LBTC in active chain\n * in the current account. Signing is necessary for the\n * generation of the deposit address.\n *\n * @param {SignLbtcDestionationAddrParams} params\n *\n * @returns {Promise<string>} The signature of the message.\n */\nexport async function signLbtcDestionationAddr(\n params: SignLbtcDestionationAddrParams,\n): Promise<string> {\n const provider = new Provider(params);\n\n const message = `destination chain id is ${params.chainId}`;\n\n return provider.signMessage(message);\n}\n","import * as ecc from '@bitcoin-js/tiny-secp256k1-asmjs';\nimport {\n address as addressUtils,\n initEccLib,\n networks,\n payments,\n} from 'bitcoinjs-lib';\nimport { OEnv, TEnv } from '../../common/types/types';\n\ninitEccLib(ecc);\n\n/**\n * Get output script from address.\n *\n * @param address - The address.\n * @param networkMode - The network mode.\n *\n * @returns The output script.\n */\nexport function getOutputScript(\n address: string,\n env: TEnv = OEnv.prod,\n): string {\n const paymentType = getPaymentType(address);\n\n const payment = payments[paymentType]({\n address,\n network: env === OEnv.prod ? networks.bitcoin : networks.testnet,\n });\n\n const paymentOutputScript = payment.output?.toString('hex');\n\n if (!paymentOutputScript) {\n throw new Error('Output script is not found.');\n }\n\n return `0x${paymentOutputScript}`;\n}\n\nfunction getPaymentType(address: string): 'p2tr' | 'p2wpkh' {\n const result = addressUtils.fromBech32(address);\n\n const isP2TR = result.version === 1 && result.data.length === 32;\n if (isP2TR) {\n return 'p2tr';\n }\n\n const isP2WPKH = result.version === 0 && result.data.length === 20;\n if (isP2WPKH) {\n return 'p2wpkh';\n }\n\n throw new Error('Payment type is not supported.');\n}\n","import { getOutputScript } from '../../btcSdk/utils/getOutputScript';\nimport { IEnvParam } from '../../common/types/internalTypes';\nimport { toSatoshi } from '../../common/utils/convertSatoshi';\nimport { IWeb3SendResult, Provider } from '../../provider';\nimport { IProviderBasedParams } from '../types';\nimport { getGasMultiplier } from '../utils/getGasMultiplier';\nimport { getLbtcTokenContract } from '../utils/getLbtcTokenContract';\n\nexport interface IUnstakeLBTCParams extends IProviderBasedParams, IEnvParam {\n /**\n * The BTC address to send the unstaked BTC to.\n */\n btcAddress: string;\n /**\n * The amount of LBTC to unstake.\n */\n amount: number;\n}\n\n/**\n * Unstakes LBTC to the specified BTC address.\n *\n * @param {IUnstakeLBTCParams} params\n *\n * @returns {Promise<IWeb3SendResult>} transaction promise\n */\nexport function unstakeLBTC({\n btcAddress,\n amount,\n env,\n ...providerParams\n}: IUnstakeLBTCParams): Promise<IWeb3SendResult> {\n const provider = new Provider(providerParams);\n const tokenContract = getLbtcTokenContract(provider, env);\n const outputScript = getOutputScript(btcAddress, env);\n\n const amountSat = toSatoshi(amount);\n\n const tx = tokenContract.methods.redeem(outputScript, amountSat);\n\n return provider.sendTransactionAsync(\n provider.account,\n tokenContract.options.address,\n {\n data: tx.encodeABI(),\n estimate: true,\n estimateFee: true,\n gasLimitMultiplier: getGasMultiplier(provider.chainId),\n },\n );\n}\n"],"names":["OEnv","OChainId","defaultEnv","ZERO_ADDRESS","stageConfig","testnetConfig","prodConfig","getApiConfig","env","getErrorMessage","error","getAxiosErrorMessage","getErrorMessageFromObject","OChainName","getChainNameById","chainId","SANCTIONED_ADDRESS","ADDRESS_URL","SANCTIONS_MESSAGE","generateDepositBtcAddress","address","signature","referralId","baseApiUrl","toChain","requestParams","data","axios","errorMsg","isSanctioned","getDepositBtcAddress","addresses","getDepositBtcAddresses","addressData","getActualAddress","actualAddress","acc","toBlockchain","requestrParams","BTC_DECIMALS","SATOSHI_SCALE","fromSatoshi","amount","toSatoshi","getCainIdByName","chain","getDepositsByAddress","mapResponse","demoDepositsByAddress","getLBTCExchageRate","chainIdName","rpcUrlConfig","getMaxPriorityFeePerGas","rpcUrl","convertedHexValue","Web3","BigNumber","FEE_MULTIPLIER","ADDITIONAL_SAFE_GAS_PRICE_WEI","ReadProvider","__publicField","defaultRpcUrlConfig","readWeb3","provider","_a","web3","block","maxPriorityFeePerGas","pureGasPriceWei","abi","Provider","account","message","messageHex","from","to","sendOptions","web3Write","web3Read","estimate","estimateFee","extendedGasLimit","gasLimit","value","gasLimitMultiplier","nonce","tx","utils","estimatedGas","multipliedGasLimit","e","maxFeePerGas","safeGasPrice","resolve","reject","promise","transactionHash","getGasMultiplier","isValidChain","PLACEHOLDER_ADDRESS","getLbtcAddressConfig","getTokenABI","token","LBTCABI","IERC20","getLbtcTokenContract","lbtcAddressConfig","tokenAddress","contract","approveLBTC","spender","providerParams","tokenContract","amountSat","INSUFFICIENT_FUNDS_PARTIAL_ERROR","INSUFFICIENT_FUNDS_ERROR","claimLBTC","proofSignature","errorMessage","signLbtcDestionationAddr","params","initEccLib","ecc","getOutputScript","paymentType","getPaymentType","paymentOutputScript","payments","networks","result","addressUtils","unstakeLBTC","btcAddress","outputScript"],"mappings":";;;;;;;;AAAO,MAAMA,IAAO;AAAA,EAClB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AACT,GAIaC,IAAW;AAAA,EACtB,UAAU;AAAA,EACV,SAAS;AACX,GCTaC,IAAmBF,EAAK,MAMxBG,IAAe,8CCDtBC,IAA0B;AAAA,EAC9B,YAAY;AACd,GAEMC,IAA4B;AAAA,EAChC,YAAY;AACd,GAEMC,IAAyB;AAAA,EAC7B,YAAY;AACd,GAEaC,IAAe,CAACC,IAAYN,MAA2B;AAClE,UAAQM,GAAK;AAAA,IACX,KAAKR,EAAK;AACD,aAAAM;AAAAA,IACT,KAAKN,EAAK;AACD,aAAAK;AAAAA,IACT;AACS,aAAAD;AAAAA,EACX;AACF;ACpBO,SAASK,EAAgBC,GAAwB;AAClD,SAAA,OAAOA,KAAU,WACZA,IAGLA,aAAiB,QACZC,EAAqBD,CAAmB,IAG1CE,EAA0BF,CAAK;AACxC;AAEA,SAASC,EAAqBD,GAA2B;AACvD,SAAIA,EAAM,WACAA,EAAM,SAAS,KAA6B,UAG/CA,EAAM;AACf;AAEA,SAASE,EAA0BF,GAAoB;AACrD,SAAIA,KAAA,QAAAA,EAAO,UACFA,EAAM,UAGR;AACT;AClCO,MAAMG,IAAa;AAAA,EACxB,KAAK;AACP;ACMO,SAASC,EAAiBC,GAA+B;AAC9D,UAAQA,GAAS;AAAA,IACf,KAAKd,EAAS;AAAA,IACd,KAAKA,EAAS;AACZ,aAAOY,EAAW;AAAA,IACpB;AACE,YAAM,IAAI,MAAM,qBAAqBE,CAAO,EAAE;AAAA,EAClD;AACF;ACNO,MAAMC,KAAqB,sBAC5BC,KAAc,2BACdC,KAAoB;AAiC1B,eAAsBC,GAA0B;AAAA,EAC9C,SAAAC;AAAA,EACA,SAAAL;AAAA,EACA,WAAAM;AAAA,EACA,YAAAC;AAAA,EACA,KAAAd;AACF,GAAsD;AACpD,QAAM,EAAE,YAAAe,EAAA,IAAehB,EAAaC,CAAG,GACjCgB,IAAUV,EAAiBC,CAAO,GAElCU,IAAgB;AAAA,IACpB,YAAYL;AAAA,IACZ,sBAAsBC;AAAA,IACtB,UAAUG;AAAA,IACV,aAAaF;AAAA,IACb,OAAO;AAAA,EAAA;AAGL,MAAA;AACF,UAAM,EAAE,MAAAI,EAAA,IAAS,MAAMC,EAAM;AAAA,MAC3BV;AAAAA,MACAQ;AAAA,MACA,EAAE,SAASF,EAAW;AAAA,IAAA;AAGxB,WAAOG,EAAK;AAAA,WACLhB,GAAO;AACR,UAAAkB,IAAWnB,EAAgBC,CAAK;AAElC,QAAAmB,GAAaD,CAAQ;AAChB,aAAAZ;AAED,UAAA,IAAI,MAAMY,CAAQ;AAAA,EAE5B;AACF;AAEA,SAASC,GAAaD,GAA2B;AAC/C,SAAO,CAAC,CAACA,EAAS,SAASV,EAAiB;AAC9C;AC7EA,MAAMD,KAAc;AAyCpB,eAAsBa,GAAqB;AAAA,EACzC,SAAAV;AAAA,EACA,SAAAL;AAAA,EACA,KAAAP;AAAA,EACA,YAAAc;AACF,GAAiD;AACzC,QAAAS,IAAY,MAAMC,GAAuB;AAAA,IAC7C,SAAAZ;AAAA,IACA,SAAAL;AAAA,IACA,KAAAP;AAAA,IACA,YAAAc;AAAA,EAAA,CACD,GAEKW,IAAcC,GAAiBH,CAAS;AAE9C,MAAI,CAACE;AACG,UAAA,IAAI,MAAM,YAAY;AAG9B,SAAOA,EAAY;AACrB;AAQA,SAASC,GACPH,GAC6B;AAC7B,QAAMI,IAAgBJ,EAAU,OAAO,CAACK,GAAKhB,MACvCgB,EAAI,aAAahB,EAAQ,aACpBA,IAEFgB,CACR;AAEM,SAAAD,EAAc,aAAa,SAAYA;AAChD;AASA,eAAsBH,GAAuB;AAAA,EAC3C,SAAAZ;AAAA,EACA,SAAAL;AAAA,EACA,KAAAP;AAAA,EACA,YAAAc;AACF,GAA4D;AAC1D,QAAM,EAAE,YAAAC,EAAA,IAAehB,EAAaC,CAAG,GACjC6B,IAAevB,EAAiBC,CAAO,GAEvCuB,IAAiB;AAAA,IACrB,YAAYlB;AAAA,IACZ,eAAeiB;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,aAAaf;AAAA,EAAA,GAGT,EAAE,MAAAI,EAAK,IAAI,MAAMC,EAAM,IAA+BV,IAAa;AAAA,IACvE,SAASM;AAAA,IACT,QAAQe;AAAA,EAAA,CACT;AAEM,UAAAZ,KAAA,gBAAAA,EAAM,cAAa;AAC5B;ACxHA,MAAMa,KAAe,GACfC,IAAgB,MAAMD;AAOrB,SAASE,GAAYC,GAAyB;AACnD,SAAO,CAACA,IAASF;AACnB;AAQO,SAASG,EAAUD,GAAyB;AACjD,SAAO,KAAK,MAAM,CAACA,IAASF,CAAa;AAC3C;ACXgB,SAAAI,GACdC,GACArC,IAAYN,GACF;AACV,UAAQ2C,GAAqB;AAAA,IAC3B,KAAK;AACH,aAAOrC,MAAQR,EAAK,OAAOC,EAAS,WAAWA,EAAS;AAAA,IAE1D;AACE,aAAOA,EAAS;AAAA,EACpB;AACF;ACoCA,eAAsB6C,GAAqB;AAAA,EACzC,SAAA1B;AAAA,EACA,KAAAZ;AACF,GAAqD;AACnD,QAAM,EAAE,YAAAe,EAAA,IAAehB,EAAaC,CAAG,GAEjC,EAAE,MAAAkB,EAAA,IAAS,MAAMC,EAAM;AAAA,IAC3B,0BAA0BP,CAAO;AAAA,IACjC,EAAE,SAASG,EAAW;AAAA,EAAA;AAKxB,WAFgBG,KAAA,gBAAAA,EAAM,YAAW,IAElB,IAAIqB,GAAYvC,CAAG,CAAC;AACrC;AAEA,SAASuC,GAAYvC,GAAY;AAC/B,SAAO,CAACkB,OAAsC;AAAA,IAC5C,MAAMA,EAAK;AAAA,IACX,OAAOA,EAAK,SAAS;AAAA,IACrB,aAAaA,EAAK,eAAe,OAAOA,EAAK,YAAY,IAAI;AAAA,IAC7D,WAAWA,EAAK,aAAa,OAAOA,EAAK,UAAU,IAAI;AAAA,IACvD,OAAOe,GAAYf,EAAK,KAAK;AAAA,IAC7B,SAASA,EAAK;AAAA,IACd,SAASkB,GAAgBlB,EAAK,UAAUlB,CAAG;AAAA;AAAA,IAE3C,WAAW,CAAC,CAACkB,EAAK;AAAA,IAClB,YAAYA,EAAK;AAAA,IACjB,WAAWA,EAAK;AAAA,IAChB,cAAc,CAAC,CAACA,EAAK;AAAA,EAAA;AAEzB;AAEO,MAAMsB,KAAoC;AAAA,EAC/C;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS/C,EAAS;AAAA,IAClB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAASA,EAAS;AAAA,IAClB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAASA,EAAS;AAAA,IAClB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAASA,EAAS;AAAA,IAClB,WAAW;AAAA,IACX,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAASA,EAAS;AAAA,IAClB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AACF;ACvHA,eAAsBgD,GAAmB;AAAA,EACvC,KAAAzC;AAAA,EACA,SAAAO;AAAA,EACA,QAAA2B;AACF,GAA+C;AAC7C,QAAM,EAAE,YAAAnB,EAAA,IAAehB,EAAaC,CAAG,GACjC0C,IAAcpC,EAAiBC,CAAO,GAEtC,EAAE,MAAAW,EAAA,IAAS,MAAMC,EAAM;AAAA,IAC3B,wBAAwBuB,CAAW;AAAA,IACnC,EAAE,SAAS3B,GAAY,QAAQ,EAAE,QAAAmB,IAAS;AAAA,EAAA;AAG5C,SAAOhB,EAAK;AACd;ACtCO,MAAMyB,IAA8B;AAAA,EACzC,CAAClD,EAAS,QAAQ,GAAG;AAAA,EACrB,CAACA,EAAS,OAAO,GAAG;AACtB;ACJA,eAAsBmD,GACpBC,GACoB;AAcd,QAAA3B,IAAO,OAbI,MAAM,MAAM2B,GAAQ;AAAA,IACnC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,QAAQ,CAAC;AAAA,IAAA,CACV;AAAA,EAAA,CACF,GAE2B,QAEtBC,IAAoBC,EAAK,MAAM,YAAY7B,KAAA,gBAAAA,EAAM,MAAM;AAE7D,SAAO,IAAI8B,EAAU,OAAOF,CAAiB,CAAC;AAChD;ACfA,MAAMG,KAAiB,GACjBC,KAAgC;AAa/B,MAAMC,GAAa;AAAA,EAIxB,YAAY,EAAE,SAAA5C,GAASoC,cAAAA,KAAqC;AAH5D,IAAAS,EAAA;AACA,IAAAA,EAAA;AAGE,SAAK,UAAU7C,GACf,KAAK,YAAY,EAAE,GAAG8C,GAAqB,GAAGV,EAAa;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,cAAoB;AACnB,UAAAE,IAAS,KAAK,aACdS,IAAW,IAAIP,KACfQ,IAAW,IAAIR,EAAK,UAAU,aAAaF,CAAM;AACvD,WAAAS,EAAS,YAAYC,CAAQ,GACtBD;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAoB;;AACZ,UAAA,EAAE,SAAA/C,EAAY,IAAA,MACdsC,KAASW,IAAA,KAAK,cAAL,gBAAAA,EAAiBjD;AAEhC,QAAI,CAACsC;AACK,oBAAA;AAAA,QACN,+CAA+CtC,CAAO;AAAA,MAAA,GAElD,IAAI,MAAM,uBAAuBA,CAAO,YAAY;AAGrD,WAAAsC;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,aAAyC;AAC9C,UAAAY,IAAO,KAAK,eACZZ,IAAS,KAAK,aAEd,CAACa,GAAOC,CAAoB,IAAI,MAAM,QAAQ,IAAI;AAAA,MACtDF,EAAK,IAAI,SAAS,QAAQ;AAAA,MAC1Bb,GAAwBC,CAAM;AAAA,IAAA,CAC/B;AAED,WAAI,EAACa,KAAA,QAAAA,EAAO,kBAAiB,QAAOA,KAAA,gBAAAA,EAAO,kBAAkB,WACpD,KAOF;AAAA,MACL,cAAc,CALK,IAAIV,EAAUU,EAAM,cAAc,SAAS,EAAE,CAAC,EAChE,aAAaT,EAAc,EAC3B,KAAKU,CAAoB;AAAA,MAI1B,sBAAsB,CAACA;AAAA,IAAA;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,qBAAyC;AACpD,UAAMC,IAAkB,MAAM,KAAK,YAAY,EAAE,IAAI;AAErD,WAAO,IAAIZ,EAAUY,EAAgB,SAAS,EAAE,CAAC,EAAE;AAAA,MACjDV;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,eACLW,GACAjD,GACmB;AACb,UAAA6C,IAAO,KAAK;AAClB,WAAO,IAAIA,EAAK,IAAI,SAAkBI,GAAKjD,CAAO;AAAA,EACpD;AACF;ACtGO,MAAMkD,UAAiBX,GAAa;AAAA,EAKzC,YAAY,EAAE,UAAAI,GAAU,SAAAQ,GAAS,SAAAxD,GAAA,cAASoC,KAAiC;AACnE,UAAA,EAAE,SAAApC,iBAASoC,EAAA,CAAc;AALjC,IAAAS,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIO,SAAA,OAAO,IAAIL,EAAKQ,CAAQ,GAC7B,KAAK,UAAUQ,GACf,KAAK,UAAUxD,GACf,KAAK,YAAY,EAAE,GAAG8C,GAAqB,GAAGV,EAAa;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,YAAYqB,GAAkC;AACnD,UAAA,EAAE,SAAAD,EAAY,IAAA,MAEdE,IAAa,KAAK,OAAO,KAAKD,GAAS,MAAM,EAAE,SAAS,KAAK,CAAC;AAIpE,WAFiB,KAAK,KAAK,gBAEX,QAAQ;AAAA,MACtB,QAAQ;AAAA,MACR,QAAQ,CAACC,GAAYF,CAAO;AAAA,IAAA,CAC7B;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,qBACXG,GACAC,GACAC,GAC0B;AAC1B,UAAM,EAAE,SAAA7D,GAAS,MAAM8D,EAAA,IAAc,MAC/BC,IAAW,KAAK,eAEhB;AAAA,MACJ,MAAApD;AAAA,MACA,UAAAqD,IAAW;AAAA,MACX,aAAAC,IAAc;AAAA,MACd,kBAAAC;AAAA,MACA,UAAAC,IAAW;AAAA,MACX,OAAAC,IAAQ;AAAA,MACR,oBAAAC,IAAqB;AAAA,IACnB,IAAAR;AACA,QAAA,EAAE,OAAAS,EAAU,IAAAT;AAEhB,IAAKS,MACHA,IAAQ,MAAMP,EAAS,IAAI,oBAAoBJ,CAAI,IAG7C,QAAA,IAAI,UAAUW,CAAK,EAAE;AAE7B,UAAMC,IAAkB;AAAA,MACtB,MAAAZ;AAAA,MACA,IAAAC;AAAA,MACA,OAAOY,EAAM,YAAYJ,CAAK;AAAA,MAC9B,KAAKI,EAAM,YAAYL,CAAQ;AAAA,MAC/B,MAAAxD;AAAA,MACA,OAAA2D;AAAA,MACA,SAASE,EAAM,YAAYxE,CAAO;AAAA,IAAA;AAGpC,QAAIgE;AACE,UAAA;AACF,cAAMS,IAAe,MAAMV,EAAS,IAAI,YAAYQ,CAAE,GAChDG,IAAqB,KAAK;AAAA,UAC9B,OAAOD,CAAY,IAAIJ;AAAA,QAAA;AAGzB,QAAIH,IACFK,EAAG,MAAMC,EAAM,YAAYE,IAAqBR,CAAgB,IAE7DK,EAAA,MAAMC,EAAM,YAAYE,CAAkB;AAAA,eAExCC,GAAG;AACV,cAAM,IAAI;AAAA,UACPA,EAAqB,WACpB;AAAA,QAAA;AAAA,MAEN;AAGF,UAAM,EAAE,cAAAC,GAAc,sBAAAxB,EAAqB,IAAIa,IAC3C,MAAM,KAAK,WAAA,EAAa,MAAM,MAAMJ,CAAW,IAC/CA;AAUJ,QARIT,MAAyB,WACxBmB,EAAA,uBAAuBC,EAAM,YAAYpB,CAAoB,IAG9DwB,MAAiB,WAChBL,EAAA,eAAeC,EAAM,YAAYI,CAAY,IAG9C,CAACL,EAAG,gBAAgB,CAACA,EAAG,sBAAsB;AAC1C,YAAAM,IAAe,MAAM,KAAK;AAC7B,MAAAN,EAAA,WAAWM,EAAa,SAAS,EAAE;AAAA,IACxC;AAEA,QAAI,CAACN,EAAG,gBAAgB,CAACA,EAAG,sBAAsB;AAC1C,YAAAM,IAAe,MAAM,KAAK;AAC7B,MAAAN,EAAA,WAAWM,EAAa,SAAS,EAAE;AAAA,IACxC;AAEQ,mBAAA,IAAI,kCAAkCN,CAAE,GAEzC,IAAI,QAAQ,CAACO,GAASC,MAAW;AACtC,YAAMC,IAAUlB,EAAU,IAAI,gBAAgBS,CAAE;AAG7C,MAAAS,EAAA,KAAK,mBAAmB,OAAOC,MAA4B;AAClD,gBAAA,IAAI,mCAAmCA,CAAe,EAAE,GAExDH,EAAA;AAAA,UACN,gBAAgBE;AAAA,UAChB,iBAAAC;AAAA,QAAA,CACD;AAAA,MAAA,CACF,EACA,MAAMF,CAAM;AAAA,IAAA,CAChB;AAAA,EACH;AAAA,EAEO,eACLzB,GACAjD,GACmB;AACnB,WAAO,IAAI,KAAK,KAAK,IAAI,SAAkBiD,GAAKjD,CAAO;AAAA,EACzD;AACF;AC5JO,SAAS6E,EAAiBlF,GAAyB;AACxD,UAAQA,GAAS;AAAA,IACf,KAAKd,EAAS;AACL,aAAA;AAAA,IACT,KAAKA,EAAS;AACL,aAAA;AAAA,IACT;AACS,aAAA;AAAA,EACX;AACF;AChBO,SAASiG,GAAanF,GAAsC;AACjE,SAAO,OAAO,OAAOd,CAAQ,EAAE,SAASc,CAAmB;AAC7D;ACIA,MAAMX,KAA+B;AAAA,EACnC,CAACH,EAAS,OAAO,GAAG;AAAA,EACpB,CAACA,EAAS,QAAQ,GAAGkG;AACvB,GAEM9F,KAAiC;AAAA,EACrC,CAACJ,EAAS,OAAO,GAAG;AAAA,EACpB,CAACA,EAAS,QAAQ,GAAGkG;AACvB,GAEM7F,KAA8B;AAAA,EAClC,CAACL,EAAS,OAAO,GAAGkG;AAAAA,EACpB,CAAClG,EAAS,QAAQ,GAAG;AACvB;AAEgB,SAAAmG,GAAqB5F,IAAYN,GAA6B;AAC5E,UAAQM,GAAK;AAAA,IACX,KAAKR,EAAK;AACD,aAAAM;AAAA,IACT,KAAKN,EAAK;AACD,aAAAK;AAAA,IACT;AACS,aAAAD;AAAA,EACX;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lombard.finance/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"exports": {
|
|
5
5
|
".": {
|
|
6
6
|
"import": "./dist/index.js",
|
|
@@ -21,18 +21,18 @@
|
|
|
21
21
|
"types": "tsc --noEmit",
|
|
22
22
|
"build": "yarn types && vite build",
|
|
23
23
|
"storybook": "storybook dev -p 6006",
|
|
24
|
-
"build-storybook": "storybook build",
|
|
25
|
-
"build-docs": "rimraf ./docs && typedoc"
|
|
24
|
+
"build-storybook": "storybook build -o sdk-storybook",
|
|
25
|
+
"build-docs": "rimraf ./sdk-docs && typedoc --out sdk-docs"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"@bitcoin-js/tiny-secp256k1-asmjs": "
|
|
28
|
+
"@bitcoin-js/tiny-secp256k1-asmjs": "2.2.3",
|
|
29
29
|
"axios": "^1",
|
|
30
|
-
"bitcoinjs-lib": "
|
|
30
|
+
"bitcoinjs-lib": "6.1.5",
|
|
31
31
|
"bignumber.js": "^9",
|
|
32
32
|
"web3": "^4"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@bitcoin-js/tiny-secp256k1-asmjs": "
|
|
35
|
+
"@bitcoin-js/tiny-secp256k1-asmjs": "2.2.3",
|
|
36
36
|
"@chromatic-com/storybook": "1.6.1",
|
|
37
37
|
"@storybook/addon-essentials": "^8.2.9",
|
|
38
38
|
"@storybook/addon-interactions": "^8.2.9",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@storybook/react-vite": "^8.2.9",
|
|
44
44
|
"@storybook/test": "^8.2.9",
|
|
45
45
|
"axios": "^1.7.4",
|
|
46
|
-
"bitcoinjs-lib": "
|
|
46
|
+
"bitcoinjs-lib": "6.1.5",
|
|
47
47
|
"bignumber.js": "^9.1.2",
|
|
48
48
|
"bootstrap": "^5.3.3",
|
|
49
49
|
"rimraf": "^5",
|
package/src/common/const.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import { OEnv, TEnv } from './types/types';
|
|
2
2
|
|
|
3
3
|
export const defaultEnv: TEnv = OEnv.prod;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Address of the zero account.
|
|
7
|
+
* Can also be used as a placeholder for unknown addresses.
|
|
8
|
+
*/
|
|
9
|
+
export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
package/src/provider/Provider.ts
CHANGED
|
@@ -148,18 +148,6 @@ export class Provider extends ReadProvider {
|
|
|
148
148
|
.once('transactionHash', async (transactionHash: string) => {
|
|
149
149
|
console.log(`Just signed transaction has is: ${transactionHash}`);
|
|
150
150
|
|
|
151
|
-
const rawTx = await web3Read.eth.getTransaction(transactionHash);
|
|
152
|
-
|
|
153
|
-
console.log(
|
|
154
|
-
'Found transaction in node: ',
|
|
155
|
-
JSON.stringify(
|
|
156
|
-
rawTx,
|
|
157
|
-
(_, value) =>
|
|
158
|
-
typeof value === 'bigint' ? value.toString() : value,
|
|
159
|
-
2,
|
|
160
|
-
),
|
|
161
|
-
);
|
|
162
|
-
|
|
163
151
|
resolve({
|
|
164
152
|
receiptPromise: promise,
|
|
165
153
|
transactionHash,
|
|
@@ -3,6 +3,6 @@ import { OChainId } from '../common/types/types';
|
|
|
3
3
|
export type TRpcUrlConfig = Record<number, string>;
|
|
4
4
|
|
|
5
5
|
export const rpcUrlConfig: TRpcUrlConfig = {
|
|
6
|
-
[OChainId.ethereum]: 'https://
|
|
6
|
+
[OChainId.ethereum]: 'https://ethereum-rpc.publicnode.com',
|
|
7
7
|
[OChainId.holesky]: 'https://ethereum-holesky-rpc.publicnode.com',
|
|
8
8
|
};
|
|
@@ -9,7 +9,7 @@ import { getChainNameById } from '../utils/getChainNameById';
|
|
|
9
9
|
* The address wich will be returned if the provided EVM address is sanctioned.
|
|
10
10
|
*/
|
|
11
11
|
export const SANCTIONED_ADDRESS = 'sanctioned_address';
|
|
12
|
-
const ADDRESS_URL = 'api/v1/address';
|
|
12
|
+
const ADDRESS_URL = 'api/v1/address/generate';
|
|
13
13
|
const SANCTIONS_MESSAGE = 'destination address is under sanctions';
|
|
14
14
|
|
|
15
15
|
interface IGenerateNewAddressResponse {
|
|
@@ -32,7 +32,7 @@ export interface IGenerateDepositBtcAddressParams extends IEnvParam {
|
|
|
32
32
|
/**
|
|
33
33
|
* The referral ID.
|
|
34
34
|
*/
|
|
35
|
-
referralId
|
|
35
|
+
referralId: string;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/**
|
|
@@ -33,6 +33,10 @@ export interface IGetDepositBtcAddressParams extends IEnvParam {
|
|
|
33
33
|
* The destination chain ID where LBTC will be claimed.
|
|
34
34
|
*/
|
|
35
35
|
chainId: TChainId;
|
|
36
|
+
/**
|
|
37
|
+
* The referral ID.
|
|
38
|
+
*/
|
|
39
|
+
referralId: string;
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
/**
|
|
@@ -46,8 +50,14 @@ export async function getDepositBtcAddress({
|
|
|
46
50
|
address,
|
|
47
51
|
chainId,
|
|
48
52
|
env,
|
|
53
|
+
referralId,
|
|
49
54
|
}: IGetDepositBtcAddressParams): Promise<string> {
|
|
50
|
-
const addresses = await getDepositBtcAddresses({
|
|
55
|
+
const addresses = await getDepositBtcAddresses({
|
|
56
|
+
address,
|
|
57
|
+
chainId,
|
|
58
|
+
env,
|
|
59
|
+
referralId,
|
|
60
|
+
});
|
|
51
61
|
|
|
52
62
|
const addressData = getActualAddress(addresses);
|
|
53
63
|
|
|
@@ -88,6 +98,7 @@ export async function getDepositBtcAddresses({
|
|
|
88
98
|
address,
|
|
89
99
|
chainId,
|
|
90
100
|
env,
|
|
101
|
+
referralId,
|
|
91
102
|
}: IGetDepositBtcAddressParams): Promise<IDepositAddress[]> {
|
|
92
103
|
const { baseApiUrl } = getApiConfig(env);
|
|
93
104
|
const toBlockchain = getChainNameById(chainId);
|
|
@@ -98,6 +109,7 @@ export async function getDepositBtcAddresses({
|
|
|
98
109
|
limit: 1,
|
|
99
110
|
offset: 0,
|
|
100
111
|
asc: false,
|
|
112
|
+
referral_id: referralId,
|
|
101
113
|
};
|
|
102
114
|
|
|
103
115
|
const { data } = await axios.get<IDepositAddressesResponse>(ADDRESS_URL, {
|
|
@@ -50,7 +50,7 @@ export interface IGetDepositsByAddressParams extends IEnvParam {
|
|
|
50
50
|
/**
|
|
51
51
|
* Returns all deposits for a given address
|
|
52
52
|
*
|
|
53
|
-
* @param {IGetDepositsByAddressParams} params
|
|
53
|
+
* @param {IGetDepositsByAddressParams} params
|
|
54
54
|
*
|
|
55
55
|
* @returns {Promise<IDeposit[]>} a list of deposits
|
|
56
56
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IEnvParam } from '../../common/types/internalTypes';
|
|
2
2
|
import { toSatoshi } from '../../common/utils/convertSatoshi';
|
|
3
3
|
import { IWeb3SendResult, Provider } from '../../provider';
|
|
4
|
-
import { IProviderBasedParams } from '../
|
|
4
|
+
import { IProviderBasedParams } from '../types';
|
|
5
5
|
import { getGasMultiplier } from '../utils/getGasMultiplier';
|
|
6
6
|
import { getLbtcTokenContract } from '../utils/getLbtcTokenContract';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IEnvParam } from '../../common/types/internalTypes';
|
|
2
2
|
import { getErrorMessage } from '../../common/utils/getErrorMessage';
|
|
3
3
|
import { IWeb3SendResult, Provider } from '../../provider';
|
|
4
|
-
import { IProviderBasedParams } from '../
|
|
4
|
+
import { IProviderBasedParams } from '../types';
|
|
5
5
|
import { getGasMultiplier } from '../utils/getGasMultiplier';
|
|
6
6
|
import { getLbtcTokenContract } from '../utils/getLbtcTokenContract';
|
|
7
7
|
|
package/src/web3Sdk/index.ts
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
defaultEnv,
|
|
3
|
+
ZERO_ADDRESS as PLACEHOLDER_ADDRESS,
|
|
4
|
+
} from '../common/const';
|
|
2
5
|
import { OChainId, OEnv, TChainId, TEnv } from '../common/types/types';
|
|
3
6
|
|
|
4
|
-
type LbtcTokenConfig =
|
|
7
|
+
type LbtcTokenConfig = Record<TChainId, string>;
|
|
5
8
|
|
|
6
9
|
const stageConfig: LbtcTokenConfig = {
|
|
7
10
|
[OChainId.holesky]: '0xED7bfd5C1790576105Af4649817f6d35A75CD818',
|
|
11
|
+
[OChainId.ethereum]: PLACEHOLDER_ADDRESS,
|
|
8
12
|
};
|
|
9
13
|
|
|
10
14
|
const testnetConfig: LbtcTokenConfig = {
|
|
11
15
|
[OChainId.holesky]: '0x38A13AB20D15ffbE5A7312d2336EF1552580a4E2',
|
|
16
|
+
[OChainId.ethereum]: PLACEHOLDER_ADDRESS,
|
|
12
17
|
};
|
|
13
18
|
|
|
14
19
|
const prodConfig: LbtcTokenConfig = {
|
|
20
|
+
[OChainId.holesky]: PLACEHOLDER_ADDRESS,
|
|
15
21
|
[OChainId.ethereum]: '0x8236a87084f8b84306f72007f36f2618a5634494',
|
|
16
22
|
};
|
|
17
23
|
|
|
@@ -2,7 +2,7 @@ import { getOutputScript } from '../../btcSdk/utils/getOutputScript';
|
|
|
2
2
|
import { IEnvParam } from '../../common/types/internalTypes';
|
|
3
3
|
import { toSatoshi } from '../../common/utils/convertSatoshi';
|
|
4
4
|
import { IWeb3SendResult, Provider } from '../../provider';
|
|
5
|
-
import { IProviderBasedParams } from '../
|
|
5
|
+
import { IProviderBasedParams } from '../types';
|
|
6
6
|
import { getGasMultiplier } from '../utils/getGasMultiplier';
|
|
7
7
|
import { getLbtcTokenContract } from '../utils/getLbtcTokenContract';
|
|
8
8
|
|
|
File without changes
|