@lombard.finance/sdk 0.4.0 → 0.6.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 CHANGED
@@ -15,40 +15,235 @@ 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@^2 bitcoinjs-lib@^6
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
22
22
 
23
- API based methods:
23
+ All methods are documented with JSDoc comments. You can use your IDE's autocomplete feature to see the available methods and their parameters.
24
+
25
+ ### API Methods
26
+
27
+ - API based
28
+ - [getDepositBtcAddress](#getDepositBtcAddress)
29
+ - [getDepositBtcAddresses](#getDepositBtcAddresses)
30
+ - [generateDepositBtcAddress](#generateDepositBtcAddress)
31
+ - [getDepositsByAddress](#getDepositsByAddress)
32
+ - [getLBTCExchageRate](#getLBTCExchageRate)
33
+ - Web3 based
34
+ - [signLbtcDestionationAddr](#signLbtcDestionationAddr)
35
+ - [claimLBTC](#claimLBTC)
36
+ - [unstakeLBTC](#unstakeLBTC)
37
+
38
+ #### getDepositBtcAddress
39
+
40
+ `@returns Promise<string>`
41
+
42
+ Returns the address for depositing BTC.
43
+
44
+ Parameters:
45
+ | name | type | description |
46
+ |-----------|----------|--------------------------------------------------------------|
47
+ | `address` | `string` | The destination EVM user address where LBTC will be claimed. |
48
+ | `chainId` | `TChainId` | The destination chain ID where LBTC will be claimed. |
49
+ | `referralId` | `string` | The referral ID. |
50
+ | `env` | `TEnv` | Environment (optional, default: 'prod') |
51
+
52
+ Usage
24
53
 
25
54
  ```typescript
26
55
  import { getDepositBtcAddress } from '@lombard.finance/sdk';
27
-
56
+ ...
28
57
  const depositBtcAddress = await getDepositBtcAddress({
29
- address: '0x...', // Ethereum address
58
+ address: '0x...',
30
59
  chainId: 1,
31
- });
60
+ referralId: 'YOUR_REFERRAL_ID',
61
+ }); // bc1q...
62
+ ```
63
+
64
+ #### getDepositBtcAddresses
65
+
66
+ `@returns Promise<IDepositAddress[]>`
67
+
68
+ Returns the addresses for depositing BTC.
69
+
70
+ Parameters are the same as for `getDepositBtcAddress`.
71
+
72
+ Probably you will not need this method. You can just use `getDepositBtcAddress`.
73
+
74
+ #### generateDepositBtcAddress
75
+
76
+ `@returns {Promise<string>}`
32
77
 
33
- console.log(depositBtcAddress); // bc1q...
78
+ Generates a BTC deposit address.
79
+ If the provided EVM address is sanctioned, the function will return the `SANCTIONED_ADDRESS` variable.
80
+
81
+ Parameters:
82
+ | name | type | description |
83
+ |-------------|----------|---------------------------------------------------------------------------------------------------|
84
+ | `address` | `string` | The destination EVM user address where LBTC will be claimed. |
85
+ | `chainId` | `TChainId` | The destination chain ID where LBTC will be claimed. |
86
+ | `signature` | `string` | The signature of the address. The signature is generated by signing the address using EVM wallet. |
87
+ | `referralId` | `string` | The referral ID. |
88
+ | `env` | `TEnv` | Environment (optional, default: 'prod') |
89
+
90
+ Usage
91
+
92
+ ```typescript
93
+ import { generateDepositBtcAddress } from '@lombard.finance/sdk';
94
+ ...
95
+ const depositBtcAddress = await generateDepositBtcAddress({
96
+ address: '0x...',
97
+ chainId: 1,
98
+ signature: 'SIGNATURE',
99
+ referralId: 'YOUR_REFERRAL_ID',
100
+ }); // bc1q...
34
101
  ```
35
102
 
36
- Web3 based methods:
103
+ #### getDepositsByAddress
104
+
105
+ `@returns Promise<IDeposit[]>`
106
+ Returns all deposits for a given address.
107
+
108
+ Parameters:
109
+
110
+ | name | type | description |
111
+ | --------- | -------- | --------------------------------------- |
112
+ | `address` | `string` | The EVM address to get deposits for |
113
+ | `env` | `TEnv` | Environment (optional, default: 'prod') |
114
+
115
+ Usage
37
116
 
38
117
  ```typescript
39
- import { unstakeLBTC } from '@lombard.finance/sdk';
118
+ import { getDepositsByAddress } from '@lombard.finance/sdk';
119
+ ...
120
+ const deposits = await getDepositsByAddress({
121
+ address: '0x...',
122
+ }); // [{...}]
123
+ ```
40
124
 
41
- const { receiptPromise, transactionHash } = await unstakeLBTC({
42
- amount: '1', // 1 LBTC
43
- btcAddress: 'bc1q...', // The BTC address to send the unstaked BTC to
44
- account: '0x...', // current address in the web3 wallet
45
- chainId: 1, // current chain id in the web3 wallet
46
- provider: window.ethereum, // EIP-1193 provider
125
+ #### getLBTCExchageRate
126
+
127
+ `@returns Promise<number>`
128
+
129
+ Returns the exchange rate for LBTC.
130
+
131
+ Parameters:
132
+
133
+ | name | type | description |
134
+ | --------- | ---------- | ------------------------------------------------------ |
135
+ | `chainId` | `TChainId` | The chain id of the asset to get the exchange rate for |
136
+ | `amount` | `number` | The amount of the asset to get the exchange rate for |
137
+ | `env` | `TEnv` | Environment (optional, default: 'prod') |
138
+
139
+ Usage
140
+
141
+ ```typescript
142
+ import { getLBTCExchageRate } from '@lombard.finance/sdk';
143
+ ...
144
+ const exchangeRate = await getLBTCExchageRate({
145
+ chainId: 1,
146
+ amount: 3,
147
+ }); // 3
148
+ ```
149
+
150
+ #### signLbtcDestionationAddr
151
+
152
+ `@returns Promise<string>` - The signature of the message.
153
+
154
+ Signs the destination address for the LBTC in active chain in the current account.
155
+ Signing is necessary for the generation of the deposit address.
156
+
157
+ Parameters:
158
+
159
+ | name | type | description |
160
+ | ---------- | ------------------ | ------------------------------ |
161
+ | `provider` | `IEIP1193Provider` | The EIP-1193 provider instance |
162
+ | `account` | `string` | Current account address |
163
+ | `chainId` | `TChainId` | Current chain ID |
164
+
165
+ Usage
166
+
167
+ ```typescript
168
+ import { signLbtcDestionationAddr } from '@lombard.finance/sdk';
169
+ ...
170
+ // do connect to the wallet using web3.js or ethers.js or any other library
171
+ // and get the provider, account and chainId
172
+ const destinationAddr = await signLbtcDestionationAddr({
173
+ provider: window.ethereum,
174
+ account: '0x...',
175
+ chainId: 1,
176
+ }); // '0x...'
177
+ ```
178
+
179
+ #### claimLBTC
180
+
181
+ `@returns Promise<IWeb3SendResult>` transaction promise
182
+
183
+ Claims LBTC.
184
+
185
+ Parameters:
186
+
187
+ | name | type | description |
188
+ | ---------------- | ------------------ | -------------------------------------------------------------------------------------- |
189
+ | `data` | `string` | Raw payload from deposit notarization. Can be obtained from the `getDepositsByAddress` |
190
+ | `proofSignature` | `string` | Signature from deposit notarization. Can be obtained from the `getDepositsByAddress` |
191
+ | `provider` | `IEIP1193Provider` | The EIP-1193 provider instance |
192
+ | `account` | `string` | Current account address |
193
+ | `chainId` | `TChainId` | Current chain ID |
194
+ | `env` | `TEnv` | Environment (optional, default: 'prod') |
195
+
196
+ Usage
197
+
198
+ ```typescript
199
+ import { claimLBTC } from '@lombard.finance/sdk';
200
+ ...
201
+ // do connect to the wallet using web3.js or ethers.js or any other library
202
+ // and get the provider, account and chainId
203
+ const { receiptPromise, transactionHash } = await claimLBTC({
204
+ data: 'PAYLOAD',
205
+ proofSignature: 'SIGNATURE',
206
+ provider: window.ethereum,
207
+ account: '0x...',
208
+ chainId: 1,
47
209
  });
210
+ console.log(transactionHash); // '0x...'
211
+ const receipt = await receiptPromise; // {...}
212
+ ```
213
+
214
+ #### unstakeLBTC
215
+
216
+ `@returns Promise<IWeb3SendResult>` transaction promise
48
217
 
49
- console.log(transactionHash); // 0x...
218
+ Unstakes LBTC to the specified BTC address.
50
219
 
51
- const receipt = await receiptPromise; // will return the tx receipt
220
+ Parameters:
221
+
222
+ | name | type | description |
223
+ | ------------ | ------------------ | -------------------------------------------- |
224
+ | `btcAddress` | `string` | The BTC address to send the unstaked BTC to. |
225
+ | `amount` | `string` | The amount of LBTC to unstake. |
226
+ | `provider` | `IEIP1193Provider` | The EIP-1193 provider instance |
227
+ | `account` | `string` | Current account address |
228
+ | `chainId` | `TChainId` | Current chain ID |
229
+ | `env` | `TEnv` | Environment (optional, default: 'prod') |
230
+
231
+ Usage
232
+
233
+ ```typescript
234
+ import { unstakeLBTC } from '@lombard.finance/sdk';
235
+ ...
236
+ // do connect to the wallet using web3.js or ethers.js or any other library
237
+ // and get the provider, account and chainId
238
+ const { receiptPromise, transactionHash } = await unstakeLBTC({
239
+ btcAddress: 'bs...',
240
+ amount: 1,
241
+ provider: window.ethereum,
242
+ account: '0x...',
243
+ chainId: 1,
244
+ });
245
+ console.log(transactionHash); // '0x...'
246
+ const receipt = await receiptPromise; // {...}
52
247
  ```
53
248
 
54
249
  ## Development
package/dist/index.js CHANGED
@@ -50,69 +50,77 @@ function I(e) {
50
50
  throw new Error(`Unknown chain ID: ${e}`);
51
51
  }
52
52
  }
53
- const te = "sanctioned_address", ne = "api/v1/address";
53
+ const te = "sanctioned_address", ne = "api/v1/address", ae = "destination address is under sanctions";
54
54
  async function Be({
55
- address: e,
56
- chainId: t,
57
- env: n
58
- }) {
59
- const a = await se({ address: e, chainId: t, env: n }), s = ae(a);
60
- if (!s)
61
- throw new Error("No address");
62
- return s.btc_address;
63
- }
64
- function ae(e) {
65
- const t = e.reduce((n, a) => n.created_at < a.created_at ? a : n);
66
- return t.deprecated ? void 0 : t;
67
- }
68
- async function se({
69
- address: e,
70
- chainId: t,
71
- env: n
72
- }) {
73
- const { baseApiUrl: a } = w(n), s = I(t), i = {
74
- to_address: e,
75
- to_blockchain: s,
76
- limit: 1,
77
- offset: 0,
78
- asc: !1
79
- }, { data: o } = await g.get(ne, {
80
- baseURL: a,
81
- params: i
82
- });
83
- return (o == null ? void 0 : o.addresses) || [];
84
- }
85
- const ie = "api/v1/address", re = "destination address is under sanctions";
86
- async function Fe({
87
55
  address: e,
88
56
  chainId: t,
89
57
  signature: n,
90
58
  referralId: a,
91
59
  env: s
92
60
  }) {
93
- const { baseApiUrl: i } = w(s), o = I(t), u = {
61
+ const { baseApiUrl: i } = w(s), p = I(t), o = {
94
62
  to_address: e,
95
63
  to_address_signature: n,
96
- to_chain: o,
64
+ to_chain: p,
97
65
  referral_id: a,
98
66
  nonce: 0
99
67
  };
100
68
  try {
101
69
  const { data: y } = await g.post(
102
- ie,
103
- u,
70
+ ne,
71
+ o,
104
72
  { baseURL: i }
105
73
  );
106
74
  return y.address;
107
75
  } catch (y) {
108
76
  const f = B(y);
109
- if (oe(f))
77
+ if (se(f))
110
78
  return te;
111
79
  throw new Error(f);
112
80
  }
113
81
  }
114
- function oe(e) {
115
- return !!e.includes(re);
82
+ function se(e) {
83
+ return !!e.includes(ae);
84
+ }
85
+ const ie = "api/v1/address";
86
+ async function Fe({
87
+ address: e,
88
+ chainId: t,
89
+ env: n,
90
+ referralId: a
91
+ }) {
92
+ const s = await oe({
93
+ address: e,
94
+ chainId: t,
95
+ env: n,
96
+ referralId: a
97
+ }), i = re(s);
98
+ if (!i)
99
+ throw new Error("No address");
100
+ return i.btc_address;
101
+ }
102
+ function re(e) {
103
+ const t = e.reduce((n, a) => n.created_at < a.created_at ? a : n);
104
+ return t.deprecated ? void 0 : t;
105
+ }
106
+ async function oe({
107
+ address: e,
108
+ chainId: t,
109
+ env: n,
110
+ referralId: a
111
+ }) {
112
+ const { baseApiUrl: s } = w(n), i = I(t), p = {
113
+ to_address: e,
114
+ to_blockchain: i,
115
+ limit: 1,
116
+ offset: 0,
117
+ asc: !1,
118
+ referral_id: a
119
+ }, { data: o } = await g.get(ie, {
120
+ baseURL: s,
121
+ params: p
122
+ });
123
+ return (o == null ? void 0 : o.addresses) || [];
116
124
  }
117
125
  const pe = 8, F = 10 ** pe;
118
126
  function ue(e) {
@@ -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, u = this.getReadWeb3(), {
360
+ const { chainId: i, web3: p } = this, o = 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 u.eth.getTransactionCount(n)), console.log(`Nonce: ${b}`);
363
- const p = {
370
+ b || (b = await o.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,29 +379,29 @@ class v extends fe {
371
379
  };
372
380
  if (f)
373
381
  try {
374
- const d = await u.eth.estimateGas(p), T = Math.round(
382
+ const d = await o.eth.estimateGas(u), T = Math.round(
375
383
  Number(d) * H
376
384
  );
377
- E ? p.gas = m.numberToHex(T + E) : p.gas = m.numberToHex(T);
385
+ E ? u.gas = m.numberToHex(T + E) : u.gas = m.numberToHex(T);
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
391
  const { maxFeePerGas: R, maxPriorityFeePerGas: k } = O ? await this.getMaxFees().catch(() => s) : s;
384
- if (k !== void 0 && (p.maxPriorityFeePerGas = m.numberToHex(k)), R !== void 0 && (p.maxFeePerGas = m.numberToHex(R)), !p.maxFeePerGas && !p.maxPriorityFeePerGas) {
392
+ if (k !== void 0 && (u.maxPriorityFeePerGas = m.numberToHex(k)), R !== void 0 && (u.maxFeePerGas = m.numberToHex(R)), !u.maxFeePerGas && !u.maxPriorityFeePerGas) {
385
393
  const d = await this.getSafeGasPriceWei();
386
- p.gasPrice = d.toString(10);
394
+ u.gasPrice = d.toString(10);
387
395
  }
388
- if (!p.maxFeePerGas && !p.maxPriorityFeePerGas) {
396
+ if (!u.maxFeePerGas && !u.maxPriorityFeePerGas) {
389
397
  const d = await this.getSafeGasPriceWei();
390
- p.gasPrice = d.toString(10);
398
+ u.gasPrice = d.toString(10);
391
399
  }
392
- return console.log("Sending transaction via Web3: ", p), new Promise((d, T) => {
393
- const _ = o.eth.sendTransaction(p);
400
+ return console.log("Sending transaction via Web3: ", u), new Promise((d, T) => {
401
+ const _ = p.eth.sendTransaction(u);
394
402
  _.once("transactionHash", async (x) => {
395
403
  console.log(`Just signed transaction has is: ${x}`);
396
- const W = await u.eth.getTransaction(x);
404
+ const W = await o.eth.getTransaction(x);
397
405
  console.log(
398
406
  "Found transaction in node: ",
399
407
  JSON.stringify(
@@ -2251,8 +2259,8 @@ function S(e, t) {
2251
2259
  const s = n[a];
2252
2260
  if (!s)
2253
2261
  throw new Error(`Token address for chain ${a} is not defined`);
2254
- const i = Ce("LBTC"), o = e.createContract(i, s);
2255
- return o.options.address || (o.options.address = s), o;
2262
+ const i = Ce("LBTC"), p = e.createContract(i, s);
2263
+ return p.options.address || (p.options.address = s), p;
2256
2264
  }
2257
2265
  function Ne({
2258
2266
  spender: e,
@@ -2260,12 +2268,12 @@ function Ne({
2260
2268
  env: n,
2261
2269
  ...a
2262
2270
  }) {
2263
- const s = new v(a), i = S(s, n), o = U(t), u = i.methods.approve(e, o);
2271
+ const s = new v(a), i = S(s, n), p = U(t), o = i.methods.approve(e, p);
2264
2272
  return s.sendTransactionAsync(
2265
2273
  s.account,
2266
2274
  i.options.address,
2267
2275
  {
2268
- data: u.encodeABI(),
2276
+ data: o.encodeABI(),
2269
2277
  estimate: !0,
2270
2278
  estimateFee: !0,
2271
2279
  gasLimitMultiplier: P(s.chainId)
@@ -2279,20 +2287,20 @@ async function Ge({
2279
2287
  env: n,
2280
2288
  ...a
2281
2289
  }) {
2282
- const s = new v(a), i = S(s, n), o = i.methods.mint(e, t);
2290
+ const s = new v(a), i = S(s, n), p = i.methods.mint(e, t);
2283
2291
  try {
2284
2292
  return await s.sendTransactionAsync(
2285
2293
  s.account,
2286
2294
  i.options.address,
2287
2295
  {
2288
- data: o.encodeABI(),
2296
+ data: p.encodeABI(),
2289
2297
  estimate: !0,
2290
2298
  estimateFee: !0,
2291
2299
  gasLimitMultiplier: P(s.chainId)
2292
2300
  }
2293
2301
  );
2294
- } catch (u) {
2295
- const y = B(u);
2302
+ } catch (o) {
2303
+ const y = B(o);
2296
2304
  throw y.includes(Ae) ? new Error(Me) : new Error(y);
2297
2305
  }
2298
2306
  }
@@ -2325,7 +2333,7 @@ function We({
2325
2333
  env: n,
2326
2334
  ...a
2327
2335
  }) {
2328
- const s = new v(a), i = S(s, n), o = Ie(e, n), u = U(t), y = i.methods.redeem(o, u);
2336
+ const s = new v(a), i = S(s, n), p = Ie(e, n), o = U(t), y = i.methods.redeem(p, o);
2329
2337
  return s.sendTransactionAsync(
2330
2338
  s.account,
2331
2339
  i.options.address,
@@ -2345,10 +2353,10 @@ export {
2345
2353
  Ge as claimLBTC,
2346
2354
  Le as demoDepositsByAddress,
2347
2355
  ue as fromSatoshi,
2348
- Fe as generateDepositBtcAddress,
2356
+ Be as generateDepositBtcAddress,
2349
2357
  w as getApiConfig,
2350
- Be as getDepositBtcAddress,
2351
- se as getDepositBtcAddresses,
2358
+ Fe as getDepositBtcAddress,
2359
+ oe as getDepositBtcAddresses,
2352
2360
  Ue as getDepositsByAddress,
2353
2361
  Oe as getLBTCExchageRate,
2354
2362
  we as getLbtcAddressConfig,
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/getDepositBtcAddress/getDepositBtcAddress.ts","../src/sdk/generateDepositBtcAddress/generateDepositBtcAddress.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 { getApiConfig } from '../apiConfig';\nimport { TChainName } from '../internalTypes';\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';\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","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 { SANCTIONED_ADDRESS } from '../getDepositBtcAddress';\nimport { getChainNameById } from '../utils/getChainNameById';\n\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","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","getDepositBtcAddress","address","addresses","getDepositBtcAddresses","addressData","getActualAddress","actualAddress","acc","baseApiUrl","toBlockchain","requestrParams","data","axios","SANCTIONS_MESSAGE","generateDepositBtcAddress","signature","referralId","toChain","requestParams","errorMsg","isSanctioned","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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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
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 * 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://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 '../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","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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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lombard.finance/sdk",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "exports": {
5
5
  ".": {
6
6
  "import": "./dist/index.js",
@@ -25,14 +25,14 @@
25
25
  "build-docs": "rimraf ./docs && typedoc"
26
26
  },
27
27
  "peerDependencies": {
28
- "@bitcoin-js/tiny-secp256k1-asmjs": "^2",
28
+ "@bitcoin-js/tiny-secp256k1-asmjs": "2.2.3",
29
29
  "axios": "^1",
30
- "bitcoinjs-lib": "^6",
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": "^2.2.3",
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": "^6.1.5",
46
+ "bitcoinjs-lib": "6.1.5",
47
47
  "bignumber.js": "^9.1.2",
48
48
  "bootstrap": "^5.3.3",
49
49
  "rimraf": "^5",
@@ -30,6 +30,7 @@ export const WithParams: Story = {
30
30
  chainId: OChainId.ethereum,
31
31
  signature: '',
32
32
  env: defaultEnv,
33
+ referralId: 'lombard',
33
34
  },
34
35
  };
35
36
 
@@ -3,9 +3,12 @@ import { IEnvParam } from '../../common/types/internalTypes';
3
3
  import { TChainId } from '../../common/types/types';
4
4
  import { getErrorMessage } from '../../common/utils/getErrorMessage';
5
5
  import { getApiConfig } from '../apiConfig';
6
- import { SANCTIONED_ADDRESS } from '../getDepositBtcAddress';
7
6
  import { getChainNameById } from '../utils/getChainNameById';
8
7
 
8
+ /**
9
+ * The address wich will be returned if the provided EVM address is sanctioned.
10
+ */
11
+ export const SANCTIONED_ADDRESS = 'sanctioned_address';
9
12
  const ADDRESS_URL = 'api/v1/address';
10
13
  const SANCTIONS_MESSAGE = 'destination address is under sanctions';
11
14
 
@@ -29,7 +32,7 @@ export interface IGenerateDepositBtcAddressParams extends IEnvParam {
29
32
  /**
30
33
  * The referral ID.
31
34
  */
32
- referralId?: string;
35
+ referralId: string;
33
36
  }
34
37
 
35
38
  /**
@@ -29,6 +29,7 @@ export const WithParams: Story = {
29
29
  address: exampleEvmAddress,
30
30
  chainId: OChainId.ethereum,
31
31
  env: defaultEnv,
32
+ referralId: 'lombard',
32
33
  },
33
34
  };
34
35
 
@@ -5,11 +5,6 @@ import { getApiConfig } from '../apiConfig';
5
5
  import { TChainName } from '../internalTypes';
6
6
  import { getChainNameById } from '../utils/getChainNameById';
7
7
 
8
- /**
9
- * The address wich will be returned if the provided EVM address is sanctioned.
10
- */
11
- export const SANCTIONED_ADDRESS = 'sanctioned_address';
12
-
13
8
  const ADDRESS_URL = 'api/v1/address';
14
9
 
15
10
  interface IDepositAddress {
@@ -38,6 +33,10 @@ export interface IGetDepositBtcAddressParams extends IEnvParam {
38
33
  * The destination chain ID where LBTC will be claimed.
39
34
  */
40
35
  chainId: TChainId;
36
+ /**
37
+ * The referral ID.
38
+ */
39
+ referralId: string;
41
40
  }
42
41
 
43
42
  /**
@@ -51,8 +50,14 @@ export async function getDepositBtcAddress({
51
50
  address,
52
51
  chainId,
53
52
  env,
53
+ referralId,
54
54
  }: IGetDepositBtcAddressParams): Promise<string> {
55
- const addresses = await getDepositBtcAddresses({ address, chainId, env });
55
+ const addresses = await getDepositBtcAddresses({
56
+ address,
57
+ chainId,
58
+ env,
59
+ referralId,
60
+ });
56
61
 
57
62
  const addressData = getActualAddress(addresses);
58
63
 
@@ -93,6 +98,7 @@ export async function getDepositBtcAddresses({
93
98
  address,
94
99
  chainId,
95
100
  env,
101
+ referralId,
96
102
  }: IGetDepositBtcAddressParams): Promise<IDepositAddress[]> {
97
103
  const { baseApiUrl } = getApiConfig(env);
98
104
  const toBlockchain = getChainNameById(chainId);
@@ -103,6 +109,7 @@ export async function getDepositBtcAddresses({
103
109
  limit: 1,
104
110
  offset: 0,
105
111
  asc: false,
112
+ referral_id: referralId,
106
113
  };
107
114
 
108
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 - the parameters for getting deposits
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 '../internalTypes';
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 '../internalTypes';
4
+ import { IProviderBasedParams } from '../types';
5
5
  import { getGasMultiplier } from '../utils/getGasMultiplier';
6
6
  import { getLbtcTokenContract } from '../utils/getLbtcTokenContract';
7
7
 
@@ -2,4 +2,5 @@ export * from './approveLBTC';
2
2
  export * from './claimLBTC';
3
3
  export * from './lbtcAddressConfig';
4
4
  export * from './signLbtcDestionationAddr';
5
+ export * from './types';
5
6
  export * from './unstakeLBTC';
@@ -1,5 +1,5 @@
1
1
  import { Provider } from '../../provider';
2
- import { IProviderBasedParams } from '../internalTypes';
2
+ import { IProviderBasedParams } from '../types';
3
3
 
4
4
  export type SignLbtcDestionationAddrParams = IProviderBasedParams;
5
5
 
@@ -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 '../internalTypes';
5
+ import { IProviderBasedParams } from '../types';
6
6
  import { getGasMultiplier } from '../utils/getGasMultiplier';
7
7
  import { getLbtcTokenContract } from '../utils/getLbtcTokenContract';
8
8
 
File without changes