@atomiqlabs/sdk 4.0.1 → 5.0.0-dev.1
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/README.md +1098 -1074
- package/dist/SmartChainAssets.d.ts +93 -83
- package/dist/SmartChainAssets.js +95 -85
- package/dist/SwapperFactory.d.ts +50 -50
- package/dist/SwapperFactory.js +105 -105
- package/dist/Utils.d.ts +11 -11
- package/dist/Utils.js +37 -37
- package/dist/fs-storage/FileSystemStorageManager.d.ts +15 -15
- package/dist/fs-storage/FileSystemStorageManager.js +60 -60
- package/dist/fs-storage/index.d.ts +1 -1
- package/dist/fs-storage/index.js +17 -17
- package/dist/index.d.ts +5 -5
- package/dist/index.js +21 -21
- package/dist/storage/LocalStorageManager.d.ts +24 -24
- package/dist/storage/LocalStorageManager.js +68 -68
- package/package.json +31 -31
- package/src/SmartChainAssets.js +75 -75
- package/src/SmartChainAssets.ts +96 -86
- package/src/SwapperFactory.js +120 -120
- package/src/SwapperFactory.ts +195 -195
- package/src/Utils.js +37 -37
- package/src/Utils.ts +31 -31
- package/src/fs-storage/FileSystemStorageManager.ts +71 -71
- package/src/fs-storage/index.ts +1 -1
- package/src/index.js +21 -21
- package/src/index.ts +5 -5
- package/src/storage/LocalStorageManager.js +72 -72
- package/src/storage/LocalStorageManager.ts +81 -81
package/src/SwapperFactory.js
CHANGED
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var _a, _b, _c;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.SwapperFactory = void 0;
|
|
16
|
-
var base_1 = require("@atomiqlabs/base");
|
|
17
|
-
var sdk_lib_1 = require("@atomiqlabs/sdk-lib");
|
|
18
|
-
var SmartChainAssets_1 = require("./SmartChainAssets");
|
|
19
|
-
var LocalStorageManager_1 = require("./storage/LocalStorageManager");
|
|
20
|
-
var registries = (_a = {},
|
|
21
|
-
_a[base_1.BitcoinNetwork.MAINNET] = "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry-mainnet.json?ref=main",
|
|
22
|
-
_a[base_1.BitcoinNetwork.TESTNET] = "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry.json?ref=main",
|
|
23
|
-
_a[base_1.BitcoinNetwork.TESTNET4] = "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry-testnet4.json?ref=main",
|
|
24
|
-
_a);
|
|
25
|
-
var trustedIntermediaries = (_b = {},
|
|
26
|
-
_b[base_1.BitcoinNetwork.MAINNET] = "https://node3.gethopa.com:34100",
|
|
27
|
-
_b[base_1.BitcoinNetwork.TESTNET] = "https://node3.gethopa.com:24100",
|
|
28
|
-
_b);
|
|
29
|
-
var mempoolUrls = (_c = {},
|
|
30
|
-
_c[base_1.BitcoinNetwork.MAINNET] = [
|
|
31
|
-
"https://mempool.space/api/",
|
|
32
|
-
"https://mempool.fra.mempool.space/api/",
|
|
33
|
-
"https://mempool.va1.mempool.space/api/",
|
|
34
|
-
"https://mempool.tk7.mempool.space/api/"
|
|
35
|
-
],
|
|
36
|
-
_c[base_1.BitcoinNetwork.TESTNET] = [
|
|
37
|
-
"https://mempool.space/testnet/api/",
|
|
38
|
-
"https://mempool.fra.mempool.space/testnet/api/",
|
|
39
|
-
"https://mempool.va1.mempool.space/testnet/api/",
|
|
40
|
-
"https://mempool.tk7.mempool.space/testnet/api/"
|
|
41
|
-
],
|
|
42
|
-
_c[base_1.BitcoinNetwork.TESTNET4] = [
|
|
43
|
-
"https://mempool.space/testnet4/api/",
|
|
44
|
-
"https://mempool.fra.mempool.space/testnet4/api/",
|
|
45
|
-
"https://mempool.va1.mempool.space/testnet4/api/",
|
|
46
|
-
"https://mempool.tk7.mempool.space/testnet4/api/"
|
|
47
|
-
],
|
|
48
|
-
_c);
|
|
49
|
-
var SwapperFactory = /** @class */ (function () {
|
|
50
|
-
function SwapperFactory(initializers) {
|
|
51
|
-
var _this = this;
|
|
52
|
-
this.initializers = initializers;
|
|
53
|
-
this.Tokens = {
|
|
54
|
-
BITCOIN: sdk_lib_1.BitcoinTokens
|
|
55
|
-
};
|
|
56
|
-
this.TokenResolver = {};
|
|
57
|
-
this.initializers = initializers;
|
|
58
|
-
initializers.forEach(function (initializer) {
|
|
59
|
-
var addressMap = {};
|
|
60
|
-
_this.Tokens[initializer.chainId] = {};
|
|
61
|
-
for (var ticker in initializer.tokens) {
|
|
62
|
-
var assetData = initializer.tokens[ticker];
|
|
63
|
-
_this.Tokens[initializer.chainId][ticker] = addressMap[assetData.address] = {
|
|
64
|
-
chain: "SC",
|
|
65
|
-
chainId: initializer.chainId,
|
|
66
|
-
address: assetData.address,
|
|
67
|
-
name: SmartChainAssets_1.SmartChainAssets[ticker].name,
|
|
68
|
-
decimals: assetData.decimals,
|
|
69
|
-
displayDecimals: assetData.displayDecimals,
|
|
70
|
-
ticker: ticker
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
_this.TokenResolver[initializer.chainId] = {
|
|
74
|
-
getToken: function (address) { return addressMap[address]; }
|
|
75
|
-
};
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
SwapperFactory.prototype.newSwapper = function (options) {
|
|
79
|
-
var _this = this;
|
|
80
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
81
|
-
(_a = options.bitcoinNetwork) !== null && _a !== void 0 ? _a : (options.bitcoinNetwork = base_1.BitcoinNetwork.MAINNET);
|
|
82
|
-
(_b = options.storagePrefix) !== null && _b !== void 0 ? _b : (options.storagePrefix = "atomiqsdk-" + options.bitcoinNetwork + "-");
|
|
83
|
-
(_c = options.defaultTrustedIntermediaryUrl) !== null && _c !== void 0 ? _c : (options.defaultTrustedIntermediaryUrl = trustedIntermediaries[options.bitcoinNetwork]);
|
|
84
|
-
(_d = options.registryUrl) !== null && _d !== void 0 ? _d : (options.registryUrl = registries[options.bitcoinNetwork]);
|
|
85
|
-
var b;
|
|
86
|
-
if (options.mempoolApi instanceof sdk_lib_1.MempoolApi)
|
|
87
|
-
var mempoolApi = (_e = options.mempoolApi) !== null && _e !== void 0 ? _e : new sdk_lib_1.MempoolApi(mempoolUrls[options.bitcoinNetwork]);
|
|
88
|
-
var bitcoinRpc = new sdk_lib_1.MempoolBitcoinRpc(mempoolApi);
|
|
89
|
-
var pricingAssets = [];
|
|
90
|
-
Object.keys(SmartChainAssets_1.SmartChainAssets).forEach(function (ticker) {
|
|
91
|
-
var chains = {};
|
|
92
|
-
for (var _i = 0, _a = _this.initializers; _i < _a.length; _i++) {
|
|
93
|
-
var _b = _a[_i], tokens = _b.tokens, chainId = _b.chainId;
|
|
94
|
-
if (tokens[ticker] != null)
|
|
95
|
-
chains[chainId] = tokens[ticker];
|
|
96
|
-
}
|
|
97
|
-
var assetData = SmartChainAssets_1.SmartChainAssets[ticker];
|
|
98
|
-
pricingAssets.push(__assign(__assign({}, assetData.pricing), { chains: chains, ticker: ticker, name: assetData.name }));
|
|
99
|
-
});
|
|
100
|
-
(_f = options.chainStorageCtor) !== null && _f !== void 0 ? _f : (options.chainStorageCtor = function (name) { return new LocalStorageManager_1.LocalStorageManager(name); });
|
|
101
|
-
var chains = {};
|
|
102
|
-
for (var _i = 0, _j = this.initializers; _i < _j.length; _i++) {
|
|
103
|
-
var _k = _j[_i], initializer = _k.initializer, chainId = _k.chainId;
|
|
104
|
-
if (options.chains[chainId] == null)
|
|
105
|
-
continue;
|
|
106
|
-
chains[chainId] = initializer(options.chains[chainId], bitcoinRpc, options.bitcoinNetwork, options.chainStorageCtor);
|
|
107
|
-
}
|
|
108
|
-
var swapPricing = options.getPriceFn != null ?
|
|
109
|
-
new sdk_lib_1.SingleSwapPrice((_g = options.pricingFeeDifferencePPM) !== null && _g !== void 0 ? _g : 10000n, new sdk_lib_1.CustomPriceProvider(pricingAssets.map(function (val) {
|
|
110
|
-
return {
|
|
111
|
-
coinId: val.ticker,
|
|
112
|
-
chains: val.chains
|
|
113
|
-
};
|
|
114
|
-
}), options.getPriceFn)) :
|
|
115
|
-
sdk_lib_1.RedundantSwapPrice.createFromTokenMap((_h = options.pricingFeeDifferencePPM) !== null && _h !== void 0 ? _h : 10000n, pricingAssets);
|
|
116
|
-
return new sdk_lib_1.Swapper(bitcoinRpc, chains, swapPricing, pricingAssets, options);
|
|
117
|
-
};
|
|
118
|
-
return SwapperFactory;
|
|
119
|
-
}());
|
|
120
|
-
exports.SwapperFactory = SwapperFactory;
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var _a, _b, _c;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.SwapperFactory = void 0;
|
|
16
|
+
var base_1 = require("@atomiqlabs/base");
|
|
17
|
+
var sdk_lib_1 = require("@atomiqlabs/sdk-lib");
|
|
18
|
+
var SmartChainAssets_1 = require("./SmartChainAssets");
|
|
19
|
+
var LocalStorageManager_1 = require("./storage/LocalStorageManager");
|
|
20
|
+
var registries = (_a = {},
|
|
21
|
+
_a[base_1.BitcoinNetwork.MAINNET] = "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry-mainnet.json?ref=main",
|
|
22
|
+
_a[base_1.BitcoinNetwork.TESTNET] = "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry.json?ref=main",
|
|
23
|
+
_a[base_1.BitcoinNetwork.TESTNET4] = "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry-testnet4.json?ref=main",
|
|
24
|
+
_a);
|
|
25
|
+
var trustedIntermediaries = (_b = {},
|
|
26
|
+
_b[base_1.BitcoinNetwork.MAINNET] = "https://node3.gethopa.com:34100",
|
|
27
|
+
_b[base_1.BitcoinNetwork.TESTNET] = "https://node3.gethopa.com:24100",
|
|
28
|
+
_b);
|
|
29
|
+
var mempoolUrls = (_c = {},
|
|
30
|
+
_c[base_1.BitcoinNetwork.MAINNET] = [
|
|
31
|
+
"https://mempool.space/api/",
|
|
32
|
+
"https://mempool.fra.mempool.space/api/",
|
|
33
|
+
"https://mempool.va1.mempool.space/api/",
|
|
34
|
+
"https://mempool.tk7.mempool.space/api/"
|
|
35
|
+
],
|
|
36
|
+
_c[base_1.BitcoinNetwork.TESTNET] = [
|
|
37
|
+
"https://mempool.space/testnet/api/",
|
|
38
|
+
"https://mempool.fra.mempool.space/testnet/api/",
|
|
39
|
+
"https://mempool.va1.mempool.space/testnet/api/",
|
|
40
|
+
"https://mempool.tk7.mempool.space/testnet/api/"
|
|
41
|
+
],
|
|
42
|
+
_c[base_1.BitcoinNetwork.TESTNET4] = [
|
|
43
|
+
"https://mempool.space/testnet4/api/",
|
|
44
|
+
"https://mempool.fra.mempool.space/testnet4/api/",
|
|
45
|
+
"https://mempool.va1.mempool.space/testnet4/api/",
|
|
46
|
+
"https://mempool.tk7.mempool.space/testnet4/api/"
|
|
47
|
+
],
|
|
48
|
+
_c);
|
|
49
|
+
var SwapperFactory = /** @class */ (function () {
|
|
50
|
+
function SwapperFactory(initializers) {
|
|
51
|
+
var _this = this;
|
|
52
|
+
this.initializers = initializers;
|
|
53
|
+
this.Tokens = {
|
|
54
|
+
BITCOIN: sdk_lib_1.BitcoinTokens
|
|
55
|
+
};
|
|
56
|
+
this.TokenResolver = {};
|
|
57
|
+
this.initializers = initializers;
|
|
58
|
+
initializers.forEach(function (initializer) {
|
|
59
|
+
var addressMap = {};
|
|
60
|
+
_this.Tokens[initializer.chainId] = {};
|
|
61
|
+
for (var ticker in initializer.tokens) {
|
|
62
|
+
var assetData = initializer.tokens[ticker];
|
|
63
|
+
_this.Tokens[initializer.chainId][ticker] = addressMap[assetData.address] = {
|
|
64
|
+
chain: "SC",
|
|
65
|
+
chainId: initializer.chainId,
|
|
66
|
+
address: assetData.address,
|
|
67
|
+
name: SmartChainAssets_1.SmartChainAssets[ticker].name,
|
|
68
|
+
decimals: assetData.decimals,
|
|
69
|
+
displayDecimals: assetData.displayDecimals,
|
|
70
|
+
ticker: ticker
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
_this.TokenResolver[initializer.chainId] = {
|
|
74
|
+
getToken: function (address) { return addressMap[address]; }
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
SwapperFactory.prototype.newSwapper = function (options) {
|
|
79
|
+
var _this = this;
|
|
80
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
81
|
+
(_a = options.bitcoinNetwork) !== null && _a !== void 0 ? _a : (options.bitcoinNetwork = base_1.BitcoinNetwork.MAINNET);
|
|
82
|
+
(_b = options.storagePrefix) !== null && _b !== void 0 ? _b : (options.storagePrefix = "atomiqsdk-" + options.bitcoinNetwork + "-");
|
|
83
|
+
(_c = options.defaultTrustedIntermediaryUrl) !== null && _c !== void 0 ? _c : (options.defaultTrustedIntermediaryUrl = trustedIntermediaries[options.bitcoinNetwork]);
|
|
84
|
+
(_d = options.registryUrl) !== null && _d !== void 0 ? _d : (options.registryUrl = registries[options.bitcoinNetwork]);
|
|
85
|
+
var b;
|
|
86
|
+
if (options.mempoolApi instanceof sdk_lib_1.MempoolApi)
|
|
87
|
+
var mempoolApi = (_e = options.mempoolApi) !== null && _e !== void 0 ? _e : new sdk_lib_1.MempoolApi(mempoolUrls[options.bitcoinNetwork]);
|
|
88
|
+
var bitcoinRpc = new sdk_lib_1.MempoolBitcoinRpc(mempoolApi);
|
|
89
|
+
var pricingAssets = [];
|
|
90
|
+
Object.keys(SmartChainAssets_1.SmartChainAssets).forEach(function (ticker) {
|
|
91
|
+
var chains = {};
|
|
92
|
+
for (var _i = 0, _a = _this.initializers; _i < _a.length; _i++) {
|
|
93
|
+
var _b = _a[_i], tokens = _b.tokens, chainId = _b.chainId;
|
|
94
|
+
if (tokens[ticker] != null)
|
|
95
|
+
chains[chainId] = tokens[ticker];
|
|
96
|
+
}
|
|
97
|
+
var assetData = SmartChainAssets_1.SmartChainAssets[ticker];
|
|
98
|
+
pricingAssets.push(__assign(__assign({}, assetData.pricing), { chains: chains, ticker: ticker, name: assetData.name }));
|
|
99
|
+
});
|
|
100
|
+
(_f = options.chainStorageCtor) !== null && _f !== void 0 ? _f : (options.chainStorageCtor = function (name) { return new LocalStorageManager_1.LocalStorageManager(name); });
|
|
101
|
+
var chains = {};
|
|
102
|
+
for (var _i = 0, _j = this.initializers; _i < _j.length; _i++) {
|
|
103
|
+
var _k = _j[_i], initializer = _k.initializer, chainId = _k.chainId;
|
|
104
|
+
if (options.chains[chainId] == null)
|
|
105
|
+
continue;
|
|
106
|
+
chains[chainId] = initializer(options.chains[chainId], bitcoinRpc, options.bitcoinNetwork, options.chainStorageCtor);
|
|
107
|
+
}
|
|
108
|
+
var swapPricing = options.getPriceFn != null ?
|
|
109
|
+
new sdk_lib_1.SingleSwapPrice((_g = options.pricingFeeDifferencePPM) !== null && _g !== void 0 ? _g : 10000n, new sdk_lib_1.CustomPriceProvider(pricingAssets.map(function (val) {
|
|
110
|
+
return {
|
|
111
|
+
coinId: val.ticker,
|
|
112
|
+
chains: val.chains
|
|
113
|
+
};
|
|
114
|
+
}), options.getPriceFn)) :
|
|
115
|
+
sdk_lib_1.RedundantSwapPrice.createFromTokenMap((_h = options.pricingFeeDifferencePPM) !== null && _h !== void 0 ? _h : 10000n, pricingAssets);
|
|
116
|
+
return new sdk_lib_1.Swapper(bitcoinRpc, chains, swapPricing, pricingAssets, options);
|
|
117
|
+
};
|
|
118
|
+
return SwapperFactory;
|
|
119
|
+
}());
|
|
120
|
+
exports.SwapperFactory = SwapperFactory;
|
package/src/SwapperFactory.ts
CHANGED
|
@@ -1,195 +1,195 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChainData,
|
|
3
|
-
BitcoinNetwork,
|
|
4
|
-
BitcoinRpc,
|
|
5
|
-
BaseTokenType,
|
|
6
|
-
ChainType,
|
|
7
|
-
StorageObject,
|
|
8
|
-
IStorageManager
|
|
9
|
-
} from "@atomiqlabs/base";
|
|
10
|
-
import {
|
|
11
|
-
BitcoinTokens,
|
|
12
|
-
BtcToken, CustomPriceFunction, CustomPriceProvider,
|
|
13
|
-
MempoolApi,
|
|
14
|
-
MempoolBitcoinRpc, RedundantSwapPrice,
|
|
15
|
-
RedundantSwapPriceAssets, SCToken, SingleSwapPrice, Swapper,
|
|
16
|
-
SwapperOptions
|
|
17
|
-
} from "@atomiqlabs/sdk-lib";
|
|
18
|
-
import {SmartChainAssets} from "./SmartChainAssets";
|
|
19
|
-
import {LocalStorageManager} from "./storage/LocalStorageManager";
|
|
20
|
-
|
|
21
|
-
type ChainInitializer<O, C extends ChainType, T extends BaseTokenType> = {
|
|
22
|
-
chainId: ChainType["ChainId"],
|
|
23
|
-
chainType: ChainType,
|
|
24
|
-
initializer: (
|
|
25
|
-
options: O,
|
|
26
|
-
bitcoinRelay: BitcoinRpc<any>,
|
|
27
|
-
network: BitcoinNetwork,
|
|
28
|
-
storageCtor: <T extends StorageObject>(name: string) => IStorageManager<T>
|
|
29
|
-
) => ChainData<C>,
|
|
30
|
-
tokens: T,
|
|
31
|
-
options: O
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
type TokensDict<T extends ChainInitializer<any, any, any>> = {
|
|
35
|
-
[K in T["chainId"]]: {
|
|
36
|
-
[val in keyof T["tokens"]]: SCToken<K>
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
type GetAllTokens<T extends readonly ChainInitializer<any, any, any>[]> =
|
|
40
|
-
(T extends readonly [infer First extends ChainInitializer<any, any, any>, ...infer Rest extends ChainInitializer<any, any, any>[]]
|
|
41
|
-
? TokensDict<First> & GetAllTokens<Rest>
|
|
42
|
-
: unknown);
|
|
43
|
-
|
|
44
|
-
export type TokenResolverDict<T extends ChainInitializer<any, any, any>> = {[K in T["chainId"]]: {
|
|
45
|
-
getToken: (address: string) => SCToken<K>
|
|
46
|
-
}};
|
|
47
|
-
type GetAllTokenResolvers<T extends readonly ChainInitializer<any, any, any>[]> =
|
|
48
|
-
(T extends readonly [infer First extends ChainInitializer<any, any, any>, ...infer Rest extends ChainInitializer<any, any, any>[]]
|
|
49
|
-
? TokenResolverDict<First> & GetAllTokenResolvers<Rest>
|
|
50
|
-
: unknown);
|
|
51
|
-
|
|
52
|
-
type OptionsDict<T extends ChainInitializer<any, any, any>> = {[K in T["chainId"]]: T["options"]};
|
|
53
|
-
type GetAllOptions<T extends readonly ChainInitializer<any, any, any>[]> =
|
|
54
|
-
(T extends readonly [infer First extends ChainInitializer<any, any, any>, ...infer Rest extends ChainInitializer<any, any, any>[]]
|
|
55
|
-
? OptionsDict<First> & GetAllOptions<Rest>
|
|
56
|
-
: unknown);
|
|
57
|
-
|
|
58
|
-
type ChainTypeDict<T extends ChainInitializer<any, any, any>> = {[K in T["chainId"]]: T["chainType"]};
|
|
59
|
-
type ToMultichain<T extends readonly ChainInitializer<any, any, any>[]> =
|
|
60
|
-
(T extends readonly [infer First extends ChainInitializer<any, any, any>, ...infer Rest extends ChainInitializer<any, any, any>[]]
|
|
61
|
-
? ChainTypeDict<First> & ToMultichain<Rest>
|
|
62
|
-
: {});
|
|
63
|
-
|
|
64
|
-
export type MultichainSwapperOptions<T extends readonly ChainInitializer<any, any, any>[]> = SwapperOptions & {
|
|
65
|
-
chains: GetAllOptions<T>
|
|
66
|
-
} & {
|
|
67
|
-
chainStorageCtor?: <T extends StorageObject>(name: string) => IStorageManager<T>,
|
|
68
|
-
pricingFeeDifferencePPM?: bigint,
|
|
69
|
-
mempoolApi?: MempoolApi | MempoolBitcoinRpc | string | string[],
|
|
70
|
-
getPriceFn?: CustomPriceFunction
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
const registries = {
|
|
74
|
-
[BitcoinNetwork.MAINNET]: "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry-mainnet.json?ref=main",
|
|
75
|
-
[BitcoinNetwork.TESTNET]: "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry.json?ref=main",
|
|
76
|
-
[BitcoinNetwork.TESTNET4]: "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry-testnet4.json?ref=main"
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const trustedIntermediaries = {
|
|
80
|
-
[BitcoinNetwork.MAINNET]: "https://node3.gethopa.com:34100",
|
|
81
|
-
[BitcoinNetwork.TESTNET]: "https://node3.gethopa.com:24100"
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const mempoolUrls = {
|
|
85
|
-
[BitcoinNetwork.MAINNET]: [
|
|
86
|
-
"https://mempool.space/api/",
|
|
87
|
-
"https://mempool.fra.mempool.space/api/",
|
|
88
|
-
"https://mempool.va1.mempool.space/api/",
|
|
89
|
-
"https://mempool.tk7.mempool.space/api/"
|
|
90
|
-
],
|
|
91
|
-
[BitcoinNetwork.TESTNET]: [
|
|
92
|
-
"https://mempool.space/testnet/api/",
|
|
93
|
-
"https://mempool.fra.mempool.space/testnet/api/",
|
|
94
|
-
"https://mempool.va1.mempool.space/testnet/api/",
|
|
95
|
-
"https://mempool.tk7.mempool.space/testnet/api/"
|
|
96
|
-
],
|
|
97
|
-
[BitcoinNetwork.TESTNET4]: [
|
|
98
|
-
"https://mempool.space/testnet4/api/",
|
|
99
|
-
"https://mempool.fra.mempool.space/testnet4/api/",
|
|
100
|
-
"https://mempool.va1.mempool.space/testnet4/api/",
|
|
101
|
-
"https://mempool.tk7.mempool.space/testnet4/api/"
|
|
102
|
-
]
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export class SwapperFactory<T extends readonly ChainInitializer<any, any, any>[]> {
|
|
106
|
-
|
|
107
|
-
Tokens: GetAllTokens<T> & {
|
|
108
|
-
BITCOIN: {
|
|
109
|
-
BTC: BtcToken<false>,
|
|
110
|
-
BTCLN: BtcToken<true>
|
|
111
|
-
}
|
|
112
|
-
} = {
|
|
113
|
-
BITCOIN: BitcoinTokens
|
|
114
|
-
} as any;
|
|
115
|
-
TokenResolver: GetAllTokenResolvers<T> = {} as any;
|
|
116
|
-
|
|
117
|
-
constructor(readonly initializers: T) {
|
|
118
|
-
this.initializers = initializers;
|
|
119
|
-
initializers.forEach(initializer => {
|
|
120
|
-
const addressMap: {[tokenAddress: string]: SCToken} = {};
|
|
121
|
-
|
|
122
|
-
this.Tokens[initializer.chainId] = {} as any;
|
|
123
|
-
|
|
124
|
-
for(let ticker in initializer.tokens) {
|
|
125
|
-
const assetData = initializer.tokens[ticker] as any;
|
|
126
|
-
this.Tokens[initializer.chainId][ticker] = addressMap[assetData.address] = {
|
|
127
|
-
chain: "SC",
|
|
128
|
-
chainId: initializer.chainId,
|
|
129
|
-
address: assetData.address,
|
|
130
|
-
name: SmartChainAssets[ticker].name,
|
|
131
|
-
decimals: assetData.decimals,
|
|
132
|
-
displayDecimals: assetData.displayDecimals,
|
|
133
|
-
ticker
|
|
134
|
-
} as any;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
this.TokenResolver[initializer.chainId] = {
|
|
138
|
-
getToken: (address: string) => addressMap[address]
|
|
139
|
-
} as any;
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
newSwapper(options: MultichainSwapperOptions<T>) {
|
|
144
|
-
options.bitcoinNetwork ??= BitcoinNetwork.MAINNET as any;
|
|
145
|
-
options.storagePrefix ??= "atomiqsdk-"+options.bitcoinNetwork+"-";
|
|
146
|
-
|
|
147
|
-
options.defaultTrustedIntermediaryUrl ??= trustedIntermediaries[options.bitcoinNetwork];
|
|
148
|
-
|
|
149
|
-
options.registryUrl ??= registries[options.bitcoinNetwork];
|
|
150
|
-
|
|
151
|
-
const mempoolApi = options.mempoolApi ?? new MempoolBitcoinRpc(mempoolUrls[options.bitcoinNetwork]);
|
|
152
|
-
const bitcoinRpc = mempoolApi instanceof MempoolBitcoinRpc ? mempoolApi : new MempoolBitcoinRpc(mempoolApi);
|
|
153
|
-
|
|
154
|
-
const pricingAssets: (RedundantSwapPriceAssets<ToMultichain<T>>[number] & {ticker: string, name: string})[] = [];
|
|
155
|
-
Object.keys(SmartChainAssets).forEach((ticker) => {
|
|
156
|
-
const chains: any = {};
|
|
157
|
-
for(let {tokens, chainId} of this.initializers) {
|
|
158
|
-
if(tokens[ticker]!=null) chains[chainId] = tokens[ticker];
|
|
159
|
-
}
|
|
160
|
-
const assetData = SmartChainAssets[ticker];
|
|
161
|
-
pricingAssets.push({
|
|
162
|
-
...assetData.pricing,
|
|
163
|
-
chains,
|
|
164
|
-
ticker,
|
|
165
|
-
name: assetData.name
|
|
166
|
-
})
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
options.chainStorageCtor ??= (name: string) => new LocalStorageManager(name);
|
|
170
|
-
|
|
171
|
-
const chains: {[key in T[number]["chainId"]]: ChainData<any>} = {} as any;
|
|
172
|
-
for(let {initializer, chainId} of this.initializers) {
|
|
173
|
-
if(options.chains[chainId]==null) continue;
|
|
174
|
-
chains[chainId] = initializer(options.chains[chainId], bitcoinRpc, options.bitcoinNetwork, options.chainStorageCtor) as any;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const swapPricing = options.getPriceFn!=null ?
|
|
178
|
-
new SingleSwapPrice(options.pricingFeeDifferencePPM ?? 10000n, new CustomPriceProvider(pricingAssets.map(val => {
|
|
179
|
-
return {
|
|
180
|
-
coinId: val.ticker,
|
|
181
|
-
chains: val.chains
|
|
182
|
-
}
|
|
183
|
-
}), options.getPriceFn)) :
|
|
184
|
-
RedundantSwapPrice.createFromTokenMap<ToMultichain<T>>(options.pricingFeeDifferencePPM ?? 10000n, pricingAssets);
|
|
185
|
-
|
|
186
|
-
return new Swapper<ToMultichain<T>>(
|
|
187
|
-
bitcoinRpc,
|
|
188
|
-
chains as any,
|
|
189
|
-
swapPricing,
|
|
190
|
-
pricingAssets,
|
|
191
|
-
options
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
ChainData,
|
|
3
|
+
BitcoinNetwork,
|
|
4
|
+
BitcoinRpc,
|
|
5
|
+
BaseTokenType,
|
|
6
|
+
ChainType,
|
|
7
|
+
StorageObject,
|
|
8
|
+
IStorageManager
|
|
9
|
+
} from "@atomiqlabs/base";
|
|
10
|
+
import {
|
|
11
|
+
BitcoinTokens,
|
|
12
|
+
BtcToken, CustomPriceFunction, CustomPriceProvider,
|
|
13
|
+
MempoolApi,
|
|
14
|
+
MempoolBitcoinRpc, RedundantSwapPrice,
|
|
15
|
+
RedundantSwapPriceAssets, SCToken, SingleSwapPrice, Swapper,
|
|
16
|
+
SwapperOptions
|
|
17
|
+
} from "@atomiqlabs/sdk-lib";
|
|
18
|
+
import {SmartChainAssets} from "./SmartChainAssets";
|
|
19
|
+
import {LocalStorageManager} from "./storage/LocalStorageManager";
|
|
20
|
+
|
|
21
|
+
type ChainInitializer<O, C extends ChainType, T extends BaseTokenType> = {
|
|
22
|
+
chainId: ChainType["ChainId"],
|
|
23
|
+
chainType: ChainType,
|
|
24
|
+
initializer: (
|
|
25
|
+
options: O,
|
|
26
|
+
bitcoinRelay: BitcoinRpc<any>,
|
|
27
|
+
network: BitcoinNetwork,
|
|
28
|
+
storageCtor: <T extends StorageObject>(name: string) => IStorageManager<T>
|
|
29
|
+
) => ChainData<C>,
|
|
30
|
+
tokens: T,
|
|
31
|
+
options: O
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type TokensDict<T extends ChainInitializer<any, any, any>> = {
|
|
35
|
+
[K in T["chainId"]]: {
|
|
36
|
+
[val in keyof T["tokens"]]: SCToken<K>
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
type GetAllTokens<T extends readonly ChainInitializer<any, any, any>[]> =
|
|
40
|
+
(T extends readonly [infer First extends ChainInitializer<any, any, any>, ...infer Rest extends ChainInitializer<any, any, any>[]]
|
|
41
|
+
? TokensDict<First> & GetAllTokens<Rest>
|
|
42
|
+
: unknown);
|
|
43
|
+
|
|
44
|
+
export type TokenResolverDict<T extends ChainInitializer<any, any, any>> = {[K in T["chainId"]]: {
|
|
45
|
+
getToken: (address: string) => SCToken<K>
|
|
46
|
+
}};
|
|
47
|
+
type GetAllTokenResolvers<T extends readonly ChainInitializer<any, any, any>[]> =
|
|
48
|
+
(T extends readonly [infer First extends ChainInitializer<any, any, any>, ...infer Rest extends ChainInitializer<any, any, any>[]]
|
|
49
|
+
? TokenResolverDict<First> & GetAllTokenResolvers<Rest>
|
|
50
|
+
: unknown);
|
|
51
|
+
|
|
52
|
+
type OptionsDict<T extends ChainInitializer<any, any, any>> = {[K in T["chainId"]]: T["options"]};
|
|
53
|
+
type GetAllOptions<T extends readonly ChainInitializer<any, any, any>[]> =
|
|
54
|
+
(T extends readonly [infer First extends ChainInitializer<any, any, any>, ...infer Rest extends ChainInitializer<any, any, any>[]]
|
|
55
|
+
? OptionsDict<First> & GetAllOptions<Rest>
|
|
56
|
+
: unknown);
|
|
57
|
+
|
|
58
|
+
type ChainTypeDict<T extends ChainInitializer<any, any, any>> = {[K in T["chainId"]]: T["chainType"]};
|
|
59
|
+
type ToMultichain<T extends readonly ChainInitializer<any, any, any>[]> =
|
|
60
|
+
(T extends readonly [infer First extends ChainInitializer<any, any, any>, ...infer Rest extends ChainInitializer<any, any, any>[]]
|
|
61
|
+
? ChainTypeDict<First> & ToMultichain<Rest>
|
|
62
|
+
: {});
|
|
63
|
+
|
|
64
|
+
export type MultichainSwapperOptions<T extends readonly ChainInitializer<any, any, any>[]> = SwapperOptions & {
|
|
65
|
+
chains: GetAllOptions<T>
|
|
66
|
+
} & {
|
|
67
|
+
chainStorageCtor?: <T extends StorageObject>(name: string) => IStorageManager<T>,
|
|
68
|
+
pricingFeeDifferencePPM?: bigint,
|
|
69
|
+
mempoolApi?: MempoolApi | MempoolBitcoinRpc | string | string[],
|
|
70
|
+
getPriceFn?: CustomPriceFunction
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const registries = {
|
|
74
|
+
[BitcoinNetwork.MAINNET]: "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry-mainnet.json?ref=main",
|
|
75
|
+
[BitcoinNetwork.TESTNET]: "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry.json?ref=main",
|
|
76
|
+
[BitcoinNetwork.TESTNET4]: "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry-testnet4.json?ref=main"
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const trustedIntermediaries = {
|
|
80
|
+
[BitcoinNetwork.MAINNET]: "https://node3.gethopa.com:34100",
|
|
81
|
+
[BitcoinNetwork.TESTNET]: "https://node3.gethopa.com:24100"
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const mempoolUrls = {
|
|
85
|
+
[BitcoinNetwork.MAINNET]: [
|
|
86
|
+
"https://mempool.space/api/",
|
|
87
|
+
"https://mempool.fra.mempool.space/api/",
|
|
88
|
+
"https://mempool.va1.mempool.space/api/",
|
|
89
|
+
"https://mempool.tk7.mempool.space/api/"
|
|
90
|
+
],
|
|
91
|
+
[BitcoinNetwork.TESTNET]: [
|
|
92
|
+
"https://mempool.space/testnet/api/",
|
|
93
|
+
"https://mempool.fra.mempool.space/testnet/api/",
|
|
94
|
+
"https://mempool.va1.mempool.space/testnet/api/",
|
|
95
|
+
"https://mempool.tk7.mempool.space/testnet/api/"
|
|
96
|
+
],
|
|
97
|
+
[BitcoinNetwork.TESTNET4]: [
|
|
98
|
+
"https://mempool.space/testnet4/api/",
|
|
99
|
+
"https://mempool.fra.mempool.space/testnet4/api/",
|
|
100
|
+
"https://mempool.va1.mempool.space/testnet4/api/",
|
|
101
|
+
"https://mempool.tk7.mempool.space/testnet4/api/"
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export class SwapperFactory<T extends readonly ChainInitializer<any, any, any>[]> {
|
|
106
|
+
|
|
107
|
+
Tokens: GetAllTokens<T> & {
|
|
108
|
+
BITCOIN: {
|
|
109
|
+
BTC: BtcToken<false>,
|
|
110
|
+
BTCLN: BtcToken<true>
|
|
111
|
+
}
|
|
112
|
+
} = {
|
|
113
|
+
BITCOIN: BitcoinTokens
|
|
114
|
+
} as any;
|
|
115
|
+
TokenResolver: GetAllTokenResolvers<T> = {} as any;
|
|
116
|
+
|
|
117
|
+
constructor(readonly initializers: T) {
|
|
118
|
+
this.initializers = initializers;
|
|
119
|
+
initializers.forEach(initializer => {
|
|
120
|
+
const addressMap: {[tokenAddress: string]: SCToken} = {};
|
|
121
|
+
|
|
122
|
+
this.Tokens[initializer.chainId] = {} as any;
|
|
123
|
+
|
|
124
|
+
for(let ticker in initializer.tokens) {
|
|
125
|
+
const assetData = initializer.tokens[ticker] as any;
|
|
126
|
+
this.Tokens[initializer.chainId][ticker] = addressMap[assetData.address] = {
|
|
127
|
+
chain: "SC",
|
|
128
|
+
chainId: initializer.chainId,
|
|
129
|
+
address: assetData.address,
|
|
130
|
+
name: SmartChainAssets[ticker].name,
|
|
131
|
+
decimals: assetData.decimals,
|
|
132
|
+
displayDecimals: assetData.displayDecimals,
|
|
133
|
+
ticker
|
|
134
|
+
} as any;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
this.TokenResolver[initializer.chainId] = {
|
|
138
|
+
getToken: (address: string) => addressMap[address]
|
|
139
|
+
} as any;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
newSwapper(options: MultichainSwapperOptions<T>) {
|
|
144
|
+
options.bitcoinNetwork ??= BitcoinNetwork.MAINNET as any;
|
|
145
|
+
options.storagePrefix ??= "atomiqsdk-"+options.bitcoinNetwork+"-";
|
|
146
|
+
|
|
147
|
+
options.defaultTrustedIntermediaryUrl ??= trustedIntermediaries[options.bitcoinNetwork];
|
|
148
|
+
|
|
149
|
+
options.registryUrl ??= registries[options.bitcoinNetwork];
|
|
150
|
+
|
|
151
|
+
const mempoolApi = options.mempoolApi ?? new MempoolBitcoinRpc(mempoolUrls[options.bitcoinNetwork]);
|
|
152
|
+
const bitcoinRpc = mempoolApi instanceof MempoolBitcoinRpc ? mempoolApi : new MempoolBitcoinRpc(mempoolApi);
|
|
153
|
+
|
|
154
|
+
const pricingAssets: (RedundantSwapPriceAssets<ToMultichain<T>>[number] & {ticker: string, name: string})[] = [];
|
|
155
|
+
Object.keys(SmartChainAssets).forEach((ticker) => {
|
|
156
|
+
const chains: any = {};
|
|
157
|
+
for(let {tokens, chainId} of this.initializers) {
|
|
158
|
+
if(tokens[ticker]!=null) chains[chainId] = tokens[ticker];
|
|
159
|
+
}
|
|
160
|
+
const assetData = SmartChainAssets[ticker];
|
|
161
|
+
pricingAssets.push({
|
|
162
|
+
...assetData.pricing,
|
|
163
|
+
chains,
|
|
164
|
+
ticker,
|
|
165
|
+
name: assetData.name
|
|
166
|
+
})
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
options.chainStorageCtor ??= (name: string) => new LocalStorageManager(name);
|
|
170
|
+
|
|
171
|
+
const chains: {[key in T[number]["chainId"]]: ChainData<any>} = {} as any;
|
|
172
|
+
for(let {initializer, chainId} of this.initializers) {
|
|
173
|
+
if(options.chains[chainId]==null) continue;
|
|
174
|
+
chains[chainId] = initializer(options.chains[chainId], bitcoinRpc, options.bitcoinNetwork, options.chainStorageCtor) as any;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const swapPricing = options.getPriceFn!=null ?
|
|
178
|
+
new SingleSwapPrice(options.pricingFeeDifferencePPM ?? 10000n, new CustomPriceProvider(pricingAssets.map(val => {
|
|
179
|
+
return {
|
|
180
|
+
coinId: val.ticker,
|
|
181
|
+
chains: val.chains
|
|
182
|
+
}
|
|
183
|
+
}), options.getPriceFn)) :
|
|
184
|
+
RedundantSwapPrice.createFromTokenMap<ToMultichain<T>>(options.pricingFeeDifferencePPM ?? 10000n, pricingAssets);
|
|
185
|
+
|
|
186
|
+
return new Swapper<ToMultichain<T>>(
|
|
187
|
+
bitcoinRpc,
|
|
188
|
+
chains as any,
|
|
189
|
+
swapPricing,
|
|
190
|
+
pricingAssets,
|
|
191
|
+
options
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
}
|