@atomiqlabs/sdk 6.0.1 → 6.0.3

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.
@@ -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;
@@ -1,198 +1,198 @@
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.holdings/api/",
88
- "https://mempool.fra.mempool.space/api/",
89
- "https://mempool.va1.mempool.space/api/",
90
- "https://mempool.tk7.mempool.space/api/"
91
- ],
92
- [BitcoinNetwork.TESTNET]: [
93
- "https://mempool.space/testnet/api/",
94
- "https://mempool.holdings/testnet/api/",
95
- "https://mempool.fra.mempool.space/testnet/api/",
96
- "https://mempool.va1.mempool.space/testnet/api/",
97
- "https://mempool.tk7.mempool.space/testnet/api/"
98
- ],
99
- [BitcoinNetwork.TESTNET4]: [
100
- "https://mempool.space/testnet4/api/",
101
- "https://mempool.holdings/testnet4/api/",
102
- "https://mempool.fra.mempool.space/testnet4/api/",
103
- "https://mempool.va1.mempool.space/testnet4/api/",
104
- "https://mempool.tk7.mempool.space/testnet4/api/"
105
- ]
106
- }
107
-
108
- export class SwapperFactory<T extends readonly ChainInitializer<any, any, any>[]> {
109
-
110
- Tokens: GetAllTokens<T> & {
111
- BITCOIN: {
112
- BTC: BtcToken<false>,
113
- BTCLN: BtcToken<true>
114
- }
115
- } = {
116
- BITCOIN: BitcoinTokens
117
- } as any;
118
- TokenResolver: GetAllTokenResolvers<T> = {} as any;
119
-
120
- constructor(readonly initializers: T) {
121
- this.initializers = initializers;
122
- initializers.forEach(initializer => {
123
- const addressMap: {[tokenAddress: string]: SCToken} = {};
124
-
125
- this.Tokens[initializer.chainId] = {} as any;
126
-
127
- for(let ticker in initializer.tokens) {
128
- const assetData = initializer.tokens[ticker] as any;
129
- this.Tokens[initializer.chainId][ticker] = addressMap[assetData.address] = {
130
- chain: "SC",
131
- chainId: initializer.chainId,
132
- address: assetData.address,
133
- name: SmartChainAssets[ticker].name,
134
- decimals: assetData.decimals,
135
- displayDecimals: assetData.displayDecimals,
136
- ticker
137
- } as any;
138
- }
139
-
140
- this.TokenResolver[initializer.chainId] = {
141
- getToken: (address: string) => addressMap[address]
142
- } as any;
143
- });
144
- }
145
-
146
- newSwapper(options: MultichainSwapperOptions<T>) {
147
- options.bitcoinNetwork ??= BitcoinNetwork.MAINNET as any;
148
- options.storagePrefix ??= "atomiqsdk-"+options.bitcoinNetwork+"-";
149
-
150
- options.defaultTrustedIntermediaryUrl ??= trustedIntermediaries[options.bitcoinNetwork];
151
-
152
- options.registryUrl ??= registries[options.bitcoinNetwork];
153
-
154
- const mempoolApi = options.mempoolApi ?? new MempoolBitcoinRpc(mempoolUrls[options.bitcoinNetwork]);
155
- const bitcoinRpc = mempoolApi instanceof MempoolBitcoinRpc ? mempoolApi : new MempoolBitcoinRpc(mempoolApi);
156
-
157
- const pricingAssets: (RedundantSwapPriceAssets<ToMultichain<T>>[number] & {ticker: string, name: string})[] = [];
158
- Object.keys(SmartChainAssets).forEach((ticker) => {
159
- const chains: any = {};
160
- for(let {tokens, chainId} of this.initializers) {
161
- if(tokens[ticker]!=null) chains[chainId] = tokens[ticker];
162
- }
163
- const assetData = SmartChainAssets[ticker];
164
- pricingAssets.push({
165
- ...assetData.pricing,
166
- chains,
167
- ticker,
168
- name: assetData.name
169
- })
170
- });
171
-
172
- options.chainStorageCtor ??= (name: string) => new LocalStorageManager(name);
173
-
174
- const chains: {[key in T[number]["chainId"]]: ChainData<any>} = {} as any;
175
- for(let {initializer, chainId} of this.initializers) {
176
- if(options.chains[chainId]==null) continue;
177
- chains[chainId] = initializer(options.chains[chainId], bitcoinRpc, options.bitcoinNetwork, options.chainStorageCtor) as any;
178
- }
179
-
180
- const swapPricing = options.getPriceFn!=null ?
181
- new SingleSwapPrice(options.pricingFeeDifferencePPM ?? 10000n, new CustomPriceProvider(pricingAssets.map(val => {
182
- return {
183
- coinId: val.ticker,
184
- chains: val.chains
185
- }
186
- }), options.getPriceFn)) :
187
- RedundantSwapPrice.createFromTokenMap<ToMultichain<T>>(options.pricingFeeDifferencePPM ?? 10000n, pricingAssets);
188
-
189
- return new Swapper<ToMultichain<T>>(
190
- bitcoinRpc,
191
- chains as any,
192
- swapPricing,
193
- pricingAssets,
194
- options
195
- );
196
- }
197
-
198
- }
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.holdings/api/",
88
+ "https://mempool.fra.mempool.space/api/",
89
+ "https://mempool.va1.mempool.space/api/",
90
+ "https://mempool.tk7.mempool.space/api/"
91
+ ],
92
+ [BitcoinNetwork.TESTNET]: [
93
+ "https://mempool.space/testnet/api/",
94
+ "https://mempool.holdings/testnet/api/",
95
+ "https://mempool.fra.mempool.space/testnet/api/",
96
+ "https://mempool.va1.mempool.space/testnet/api/",
97
+ "https://mempool.tk7.mempool.space/testnet/api/"
98
+ ],
99
+ [BitcoinNetwork.TESTNET4]: [
100
+ "https://mempool.space/testnet4/api/",
101
+ "https://mempool.holdings/testnet4/api/",
102
+ "https://mempool.fra.mempool.space/testnet4/api/",
103
+ "https://mempool.va1.mempool.space/testnet4/api/",
104
+ "https://mempool.tk7.mempool.space/testnet4/api/"
105
+ ]
106
+ }
107
+
108
+ export class SwapperFactory<T extends readonly ChainInitializer<any, any, any>[]> {
109
+
110
+ Tokens: GetAllTokens<T> & {
111
+ BITCOIN: {
112
+ BTC: BtcToken<false>,
113
+ BTCLN: BtcToken<true>
114
+ }
115
+ } = {
116
+ BITCOIN: BitcoinTokens
117
+ } as any;
118
+ TokenResolver: GetAllTokenResolvers<T> = {} as any;
119
+
120
+ constructor(readonly initializers: T) {
121
+ this.initializers = initializers;
122
+ initializers.forEach(initializer => {
123
+ const addressMap: {[tokenAddress: string]: SCToken} = {};
124
+
125
+ this.Tokens[initializer.chainId] = {} as any;
126
+
127
+ for(let ticker in initializer.tokens) {
128
+ const assetData = initializer.tokens[ticker] as any;
129
+ this.Tokens[initializer.chainId][ticker] = addressMap[assetData.address] = {
130
+ chain: "SC",
131
+ chainId: initializer.chainId,
132
+ address: assetData.address,
133
+ name: SmartChainAssets[ticker]?.name ?? ticker,
134
+ decimals: assetData.decimals,
135
+ displayDecimals: assetData.displayDecimals,
136
+ ticker
137
+ } as any;
138
+ }
139
+
140
+ this.TokenResolver[initializer.chainId] = {
141
+ getToken: (address: string) => addressMap[address]
142
+ } as any;
143
+ });
144
+ }
145
+
146
+ newSwapper(options: MultichainSwapperOptions<T>) {
147
+ options.bitcoinNetwork ??= BitcoinNetwork.MAINNET as any;
148
+ options.storagePrefix ??= "atomiqsdk-"+options.bitcoinNetwork+"-";
149
+
150
+ options.defaultTrustedIntermediaryUrl ??= trustedIntermediaries[options.bitcoinNetwork];
151
+
152
+ options.registryUrl ??= registries[options.bitcoinNetwork];
153
+
154
+ const mempoolApi = options.mempoolApi ?? new MempoolBitcoinRpc(mempoolUrls[options.bitcoinNetwork]);
155
+ const bitcoinRpc = mempoolApi instanceof MempoolBitcoinRpc ? mempoolApi : new MempoolBitcoinRpc(mempoolApi);
156
+
157
+ const pricingAssets: (RedundantSwapPriceAssets<ToMultichain<T>>[number] & {ticker: string, name: string})[] = [];
158
+ Object.keys(SmartChainAssets).forEach((ticker) => {
159
+ const chains: any = {};
160
+ for(let {tokens, chainId} of this.initializers) {
161
+ if(tokens[ticker]!=null) chains[chainId] = tokens[ticker];
162
+ }
163
+ const assetData = SmartChainAssets[ticker];
164
+ pricingAssets.push({
165
+ ...assetData.pricing,
166
+ chains,
167
+ ticker,
168
+ name: assetData.name
169
+ })
170
+ });
171
+
172
+ options.chainStorageCtor ??= (name: string) => new LocalStorageManager(name);
173
+
174
+ const chains: {[key in T[number]["chainId"]]: ChainData<any>} = {} as any;
175
+ for(let {initializer, chainId} of this.initializers) {
176
+ if(options.chains[chainId]==null) continue;
177
+ chains[chainId] = initializer(options.chains[chainId], bitcoinRpc, options.bitcoinNetwork, options.chainStorageCtor) as any;
178
+ }
179
+
180
+ const swapPricing = options.getPriceFn!=null ?
181
+ new SingleSwapPrice(options.pricingFeeDifferencePPM ?? 10000n, new CustomPriceProvider(pricingAssets.map(val => {
182
+ return {
183
+ coinId: val.ticker,
184
+ chains: val.chains
185
+ }
186
+ }), options.getPriceFn)) :
187
+ RedundantSwapPrice.createFromTokenMap<ToMultichain<T>>(options.pricingFeeDifferencePPM ?? 10000n, pricingAssets);
188
+
189
+ return new Swapper<ToMultichain<T>>(
190
+ bitcoinRpc,
191
+ chains as any,
192
+ swapPricing,
193
+ pricingAssets,
194
+ options
195
+ );
196
+ }
197
+
198
+ }