@atomiqlabs/lp-lib 14.0.0-dev.3 → 14.0.0-dev.30
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/LICENSE +201 -201
- package/dist/fees/IBtcFeeEstimator.d.ts +3 -3
- package/dist/fees/IBtcFeeEstimator.js +2 -2
- package/dist/index.d.ts +42 -40
- package/dist/index.js +58 -56
- package/dist/info/InfoHandler.d.ts +17 -17
- package/dist/info/InfoHandler.js +61 -61
- package/dist/plugins/IPlugin.d.ts +143 -143
- package/dist/plugins/IPlugin.js +34 -34
- package/dist/plugins/PluginManager.d.ts +112 -112
- package/dist/plugins/PluginManager.js +259 -259
- package/dist/prices/BinanceSwapPrice.d.ts +26 -26
- package/dist/prices/BinanceSwapPrice.js +92 -92
- package/dist/prices/CoinGeckoSwapPrice.d.ts +30 -30
- package/dist/prices/CoinGeckoSwapPrice.js +64 -64
- package/dist/prices/ISwapPrice.d.ts +43 -43
- package/dist/prices/ISwapPrice.js +55 -55
- package/dist/prices/OKXSwapPrice.d.ts +26 -26
- package/dist/prices/OKXSwapPrice.js +92 -92
- package/dist/storage/IIntermediaryStorage.d.ts +18 -18
- package/dist/storage/IIntermediaryStorage.js +2 -2
- package/dist/storagemanager/IntermediaryStorageManager.d.ts +19 -19
- package/dist/storagemanager/IntermediaryStorageManager.js +111 -106
- package/dist/storagemanager/StorageManager.d.ts +13 -13
- package/dist/storagemanager/StorageManager.js +64 -59
- package/dist/swaps/SwapHandler.d.ts +153 -152
- package/dist/swaps/SwapHandler.js +160 -159
- package/dist/swaps/SwapHandlerSwap.d.ts +79 -79
- package/dist/swaps/SwapHandlerSwap.js +78 -78
- package/dist/swaps/assertions/AmountAssertions.d.ts +28 -28
- package/dist/swaps/assertions/AmountAssertions.js +72 -72
- package/dist/swaps/assertions/FromBtcAmountAssertions.d.ts +76 -76
- package/dist/swaps/assertions/FromBtcAmountAssertions.js +180 -172
- package/dist/swaps/assertions/LightningAssertions.d.ts +44 -44
- package/dist/swaps/assertions/LightningAssertions.js +86 -86
- package/dist/swaps/assertions/ToBtcAmountAssertions.d.ts +53 -53
- package/dist/swaps/assertions/ToBtcAmountAssertions.js +150 -150
- package/dist/swaps/escrow/EscrowHandler.d.ts +51 -51
- package/dist/swaps/escrow/EscrowHandler.js +158 -158
- package/dist/swaps/escrow/EscrowHandlerSwap.d.ts +35 -35
- package/dist/swaps/escrow/EscrowHandlerSwap.js +69 -69
- package/dist/swaps/escrow/FromBtcBaseSwap.d.ts +14 -14
- package/dist/swaps/escrow/FromBtcBaseSwap.js +32 -32
- package/dist/swaps/escrow/FromBtcBaseSwapHandler.d.ts +102 -101
- package/dist/swaps/escrow/FromBtcBaseSwapHandler.js +210 -207
- package/dist/swaps/escrow/ToBtcBaseSwap.d.ts +36 -36
- package/dist/swaps/escrow/ToBtcBaseSwap.js +67 -67
- package/dist/swaps/escrow/ToBtcBaseSwapHandler.d.ts +53 -53
- package/dist/swaps/escrow/ToBtcBaseSwapHandler.js +81 -81
- package/dist/swaps/escrow/frombtc_abstract/FromBtcAbs.d.ts +83 -83
- package/dist/swaps/escrow/frombtc_abstract/FromBtcAbs.js +318 -318
- package/dist/swaps/escrow/frombtc_abstract/FromBtcSwapAbs.d.ts +21 -21
- package/dist/swaps/escrow/frombtc_abstract/FromBtcSwapAbs.js +50 -50
- package/dist/swaps/escrow/frombtcln_abstract/FromBtcLnAbs.d.ts +107 -107
- package/dist/swaps/escrow/frombtcln_abstract/FromBtcLnAbs.js +675 -648
- package/dist/swaps/escrow/frombtcln_abstract/FromBtcLnSwapAbs.d.ts +33 -32
- package/dist/swaps/escrow/frombtcln_abstract/FromBtcLnSwapAbs.js +91 -88
- package/dist/swaps/escrow/frombtcln_autoinit/FromBtcLnAuto.d.ts +111 -0
- package/dist/swaps/escrow/frombtcln_autoinit/FromBtcLnAuto.js +684 -0
- package/dist/swaps/escrow/frombtcln_autoinit/FromBtcLnAutoSwap.d.ts +55 -0
- package/dist/swaps/escrow/frombtcln_autoinit/FromBtcLnAutoSwap.js +120 -0
- package/dist/swaps/escrow/tobtc_abstract/ToBtcAbs.d.ts +171 -171
- package/dist/swaps/escrow/tobtc_abstract/ToBtcAbs.js +729 -706
- package/dist/swaps/escrow/tobtc_abstract/ToBtcSwapAbs.d.ts +28 -26
- package/dist/swaps/escrow/tobtc_abstract/ToBtcSwapAbs.js +64 -62
- package/dist/swaps/escrow/tobtcln_abstract/ToBtcLnAbs.d.ts +177 -177
- package/dist/swaps/escrow/tobtcln_abstract/ToBtcLnAbs.js +865 -861
- package/dist/swaps/escrow/tobtcln_abstract/ToBtcLnSwapAbs.d.ts +24 -23
- package/dist/swaps/escrow/tobtcln_abstract/ToBtcLnSwapAbs.js +58 -56
- package/dist/swaps/spv_vault_swap/SpvVault.d.ts +42 -41
- package/dist/swaps/spv_vault_swap/SpvVault.js +111 -111
- package/dist/swaps/spv_vault_swap/SpvVaultSwap.d.ts +68 -67
- package/dist/swaps/spv_vault_swap/SpvVaultSwap.js +158 -158
- package/dist/swaps/spv_vault_swap/SpvVaultSwapHandler.d.ts +68 -68
- package/dist/swaps/spv_vault_swap/SpvVaultSwapHandler.js +519 -490
- package/dist/swaps/spv_vault_swap/SpvVaults.d.ts +56 -52
- package/dist/swaps/spv_vault_swap/SpvVaults.js +397 -364
- package/dist/swaps/trusted/frombtc_trusted/FromBtcTrusted.d.ts +51 -51
- package/dist/swaps/trusted/frombtc_trusted/FromBtcTrusted.js +650 -650
- package/dist/swaps/trusted/frombtc_trusted/FromBtcTrustedSwap.d.ts +52 -52
- package/dist/swaps/trusted/frombtc_trusted/FromBtcTrustedSwap.js +118 -118
- package/dist/swaps/trusted/frombtcln_trusted/FromBtcLnTrusted.d.ts +76 -76
- package/dist/swaps/trusted/frombtcln_trusted/FromBtcLnTrusted.js +494 -494
- package/dist/swaps/trusted/frombtcln_trusted/FromBtcLnTrustedSwap.d.ts +34 -34
- package/dist/swaps/trusted/frombtcln_trusted/FromBtcLnTrustedSwap.js +81 -81
- package/dist/utils/BitcoinUtils.d.ts +6 -0
- package/dist/utils/BitcoinUtils.js +75 -0
- package/dist/utils/Utils.d.ts +29 -29
- package/dist/utils/Utils.js +89 -89
- package/dist/utils/paramcoders/IParamReader.d.ts +5 -5
- package/dist/utils/paramcoders/IParamReader.js +2 -2
- package/dist/utils/paramcoders/IParamWriter.d.ts +4 -4
- package/dist/utils/paramcoders/IParamWriter.js +2 -2
- package/dist/utils/paramcoders/LegacyParamEncoder.d.ts +10 -10
- package/dist/utils/paramcoders/LegacyParamEncoder.js +22 -22
- package/dist/utils/paramcoders/ParamDecoder.d.ts +25 -25
- package/dist/utils/paramcoders/ParamDecoder.js +222 -222
- package/dist/utils/paramcoders/ParamEncoder.d.ts +9 -9
- package/dist/utils/paramcoders/ParamEncoder.js +22 -22
- package/dist/utils/paramcoders/SchemaVerifier.d.ts +21 -21
- package/dist/utils/paramcoders/SchemaVerifier.js +84 -84
- package/dist/utils/paramcoders/server/ServerParamDecoder.d.ts +8 -8
- package/dist/utils/paramcoders/server/ServerParamDecoder.js +107 -107
- package/dist/utils/paramcoders/server/ServerParamEncoder.d.ts +11 -11
- package/dist/utils/paramcoders/server/ServerParamEncoder.js +65 -65
- package/dist/wallets/IBitcoinWallet.d.ts +67 -67
- package/dist/wallets/IBitcoinWallet.js +2 -2
- package/dist/wallets/ILightningWallet.d.ts +117 -117
- package/dist/wallets/ILightningWallet.js +37 -37
- package/dist/wallets/ISpvVaultSigner.d.ts +7 -7
- package/dist/wallets/ISpvVaultSigner.js +2 -2
- package/package.json +36 -36
- package/src/fees/IBtcFeeEstimator.ts +6 -6
- package/src/index.ts +53 -51
- package/src/info/InfoHandler.ts +106 -106
- package/src/plugins/IPlugin.ts +168 -168
- package/src/plugins/PluginManager.ts +336 -336
- package/src/prices/BinanceSwapPrice.ts +113 -113
- package/src/prices/CoinGeckoSwapPrice.ts +87 -87
- package/src/prices/ISwapPrice.ts +88 -88
- package/src/prices/OKXSwapPrice.ts +113 -113
- package/src/storage/IIntermediaryStorage.ts +19 -19
- package/src/storagemanager/IntermediaryStorageManager.ts +118 -112
- package/src/storagemanager/StorageManager.ts +78 -72
- package/src/swaps/SwapHandler.ts +277 -276
- package/src/swaps/SwapHandlerSwap.ts +141 -141
- package/src/swaps/assertions/AmountAssertions.ts +76 -76
- package/src/swaps/assertions/FromBtcAmountAssertions.ts +246 -238
- package/src/swaps/assertions/LightningAssertions.ts +103 -103
- package/src/swaps/assertions/ToBtcAmountAssertions.ts +203 -203
- package/src/swaps/escrow/EscrowHandler.ts +179 -179
- package/src/swaps/escrow/EscrowHandlerSwap.ts +86 -86
- package/src/swaps/escrow/FromBtcBaseSwap.ts +38 -38
- package/src/swaps/escrow/FromBtcBaseSwapHandler.ts +286 -283
- package/src/swaps/escrow/ToBtcBaseSwap.ts +85 -85
- package/src/swaps/escrow/ToBtcBaseSwapHandler.ts +129 -129
- package/src/swaps/escrow/frombtc_abstract/FromBtcAbs.ts +452 -452
- package/src/swaps/escrow/frombtc_abstract/FromBtcSwapAbs.ts +61 -61
- package/src/swaps/escrow/frombtcln_abstract/FromBtcLnAbs.ts +856 -828
- package/src/swaps/escrow/frombtcln_abstract/FromBtcLnSwapAbs.ts +141 -137
- package/src/swaps/escrow/frombtcln_autoinit/FromBtcLnAuto.ts +850 -0
- package/src/swaps/escrow/frombtcln_autoinit/FromBtcLnAutoSwap.ts +196 -0
- package/src/swaps/escrow/tobtc_abstract/ToBtcAbs.ts +904 -879
- package/src/swaps/escrow/tobtc_abstract/ToBtcSwapAbs.ts +108 -102
- package/src/swaps/escrow/tobtcln_abstract/ToBtcLnAbs.ts +1116 -1110
- package/src/swaps/escrow/tobtcln_abstract/ToBtcLnSwapAbs.ts +80 -77
- package/src/swaps/spv_vault_swap/SpvVault.ts +143 -143
- package/src/swaps/spv_vault_swap/SpvVaultSwap.ts +228 -225
- package/src/swaps/spv_vault_swap/SpvVaultSwapHandler.ts +656 -626
- package/src/swaps/spv_vault_swap/SpvVaults.ts +473 -435
- package/src/swaps/trusted/frombtc_trusted/FromBtcTrusted.ts +747 -747
- package/src/swaps/trusted/frombtc_trusted/FromBtcTrustedSwap.ts +185 -185
- package/src/swaps/trusted/frombtcln_trusted/FromBtcLnTrusted.ts +590 -590
- package/src/swaps/trusted/frombtcln_trusted/FromBtcLnTrustedSwap.ts +121 -121
- package/src/utils/BitcoinUtils.ts +71 -0
- package/src/utils/Utils.ts +104 -104
- package/src/utils/paramcoders/IParamReader.ts +7 -7
- package/src/utils/paramcoders/IParamWriter.ts +8 -8
- package/src/utils/paramcoders/LegacyParamEncoder.ts +27 -27
- package/src/utils/paramcoders/ParamDecoder.ts +218 -218
- package/src/utils/paramcoders/ParamEncoder.ts +29 -29
- package/src/utils/paramcoders/SchemaVerifier.ts +96 -96
- package/src/utils/paramcoders/server/ServerParamDecoder.ts +118 -118
- package/src/utils/paramcoders/server/ServerParamEncoder.ts +75 -75
- package/src/wallets/IBitcoinWallet.ts +68 -68
- package/src/wallets/ILightningWallet.ts +178 -178
- package/src/wallets/ISpvVaultSigner.ts +10 -10
- package/dist/wallets/ISpvVaultWallet.d.ts +0 -42
- package/dist/wallets/ISpvVaultWallet.js +0 -2
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
import {ISwapPrice} from "./ISwapPrice";
|
|
2
|
-
|
|
3
|
-
const CACHE_DURATION = 15000;
|
|
4
|
-
|
|
5
|
-
export type BinancePriceData = {
|
|
6
|
-
[pair: string]: {
|
|
7
|
-
[chainId: string]: {
|
|
8
|
-
address: string,
|
|
9
|
-
decimals: number
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export class BinanceSwapPrice extends ISwapPrice<{ pair: string, decimals: number }> {
|
|
15
|
-
|
|
16
|
-
url: string;
|
|
17
|
-
cache: {
|
|
18
|
-
[pair: string]: {
|
|
19
|
-
price: number,
|
|
20
|
-
expiry: number
|
|
21
|
-
}
|
|
22
|
-
} = {};
|
|
23
|
-
|
|
24
|
-
constructor(url: string, coins: BinancePriceData) {
|
|
25
|
-
const coinsMap = {};
|
|
26
|
-
for(let pair in coins) {
|
|
27
|
-
const chains = coins[pair];
|
|
28
|
-
for(let chainId in chains) {
|
|
29
|
-
const tokenData = chains[chainId];
|
|
30
|
-
if(coinsMap[chainId]==null) coinsMap[chainId] = {};
|
|
31
|
-
coinsMap[chainId][tokenData.address] = {
|
|
32
|
-
pair,
|
|
33
|
-
decimals: tokenData.decimals
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
super(coinsMap);
|
|
38
|
-
this.url = url || "https://api.binance.com/api/v3";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async fetchPrice(pair: string) {
|
|
42
|
-
const response: Response = await fetch(this.url + "/ticker/price?symbol=" + pair, {
|
|
43
|
-
method: "GET"
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
if (response.status !== 200) {
|
|
47
|
-
let resp: string;
|
|
48
|
-
try {
|
|
49
|
-
resp = await response.text();
|
|
50
|
-
} catch (e) {
|
|
51
|
-
throw new Error(response.statusText);
|
|
52
|
-
}
|
|
53
|
-
throw new Error(resp);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
let jsonBody: any = await response.json();
|
|
57
|
-
|
|
58
|
-
return parseFloat(jsonBody.price);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
async getPrice(tokenData: {pair: string}): Promise<bigint> {
|
|
62
|
-
const pair = tokenData.pair;
|
|
63
|
-
if(pair.startsWith("$fixed-")) {
|
|
64
|
-
const amt: number = parseFloat(pair.substring(7));
|
|
65
|
-
return BigInt(Math.floor(amt*1000000));
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const arr = pair.split(";");
|
|
69
|
-
|
|
70
|
-
const promises = [];
|
|
71
|
-
const cachedValue = this.cache[pair];
|
|
72
|
-
if(cachedValue==null || cachedValue.expiry<Date.now()) {
|
|
73
|
-
let resultPrice = 1;
|
|
74
|
-
for (let pair of arr) {
|
|
75
|
-
let invert = false
|
|
76
|
-
if (pair.startsWith("!")) {
|
|
77
|
-
invert = true;
|
|
78
|
-
pair = pair.substring(1);
|
|
79
|
-
}
|
|
80
|
-
const cachedValue = this.cache[pair];
|
|
81
|
-
if (cachedValue == null || cachedValue.expiry < Date.now()) {
|
|
82
|
-
promises.push(this.fetchPrice(pair).then(price => {
|
|
83
|
-
this.cache[pair] = {
|
|
84
|
-
price,
|
|
85
|
-
expiry: Date.now() + CACHE_DURATION
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
if (invert) {
|
|
89
|
-
resultPrice /= price;
|
|
90
|
-
} else {
|
|
91
|
-
resultPrice *= price;
|
|
92
|
-
}
|
|
93
|
-
}));
|
|
94
|
-
} else {
|
|
95
|
-
if (invert) {
|
|
96
|
-
resultPrice /= cachedValue.price;
|
|
97
|
-
} else {
|
|
98
|
-
resultPrice *= cachedValue.price;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
await Promise.all(promises);
|
|
104
|
-
|
|
105
|
-
this.cache[pair] = {
|
|
106
|
-
price: resultPrice,
|
|
107
|
-
expiry: Date.now() + CACHE_DURATION
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return BigInt(Math.floor(this.cache[pair].price*100000000000000));
|
|
112
|
-
}
|
|
113
|
-
}
|
|
1
|
+
import {ISwapPrice} from "./ISwapPrice";
|
|
2
|
+
|
|
3
|
+
const CACHE_DURATION = 15000;
|
|
4
|
+
|
|
5
|
+
export type BinancePriceData = {
|
|
6
|
+
[pair: string]: {
|
|
7
|
+
[chainId: string]: {
|
|
8
|
+
address: string,
|
|
9
|
+
decimals: number
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export class BinanceSwapPrice extends ISwapPrice<{ pair: string, decimals: number }> {
|
|
15
|
+
|
|
16
|
+
url: string;
|
|
17
|
+
cache: {
|
|
18
|
+
[pair: string]: {
|
|
19
|
+
price: number,
|
|
20
|
+
expiry: number
|
|
21
|
+
}
|
|
22
|
+
} = {};
|
|
23
|
+
|
|
24
|
+
constructor(url: string, coins: BinancePriceData) {
|
|
25
|
+
const coinsMap = {};
|
|
26
|
+
for(let pair in coins) {
|
|
27
|
+
const chains = coins[pair];
|
|
28
|
+
for(let chainId in chains) {
|
|
29
|
+
const tokenData = chains[chainId];
|
|
30
|
+
if(coinsMap[chainId]==null) coinsMap[chainId] = {};
|
|
31
|
+
coinsMap[chainId][tokenData.address] = {
|
|
32
|
+
pair,
|
|
33
|
+
decimals: tokenData.decimals
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
super(coinsMap);
|
|
38
|
+
this.url = url || "https://api.binance.com/api/v3";
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async fetchPrice(pair: string) {
|
|
42
|
+
const response: Response = await fetch(this.url + "/ticker/price?symbol=" + pair, {
|
|
43
|
+
method: "GET"
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
if (response.status !== 200) {
|
|
47
|
+
let resp: string;
|
|
48
|
+
try {
|
|
49
|
+
resp = await response.text();
|
|
50
|
+
} catch (e) {
|
|
51
|
+
throw new Error(response.statusText);
|
|
52
|
+
}
|
|
53
|
+
throw new Error(resp);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let jsonBody: any = await response.json();
|
|
57
|
+
|
|
58
|
+
return parseFloat(jsonBody.price);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async getPrice(tokenData: {pair: string}): Promise<bigint> {
|
|
62
|
+
const pair = tokenData.pair;
|
|
63
|
+
if(pair.startsWith("$fixed-")) {
|
|
64
|
+
const amt: number = parseFloat(pair.substring(7));
|
|
65
|
+
return BigInt(Math.floor(amt*1000000));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const arr = pair.split(";");
|
|
69
|
+
|
|
70
|
+
const promises = [];
|
|
71
|
+
const cachedValue = this.cache[pair];
|
|
72
|
+
if(cachedValue==null || cachedValue.expiry<Date.now()) {
|
|
73
|
+
let resultPrice = 1;
|
|
74
|
+
for (let pair of arr) {
|
|
75
|
+
let invert = false
|
|
76
|
+
if (pair.startsWith("!")) {
|
|
77
|
+
invert = true;
|
|
78
|
+
pair = pair.substring(1);
|
|
79
|
+
}
|
|
80
|
+
const cachedValue = this.cache[pair];
|
|
81
|
+
if (cachedValue == null || cachedValue.expiry < Date.now()) {
|
|
82
|
+
promises.push(this.fetchPrice(pair).then(price => {
|
|
83
|
+
this.cache[pair] = {
|
|
84
|
+
price,
|
|
85
|
+
expiry: Date.now() + CACHE_DURATION
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
if (invert) {
|
|
89
|
+
resultPrice /= price;
|
|
90
|
+
} else {
|
|
91
|
+
resultPrice *= price;
|
|
92
|
+
}
|
|
93
|
+
}));
|
|
94
|
+
} else {
|
|
95
|
+
if (invert) {
|
|
96
|
+
resultPrice /= cachedValue.price;
|
|
97
|
+
} else {
|
|
98
|
+
resultPrice *= cachedValue.price;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
await Promise.all(promises);
|
|
104
|
+
|
|
105
|
+
this.cache[pair] = {
|
|
106
|
+
price: resultPrice,
|
|
107
|
+
expiry: Date.now() + CACHE_DURATION
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return BigInt(Math.floor(this.cache[pair].price*100000000000000));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
import {ISwapPrice} from "./ISwapPrice";
|
|
2
|
-
|
|
3
|
-
const CACHE_DURATION = 15000;
|
|
4
|
-
|
|
5
|
-
export type CoinGeckoPriceData = {
|
|
6
|
-
[coinId: string]: {
|
|
7
|
-
[chainId: string]: {
|
|
8
|
-
address: string,
|
|
9
|
-
decimals: number
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export class CoinGeckoSwapPrice extends ISwapPrice<{coinId: string, decimals: number}> {
|
|
15
|
-
|
|
16
|
-
url: string;
|
|
17
|
-
cache: {
|
|
18
|
-
[coinId: string]: {
|
|
19
|
-
price: bigint,
|
|
20
|
-
expiry: number
|
|
21
|
-
}
|
|
22
|
-
} = {};
|
|
23
|
-
|
|
24
|
-
constructor(url: string, coins: CoinGeckoPriceData) {
|
|
25
|
-
const coinsMap = {};
|
|
26
|
-
for(let coinId in coins) {
|
|
27
|
-
const chains = coins[coinId];
|
|
28
|
-
for(let chainId in chains) {
|
|
29
|
-
const tokenData = chains[chainId];
|
|
30
|
-
if(coinsMap[chainId]==null) coinsMap[chainId] = {};
|
|
31
|
-
coinsMap[chainId][tokenData.address] = {
|
|
32
|
-
coinId,
|
|
33
|
-
decimals: tokenData.decimals
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
super(coinsMap);
|
|
38
|
-
this.url = url || "https://api.coingecko.com/api/v3";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Returns coin price in mSat
|
|
43
|
-
*
|
|
44
|
-
* @param coin
|
|
45
|
-
*/
|
|
46
|
-
async getPrice(coin: {coinId: string}): Promise<bigint> {
|
|
47
|
-
const coinId = coin.coinId;
|
|
48
|
-
if(coinId.startsWith("$fixed-")) {
|
|
49
|
-
const amt: number = parseFloat(coinId.substring(7));
|
|
50
|
-
return BigInt(Math.floor(amt*1000));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const cachedValue = this.cache[coinId];
|
|
54
|
-
if(cachedValue!=null && cachedValue.expiry>Date.now()) {
|
|
55
|
-
return cachedValue.price;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const response: Response = await fetch(this.url+"/simple/price?ids="+coinId+"&vs_currencies=sats&precision=3", {
|
|
59
|
-
method: "GET",
|
|
60
|
-
headers: {'Content-Type': 'application/json'}
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
if(response.status!==200) {
|
|
64
|
-
let resp: string;
|
|
65
|
-
try {
|
|
66
|
-
resp = await response.text();
|
|
67
|
-
} catch (e) {
|
|
68
|
-
throw new Error(response.statusText);
|
|
69
|
-
}
|
|
70
|
-
throw new Error(resp);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
let jsonBody: any = await response.json();
|
|
74
|
-
|
|
75
|
-
const amt: number = jsonBody[coinId].sats;
|
|
76
|
-
|
|
77
|
-
const result = BigInt(Math.floor(amt*1000));
|
|
78
|
-
|
|
79
|
-
this.cache[coinId] = {
|
|
80
|
-
price: result,
|
|
81
|
-
expiry: Date.now()+CACHE_DURATION
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
return result;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
}
|
|
1
|
+
import {ISwapPrice} from "./ISwapPrice";
|
|
2
|
+
|
|
3
|
+
const CACHE_DURATION = 15000;
|
|
4
|
+
|
|
5
|
+
export type CoinGeckoPriceData = {
|
|
6
|
+
[coinId: string]: {
|
|
7
|
+
[chainId: string]: {
|
|
8
|
+
address: string,
|
|
9
|
+
decimals: number
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export class CoinGeckoSwapPrice extends ISwapPrice<{coinId: string, decimals: number}> {
|
|
15
|
+
|
|
16
|
+
url: string;
|
|
17
|
+
cache: {
|
|
18
|
+
[coinId: string]: {
|
|
19
|
+
price: bigint,
|
|
20
|
+
expiry: number
|
|
21
|
+
}
|
|
22
|
+
} = {};
|
|
23
|
+
|
|
24
|
+
constructor(url: string, coins: CoinGeckoPriceData) {
|
|
25
|
+
const coinsMap = {};
|
|
26
|
+
for(let coinId in coins) {
|
|
27
|
+
const chains = coins[coinId];
|
|
28
|
+
for(let chainId in chains) {
|
|
29
|
+
const tokenData = chains[chainId];
|
|
30
|
+
if(coinsMap[chainId]==null) coinsMap[chainId] = {};
|
|
31
|
+
coinsMap[chainId][tokenData.address] = {
|
|
32
|
+
coinId,
|
|
33
|
+
decimals: tokenData.decimals
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
super(coinsMap);
|
|
38
|
+
this.url = url || "https://api.coingecko.com/api/v3";
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Returns coin price in mSat
|
|
43
|
+
*
|
|
44
|
+
* @param coin
|
|
45
|
+
*/
|
|
46
|
+
async getPrice(coin: {coinId: string}): Promise<bigint> {
|
|
47
|
+
const coinId = coin.coinId;
|
|
48
|
+
if(coinId.startsWith("$fixed-")) {
|
|
49
|
+
const amt: number = parseFloat(coinId.substring(7));
|
|
50
|
+
return BigInt(Math.floor(amt*1000));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const cachedValue = this.cache[coinId];
|
|
54
|
+
if(cachedValue!=null && cachedValue.expiry>Date.now()) {
|
|
55
|
+
return cachedValue.price;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const response: Response = await fetch(this.url+"/simple/price?ids="+coinId+"&vs_currencies=sats&precision=3", {
|
|
59
|
+
method: "GET",
|
|
60
|
+
headers: {'Content-Type': 'application/json'}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
if(response.status!==200) {
|
|
64
|
+
let resp: string;
|
|
65
|
+
try {
|
|
66
|
+
resp = await response.text();
|
|
67
|
+
} catch (e) {
|
|
68
|
+
throw new Error(response.statusText);
|
|
69
|
+
}
|
|
70
|
+
throw new Error(resp);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let jsonBody: any = await response.json();
|
|
74
|
+
|
|
75
|
+
const amt: number = jsonBody[coinId].sats;
|
|
76
|
+
|
|
77
|
+
const result = BigInt(Math.floor(amt*1000));
|
|
78
|
+
|
|
79
|
+
this.cache[coinId] = {
|
|
80
|
+
price: result,
|
|
81
|
+
expiry: Date.now()+CACHE_DURATION
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
}
|
package/src/prices/ISwapPrice.ts
CHANGED
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
export type ISwapPriceCoinsMap<T extends {decimals: number}> = {
|
|
2
|
-
[chainId: string]: {
|
|
3
|
-
[address: string]: T
|
|
4
|
-
}
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
export abstract class ISwapPrice<T extends {decimals: number} = {decimals: number}> {
|
|
8
|
-
|
|
9
|
-
protected coinsMap: ISwapPriceCoinsMap<T>;
|
|
10
|
-
|
|
11
|
-
protected constructor(coinsMap: ISwapPriceCoinsMap<T>) {
|
|
12
|
-
this.coinsMap = coinsMap;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Returns coin price in mSat
|
|
17
|
-
*
|
|
18
|
-
* @param tokenData
|
|
19
|
-
*/
|
|
20
|
-
protected abstract getPrice(tokenData: T): Promise<bigint>;
|
|
21
|
-
|
|
22
|
-
getTokenData(tokenAddress: string, chainId: string): T {
|
|
23
|
-
const chainTokens = this.coinsMap[chainId];
|
|
24
|
-
if(chainTokens==null) throw new Error("Chain not found");
|
|
25
|
-
|
|
26
|
-
const tokenAddr: string = tokenAddress.toString();
|
|
27
|
-
const coin: T = chainTokens[tokenAddr];
|
|
28
|
-
if(coin==null) throw new Error("Token not found");
|
|
29
|
-
|
|
30
|
-
return coin;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
preFetchPrice(token: string, chainId: string): Promise<bigint> {
|
|
34
|
-
const coin = this.getTokenData(token, chainId);
|
|
35
|
-
return this.getPrice(coin);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Returns amount of satoshis that are equivalent to {fromAmount} of {fromToken}
|
|
40
|
-
*
|
|
41
|
-
* @param fromAmount Amount of the token
|
|
42
|
-
* @param fromToken Token
|
|
43
|
-
* @param tokenChainIdentification Chain of the token
|
|
44
|
-
* @param roundUp Whether result should be rounded up
|
|
45
|
-
* @param preFetch Price pre-fetch promise returned from preFetchPrice()
|
|
46
|
-
*/
|
|
47
|
-
async getToBtcSwapAmount(
|
|
48
|
-
fromAmount:bigint,
|
|
49
|
-
fromToken: string,
|
|
50
|
-
tokenChainIdentification: string,
|
|
51
|
-
roundUp?: boolean,
|
|
52
|
-
preFetch?: Promise<bigint>
|
|
53
|
-
): Promise<bigint> {
|
|
54
|
-
if(fromAmount===0n) return 0n;
|
|
55
|
-
|
|
56
|
-
const coin = this.getTokenData(fromToken, tokenChainIdentification);
|
|
57
|
-
|
|
58
|
-
const price = (preFetch==null ? null : await preFetch) || await this.getPrice(coin);
|
|
59
|
-
|
|
60
|
-
return ((fromAmount * price / (10n ** BigInt(coin.decimals))) + (roundUp ? 999999n : 0n)) / 1000000n;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Returns amount of {toToken} that are equivalent to {fromAmount} satoshis
|
|
65
|
-
*
|
|
66
|
-
* @param fromAmount Amount of satoshis
|
|
67
|
-
* @param toToken Token
|
|
68
|
-
* @param tokenChainIdentification Chain of the token
|
|
69
|
-
* @param roundUp Whether result should be rounded up
|
|
70
|
-
* @param preFetch Price pre-fetch promise returned from preFetchPrice()
|
|
71
|
-
*/
|
|
72
|
-
async getFromBtcSwapAmount(
|
|
73
|
-
fromAmount: bigint,
|
|
74
|
-
toToken: string,
|
|
75
|
-
tokenChainIdentification: string,
|
|
76
|
-
roundUp?: boolean,
|
|
77
|
-
preFetch?: Promise<bigint>
|
|
78
|
-
): Promise<bigint> {
|
|
79
|
-
if(fromAmount===0n) return 0n;
|
|
80
|
-
|
|
81
|
-
const coin = this.getTokenData(toToken, tokenChainIdentification);
|
|
82
|
-
|
|
83
|
-
const price = (preFetch==null ? null : await preFetch) || await this.getPrice(coin);
|
|
84
|
-
|
|
85
|
-
return ((fromAmount * (10n ** BigInt(coin.decimals)) * 1000000n) + (roundUp ? price - 1n : 0n)) / price;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
}
|
|
1
|
+
export type ISwapPriceCoinsMap<T extends {decimals: number}> = {
|
|
2
|
+
[chainId: string]: {
|
|
3
|
+
[address: string]: T
|
|
4
|
+
}
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export abstract class ISwapPrice<T extends {decimals: number} = {decimals: number}> {
|
|
8
|
+
|
|
9
|
+
protected coinsMap: ISwapPriceCoinsMap<T>;
|
|
10
|
+
|
|
11
|
+
protected constructor(coinsMap: ISwapPriceCoinsMap<T>) {
|
|
12
|
+
this.coinsMap = coinsMap;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Returns coin price in mSat
|
|
17
|
+
*
|
|
18
|
+
* @param tokenData
|
|
19
|
+
*/
|
|
20
|
+
protected abstract getPrice(tokenData: T): Promise<bigint>;
|
|
21
|
+
|
|
22
|
+
getTokenData(tokenAddress: string, chainId: string): T {
|
|
23
|
+
const chainTokens = this.coinsMap[chainId];
|
|
24
|
+
if(chainTokens==null) throw new Error("Chain not found");
|
|
25
|
+
|
|
26
|
+
const tokenAddr: string = tokenAddress.toString();
|
|
27
|
+
const coin: T = chainTokens[tokenAddr];
|
|
28
|
+
if(coin==null) throw new Error("Token not found");
|
|
29
|
+
|
|
30
|
+
return coin;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
preFetchPrice(token: string, chainId: string): Promise<bigint> {
|
|
34
|
+
const coin = this.getTokenData(token, chainId);
|
|
35
|
+
return this.getPrice(coin);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Returns amount of satoshis that are equivalent to {fromAmount} of {fromToken}
|
|
40
|
+
*
|
|
41
|
+
* @param fromAmount Amount of the token
|
|
42
|
+
* @param fromToken Token
|
|
43
|
+
* @param tokenChainIdentification Chain of the token
|
|
44
|
+
* @param roundUp Whether result should be rounded up
|
|
45
|
+
* @param preFetch Price pre-fetch promise returned from preFetchPrice()
|
|
46
|
+
*/
|
|
47
|
+
async getToBtcSwapAmount(
|
|
48
|
+
fromAmount:bigint,
|
|
49
|
+
fromToken: string,
|
|
50
|
+
tokenChainIdentification: string,
|
|
51
|
+
roundUp?: boolean,
|
|
52
|
+
preFetch?: Promise<bigint>
|
|
53
|
+
): Promise<bigint> {
|
|
54
|
+
if(fromAmount===0n) return 0n;
|
|
55
|
+
|
|
56
|
+
const coin = this.getTokenData(fromToken, tokenChainIdentification);
|
|
57
|
+
|
|
58
|
+
const price = (preFetch==null ? null : await preFetch) || await this.getPrice(coin);
|
|
59
|
+
|
|
60
|
+
return ((fromAmount * price / (10n ** BigInt(coin.decimals))) + (roundUp ? 999999n : 0n)) / 1000000n;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Returns amount of {toToken} that are equivalent to {fromAmount} satoshis
|
|
65
|
+
*
|
|
66
|
+
* @param fromAmount Amount of satoshis
|
|
67
|
+
* @param toToken Token
|
|
68
|
+
* @param tokenChainIdentification Chain of the token
|
|
69
|
+
* @param roundUp Whether result should be rounded up
|
|
70
|
+
* @param preFetch Price pre-fetch promise returned from preFetchPrice()
|
|
71
|
+
*/
|
|
72
|
+
async getFromBtcSwapAmount(
|
|
73
|
+
fromAmount: bigint,
|
|
74
|
+
toToken: string,
|
|
75
|
+
tokenChainIdentification: string,
|
|
76
|
+
roundUp?: boolean,
|
|
77
|
+
preFetch?: Promise<bigint>
|
|
78
|
+
): Promise<bigint> {
|
|
79
|
+
if(fromAmount===0n) return 0n;
|
|
80
|
+
|
|
81
|
+
const coin = this.getTokenData(toToken, tokenChainIdentification);
|
|
82
|
+
|
|
83
|
+
const price = (preFetch==null ? null : await preFetch) || await this.getPrice(coin);
|
|
84
|
+
|
|
85
|
+
return ((fromAmount * (10n ** BigInt(coin.decimals)) * 1000000n) + (roundUp ? price - 1n : 0n)) / price;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
}
|