@chain-registry/utils 0.5.1 → 0.6.2
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/CHANGELOG.md +24 -0
- package/README.md +85 -1
- package/main/index.js +18 -399
- package/main/registry.js +312 -0
- package/main/utils.js +415 -0
- package/module/index.js +2 -338
- package/module/registry.js +216 -0
- package/module/utils.js +341 -0
- package/package.json +6 -3
package/module/index.js
CHANGED
|
@@ -1,338 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
4
|
-
|
|
5
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
6
|
-
|
|
7
|
-
import { Hash } from '@keplr-wallet/crypto';
|
|
8
|
-
export const ibcDenom = (paths, coinMinimalDenom) => {
|
|
9
|
-
const prefixes = [];
|
|
10
|
-
|
|
11
|
-
for (const path of paths) {
|
|
12
|
-
prefixes.push(`${path.portId}/${path.channelId}`);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const prefix = prefixes.join('/');
|
|
16
|
-
const denom = `${prefix}/${coinMinimalDenom}`;
|
|
17
|
-
return 'ibc/' + Buffer.from(Hash.sha256(Buffer.from(denom))).toString('hex').toUpperCase();
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const findInfo = (ibc, to, from) => ibc.find(i => i['chain-1']['chain-name'] === from && i['chain-2']['chain-name'] === to);
|
|
21
|
-
|
|
22
|
-
export const getIbcInfo = (ibc, chain, counterparty) => {
|
|
23
|
-
return findInfo(ibc, chain, counterparty) || findInfo(ibc, counterparty, chain);
|
|
24
|
-
};
|
|
25
|
-
export const getTransferChannel = info => {
|
|
26
|
-
return info.channels.find(channel => channel['chain-1']['port-id'] === 'transfer' && channel['chain-2']['port-id'] === 'transfer');
|
|
27
|
-
};
|
|
28
|
-
export const getNonTransferChannel = info => {
|
|
29
|
-
return info.channels.find(channel => channel['chain-1']['port-id'] !== 'transfer' && channel['chain-2']['port-id'] === 'transfer' || channel['chain-1']['port-id'] === 'transfer' && channel['chain-2']['port-id'] !== 'transfer');
|
|
30
|
-
};
|
|
31
|
-
export const getWasmChannel = info => {
|
|
32
|
-
return info.channels.find(channel => channel['chain-1']['port-id'].startsWith('wasm.') && channel['chain-2']['port-id'] === 'transfer' || channel['chain-1']['port-id'] === 'transfer' && channel['chain-2']['port-id'].startsWith('wasm'));
|
|
33
|
-
};
|
|
34
|
-
export const getIbcDenomByBase = (ibc, chain, counterparty, assets, base) => {
|
|
35
|
-
const ibcInfo = getIbcInfo(ibc, chain, counterparty);
|
|
36
|
-
|
|
37
|
-
if (ibcInfo) {
|
|
38
|
-
const channel = getTransferChannel(ibcInfo);
|
|
39
|
-
|
|
40
|
-
if (!channel) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
let channelInfo;
|
|
45
|
-
|
|
46
|
-
if (ibcInfo['chain-1']['chain-name'] === chain) {
|
|
47
|
-
channelInfo = channel['chain-1'];
|
|
48
|
-
} else {
|
|
49
|
-
channelInfo = channel['chain-2'];
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const assetList = assets.find(({
|
|
53
|
-
chain_name
|
|
54
|
-
}) => chain_name === counterparty);
|
|
55
|
-
|
|
56
|
-
if (!assetList) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const assetInfo = assetList.assets.find(asset => {
|
|
61
|
-
return asset.base === base;
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
if (!assetInfo) {
|
|
65
|
-
console.warn('missing referrenced asset');
|
|
66
|
-
} // TODO transition later!
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const traces = [];
|
|
70
|
-
|
|
71
|
-
if (assetInfo.ibc) {
|
|
72
|
-
traces.push({
|
|
73
|
-
type: 'ibc',
|
|
74
|
-
counterparty: {
|
|
75
|
-
denom: assetInfo.ibc.source_denom,
|
|
76
|
-
channel: assetInfo.ibc.source_channel
|
|
77
|
-
},
|
|
78
|
-
chain: {
|
|
79
|
-
channel: assetInfo.ibc.dst_channel
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (assetInfo.traces && assetInfo.traces.length) {
|
|
85
|
-
[].push.apply(traces, assetInfo.traces);
|
|
86
|
-
} // console.log(transition);
|
|
87
|
-
// if (transition.length) {
|
|
88
|
-
// return ibcDenom(
|
|
89
|
-
// [
|
|
90
|
-
// {
|
|
91
|
-
// portId: 'transfer',
|
|
92
|
-
// channelId: assetInfo.ibc.source_channel
|
|
93
|
-
// },
|
|
94
|
-
// {
|
|
95
|
-
// portId: channelInfo['port-id'],
|
|
96
|
-
// channelId: channelInfo['channel-id']
|
|
97
|
-
// }
|
|
98
|
-
// ],
|
|
99
|
-
// base
|
|
100
|
-
// );
|
|
101
|
-
// }
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return ibcDenom([{
|
|
105
|
-
portId: channelInfo['port-id'],
|
|
106
|
-
channelId: channelInfo['channel-id']
|
|
107
|
-
}], base);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
export const getIbcDenomByBaseForCw20 = (ibc, chain, counterparty, assets, base) => {
|
|
111
|
-
const ibcInfo = getIbcInfo(ibc, chain, counterparty);
|
|
112
|
-
|
|
113
|
-
if (ibcInfo) {
|
|
114
|
-
const channel = getWasmChannel(ibcInfo);
|
|
115
|
-
|
|
116
|
-
if (!channel) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
let channelInfo;
|
|
121
|
-
|
|
122
|
-
if (ibcInfo['chain-1']['chain-name'] === chain) {
|
|
123
|
-
channelInfo = channel['chain-1'];
|
|
124
|
-
} else {
|
|
125
|
-
channelInfo = channel['chain-2'];
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const assetInfo = assets.find(({
|
|
129
|
-
chain_name
|
|
130
|
-
}) => chain_name === counterparty);
|
|
131
|
-
|
|
132
|
-
if (!assetInfo) {
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return ibcDenom([{
|
|
137
|
-
portId: channelInfo['port-id'],
|
|
138
|
-
channelId: channelInfo['channel-id']
|
|
139
|
-
}], base);
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
export const getIbcAssets = (chainName, ibc, assets) => {
|
|
143
|
-
const chainIbcInfo = ibc.filter(i => {
|
|
144
|
-
return i['chain-1']['chain-name'] === chainName || i['chain-2']['chain-name'] === chainName;
|
|
145
|
-
});
|
|
146
|
-
const ibcAssetLists = chainIbcInfo.map(ibcInfo => {
|
|
147
|
-
const counterpartyIs = ibcInfo['chain-1']['chain-name'] === chainName ? 'chain-2' : 'chain-1';
|
|
148
|
-
const chainIs = ibcInfo['chain-1']['chain-name'] === chainName ? 'chain-1' : 'chain-2';
|
|
149
|
-
const counterparty = ibcInfo[counterpartyIs]['chain-name'];
|
|
150
|
-
const counterpartyIbc = ibcInfo[counterpartyIs];
|
|
151
|
-
const chainIbc = ibcInfo[chainIs];
|
|
152
|
-
const counterpartyAssets = assets.find(a => {
|
|
153
|
-
return a.chain_name === counterparty;
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
if (!counterpartyAssets) {
|
|
157
|
-
console.warn('asset not found: ' + counterparty);
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const ibcAssets = counterpartyAssets.assets.filter(a => !a.base.startsWith('cw20:')).map(asset => {
|
|
162
|
-
const denom = getIbcDenomByBase(ibc, chainName, counterparty, //
|
|
163
|
-
assets, asset.base);
|
|
164
|
-
|
|
165
|
-
const newAsset = _objectSpread({}, asset);
|
|
166
|
-
|
|
167
|
-
newAsset.base = denom;
|
|
168
|
-
newAsset.denom_units = newAsset.denom_units.map(unit => {
|
|
169
|
-
if (unit.denom === asset.base) {
|
|
170
|
-
const newUnit = _objectSpread({}, unit);
|
|
171
|
-
|
|
172
|
-
newUnit.denom = denom;
|
|
173
|
-
newUnit.aliases = [unit.denom];
|
|
174
|
-
return newUnit;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return unit;
|
|
178
|
-
});
|
|
179
|
-
return newAsset;
|
|
180
|
-
});
|
|
181
|
-
const channel = getTransferChannel(ibcInfo);
|
|
182
|
-
return {
|
|
183
|
-
chain: _objectSpread(_objectSpread({}, chainIbc), channel[chainIs]),
|
|
184
|
-
counterparty: _objectSpread(_objectSpread({}, counterpartyIbc), channel[counterpartyIs]),
|
|
185
|
-
assets: ibcAssets
|
|
186
|
-
};
|
|
187
|
-
}).filter(Boolean);
|
|
188
|
-
const hash = ibcAssetLists.reduce((m, v) => {
|
|
189
|
-
m[v.chain['chain-name']] = m[v.chain['chain-name']] || [];
|
|
190
|
-
const assets = v.assets.map(asset => {
|
|
191
|
-
return _objectSpread(_objectSpread({}, asset), {}, {
|
|
192
|
-
traces: [{
|
|
193
|
-
type: 'ibc',
|
|
194
|
-
counterparty: {
|
|
195
|
-
// source_channel
|
|
196
|
-
channel: v.counterparty['channel-id'],
|
|
197
|
-
// source_denom
|
|
198
|
-
denom: asset.denom_units[0].aliases[0],
|
|
199
|
-
chain_name: v.counterparty['chain-name'] // port: v.counterparty['port-id']
|
|
200
|
-
|
|
201
|
-
},
|
|
202
|
-
chain: {
|
|
203
|
-
// dst_denom
|
|
204
|
-
channel: v.chain['channel-id'] // chain_name: v.chain['chain-name'],
|
|
205
|
-
// port: v.chain['port-id']
|
|
206
|
-
|
|
207
|
-
}
|
|
208
|
-
}]
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
const obj = _objectSpread(_objectSpread({}, v), {}, {
|
|
213
|
-
assets
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
m[v.chain['chain-name']].push(obj);
|
|
217
|
-
return m;
|
|
218
|
-
}, {});
|
|
219
|
-
return Object.keys(hash).map(chain => {
|
|
220
|
-
return {
|
|
221
|
-
chain_name: chain,
|
|
222
|
-
assets: hash[chain].reduce((m, v) => {
|
|
223
|
-
return [...m, ...v.assets];
|
|
224
|
-
}, [])
|
|
225
|
-
};
|
|
226
|
-
});
|
|
227
|
-
};
|
|
228
|
-
export const getCw20Assets = (chainName, ibc, assets) => {
|
|
229
|
-
const chainIbcInfo = ibc.filter(i => {
|
|
230
|
-
return i['chain-1']['chain-name'] === chainName || i['chain-2']['chain-name'] === chainName;
|
|
231
|
-
});
|
|
232
|
-
const cw20AssetLists = chainIbcInfo.map(ibcInfo => {
|
|
233
|
-
const counterpartyIs = ibcInfo['chain-1']['chain-name'] === chainName ? 'chain-2' : 'chain-1';
|
|
234
|
-
const chainIs = ibcInfo['chain-1']['chain-name'] === chainName ? 'chain-1' : 'chain-2';
|
|
235
|
-
const counterparty = ibcInfo[counterpartyIs]['chain-name'];
|
|
236
|
-
const counterpartyIbc = ibcInfo[counterpartyIs];
|
|
237
|
-
const chainIbc = ibcInfo[chainIs];
|
|
238
|
-
const counterpartyAssets = assets.find(a => {
|
|
239
|
-
return a.chain_name === counterparty;
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
if (!counterpartyAssets) {
|
|
243
|
-
console.warn('asset not found: ' + counterparty);
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
const cw20Assets = counterpartyAssets.assets.filter(a => a.base.startsWith('cw20:')).map(asset => {
|
|
248
|
-
const denom = getIbcDenomByBaseForCw20(ibc, chainName, counterparty, //
|
|
249
|
-
assets, asset.base);
|
|
250
|
-
|
|
251
|
-
const newAsset = _objectSpread({}, asset);
|
|
252
|
-
|
|
253
|
-
newAsset.base = denom;
|
|
254
|
-
newAsset.denom_units = newAsset.denom_units.map(unit => {
|
|
255
|
-
if (unit.denom === asset.base) {
|
|
256
|
-
const newUnit = _objectSpread({}, unit);
|
|
257
|
-
|
|
258
|
-
newUnit.denom = denom;
|
|
259
|
-
newUnit.aliases = [unit.denom];
|
|
260
|
-
return newUnit;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
return unit;
|
|
264
|
-
});
|
|
265
|
-
return newAsset;
|
|
266
|
-
});
|
|
267
|
-
if (!cw20Assets.length) return;
|
|
268
|
-
const channel = getWasmChannel(ibcInfo);
|
|
269
|
-
|
|
270
|
-
if (!channel) {
|
|
271
|
-
console.warn(chainIbc['chain-name'], '<>', counterpartyIbc['chain-name'], 'MISSING cw20 IBC info');
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
return {
|
|
276
|
-
chain: _objectSpread(_objectSpread({}, chainIbc), channel[chainIs]),
|
|
277
|
-
counterparty: _objectSpread(_objectSpread({}, counterpartyIbc), channel[counterpartyIs]),
|
|
278
|
-
assets: cw20Assets
|
|
279
|
-
};
|
|
280
|
-
}).filter(Boolean);
|
|
281
|
-
const hash = cw20AssetLists.reduce((m, v) => {
|
|
282
|
-
m[v.chain['chain-name']] = m[v.chain['chain-name']] || [];
|
|
283
|
-
const assets = v.assets.map(asset => {
|
|
284
|
-
return _objectSpread(_objectSpread({}, asset), {}, {
|
|
285
|
-
traces: [{
|
|
286
|
-
type: 'ibc',
|
|
287
|
-
counterparty: {
|
|
288
|
-
port: v.counterparty['port-id'],
|
|
289
|
-
// source_channel
|
|
290
|
-
channel: v.counterparty['channel-id'],
|
|
291
|
-
// source_denom
|
|
292
|
-
denom: asset.denom_units[0].aliases[0],
|
|
293
|
-
chain_name: v.counterparty['chain-name']
|
|
294
|
-
},
|
|
295
|
-
chain: {
|
|
296
|
-
// dst_denom
|
|
297
|
-
port: v.chain['port-id'],
|
|
298
|
-
channel: v.chain['channel-id'] // chain_name: v.chain['chain-name'],
|
|
299
|
-
|
|
300
|
-
}
|
|
301
|
-
}]
|
|
302
|
-
});
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
const obj = _objectSpread(_objectSpread({}, v), {}, {
|
|
306
|
-
assets
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
m[v.chain['chain-name']].push(obj);
|
|
310
|
-
return m;
|
|
311
|
-
}, {});
|
|
312
|
-
return Object.keys(hash).map(chain => {
|
|
313
|
-
return {
|
|
314
|
-
chain_name: chain,
|
|
315
|
-
assets: hash[chain].reduce((m, v) => {
|
|
316
|
-
return [...m, ...v.assets];
|
|
317
|
-
}, [])
|
|
318
|
-
};
|
|
319
|
-
});
|
|
320
|
-
};
|
|
321
|
-
export const getAssetLists = (chainName, ibc, assets) => {
|
|
322
|
-
const ibcAssetLists = getIbcAssets(chainName, ibc, assets);
|
|
323
|
-
const cw20Assets = getCw20Assets(chainName, ibc, assets);
|
|
324
|
-
return ibcAssetLists.reduce((m, v) => {
|
|
325
|
-
const chain = v.chain_name;
|
|
326
|
-
const assets = [...v.assets];
|
|
327
|
-
const cw20 = cw20Assets.find(a => a.chain_name === chain);
|
|
328
|
-
|
|
329
|
-
if (cw20) {
|
|
330
|
-
[].push.apply(assets, cw20.assets);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
return [{
|
|
334
|
-
chain_name: chain,
|
|
335
|
-
assets
|
|
336
|
-
}, ...m];
|
|
337
|
-
}, []);
|
|
338
|
-
};
|
|
1
|
+
export * from './registry';
|
|
2
|
+
export * from './utils';
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import { basename } from 'bfs-path';
|
|
3
|
+
import fetch from 'cross-fetch';
|
|
4
|
+
import { getAssetLists } from './utils';
|
|
5
|
+
|
|
6
|
+
const fetchUrl = url => {
|
|
7
|
+
return fetch(url).then(res => {
|
|
8
|
+
if (res.status >= 400) {
|
|
9
|
+
throw new Error('Bad response');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return res.json();
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export class ChainInfo {
|
|
17
|
+
constructor(options) {
|
|
18
|
+
_defineProperty(this, "chain_name", void 0);
|
|
19
|
+
|
|
20
|
+
_defineProperty(this, "registry", void 0);
|
|
21
|
+
|
|
22
|
+
_defineProperty(this, "_asset_list", void 0);
|
|
23
|
+
|
|
24
|
+
_defineProperty(this, "_asset_lists", void 0);
|
|
25
|
+
|
|
26
|
+
_defineProperty(this, "_chain", void 0);
|
|
27
|
+
|
|
28
|
+
_defineProperty(this, "_ibc_data", []);
|
|
29
|
+
|
|
30
|
+
this.chain_name = options.chain_name;
|
|
31
|
+
this.registry = options.registry;
|
|
32
|
+
this.refresh();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
refresh() {
|
|
36
|
+
this._asset_list = this.registry.getChainAssetList(this.chain_name);
|
|
37
|
+
this._ibc_data = this.registry.getChainIbcData(this.chain_name);
|
|
38
|
+
this._chain = this.registry.getChain(this.chain_name);
|
|
39
|
+
|
|
40
|
+
const supportedChains = this._ibc_data.reduce((m, v) => {
|
|
41
|
+
if (!m.includes(v['chain-1']['chain-name'])) m.push(v['chain-1']['chain-name']);
|
|
42
|
+
if (!m.includes(v['chain-2']['chain-name'])) m.push(v['chain-2']['chain-name']);
|
|
43
|
+
return m;
|
|
44
|
+
}, []);
|
|
45
|
+
|
|
46
|
+
this._asset_lists = this.registry.assetLists().filter(list => supportedChains.includes(list.chain_name));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
nativeAssetLists() {
|
|
50
|
+
return this._asset_list;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
chain() {
|
|
54
|
+
return this._chain;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
assetLists() {
|
|
58
|
+
return getAssetLists(this.chain_name, this._ibc_data, this._asset_lists);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
export class ChainRegistry {
|
|
63
|
+
constructor(options = {}) {
|
|
64
|
+
_defineProperty(this, "_asset_lists", []);
|
|
65
|
+
|
|
66
|
+
_defineProperty(this, "_chains", []);
|
|
67
|
+
|
|
68
|
+
_defineProperty(this, "_ibc_data", []);
|
|
69
|
+
|
|
70
|
+
_defineProperty(this, "urls", []);
|
|
71
|
+
|
|
72
|
+
//
|
|
73
|
+
if (options.assetLists) {
|
|
74
|
+
this._asset_lists = options.assetLists;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (options.chains) {
|
|
78
|
+
this._chains = options.chains;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (options.ibcData) {
|
|
82
|
+
this._ibc_data = options.ibcData;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (options.urls) {
|
|
86
|
+
this.urls = options.urls;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
assetLists() {
|
|
91
|
+
return this._asset_lists;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
getChainAssetList(chainName) {
|
|
95
|
+
return this._asset_lists.find(list => list.chain_name === chainName);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
getGeneratedAssetLists(chainName) {
|
|
99
|
+
return getAssetLists(chainName, this._ibc_data, this._asset_lists);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
chains() {
|
|
103
|
+
return this._chains;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
getChain(chainName) {
|
|
107
|
+
return this._chains.find(chain => chain.chain_name === chainName);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
ibcData() {
|
|
111
|
+
return this._ibc_data;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
getChainIbcData(chainName) {
|
|
115
|
+
return this._ibc_data.filter(info => info['chain-1']['chain-name'] === chainName || info['chain-2']['chain-name'] === chainName);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
getChainInfo(chainName) {
|
|
119
|
+
return new ChainInfo({
|
|
120
|
+
chain_name: chainName,
|
|
121
|
+
registry: this
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
upsertChain(data) {
|
|
126
|
+
const found = this._chains.find(chain => {
|
|
127
|
+
return chain.chain_name === data.chain_name && chain.network_type === data.network_type;
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
if (!found) {
|
|
131
|
+
this._chains.push(data);
|
|
132
|
+
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
this._chains = this._chains.map(chain => {
|
|
137
|
+
if (chain.chain_name === data.chain_name && chain.network_type === data.network_type) {
|
|
138
|
+
return data;
|
|
139
|
+
} else {
|
|
140
|
+
return chain;
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
updateAssetList(data) {
|
|
146
|
+
const found = this._asset_lists.find(list => {
|
|
147
|
+
return list.chain_name === data.chain_name;
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
if (!found) {
|
|
151
|
+
this._asset_lists.push(data);
|
|
152
|
+
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
this._asset_lists = this._asset_lists.map(list => {
|
|
157
|
+
if (list.chain_name === data.chain_name) {
|
|
158
|
+
return data;
|
|
159
|
+
} else {
|
|
160
|
+
return list;
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
upsertIbcData(data) {
|
|
166
|
+
const found = this._ibc_data.find(info => {
|
|
167
|
+
return info['chain-1']['chain-name'] === data['chain-1']['chain-name'] && info['chain-2']['chain-name'] === data['chain-2']['chain-name'];
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
if (!found) {
|
|
171
|
+
this._ibc_data.push(data);
|
|
172
|
+
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
this._ibc_data = this._ibc_data.map(info => {
|
|
177
|
+
if (info['chain-1']['chain-name'] === data['chain-1']['chain-name'] && info['chain-2']['chain-name'] === data['chain-2']['chain-name']) {
|
|
178
|
+
return data;
|
|
179
|
+
} else {
|
|
180
|
+
return info;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
update(data) {
|
|
186
|
+
if (!data.$schema) throw new Error('not a registered JSON schema type');
|
|
187
|
+
const type = basename(data.$schema, '.schema.json');
|
|
188
|
+
|
|
189
|
+
switch (type) {
|
|
190
|
+
case 'chain':
|
|
191
|
+
this.upsertChain(data);
|
|
192
|
+
break;
|
|
193
|
+
|
|
194
|
+
case 'assetlist':
|
|
195
|
+
this.updateAssetList(data);
|
|
196
|
+
break;
|
|
197
|
+
|
|
198
|
+
case 'ibc_data':
|
|
199
|
+
this.upsertIbcData(data);
|
|
200
|
+
break;
|
|
201
|
+
|
|
202
|
+
default:
|
|
203
|
+
throw new Error('unknown schema type');
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
async fetch(url) {
|
|
208
|
+
const data = await fetchUrl(url);
|
|
209
|
+
this.update(data);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async fetchUrls() {
|
|
213
|
+
return Promise.all(this.urls.map(url => this.fetch(url)));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
}
|