@keplr-wallet/background 0.10.11 → 0.10.12-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +2 -1
- package/.prettierignore +2 -1
- package/build/chains/service.d.ts +1 -1
- package/build/chains/service.js +3 -3
- package/build/chains/service.js.map +1 -1
- package/build/updater/handler.js +14 -0
- package/build/updater/handler.js.map +1 -1
- package/build/updater/init.js +2 -0
- package/build/updater/init.js.map +1 -1
- package/build/updater/messages.d.ts +19 -0
- package/build/updater/messages.js +59 -1
- package/build/updater/messages.js.map +1 -1
- package/build/updater/service.d.ts +4 -1
- package/build/updater/service.js +104 -0
- package/build/updater/service.js.map +1 -1
- package/package.json +12 -11
- package/src/chains/service.ts +4 -4
- package/src/updater/handler.ts +31 -1
- package/src/updater/init.ts +7 -1
- package/src/updater/messages.ts +68 -0
- package/src/updater/service.ts +174 -3
package/.eslintignore
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
build/*
|
|
1
|
+
build/*
|
|
2
|
+
.DS_Store
|
package/.prettierignore
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
build/*
|
|
1
|
+
build/*
|
|
2
|
+
.DS_Store
|
|
@@ -26,7 +26,7 @@ export declare class ChainsService {
|
|
|
26
26
|
getChainCoinType(chainId: string): Promise<number>;
|
|
27
27
|
hasChainInfo(chainId: string): Promise<boolean>;
|
|
28
28
|
suggestChainInfo(env: Env, chainInfo: ChainInfo, origin: string): Promise<void>;
|
|
29
|
-
|
|
29
|
+
getSuggestedChainInfos(): Promise<ChainInfo[]>;
|
|
30
30
|
addChainInfo(chainInfo: ChainInfo): Promise<void>;
|
|
31
31
|
removeChainInfo(chainId: string): Promise<void>;
|
|
32
32
|
getChainEthereumKeyFeatures(chainId: string): Promise<{
|
package/build/chains/service.js
CHANGED
|
@@ -32,7 +32,7 @@ class ChainsService {
|
|
|
32
32
|
for (const embedChainInfo of chainInfos) {
|
|
33
33
|
embedChainInfoIdentifierMap.set(cosmos_1.ChainIdHelper.parse(embedChainInfo.chainId).identifier, true);
|
|
34
34
|
}
|
|
35
|
-
const
|
|
35
|
+
const suggestedChainInfos = (yield this.getSuggestedChainInfos())
|
|
36
36
|
.filter((chainInfo) => {
|
|
37
37
|
// Filter the overlaped chain info with the embeded chain infos.
|
|
38
38
|
return !embedChainInfoIdentifierMap.get(cosmos_1.ChainIdHelper.parse(chainInfo.chainId).identifier);
|
|
@@ -40,7 +40,7 @@ class ChainsService {
|
|
|
40
40
|
.map((chainInfo) => {
|
|
41
41
|
return Object.assign(Object.assign({}, chainInfo), { embeded: false });
|
|
42
42
|
});
|
|
43
|
-
let result = chainInfos.concat(
|
|
43
|
+
let result = chainInfos.concat(suggestedChainInfos);
|
|
44
44
|
// Set the updated property of the chain.
|
|
45
45
|
result = yield Promise.all(result.map((chainInfo) => __awaiter(this, void 0, void 0, function* () {
|
|
46
46
|
const updated = yield this.chainUpdaterKeeper.putUpdatedPropertyToChainInfo(chainInfo);
|
|
@@ -101,7 +101,7 @@ class ChainsService {
|
|
|
101
101
|
yield this.addChainInfo(chainInfo);
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
|
-
|
|
104
|
+
getSuggestedChainInfos() {
|
|
105
105
|
var _a;
|
|
106
106
|
return __awaiter(this, void 0, void 0, function* () {
|
|
107
107
|
return ((_a = (yield this.kvStoreForSuggestChain.get("chain-infos"))) !== null && _a !== void 0 ? _a : []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/chains/service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAA8D;AAE9D,iDAAyE;AAGzE,iDAAuD;AACvD,yCAAiD;AACjD,iDAAqD;AAIrD,MAAa,aAAa;IAUxB,YACqB,OAAgB,EAChB,eAA4B,EAC5B,sBAEd,EAAE;QAJY,YAAO,GAAP,OAAO,CAAS;QAChB,oBAAe,GAAf,eAAe,CAAa;QAC5B,wBAAmB,GAAnB,mBAAmB,CAE/B;QAdC,2BAAsB,GAA0B,EAAE,CAAC;QA+BpD,kBAAa,GAElB,kBAAS,CAAC,OAAO,CAAC,GAAS,EAAE;YAC/B,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACzB,OAAO,IAAI,CAAC,gBAAgB,CAAC;aAC9B;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;gBACxD,uCACK,SAAS,KACZ,OAAO,EAAE,IAAI,IACb;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,2BAA2B,GAG7B,IAAI,GAAG,EAAE,CAAC;YACd,KAAK,MAAM,cAAc,IAAI,UAAU,EAAE;gBACvC,2BAA2B,CAAC,GAAG,CAC7B,sBAAa,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,UAAU,EACtD,IAAI,CACL,CAAC;aACH;YAED,MAAM,
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/chains/service.ts"],"names":[],"mappings":"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"}
|
package/build/updater/handler.js
CHANGED
|
@@ -17,6 +17,10 @@ const getHandler = (service) => {
|
|
|
17
17
|
switch (msg.constructor) {
|
|
18
18
|
case messages_1.TryUpdateChainMsg:
|
|
19
19
|
return handleTryUpdateChainMsg(service)(env, msg);
|
|
20
|
+
case messages_1.SetChainEndpointsMsg:
|
|
21
|
+
return handleSetChainEndpointsMsg(service)(env, msg);
|
|
22
|
+
case messages_1.ResetChainEndpointsMsg:
|
|
23
|
+
return handleResetChainEndpointsMsg(service)(env, msg);
|
|
20
24
|
default:
|
|
21
25
|
throw new router_1.KeplrError("updater", 110, "Unknown msg type");
|
|
22
26
|
}
|
|
@@ -28,4 +32,14 @@ const handleTryUpdateChainMsg = (service) => {
|
|
|
28
32
|
yield service.tryUpdateChain(msg.chainId);
|
|
29
33
|
});
|
|
30
34
|
};
|
|
35
|
+
const handleSetChainEndpointsMsg = (service) => {
|
|
36
|
+
return (_, msg) => __awaiter(void 0, void 0, void 0, function* () {
|
|
37
|
+
return yield service.setChainEndpoints(msg.chainId, msg.rpc, msg.rest);
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
const handleResetChainEndpointsMsg = (service) => {
|
|
41
|
+
return (_, msg) => __awaiter(void 0, void 0, void 0, function* () {
|
|
42
|
+
return yield service.resetChainEndpoints(msg.chainId);
|
|
43
|
+
});
|
|
44
|
+
};
|
|
31
45
|
//# sourceMappingURL=handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/updater/handler.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAM8B;AAE9B,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/updater/handler.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAM8B;AAE9B,yCAIoB;AAEb,MAAM,UAAU,GAA8C,CACnE,OAAO,EACP,EAAE;IACF,OAAO,CAAC,GAAQ,EAAE,GAAqB,EAAE,EAAE;QACzC,QAAQ,GAAG,CAAC,WAAW,EAAE;YACvB,KAAK,4BAAiB;gBACpB,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAwB,CAAC,CAAC;YACzE,KAAK,+BAAoB;gBACvB,OAAO,0BAA0B,CAAC,OAAO,CAAC,CACxC,GAAG,EACH,GAA2B,CAC5B,CAAC;YACJ,KAAK,iCAAsB;gBACzB,OAAO,4BAA4B,CAAC,OAAO,CAAC,CAC1C,GAAG,EACH,GAA6B,CAC9B,CAAC;YACJ;gBACE,MAAM,IAAI,mBAAU,CAAC,SAAS,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;SAC5D;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AArBW,QAAA,UAAU,cAqBrB;AAEF,MAAM,uBAAuB,GAEa,CAAC,OAAO,EAAE,EAAE;IACpD,OAAO,CAAO,CAAC,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAEa,CAAC,OAAO,EAAE,EAAE;IACvD,OAAO,CAAO,CAAC,EAAE,GAAG,EAAE,EAAE;QACtB,OAAO,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAEa,CAAC,OAAO,EAAE,EAAE;IACzD,OAAO,CAAO,CAAC,EAAE,GAAG,EAAE,EAAE;QACtB,OAAO,MAAM,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC"}
|
package/build/updater/init.js
CHANGED
|
@@ -6,6 +6,8 @@ const constants_1 = require("./constants");
|
|
|
6
6
|
const handler_1 = require("./handler");
|
|
7
7
|
function init(router, service) {
|
|
8
8
|
router.registerMessage(messages_1.TryUpdateChainMsg);
|
|
9
|
+
router.registerMessage(messages_1.SetChainEndpointsMsg);
|
|
10
|
+
router.registerMessage(messages_1.ResetChainEndpointsMsg);
|
|
9
11
|
router.addHandler(constants_1.ROUTE, handler_1.getHandler(service));
|
|
10
12
|
}
|
|
11
13
|
exports.init = init;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/updater/init.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/updater/init.ts"],"names":[],"mappings":";;;AACA,yCAIoB;AACpB,2CAAoC;AACpC,uCAAuC;AAGvC,SAAgB,IAAI,CAAC,MAAc,EAAE,OAA4B;IAC/D,MAAM,CAAC,eAAe,CAAC,4BAAiB,CAAC,CAAC;IAC1C,MAAM,CAAC,eAAe,CAAC,+BAAoB,CAAC,CAAC;IAC7C,MAAM,CAAC,eAAe,CAAC,iCAAsB,CAAC,CAAC;IAE/C,MAAM,CAAC,UAAU,CAAC,iBAAK,EAAE,oBAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC;AAND,oBAMC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Message } from "@keplr-wallet/router";
|
|
2
|
+
import { ChainInfoWithEmbed } from "../chains";
|
|
2
3
|
export declare class TryUpdateChainMsg extends Message<void> {
|
|
3
4
|
readonly chainId: string;
|
|
4
5
|
static type(): string;
|
|
@@ -7,3 +8,21 @@ export declare class TryUpdateChainMsg extends Message<void> {
|
|
|
7
8
|
route(): string;
|
|
8
9
|
type(): string;
|
|
9
10
|
}
|
|
11
|
+
export declare class SetChainEndpointsMsg extends Message<ChainInfoWithEmbed[]> {
|
|
12
|
+
readonly chainId: string;
|
|
13
|
+
readonly rpc: string | undefined;
|
|
14
|
+
readonly rest: string | undefined;
|
|
15
|
+
static type(): string;
|
|
16
|
+
constructor(chainId: string, rpc: string | undefined, rest: string | undefined);
|
|
17
|
+
validateBasic(): void;
|
|
18
|
+
route(): string;
|
|
19
|
+
type(): string;
|
|
20
|
+
}
|
|
21
|
+
export declare class ResetChainEndpointsMsg extends Message<ChainInfoWithEmbed[]> {
|
|
22
|
+
readonly chainId: string;
|
|
23
|
+
static type(): string;
|
|
24
|
+
constructor(chainId: string);
|
|
25
|
+
validateBasic(): void;
|
|
26
|
+
route(): string;
|
|
27
|
+
type(): string;
|
|
28
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TryUpdateChainMsg = void 0;
|
|
3
|
+
exports.ResetChainEndpointsMsg = exports.SetChainEndpointsMsg = exports.TryUpdateChainMsg = void 0;
|
|
4
4
|
const router_1 = require("@keplr-wallet/router");
|
|
5
5
|
const constants_1 = require("./constants");
|
|
6
6
|
class TryUpdateChainMsg extends router_1.Message {
|
|
@@ -24,4 +24,62 @@ class TryUpdateChainMsg extends router_1.Message {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
exports.TryUpdateChainMsg = TryUpdateChainMsg;
|
|
27
|
+
class SetChainEndpointsMsg extends router_1.Message {
|
|
28
|
+
constructor(chainId, rpc, rest) {
|
|
29
|
+
super();
|
|
30
|
+
this.chainId = chainId;
|
|
31
|
+
this.rpc = rpc;
|
|
32
|
+
this.rest = rest;
|
|
33
|
+
}
|
|
34
|
+
static type() {
|
|
35
|
+
return "set-chain-endpoints";
|
|
36
|
+
}
|
|
37
|
+
validateBasic() {
|
|
38
|
+
if (!this.chainId) {
|
|
39
|
+
throw new router_1.KeplrError("updater", 100, "Empty chain id");
|
|
40
|
+
}
|
|
41
|
+
if (this.rpc) {
|
|
42
|
+
// Make sure that rpc is valid url form
|
|
43
|
+
const url = new URL(this.rpc);
|
|
44
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
45
|
+
throw new Error(`RPC has invalid protocol: ${url.protocol}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (this.rest) {
|
|
49
|
+
// Make sure that rest is valid url form
|
|
50
|
+
const url = new URL(this.rest);
|
|
51
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
52
|
+
throw new Error(`LCD has invalid protocol: ${url.protocol}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
route() {
|
|
57
|
+
return constants_1.ROUTE;
|
|
58
|
+
}
|
|
59
|
+
type() {
|
|
60
|
+
return SetChainEndpointsMsg.type();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.SetChainEndpointsMsg = SetChainEndpointsMsg;
|
|
64
|
+
class ResetChainEndpointsMsg extends router_1.Message {
|
|
65
|
+
constructor(chainId) {
|
|
66
|
+
super();
|
|
67
|
+
this.chainId = chainId;
|
|
68
|
+
}
|
|
69
|
+
static type() {
|
|
70
|
+
return "reset-chain-endpoints";
|
|
71
|
+
}
|
|
72
|
+
validateBasic() {
|
|
73
|
+
if (!this.chainId) {
|
|
74
|
+
throw new router_1.KeplrError("updater", 100, "Empty chain id");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
route() {
|
|
78
|
+
return constants_1.ROUTE;
|
|
79
|
+
}
|
|
80
|
+
type() {
|
|
81
|
+
return ResetChainEndpointsMsg.type();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.ResetChainEndpointsMsg = ResetChainEndpointsMsg;
|
|
27
85
|
//# sourceMappingURL=messages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/updater/messages.ts"],"names":[],"mappings":";;;AAAA,iDAA2D;AAC3D,2CAAoC;
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/updater/messages.ts"],"names":[],"mappings":";;;AAAA,iDAA2D;AAC3D,2CAAoC;AAGpC,MAAa,iBAAkB,SAAQ,gBAAa;IAKlD,YAA4B,OAAe;QACzC,KAAK,EAAE,CAAC;QADkB,YAAO,GAAP,OAAO,CAAQ;IAE3C,CAAC;IANM,MAAM,CAAC,IAAI;QAChB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAMD,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,IAAI,mBAAU,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;SACxD;IACH,CAAC;IAED,KAAK;QACH,OAAO,iBAAK,CAAC;IACf,CAAC;IAED,IAAI;QACF,OAAO,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;CACF;AAtBD,8CAsBC;AAED,MAAa,oBAAqB,SAAQ,gBAA6B;IAKrE,YACkB,OAAe,EACf,GAAuB,EACvB,IAAwB;QAExC,KAAK,EAAE,CAAC;QAJQ,YAAO,GAAP,OAAO,CAAQ;QACf,QAAG,GAAH,GAAG,CAAoB;QACvB,SAAI,GAAJ,IAAI,CAAoB;IAG1C,CAAC;IAVM,MAAM,CAAC,IAAI;QAChB,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAUD,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,IAAI,mBAAU,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;SACxD;QAED,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,uCAAuC;YACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE;gBACzD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;aAC9D;SACF;QACD,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,wCAAwC;YACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE;gBACzD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;aAC9D;SACF;IACH,CAAC;IAED,KAAK;QACH,OAAO,iBAAK,CAAC;IACf,CAAC;IAED,IAAI;QACF,OAAO,oBAAoB,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;CACF;AAzCD,oDAyCC;AAED,MAAa,sBAAuB,SAAQ,gBAA6B;IAKvE,YAA4B,OAAe;QACzC,KAAK,EAAE,CAAC;QADkB,YAAO,GAAP,OAAO,CAAQ;IAE3C,CAAC;IANM,MAAM,CAAC,IAAI;QAChB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAMD,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,IAAI,mBAAU,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;SACxD;IACH,CAAC;IAED,KAAK;QACH,OAAO,iBAAK,CAAC;IACf,CAAC;IAED,IAAI;QACF,OAAO,sBAAsB,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;CACF;AAtBD,wDAsBC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChainInfo } from "@keplr-wallet/types";
|
|
2
2
|
import { KVStore } from "@keplr-wallet/common";
|
|
3
|
-
import { ChainsService } from "../chains";
|
|
3
|
+
import { ChainInfoWithEmbed, ChainsService } from "../chains";
|
|
4
4
|
export declare class ChainUpdaterService {
|
|
5
5
|
protected readonly kvStore: KVStore;
|
|
6
6
|
protected chainsService: ChainsService;
|
|
@@ -23,4 +23,7 @@ export declare class ChainUpdaterService {
|
|
|
23
23
|
chainId?: string;
|
|
24
24
|
features?: string[];
|
|
25
25
|
}>;
|
|
26
|
+
setChainEndpoints(chainId: string, rpc: string | undefined, rest: string | undefined): Promise<ChainInfoWithEmbed[]>;
|
|
27
|
+
resetChainEndpoints(chainId: string): Promise<ChainInfoWithEmbed[]>;
|
|
28
|
+
static checkEndpointsConnectivity(chainId: string, rpc: string, rest: string, wsObject?: new (url: string, protocols?: string | string[]) => WebSocket): Promise<void>;
|
|
26
29
|
}
|
package/build/updater/service.js
CHANGED
|
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.ChainUpdaterService = void 0;
|
|
16
16
|
const axios_1 = __importDefault(require("axios"));
|
|
17
17
|
const cosmos_1 = require("@keplr-wallet/cosmos");
|
|
18
|
+
const router_1 = require("@keplr-wallet/router");
|
|
18
19
|
class ChainUpdaterService {
|
|
19
20
|
constructor(kvStore) {
|
|
20
21
|
this.kvStore = kvStore;
|
|
@@ -40,6 +41,8 @@ class ChainUpdaterService {
|
|
|
40
41
|
}
|
|
41
42
|
return Object.assign(Object.assign({}, chainInfo), {
|
|
42
43
|
chainId: updatedProperty.chainId || chainInfo.chainId,
|
|
44
|
+
rpc: updatedProperty.rpc || chainInfo.rpc,
|
|
45
|
+
rest: updatedProperty.rest || chainInfo.rest,
|
|
43
46
|
features,
|
|
44
47
|
});
|
|
45
48
|
});
|
|
@@ -210,6 +213,107 @@ class ChainUpdaterService {
|
|
|
210
213
|
};
|
|
211
214
|
});
|
|
212
215
|
}
|
|
216
|
+
// XXX: It is not conceptually valid that the function to set the rpc/rest endpoint of the chain exists in this service.
|
|
217
|
+
// However, in order to focus on adding feature rather than making a big change, the refactor is postponed later and the configuration of the rpc/rest endpoint is handled here.
|
|
218
|
+
setChainEndpoints(chainId, rpc, rest) {
|
|
219
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
220
|
+
const chainInfo = {};
|
|
221
|
+
// `saveChainProperty` method merges chain info using spread operator.
|
|
222
|
+
// That is, if the field is undefined, the field is finally saved as undefined and the field is treated as if it were deleted.
|
|
223
|
+
// To avoid this problem, the field must not exist. The implementation of the below is critical to its operation.
|
|
224
|
+
if (rpc) {
|
|
225
|
+
chainInfo.rpc = rpc;
|
|
226
|
+
}
|
|
227
|
+
if (rest) {
|
|
228
|
+
chainInfo.rest = rest;
|
|
229
|
+
}
|
|
230
|
+
const version = cosmos_1.ChainIdHelper.parse(chainId);
|
|
231
|
+
yield this.saveChainProperty(version.identifier, chainInfo);
|
|
232
|
+
return yield this.chainsService.getChainInfos();
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
resetChainEndpoints(chainId) {
|
|
236
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
237
|
+
const version = cosmos_1.ChainIdHelper.parse(chainId);
|
|
238
|
+
// `saveChainProperty` method merges chain info using spread operator.
|
|
239
|
+
// That is, if the field is undefined, the field is finally saved as undefined and the field is treated as if it were deleted.
|
|
240
|
+
yield this.saveChainProperty(version.identifier, {
|
|
241
|
+
rpc: undefined,
|
|
242
|
+
rest: undefined,
|
|
243
|
+
});
|
|
244
|
+
return yield this.chainsService.getChainInfos();
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
static checkEndpointsConnectivity(chainId, rpc, rest, wsObject) {
|
|
248
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
249
|
+
const rpcInstance = axios_1.default.create({
|
|
250
|
+
baseURL: rpc,
|
|
251
|
+
});
|
|
252
|
+
let resultStatus;
|
|
253
|
+
try {
|
|
254
|
+
// Get the status to get the chain id.
|
|
255
|
+
resultStatus = yield rpcInstance.get("/status");
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
console.log(e);
|
|
259
|
+
throw new Error("Failed to get response /status from rpc endpoint");
|
|
260
|
+
}
|
|
261
|
+
const version = cosmos_1.ChainIdHelper.parse(chainId);
|
|
262
|
+
const versionFromRPCStatus = cosmos_1.ChainIdHelper.parse(resultStatus.data.result.node_info.network);
|
|
263
|
+
if (versionFromRPCStatus.identifier !== version.identifier) {
|
|
264
|
+
throw new router_1.KeplrError("updater", 8001, `RPC endpoint has different chain id (expected: ${chainId}, actual: ${resultStatus.data.result.node_info.network})`);
|
|
265
|
+
}
|
|
266
|
+
else if (versionFromRPCStatus.version !== version.version) {
|
|
267
|
+
// In the form of {chain_identifier}-{chain_version}, if the identifier is the same but the version is different, it is strictly an error,
|
|
268
|
+
// but it is actually the same chain but the chain version of the node is different.
|
|
269
|
+
// In this case, it is possible to treat as a warning and proceed as it is, so this is separated with above error.
|
|
270
|
+
throw new router_1.KeplrError("updater", 8002, `RPC endpoint has different chain id (expected: ${chainId}, actual: ${resultStatus.data.result.node_info.network})`);
|
|
271
|
+
}
|
|
272
|
+
let wsURL = rpc;
|
|
273
|
+
if (wsURL.startsWith("http")) {
|
|
274
|
+
wsURL = wsURL.replace("http", "ws");
|
|
275
|
+
}
|
|
276
|
+
wsURL = wsURL.endsWith("/") ? wsURL + "websocket" : wsURL + "/websocket";
|
|
277
|
+
const wsInstance = wsObject ? new wsObject(wsURL) : new WebSocket(wsURL);
|
|
278
|
+
// Try 15 times at 1 second intervals to test websocket connectivity.
|
|
279
|
+
for (let i = 0; i < 15; i++) {
|
|
280
|
+
// If ws state is not "connecting"
|
|
281
|
+
if (wsInstance.readyState !== 0) {
|
|
282
|
+
// If ws state is "open", it means that app can connect ws to /websocket rpc
|
|
283
|
+
if (wsInstance.readyState === 1) {
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
// else, handle that as error.
|
|
288
|
+
throw new Error("Failed to connect websocket to /websocket rpc");
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
yield new Promise((resolve) => setTimeout(resolve, 1000));
|
|
292
|
+
}
|
|
293
|
+
const restInstance = axios_1.default.create({
|
|
294
|
+
baseURL: rest,
|
|
295
|
+
});
|
|
296
|
+
let resultLCDNodeInfo;
|
|
297
|
+
try {
|
|
298
|
+
// Get the node info to get the chain id.
|
|
299
|
+
resultLCDNodeInfo = yield restInstance.get("/cosmos/base/tendermint/v1beta1/node_info");
|
|
300
|
+
}
|
|
301
|
+
catch (e) {
|
|
302
|
+
console.log(e);
|
|
303
|
+
throw new Error("Failed to get response /cosmos/base/tendermint/v1beta1/node_info from lcd endpoint");
|
|
304
|
+
}
|
|
305
|
+
const versionFromLCDNodeInfo = cosmos_1.ChainIdHelper.parse(resultLCDNodeInfo.data.default_node_info.network);
|
|
306
|
+
if (versionFromLCDNodeInfo.identifier !== version.identifier) {
|
|
307
|
+
throw new router_1.KeplrError("updater", 8101, `LCD endpoint has different chain id (expected: ${chainId}, actual: ${resultStatus.data.result.node_info.network})`);
|
|
308
|
+
}
|
|
309
|
+
else if (versionFromLCDNodeInfo.version !== version.version) {
|
|
310
|
+
// In the form of {chain_identifier}-{chain_version}, if the identifier is the same but the version is different, it is strictly an error,
|
|
311
|
+
// but it is actually the same chain but the chain version of the node is different.
|
|
312
|
+
// In this case, it is possible to treat as a warning and proceed as it is, so this is separated with above error.
|
|
313
|
+
throw new router_1.KeplrError("updater", 8102, `LCD endpoint has different chain id (expected: ${chainId}, actual: ${resultStatus.data.result.node_info.network})`);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
}
|
|
213
317
|
}
|
|
214
318
|
exports.ChainUpdaterService = ChainUpdaterService;
|
|
215
319
|
//# sourceMappingURL=service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/updater/service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/updater/service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,kDAA6C;AAE7C,iDAAqD;AAGrD,iDAAkD;AAElD,MAAa,mBAAmB;IAG9B,YAA+B,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;IAAG,CAAC;IAEnD,IAAI,CAAC,aAA4B;QAC/B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAEK,6BAA6B,CACjC,SAAoB;;;YAEpB,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,uBAAuB,CACxD,SAAS,CAAC,OAAO,CAClB,CAAC;YAEF,MAAM,OAAO,GAAG,sBAAa,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,cAAc,GAAG,sBAAa,CAAC,KAAK,CACxC,eAAe,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAC7C,CAAC;YAEF,0EAA0E;YAC1E,IAAI,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE;gBAC5C,OAAO,SAAS,CAAC;aAClB;YAED,MAAM,QAAQ,SAAG,SAAS,CAAC,QAAQ,mCAAI,EAAE,CAAC;YAC1C,KAAK,MAAM,cAAc,UAAI,eAAe,CAAC,QAAQ,mCAAI,EAAE,EAAE;gBAC3D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;oBACtC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;iBAC/B;aACF;YAED,uCACK,SAAS,GACT;gBACD,OAAO,EAAE,eAAe,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO;gBACrD,GAAG,EAAE,eAAe,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG;gBACzC,IAAI,EAAE,eAAe,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI;gBAC5C,QAAQ;aACT,EACD;;KACH;IAEK,oBAAoB,CAAC,OAAe;;YACxC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAEtE,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;QAC7C,CAAC;KAAA;IAEK,cAAc,CAAC,OAAe;;;YAClC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAEjE,sDAAsD;YACtD,qDAAqD;YACrD,IAAI,CAAC,sBAAa,CAAC,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;gBACrD,OAAO;aACR;YAED,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAEtE,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE;gBACtC,MAAM,cAAc,GAAG,sBAAa,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAE9D,IAAI,OAAO,CAAC,OAAO,EAAE;oBACnB,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;oBACvC,MAAM,cAAc,GAAG,sBAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBAE3D,IACE,cAAc,CAAC,UAAU,KAAK,cAAc,CAAC,UAAU;wBACvD,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,EAC/C;wBACA,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,UAAU,EAAE;4BACtD,OAAO,EAAE,cAAc;yBACxB,CAAC,CAAC;qBACJ;iBACF;gBAED,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBACnD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAC3D,SAAS,CAAC,OAAO,CAClB,CAAC;oBAEF,MAAM,cAAc,SAAG,kBAAkB,CAAC,QAAQ,mCAAI,EAAE,CAAC;oBAEzD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE;wBACtC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;4BACrC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;yBAC9B;qBACF;oBAED,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,UAAU,EAAE;wBACtD,QAAQ,EAAE,cAAc;qBACzB,CAAC,CAAC;iBACJ;aACF;;KACF;IAEa,uBAAuB,CACnC,OAAe;;YAEf,MAAM,OAAO,GAAG,sBAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE7C,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1D,CAAC;KAAA;IAEa,iBAAiB,CAC7B,UAAkB,EAClB,SAA6B;;YAE7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEvD,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,kCAC5B,KAAK,GACL,SAAS,EACZ,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;QAC7C,CAAC;KAAA;IAEa,iBAAiB,CAC7B,UAAkB;;YAElB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAqB,UAAU,CAAC,CAAC;YACzE,IAAI,CAAC,SAAS;gBAAE,OAAO,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAED;;;;OAIG;IACI,MAAM,CAAO,gBAAgB,CAClC,SAA8B;;;YAQ9B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;YAElC,sDAAsD;YACtD,qDAAqD;YACrD,IAAI,CAAC,sBAAa,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE;gBAC3C,OAAO;oBACL,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,KAAK;iBACd,CAAC;aACH;YAED,MAAM,QAAQ,GAAG,eAAK,CAAC,MAAM,CAAC;gBAC5B,OAAO,EAAE,SAAS,CAAC,GAAG;aACvB,CAAC,CAAC;YAEH,sCAAsC;YACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAM9B,SAAS,CAAC,CAAC;YAEd,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;YAE3D,MAAM,OAAO,GAAG,sBAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,cAAc,GAAG,sBAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAE1D,+BAA+B;YAC/B,IAAI,OAAO,CAAC,UAAU,KAAK,cAAc,CAAC,UAAU,EAAE;gBACpD,OAAO;oBACL,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,KAAK;iBACd,CAAC;aACH;YAED,MAAM,YAAY,GAAG,eAAK,CAAC,MAAM,CAAC;gBAChC,OAAO,EAAE,SAAS,CAAC,IAAI;aACxB,CAAC,CAAC;YAEH,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,IAAI;gBACF,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBACjE,qEAAqE;oBACrE,yDAAyD;oBACzD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAKlC,8BAA8B,CAAC,CAAC;oBAEnC,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE;wBACzB,YAAY,GAAG,IAAI,CAAC;qBACrB;iBACF;aACF;YAAC,WAAM,GAAE;YAEV,IAAI,iBAAiB,GAAG,KAAK,CAAC;YAC9B,IAAI;gBACF,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;oBACvE,MAAM,OAAO,GACX,YAAY;wBACZ,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAEhE,sDAAsD;oBACtD,kDAAkD;oBAClD,yGAAyG;oBACzG,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAMnC,OAAO;wBACL,CAAC,CAAC,8BAA8B;wBAChC,CAAC,CAAC,2CAA2C,CAChD,CAAC;oBACF,IACE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe;wBAClC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAC/B;wBACA,iBAAiB,GAAG,IAAI,CAAC;qBAC1B;iBACF;aACF;YAAC,WAAM,GAAE;YAEV,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,IAAI;gBACF,IACE,OAAA,SAAS,CAAC,QAAQ,0CAAE,QAAQ,CAAC,UAAU;oBACvC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAC3C;oBACA,0EAA0E;oBAC1E,yDAAyD;oBACzD,4EAA4E;oBAC5E,wDAAwD;oBACxD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CACnC,4CAA4C,EAC5C;wBACE,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;4BACzB,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;wBAC1C,CAAC;qBACF,CACF,CAAC;oBACF,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE;wBACzB,aAAa,GAAG,IAAI,CAAC;qBACtB;iBACF;aACF;YAAC,WAAM,GAAE;YAEV,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,IAAI,YAAY,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aACzB;YACD,IAAI,iBAAiB,EAAE;gBACrB,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;aAC/B;YACD,IAAI,aAAa,EAAE;gBACjB,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;aAC9B;YAED,OAAO;gBACL,QAAQ,EAAE,OAAO,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO;gBAClD,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAE3B,OAAO,EAAE,aAAa;gBACtB,QAAQ;aACT,CAAC;;KACH;IAED,wHAAwH;IACxH,qLAAqL;IAExK,iBAAiB,CAC5B,OAAe,EACf,GAAuB,EACvB,IAAwB;;YAExB,MAAM,SAAS,GAAgC,EAAE,CAAC;YAElD,sEAAsE;YACtE,8HAA8H;YAC9H,iHAAiH;YACjH,IAAI,GAAG,EAAE;gBACP,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC;aACrB;YACD,IAAI,IAAI,EAAE;gBACR,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;aACvB;YAED,MAAM,OAAO,GAAG,sBAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE7C,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAE5D,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QAClD,CAAC;KAAA;IAEY,mBAAmB,CAC9B,OAAe;;YAEf,MAAM,OAAO,GAAG,sBAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE7C,sEAAsE;YACtE,8HAA8H;YAC9H,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE;gBAC/C,GAAG,EAAE,SAAS;gBACd,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YAEH,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QAClD,CAAC;KAAA;IAEM,MAAM,CAAO,0BAA0B,CAC5C,OAAe,EACf,GAAW,EACX,IAAY,EACZ,QAAwE;;YAExE,MAAM,WAAW,GAAG,eAAK,CAAC,MAAM,CAAC;gBAC/B,OAAO,EAAE,GAAG;aACb,CAAC,CAAC;YAEH,IAAI,YAMF,CAAC;YAEH,IAAI;gBACF,sCAAsC;gBACtC,YAAY,GAAG,MAAM,WAAW,CAAC,GAAG,CAMjC,SAAS,CAAC,CAAC;aACf;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;aACrE;YAED,MAAM,OAAO,GAAG,sBAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE7C,MAAM,oBAAoB,GAAG,sBAAa,CAAC,KAAK,CAC9C,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAC3C,CAAC;YAEF,IAAI,oBAAoB,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE;gBAC1D,MAAM,IAAI,mBAAU,CAClB,SAAS,EACT,IAAI,EACJ,kDAAkD,OAAO,aAAa,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,CACpH,CAAC;aACH;iBAAM,IAAI,oBAAoB,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE;gBAC3D,0IAA0I;gBAC1I,oFAAoF;gBACpF,kHAAkH;gBAClH,MAAM,IAAI,mBAAU,CAClB,SAAS,EACT,IAAI,EACJ,kDAAkD,OAAO,aAAa,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,CACpH,CAAC;aACH;YAED,IAAI,KAAK,GAAG,GAAG,CAAC;YAChB,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;gBAC5B,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;aACrC;YACD,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC;YAEzE,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;YAEzE,qEAAqE;YACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;gBAC3B,kCAAkC;gBAClC,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE;oBAC/B,4EAA4E;oBAC5E,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE;wBAC/B,MAAM;qBACP;yBAAM;wBACL,8BAA8B;wBAC9B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;qBAClE;iBACF;gBAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;aAC3D;YAED,MAAM,YAAY,GAAG,eAAK,CAAC,MAAM,CAAC;gBAChC,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,IAAI,iBAIF,CAAC;YAEH,IAAI;gBACF,yCAAyC;gBACzC,iBAAiB,GAAG,MAAM,YAAY,CAAC,GAAG,CAIvC,2CAA2C,CAAC,CAAC;aACjD;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;aACH;YAED,MAAM,sBAAsB,GAAG,sBAAa,CAAC,KAAK,CAChD,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CACjD,CAAC;YAEF,IAAI,sBAAsB,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE;gBAC5D,MAAM,IAAI,mBAAU,CAClB,SAAS,EACT,IAAI,EACJ,kDAAkD,OAAO,aAAa,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,CACpH,CAAC;aACH;iBAAM,IAAI,sBAAsB,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE;gBAC7D,0IAA0I;gBAC1I,oFAAoF;gBACpF,kHAAkH;gBAClH,MAAM,IAAI,mBAAU,CAClB,SAAS,EACT,IAAI,EACJ,kDAAkD,OAAO,aAAa,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,CACpH,CAAC;aACH;QACH,CAAC;KAAA;CACF;AAxbD,kDAwbC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keplr-wallet/background",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.12-rc.0",
|
|
4
4
|
"main": "build/index.js",
|
|
5
5
|
"author": "chainapsis",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -29,14 +29,14 @@
|
|
|
29
29
|
"@ethersproject/bytes": "^5.5.0",
|
|
30
30
|
"@ethersproject/keccak256": "^5.5.0",
|
|
31
31
|
"@ethersproject/wallet": "^5.5.0",
|
|
32
|
-
"@keplr-wallet/common": "0.10.
|
|
33
|
-
"@keplr-wallet/cosmos": "0.10.
|
|
34
|
-
"@keplr-wallet/crypto": "0.10.
|
|
35
|
-
"@keplr-wallet/popup": "0.10.
|
|
36
|
-
"@keplr-wallet/proto-types": "0.10.
|
|
37
|
-
"@keplr-wallet/router": "0.10.
|
|
38
|
-
"@keplr-wallet/types": "0.10.
|
|
39
|
-
"@keplr-wallet/unit": "0.10.
|
|
32
|
+
"@keplr-wallet/common": "0.10.12-rc.0",
|
|
33
|
+
"@keplr-wallet/cosmos": "0.10.12-rc.0",
|
|
34
|
+
"@keplr-wallet/crypto": "0.10.12-rc.0",
|
|
35
|
+
"@keplr-wallet/popup": "0.10.12-rc.0",
|
|
36
|
+
"@keplr-wallet/proto-types": "0.10.12-rc.0",
|
|
37
|
+
"@keplr-wallet/router": "0.10.12-rc.0",
|
|
38
|
+
"@keplr-wallet/types": "0.10.12-rc.0",
|
|
39
|
+
"@keplr-wallet/unit": "0.10.12-rc.0",
|
|
40
40
|
"@ledgerhq/hw-transport": "^6.20.0",
|
|
41
41
|
"@ledgerhq/hw-transport-webhid": "^6.20.0",
|
|
42
42
|
"@ledgerhq/hw-transport-webusb": "^6.20.0",
|
|
@@ -52,7 +52,8 @@
|
|
|
52
52
|
"long": "^4.0.0",
|
|
53
53
|
"pbkdf2": "^3.1.2",
|
|
54
54
|
"secp256k1": "^4.0.2",
|
|
55
|
-
"secretjs": "^0.17.0"
|
|
55
|
+
"secretjs": "^0.17.0",
|
|
56
|
+
"utility-types": "^3.10.0"
|
|
56
57
|
},
|
|
57
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "523e735daecdd9aa62c330b141fd9ec70f2246ba"
|
|
58
59
|
}
|
package/src/chains/service.ts
CHANGED
|
@@ -65,8 +65,8 @@ export class ChainsService {
|
|
|
65
65
|
);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
const
|
|
69
|
-
await this.
|
|
68
|
+
const suggestedChainInfos: ChainInfoWithEmbed[] = (
|
|
69
|
+
await this.getSuggestedChainInfos()
|
|
70
70
|
)
|
|
71
71
|
.filter((chainInfo) => {
|
|
72
72
|
// Filter the overlaped chain info with the embeded chain infos.
|
|
@@ -81,7 +81,7 @@ export class ChainsService {
|
|
|
81
81
|
};
|
|
82
82
|
});
|
|
83
83
|
|
|
84
|
-
let result: ChainInfoWithEmbed[] = chainInfos.concat(
|
|
84
|
+
let result: ChainInfoWithEmbed[] = chainInfos.concat(suggestedChainInfos);
|
|
85
85
|
|
|
86
86
|
// Set the updated property of the chain.
|
|
87
87
|
result = await Promise.all(
|
|
@@ -171,7 +171,7 @@ export class ChainsService {
|
|
|
171
171
|
await this.addChainInfo(chainInfo);
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
-
async
|
|
174
|
+
async getSuggestedChainInfos(): Promise<ChainInfo[]> {
|
|
175
175
|
return (
|
|
176
176
|
(await this.kvStoreForSuggestChain.get<ChainInfo[]>("chain-infos")) ?? []
|
|
177
177
|
);
|
package/src/updater/handler.ts
CHANGED
|
@@ -6,7 +6,11 @@ import {
|
|
|
6
6
|
Message,
|
|
7
7
|
} from "@keplr-wallet/router";
|
|
8
8
|
import { ChainUpdaterService } from "./service";
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
ResetChainEndpointsMsg,
|
|
11
|
+
SetChainEndpointsMsg,
|
|
12
|
+
TryUpdateChainMsg,
|
|
13
|
+
} from "./messages";
|
|
10
14
|
|
|
11
15
|
export const getHandler: (service: ChainUpdaterService) => Handler = (
|
|
12
16
|
service
|
|
@@ -15,6 +19,16 @@ export const getHandler: (service: ChainUpdaterService) => Handler = (
|
|
|
15
19
|
switch (msg.constructor) {
|
|
16
20
|
case TryUpdateChainMsg:
|
|
17
21
|
return handleTryUpdateChainMsg(service)(env, msg as TryUpdateChainMsg);
|
|
22
|
+
case SetChainEndpointsMsg:
|
|
23
|
+
return handleSetChainEndpointsMsg(service)(
|
|
24
|
+
env,
|
|
25
|
+
msg as SetChainEndpointsMsg
|
|
26
|
+
);
|
|
27
|
+
case ResetChainEndpointsMsg:
|
|
28
|
+
return handleResetChainEndpointsMsg(service)(
|
|
29
|
+
env,
|
|
30
|
+
msg as ResetChainEndpointsMsg
|
|
31
|
+
);
|
|
18
32
|
default:
|
|
19
33
|
throw new KeplrError("updater", 110, "Unknown msg type");
|
|
20
34
|
}
|
|
@@ -28,3 +42,19 @@ const handleTryUpdateChainMsg: (
|
|
|
28
42
|
await service.tryUpdateChain(msg.chainId);
|
|
29
43
|
};
|
|
30
44
|
};
|
|
45
|
+
|
|
46
|
+
const handleSetChainEndpointsMsg: (
|
|
47
|
+
service: ChainUpdaterService
|
|
48
|
+
) => InternalHandler<SetChainEndpointsMsg> = (service) => {
|
|
49
|
+
return async (_, msg) => {
|
|
50
|
+
return await service.setChainEndpoints(msg.chainId, msg.rpc, msg.rest);
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const handleResetChainEndpointsMsg: (
|
|
55
|
+
service: ChainUpdaterService
|
|
56
|
+
) => InternalHandler<ResetChainEndpointsMsg> = (service) => {
|
|
57
|
+
return async (_, msg) => {
|
|
58
|
+
return await service.resetChainEndpoints(msg.chainId);
|
|
59
|
+
};
|
|
60
|
+
};
|
package/src/updater/init.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { Router } from "@keplr-wallet/router";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
ResetChainEndpointsMsg,
|
|
4
|
+
SetChainEndpointsMsg,
|
|
5
|
+
TryUpdateChainMsg,
|
|
6
|
+
} from "./messages";
|
|
3
7
|
import { ROUTE } from "./constants";
|
|
4
8
|
import { getHandler } from "./handler";
|
|
5
9
|
import { ChainUpdaterService } from "./service";
|
|
6
10
|
|
|
7
11
|
export function init(router: Router, service: ChainUpdaterService): void {
|
|
8
12
|
router.registerMessage(TryUpdateChainMsg);
|
|
13
|
+
router.registerMessage(SetChainEndpointsMsg);
|
|
14
|
+
router.registerMessage(ResetChainEndpointsMsg);
|
|
9
15
|
|
|
10
16
|
router.addHandler(ROUTE, getHandler(service));
|
|
11
17
|
}
|
package/src/updater/messages.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { KeplrError, Message } from "@keplr-wallet/router";
|
|
2
2
|
import { ROUTE } from "./constants";
|
|
3
|
+
import { ChainInfoWithEmbed } from "../chains";
|
|
3
4
|
|
|
4
5
|
export class TryUpdateChainMsg extends Message<void> {
|
|
5
6
|
public static type() {
|
|
@@ -24,3 +25,70 @@ export class TryUpdateChainMsg extends Message<void> {
|
|
|
24
25
|
return TryUpdateChainMsg.type();
|
|
25
26
|
}
|
|
26
27
|
}
|
|
28
|
+
|
|
29
|
+
export class SetChainEndpointsMsg extends Message<ChainInfoWithEmbed[]> {
|
|
30
|
+
public static type() {
|
|
31
|
+
return "set-chain-endpoints";
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
constructor(
|
|
35
|
+
public readonly chainId: string,
|
|
36
|
+
public readonly rpc: string | undefined,
|
|
37
|
+
public readonly rest: string | undefined
|
|
38
|
+
) {
|
|
39
|
+
super();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
validateBasic(): void {
|
|
43
|
+
if (!this.chainId) {
|
|
44
|
+
throw new KeplrError("updater", 100, "Empty chain id");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (this.rpc) {
|
|
48
|
+
// Make sure that rpc is valid url form
|
|
49
|
+
const url = new URL(this.rpc);
|
|
50
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
51
|
+
throw new Error(`RPC has invalid protocol: ${url.protocol}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (this.rest) {
|
|
55
|
+
// Make sure that rest is valid url form
|
|
56
|
+
const url = new URL(this.rest);
|
|
57
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
58
|
+
throw new Error(`LCD has invalid protocol: ${url.protocol}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
route(): string {
|
|
64
|
+
return ROUTE;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
type(): string {
|
|
68
|
+
return SetChainEndpointsMsg.type();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export class ResetChainEndpointsMsg extends Message<ChainInfoWithEmbed[]> {
|
|
73
|
+
public static type() {
|
|
74
|
+
return "reset-chain-endpoints";
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
constructor(public readonly chainId: string) {
|
|
78
|
+
super();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
validateBasic(): void {
|
|
82
|
+
if (!this.chainId) {
|
|
83
|
+
throw new KeplrError("updater", 100, "Empty chain id");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
route(): string {
|
|
88
|
+
return ROUTE;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
type(): string {
|
|
92
|
+
return ResetChainEndpointsMsg.type();
|
|
93
|
+
}
|
|
94
|
+
}
|
package/src/updater/service.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { ChainInfo } from "@keplr-wallet/types";
|
|
2
|
-
import Axios from "axios";
|
|
2
|
+
import Axios, { AxiosResponse } from "axios";
|
|
3
3
|
import { KVStore } from "@keplr-wallet/common";
|
|
4
4
|
import { ChainIdHelper } from "@keplr-wallet/cosmos";
|
|
5
|
-
import { ChainsService } from "../chains";
|
|
5
|
+
import { ChainInfoWithEmbed, ChainsService } from "../chains";
|
|
6
|
+
import { Mutable } from "utility-types";
|
|
7
|
+
import { KeplrError } from "@keplr-wallet/router";
|
|
6
8
|
|
|
7
9
|
export class ChainUpdaterService {
|
|
8
10
|
protected chainsService!: ChainsService;
|
|
@@ -41,6 +43,8 @@ export class ChainUpdaterService {
|
|
|
41
43
|
...chainInfo,
|
|
42
44
|
...{
|
|
43
45
|
chainId: updatedProperty.chainId || chainInfo.chainId,
|
|
46
|
+
rpc: updatedProperty.rpc || chainInfo.rpc,
|
|
47
|
+
rest: updatedProperty.rest || chainInfo.rest,
|
|
44
48
|
features,
|
|
45
49
|
},
|
|
46
50
|
};
|
|
@@ -163,7 +167,7 @@ export class ChainUpdaterService {
|
|
|
163
167
|
const result = await instance.get<{
|
|
164
168
|
result: {
|
|
165
169
|
node_info: {
|
|
166
|
-
network:
|
|
170
|
+
network: string;
|
|
167
171
|
};
|
|
168
172
|
};
|
|
169
173
|
}>("/status");
|
|
@@ -275,4 +279,171 @@ export class ChainUpdaterService {
|
|
|
275
279
|
features,
|
|
276
280
|
};
|
|
277
281
|
}
|
|
282
|
+
|
|
283
|
+
// XXX: It is not conceptually valid that the function to set the rpc/rest endpoint of the chain exists in this service.
|
|
284
|
+
// However, in order to focus on adding feature rather than making a big change, the refactor is postponed later and the configuration of the rpc/rest endpoint is handled here.
|
|
285
|
+
|
|
286
|
+
public async setChainEndpoints(
|
|
287
|
+
chainId: string,
|
|
288
|
+
rpc: string | undefined,
|
|
289
|
+
rest: string | undefined
|
|
290
|
+
): Promise<ChainInfoWithEmbed[]> {
|
|
291
|
+
const chainInfo: Mutable<Partial<ChainInfo>> = {};
|
|
292
|
+
|
|
293
|
+
// `saveChainProperty` method merges chain info using spread operator.
|
|
294
|
+
// That is, if the field is undefined, the field is finally saved as undefined and the field is treated as if it were deleted.
|
|
295
|
+
// To avoid this problem, the field must not exist. The implementation of the below is critical to its operation.
|
|
296
|
+
if (rpc) {
|
|
297
|
+
chainInfo.rpc = rpc;
|
|
298
|
+
}
|
|
299
|
+
if (rest) {
|
|
300
|
+
chainInfo.rest = rest;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const version = ChainIdHelper.parse(chainId);
|
|
304
|
+
|
|
305
|
+
await this.saveChainProperty(version.identifier, chainInfo);
|
|
306
|
+
|
|
307
|
+
return await this.chainsService.getChainInfos();
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
public async resetChainEndpoints(
|
|
311
|
+
chainId: string
|
|
312
|
+
): Promise<ChainInfoWithEmbed[]> {
|
|
313
|
+
const version = ChainIdHelper.parse(chainId);
|
|
314
|
+
|
|
315
|
+
// `saveChainProperty` method merges chain info using spread operator.
|
|
316
|
+
// That is, if the field is undefined, the field is finally saved as undefined and the field is treated as if it were deleted.
|
|
317
|
+
await this.saveChainProperty(version.identifier, {
|
|
318
|
+
rpc: undefined,
|
|
319
|
+
rest: undefined,
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
return await this.chainsService.getChainInfos();
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
public static async checkEndpointsConnectivity(
|
|
326
|
+
chainId: string,
|
|
327
|
+
rpc: string,
|
|
328
|
+
rest: string,
|
|
329
|
+
wsObject?: new (url: string, protocols?: string | string[]) => WebSocket
|
|
330
|
+
): Promise<void> {
|
|
331
|
+
const rpcInstance = Axios.create({
|
|
332
|
+
baseURL: rpc,
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
let resultStatus: AxiosResponse<{
|
|
336
|
+
result: {
|
|
337
|
+
node_info: {
|
|
338
|
+
network: string;
|
|
339
|
+
};
|
|
340
|
+
};
|
|
341
|
+
}>;
|
|
342
|
+
|
|
343
|
+
try {
|
|
344
|
+
// Get the status to get the chain id.
|
|
345
|
+
resultStatus = await rpcInstance.get<{
|
|
346
|
+
result: {
|
|
347
|
+
node_info: {
|
|
348
|
+
network: string;
|
|
349
|
+
};
|
|
350
|
+
};
|
|
351
|
+
}>("/status");
|
|
352
|
+
} catch (e) {
|
|
353
|
+
console.log(e);
|
|
354
|
+
throw new Error("Failed to get response /status from rpc endpoint");
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const version = ChainIdHelper.parse(chainId);
|
|
358
|
+
|
|
359
|
+
const versionFromRPCStatus = ChainIdHelper.parse(
|
|
360
|
+
resultStatus.data.result.node_info.network
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
if (versionFromRPCStatus.identifier !== version.identifier) {
|
|
364
|
+
throw new KeplrError(
|
|
365
|
+
"updater",
|
|
366
|
+
8001,
|
|
367
|
+
`RPC endpoint has different chain id (expected: ${chainId}, actual: ${resultStatus.data.result.node_info.network})`
|
|
368
|
+
);
|
|
369
|
+
} else if (versionFromRPCStatus.version !== version.version) {
|
|
370
|
+
// In the form of {chain_identifier}-{chain_version}, if the identifier is the same but the version is different, it is strictly an error,
|
|
371
|
+
// but it is actually the same chain but the chain version of the node is different.
|
|
372
|
+
// In this case, it is possible to treat as a warning and proceed as it is, so this is separated with above error.
|
|
373
|
+
throw new KeplrError(
|
|
374
|
+
"updater",
|
|
375
|
+
8002,
|
|
376
|
+
`RPC endpoint has different chain id (expected: ${chainId}, actual: ${resultStatus.data.result.node_info.network})`
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
let wsURL = rpc;
|
|
381
|
+
if (wsURL.startsWith("http")) {
|
|
382
|
+
wsURL = wsURL.replace("http", "ws");
|
|
383
|
+
}
|
|
384
|
+
wsURL = wsURL.endsWith("/") ? wsURL + "websocket" : wsURL + "/websocket";
|
|
385
|
+
|
|
386
|
+
const wsInstance = wsObject ? new wsObject(wsURL) : new WebSocket(wsURL);
|
|
387
|
+
|
|
388
|
+
// Try 15 times at 1 second intervals to test websocket connectivity.
|
|
389
|
+
for (let i = 0; i < 15; i++) {
|
|
390
|
+
// If ws state is not "connecting"
|
|
391
|
+
if (wsInstance.readyState !== 0) {
|
|
392
|
+
// If ws state is "open", it means that app can connect ws to /websocket rpc
|
|
393
|
+
if (wsInstance.readyState === 1) {
|
|
394
|
+
break;
|
|
395
|
+
} else {
|
|
396
|
+
// else, handle that as error.
|
|
397
|
+
throw new Error("Failed to connect websocket to /websocket rpc");
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const restInstance = Axios.create({
|
|
405
|
+
baseURL: rest,
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
let resultLCDNodeInfo: AxiosResponse<{
|
|
409
|
+
default_node_info: {
|
|
410
|
+
network: string;
|
|
411
|
+
};
|
|
412
|
+
}>;
|
|
413
|
+
|
|
414
|
+
try {
|
|
415
|
+
// Get the node info to get the chain id.
|
|
416
|
+
resultLCDNodeInfo = await restInstance.get<{
|
|
417
|
+
default_node_info: {
|
|
418
|
+
network: string;
|
|
419
|
+
};
|
|
420
|
+
}>("/cosmos/base/tendermint/v1beta1/node_info");
|
|
421
|
+
} catch (e) {
|
|
422
|
+
console.log(e);
|
|
423
|
+
throw new Error(
|
|
424
|
+
"Failed to get response /cosmos/base/tendermint/v1beta1/node_info from lcd endpoint"
|
|
425
|
+
);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
const versionFromLCDNodeInfo = ChainIdHelper.parse(
|
|
429
|
+
resultLCDNodeInfo.data.default_node_info.network
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
if (versionFromLCDNodeInfo.identifier !== version.identifier) {
|
|
433
|
+
throw new KeplrError(
|
|
434
|
+
"updater",
|
|
435
|
+
8101,
|
|
436
|
+
`LCD endpoint has different chain id (expected: ${chainId}, actual: ${resultStatus.data.result.node_info.network})`
|
|
437
|
+
);
|
|
438
|
+
} else if (versionFromLCDNodeInfo.version !== version.version) {
|
|
439
|
+
// In the form of {chain_identifier}-{chain_version}, if the identifier is the same but the version is different, it is strictly an error,
|
|
440
|
+
// but it is actually the same chain but the chain version of the node is different.
|
|
441
|
+
// In this case, it is possible to treat as a warning and proceed as it is, so this is separated with above error.
|
|
442
|
+
throw new KeplrError(
|
|
443
|
+
"updater",
|
|
444
|
+
8102,
|
|
445
|
+
`LCD endpoint has different chain id (expected: ${chainId}, actual: ${resultStatus.data.result.node_info.network})`
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
278
449
|
}
|