@keplr-wallet/stores 0.12.32 → 0.12.33

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/build/index.d.ts CHANGED
@@ -4,3 +4,4 @@ export * from "./price";
4
4
  export * from "./query";
5
5
  export * from "./chain";
6
6
  export * from "./ibc";
7
+ export * from "./lsm";
package/build/index.js CHANGED
@@ -20,4 +20,5 @@ __exportStar(require("./price"), exports);
20
20
  __exportStar(require("./query"), exports);
21
21
  __exportStar(require("./chain"), exports);
22
22
  __exportStar(require("./ibc"), exports);
23
+ __exportStar(require("./lsm"), exports);
23
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,2CAAyB;AACzB,0CAAwB;AACxB,0CAAwB;AACxB,0CAAwB;AACxB,wCAAsB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,2CAAyB;AACzB,0CAAwB;AACxB,0CAAwB;AACxB,0CAAwB;AACxB,wCAAsB;AACtB,wCAAsB"}
@@ -0,0 +1,26 @@
1
+ import { AppCurrency } from "@keplr-wallet/types";
2
+ import { ChainStore } from "../chain";
3
+ import { CosmosQueries, IQueriesStore } from "../query";
4
+ import { KVStore } from "@keplr-wallet/common";
5
+ type LSMDenomCacheData = {
6
+ moniker: string | undefined;
7
+ thumbnail: string | undefined;
8
+ timestamp: number;
9
+ };
10
+ export declare class LSMCurrencyRegistrar {
11
+ protected readonly kvStore: KVStore;
12
+ protected readonly cacheDuration: number;
13
+ protected readonly chainStore: ChainStore;
14
+ protected readonly queriesStore: IQueriesStore<CosmosQueries>;
15
+ protected lsmDenomCacheData: Map<string, LSMDenomCacheData>;
16
+ isInitialized: boolean;
17
+ constructor(kvStore: KVStore, cacheDuration: number, // 1 days
18
+ chainStore: ChainStore, queriesStore: IQueriesStore<CosmosQueries>);
19
+ protected init(): Promise<void>;
20
+ protected saveCacheWithoutReaction(chainId: string, coinMinimalDenom: string, data: LSMDenomCacheData): Promise<void>;
21
+ protected lsmCurrencyRegistrar(chainId: string, coinMinimalDenom: string): {
22
+ value: AppCurrency | undefined;
23
+ done: boolean;
24
+ } | undefined;
25
+ }
26
+ export {};
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
+ return new (P || (P = Promise))(function (resolve, reject) {
11
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15
+ });
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.LSMCurrencyRegistrar = void 0;
19
+ const mobx_1 = require("mobx");
20
+ const common_1 = require("@keplr-wallet/common");
21
+ const cosmos_1 = require("@keplr-wallet/cosmos");
22
+ const types_1 = require("../query/cosmos/staking/types");
23
+ class LSMCurrencyRegistrar {
24
+ constructor(kvStore, cacheDuration = 24 * 3600 * 1000, // 1 days
25
+ chainStore, queriesStore) {
26
+ this.kvStore = kvStore;
27
+ this.cacheDuration = cacheDuration;
28
+ this.chainStore = chainStore;
29
+ this.queriesStore = queriesStore;
30
+ this.lsmDenomCacheData = new Map();
31
+ this.isInitialized = false;
32
+ this.chainStore.registerCurrencyRegistrar(this.lsmCurrencyRegistrar.bind(this));
33
+ (0, mobx_1.makeObservable)(this);
34
+ this.init();
35
+ }
36
+ init() {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ const key = `cache-lsm-denom-data`;
39
+ const saved = yield this.kvStore.get(key);
40
+ if (saved) {
41
+ (0, mobx_1.runInAction)(() => {
42
+ for (const [key, value] of Object.entries(saved)) {
43
+ if (Date.now() - value.timestamp < this.cacheDuration) {
44
+ this.lsmDenomCacheData.set(key, value);
45
+ }
46
+ }
47
+ });
48
+ }
49
+ (0, mobx_1.autorun)(() => {
50
+ const js = (0, mobx_1.toJS)(this.lsmDenomCacheData);
51
+ const obj = Object.fromEntries(js);
52
+ this.kvStore.set(key, obj);
53
+ });
54
+ (0, mobx_1.runInAction)(() => {
55
+ this.isInitialized = true;
56
+ });
57
+ });
58
+ }
59
+ saveCacheWithoutReaction(chainId, coinMinimalDenom, data) {
60
+ return __awaiter(this, void 0, void 0, function* () {
61
+ const key = `cache-lsm-denom-data`;
62
+ const js = (0, mobx_1.toJS)(this.lsmDenomCacheData);
63
+ js.set(`${cosmos_1.ChainIdHelper.parse(chainId).identifier}/${coinMinimalDenom}`, data);
64
+ const obj = Object.fromEntries(js);
65
+ this.kvStore.set(key, obj);
66
+ });
67
+ }
68
+ lsmCurrencyRegistrar(chainId, coinMinimalDenom) {
69
+ if (!this.chainStore.hasChain(chainId)) {
70
+ return;
71
+ }
72
+ const denomHelper = new common_1.DenomHelper(coinMinimalDenom);
73
+ if (denomHelper.type !== "native") {
74
+ return;
75
+ }
76
+ const chainInfo = this.chainStore.getChain(chainId);
77
+ if (!chainInfo.stakeCurrency) {
78
+ return;
79
+ }
80
+ if (!coinMinimalDenom.startsWith(chainInfo.bech32Config.bech32PrefixValAddr)) {
81
+ return;
82
+ }
83
+ const i = coinMinimalDenom.indexOf("/");
84
+ if (i < 0) {
85
+ return;
86
+ }
87
+ const valAddress = coinMinimalDenom.slice(0, i);
88
+ try {
89
+ cosmos_1.Bech32Address.validate(valAddress, chainInfo.bech32Config.bech32PrefixValAddr);
90
+ }
91
+ catch (_a) {
92
+ // noop
93
+ return;
94
+ }
95
+ const id = parseInt(coinMinimalDenom.slice(i + 1));
96
+ if (id.toString() !== coinMinimalDenom.slice(i + 1)) {
97
+ return;
98
+ }
99
+ const queries = this.queriesStore.get(chainId);
100
+ const validator = (() => {
101
+ const cache = this.lsmDenomCacheData.get(`${cosmos_1.ChainIdHelper.parse(chainId).identifier}/${coinMinimalDenom}`);
102
+ if (cache && Date.now() - cache.timestamp < this.cacheDuration) {
103
+ return {
104
+ moniker: cache.moniker,
105
+ thumbnail: cache.thumbnail,
106
+ isFetching: false,
107
+ };
108
+ }
109
+ const q = [
110
+ queries.cosmos.queryValidators.getQueryStatus(types_1.BondStatus.Bonded),
111
+ queries.cosmos.queryValidators.getQueryStatus(types_1.BondStatus.Unbonded),
112
+ queries.cosmos.queryValidators.getQueryStatus(types_1.BondStatus.Unbonding),
113
+ ];
114
+ for (const query of q) {
115
+ const val = query.getValidator(valAddress);
116
+ const thumbnail = query.getQueryValidatorThumbnail(valAddress);
117
+ if (val) {
118
+ return {
119
+ moniker: val.description.moniker,
120
+ // query에서는 thumbnail이 없으면 빈 문자열이 반환되는데, 밑의 로직에서는 없을 경우 명시적으로 undefined 여야 함.
121
+ thumbnail: thumbnail && thumbnail.thumbnail
122
+ ? thumbnail.thumbnail
123
+ : undefined,
124
+ isFetching: query.isFetching || (thumbnail ? thumbnail.isFetching : false),
125
+ };
126
+ }
127
+ if (query.isFetching) {
128
+ return;
129
+ }
130
+ }
131
+ })();
132
+ if (!validator) {
133
+ return {
134
+ value: undefined,
135
+ done: false,
136
+ };
137
+ }
138
+ if (!validator.isFetching) {
139
+ this.saveCacheWithoutReaction(chainId, coinMinimalDenom, {
140
+ moniker: validator.moniker,
141
+ thumbnail: validator.thumbnail,
142
+ timestamp: Date.now(),
143
+ });
144
+ }
145
+ return {
146
+ value: {
147
+ coinMinimalDenom,
148
+ coinDenom: `${(() => {
149
+ if (validator.moniker) {
150
+ let moniker = validator.moniker;
151
+ if (moniker.length >= 10) {
152
+ moniker = moniker.slice(0, 7) + "...";
153
+ }
154
+ return moniker;
155
+ }
156
+ return "Unknown";
157
+ })()}/${id}`,
158
+ coinDecimals: chainInfo.stakeCurrency.coinDecimals,
159
+ coinImageUrl: validator.thumbnail || undefined,
160
+ },
161
+ done: !validator.isFetching,
162
+ };
163
+ }
164
+ }
165
+ __decorate([
166
+ mobx_1.observable.shallow
167
+ ], LSMCurrencyRegistrar.prototype, "lsmDenomCacheData", void 0);
168
+ __decorate([
169
+ mobx_1.observable
170
+ ], LSMCurrencyRegistrar.prototype, "isInitialized", void 0);
171
+ exports.LSMCurrencyRegistrar = LSMCurrencyRegistrar;
172
+ //# sourceMappingURL=currency-registrar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency-registrar.js","sourceRoot":"","sources":["../../src/lsm/currency-registrar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from "./currency-registrar";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./currency-registrar"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lsm/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC"}
@@ -48,6 +48,7 @@ export declare class ObservableQueryValidatorsInner extends ObservableChainQuery
48
48
  readonly getValidator: (validatorAddress: string) => Validator | undefined;
49
49
  get validatorsSortedByVotingPower(): Validator[];
50
50
  readonly getValidatorThumbnail: (operatorAddress: string) => string;
51
+ readonly getQueryValidatorThumbnail: (operatorAddress: string) => ObservableQueryValidatorThumbnail | undefined;
51
52
  /**
52
53
  * Return the validator's voting power as human friendly (considering the coin decimals).
53
54
  */
@@ -91,13 +91,20 @@ class ObservableQueryValidatorsInner extends chain_query_1.ObservableChainQuery
91
91
  return validators.find((val) => val.operator_address === validatorAddress);
92
92
  });
93
93
  this.getValidatorThumbnail = (0, mobx_utils_1.computedFn)((operatorAddress) => {
94
+ const query = this.getQueryValidatorThumbnail(operatorAddress);
95
+ if (!query) {
96
+ return "";
97
+ }
98
+ return query.thumbnail;
99
+ });
100
+ this.getQueryValidatorThumbnail = (0, mobx_utils_1.computedFn)((operatorAddress) => {
94
101
  const validators = this.validators;
95
102
  const validator = validators.find((val) => val.operator_address === operatorAddress);
96
103
  if (!validator) {
97
- return "";
104
+ return;
98
105
  }
99
106
  if (!validator.description.identity) {
100
- return "";
107
+ return;
101
108
  }
102
109
  const identity = validator.description.identity;
103
110
  if (!this.thumbnailMap.has(identity)) {
@@ -106,7 +113,7 @@ class ObservableQueryValidatorsInner extends chain_query_1.ObservableChainQuery
106
113
  });
107
114
  }
108
115
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
109
- return this.thumbnailMap.get(identity).thumbnail;
116
+ return this.thumbnailMap.get(identity);
110
117
  });
111
118
  /**
112
119
  * Return the validator's voting power as human friendly (considering the coin decimals).
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../../src/query/cosmos/staking/validators.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,mDAG2B;AAC3B,mCAA4D;AAE5D,+BAAyE;AACzE,4CAAsE;AACtE,sDAA6B;AAC7B,6CAAqD;AACrD,2CAAwC;AAmBxC;;GAEG;AACH,MAAa,iCAAkC,SAAQ,wBAA8B;IAYnF,YAAY,aAAiC,EAAE,SAAoB;QACjE,KAAK,CACH,aAAa,EACb,qBAAqB,EACrB,yDAAyD,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,CAC1F,CAAC;QACF,IAAA,qBAAc,EAAC,IAAI,CAAC,CAAC;QAErB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEkB,QAAQ;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,KAAK,EAAE,CAAC;IACpD,CAAC;IAEwB,aAAa,CACpC,eAAgC;;;;;YAEhC,OAAO,MAAM,iCAAiC,CAAC,sBAAsB,CAAC,GAAG,CACvE,GAAG,EAAE;gBACH,OAAO,OAAM,aAAa,YAAC,eAAe,EAAE;YAC9C,CAAC,CACF,CAAC;QACJ,CAAC;KAAA;IAGD,IAAI,SAAS;;QACX,IAAI,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,IAAI,CAAC,MAAM,CAAC,IAAI,MAAK,CAAC,EAAE;YACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjE,OAAO,MAAA,MAAA,MAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,0CAAE,OAAO,0CAAE,GAAG,mCAAI,EAAE,CAAC;aAChE;SACF;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;;AA7CD;;;;GAIG;AACc,wDAAsB,GAAW,IAAI,iBAAM,CAAC;IAC3D,WAAW,EAAE,CAAC;CACf,CAAC,CAAC;AA8BH;IADC,eAAQ;kEASR;AA9CH,8EA+CC;AAED,MAAa,8BAA+B,SAAQ,kCAAgC;IAKlF,YACE,aAAiC,EACjC,OAAe,EACf,WAAwB,EACL,MAAkB;QAErC,KAAK,CACH,aAAa,EACb,OAAO,EACP,WAAW,EACX,mEAAmE,CAAC,GAAG,EAAE;YACvE,QAAQ,MAAM,EAAE;gBACd,KAAK,kBAAU,CAAC,MAAM;oBACpB,OAAO,oBAAoB,CAAC;gBAC9B,KAAK,kBAAU,CAAC,QAAQ;oBACtB,OAAO,sBAAsB,CAAC;gBAChC,KAAK,kBAAU,CAAC,SAAS;oBACvB,OAAO,uBAAuB,CAAC;gBACjC;oBACE,OAAO,yBAAyB,CAAC;aACpC;QACH,CAAC,CAAC,EAAE,EAAE,CACP,CAAC;QAlBiB,WAAM,GAAN,MAAM,CAAY;QAP7B,iBAAY,GACpB,IAAI,GAAG,EAAE,CAAC;QA4CH,iBAAY,GAAG,IAAA,uBAAU,EAChC,CAAC,gBAAwB,EAAyB,EAAE;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAEnC,OAAO,UAAU,CAAC,IAAI,CACpB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,gBAAgB,KAAK,gBAAgB,CACnD,CAAC;QACJ,CAAC,CACF,CAAC;QAUO,0BAAqB,GAAG,IAAA,uBAAU,EACzC,CAAC,eAAuB,EAAU,EAAE;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACnC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAC/B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,gBAAgB,KAAK,eAAe,CAClD,CAAC;YACF,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO,EAAE,CAAC;aACX;YAED,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE;gBACnC,OAAO,EAAE,CAAC;aACX;YAED,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC;YAEhD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBACpC,IAAA,kBAAW,EAAC,GAAG,EAAE;oBACf,IAAI,CAAC,YAAY,CAAC,GAAG,CACnB,QAAQ,EACR,IAAI,iCAAiC,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CACrE,CAAC;gBACJ,CAAC,CAAC,CAAC;aACJ;YAED,oEAAoE;YACpE,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,SAAS,CAAC;QACpD,CAAC,CACF,CAAC;QAEF;;WAEG;QACM,sBAAiB,GAAG,IAAA,uBAAU,EACrC,CAAC,eAAuB,EAA0B,EAAE;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACnC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAC/B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,gBAAgB,KAAK,eAAe,CAClD,CAAC;YACF,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO;aACR;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC;YAE9C,IAAI,CAAC,aAAa,EAAE;gBAClB,OAAO;aACR;YAED,MAAM,KAAK,GAAG,IAAI,UAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;YAEnD,OAAO,IAAI,iBAAU,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC,CACF,CAAC;QA3FA,IAAA,qBAAc,EAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAEkB,QAAQ;QACzB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE;YAC1D,OAAO,KAAK,CAAC;SACd;QACD,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAGD,IAAI,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,OAAO,EAAE,CAAC;SACX;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;IACvC,CAAC;IAaD,IAAI,6BAA6B;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;YAChC,OAAO,IAAI,UAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,UAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;CAyDF;AAtHC;IADC,iBAAU,CAAC,OAAO;oEAEP;AAoCZ;IADC,eAAQ;gEAOR;AAaD;IADC,eAAQ;mFAMR;AA/DH,wEAwHC;AAED,MAAa,yBAA0B,SAAQ,qCAAmC;IAChF,YACE,aAAiC,EACjC,OAAe,EACf,WAAwB;QAExB,KAAK,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,MAAc,EAAE,EAAE;YAC5D,OAAO,IAAI,8BAA8B,CACvC,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,WAAW,EAChB,MAAoB,CACrB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CACZ,SAAqB,kBAAU,CAAC,MAAM;QAEtC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAmC,CAAC;IAC5D,CAAC;CACF;AArBD,8DAqBC"}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../../src/query/cosmos/staking/validators.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keplr-wallet/stores",
3
- "version": "0.12.32",
3
+ "version": "0.12.33",
4
4
  "main": "build/index.js",
5
5
  "author": "chainapsis",
6
6
  "license": "Apache-2.0",
@@ -16,16 +16,16 @@
16
16
  "lint-fix": "eslint --fix \"src/**/*\" && prettier --write \"src/**/*\""
17
17
  },
18
18
  "devDependencies": {
19
- "@keplr-wallet/provider-mock": "0.12.32"
19
+ "@keplr-wallet/provider-mock": "0.12.33"
20
20
  },
21
21
  "dependencies": {
22
- "@keplr-wallet/common": "0.12.32",
23
- "@keplr-wallet/cosmos": "0.12.32",
24
- "@keplr-wallet/crypto": "0.12.32",
25
- "@keplr-wallet/proto-types": "0.12.32",
26
- "@keplr-wallet/simple-fetch": "0.12.32",
27
- "@keplr-wallet/types": "0.12.32",
28
- "@keplr-wallet/unit": "0.12.32",
22
+ "@keplr-wallet/common": "0.12.33",
23
+ "@keplr-wallet/cosmos": "0.12.33",
24
+ "@keplr-wallet/crypto": "0.12.33",
25
+ "@keplr-wallet/proto-types": "0.12.33",
26
+ "@keplr-wallet/simple-fetch": "0.12.33",
27
+ "@keplr-wallet/types": "0.12.33",
28
+ "@keplr-wallet/unit": "0.12.33",
29
29
  "buffer": "^6.0.3",
30
30
  "deepmerge": "^4.2.2",
31
31
  "eventemitter3": "^4.0.7",
@@ -35,5 +35,5 @@
35
35
  "p-queue": "^6.6.2",
36
36
  "utility-types": "^3.10.0"
37
37
  },
38
- "gitHead": "24492432d7e81e12c0dbc15fbfda020d802e8c82"
38
+ "gitHead": "726440d5b8381f6d9dfd235d410a9e53f65df95e"
39
39
  }
package/src/index.ts CHANGED
@@ -4,3 +4,4 @@ export * from "./price";
4
4
  export * from "./query";
5
5
  export * from "./chain";
6
6
  export * from "./ibc";
7
+ export * from "./lsm";
@@ -0,0 +1,211 @@
1
+ import { autorun, makeObservable, observable, runInAction, toJS } from "mobx";
2
+ import { AppCurrency } from "@keplr-wallet/types";
3
+ import { ChainStore } from "../chain";
4
+ import { CosmosQueries, IQueriesStore } from "../query";
5
+ import { DenomHelper, KVStore } from "@keplr-wallet/common";
6
+ import { Bech32Address, ChainIdHelper } from "@keplr-wallet/cosmos";
7
+ import { BondStatus } from "../query/cosmos/staking/types";
8
+
9
+ type LSMDenomCacheData = {
10
+ moniker: string | undefined;
11
+ thumbnail: string | undefined;
12
+ timestamp: number;
13
+ };
14
+
15
+ export class LSMCurrencyRegistrar {
16
+ @observable.shallow
17
+ protected lsmDenomCacheData: Map<string, LSMDenomCacheData> = new Map();
18
+
19
+ @observable
20
+ public isInitialized = false;
21
+
22
+ constructor(
23
+ protected readonly kvStore: KVStore,
24
+ protected readonly cacheDuration: number = 24 * 3600 * 1000, // 1 days
25
+ protected readonly chainStore: ChainStore,
26
+ protected readonly queriesStore: IQueriesStore<CosmosQueries>
27
+ ) {
28
+ this.chainStore.registerCurrencyRegistrar(
29
+ this.lsmCurrencyRegistrar.bind(this)
30
+ );
31
+
32
+ makeObservable(this);
33
+
34
+ this.init();
35
+ }
36
+
37
+ protected async init() {
38
+ const key = `cache-lsm-denom-data`;
39
+ const saved = await this.kvStore.get<Record<string, LSMDenomCacheData>>(
40
+ key
41
+ );
42
+ if (saved) {
43
+ runInAction(() => {
44
+ for (const [key, value] of Object.entries(saved)) {
45
+ if (Date.now() - value.timestamp < this.cacheDuration) {
46
+ this.lsmDenomCacheData.set(key, value);
47
+ }
48
+ }
49
+ });
50
+ }
51
+
52
+ autorun(() => {
53
+ const js = toJS(this.lsmDenomCacheData);
54
+ const obj = Object.fromEntries(js);
55
+ this.kvStore.set<Record<string, LSMDenomCacheData>>(key, obj);
56
+ });
57
+
58
+ runInAction(() => {
59
+ this.isInitialized = true;
60
+ });
61
+ }
62
+
63
+ protected async saveCacheWithoutReaction(
64
+ chainId: string,
65
+ coinMinimalDenom: string,
66
+ data: LSMDenomCacheData
67
+ ) {
68
+ const key = `cache-lsm-denom-data`;
69
+ const js = toJS(this.lsmDenomCacheData);
70
+ js.set(
71
+ `${ChainIdHelper.parse(chainId).identifier}/${coinMinimalDenom}`,
72
+ data
73
+ );
74
+ const obj = Object.fromEntries(js);
75
+ this.kvStore.set<Record<string, LSMDenomCacheData>>(key, obj);
76
+ }
77
+
78
+ protected lsmCurrencyRegistrar(
79
+ chainId: string,
80
+ coinMinimalDenom: string
81
+ ):
82
+ | {
83
+ value: AppCurrency | undefined;
84
+ done: boolean;
85
+ }
86
+ | undefined {
87
+ if (!this.chainStore.hasChain(chainId)) {
88
+ return;
89
+ }
90
+
91
+ const denomHelper = new DenomHelper(coinMinimalDenom);
92
+ if (denomHelper.type !== "native") {
93
+ return;
94
+ }
95
+
96
+ const chainInfo = this.chainStore.getChain(chainId);
97
+ if (!chainInfo.stakeCurrency) {
98
+ return;
99
+ }
100
+
101
+ if (
102
+ !coinMinimalDenom.startsWith(chainInfo.bech32Config.bech32PrefixValAddr)
103
+ ) {
104
+ return;
105
+ }
106
+
107
+ const i = coinMinimalDenom.indexOf("/");
108
+ if (i < 0) {
109
+ return;
110
+ }
111
+
112
+ const valAddress = coinMinimalDenom.slice(0, i);
113
+ try {
114
+ Bech32Address.validate(
115
+ valAddress,
116
+ chainInfo.bech32Config.bech32PrefixValAddr
117
+ );
118
+ } catch {
119
+ // noop
120
+ return;
121
+ }
122
+ const id = parseInt(coinMinimalDenom.slice(i + 1));
123
+ if (id.toString() !== coinMinimalDenom.slice(i + 1)) {
124
+ return;
125
+ }
126
+
127
+ const queries = this.queriesStore.get(chainId);
128
+
129
+ const validator:
130
+ | {
131
+ moniker: string | undefined;
132
+ thumbnail: string | undefined;
133
+ isFetching: boolean;
134
+ }
135
+ | undefined = (() => {
136
+ const cache = this.lsmDenomCacheData.get(
137
+ `${ChainIdHelper.parse(chainId).identifier}/${coinMinimalDenom}`
138
+ );
139
+
140
+ if (cache && Date.now() - cache.timestamp < this.cacheDuration) {
141
+ return {
142
+ moniker: cache.moniker,
143
+ thumbnail: cache.thumbnail,
144
+ isFetching: false,
145
+ };
146
+ }
147
+
148
+ const q = [
149
+ queries.cosmos.queryValidators.getQueryStatus(BondStatus.Bonded),
150
+ queries.cosmos.queryValidators.getQueryStatus(BondStatus.Unbonded),
151
+ queries.cosmos.queryValidators.getQueryStatus(BondStatus.Unbonding),
152
+ ];
153
+
154
+ for (const query of q) {
155
+ const val = query.getValidator(valAddress);
156
+ const thumbnail = query.getQueryValidatorThumbnail(valAddress);
157
+ if (val) {
158
+ return {
159
+ moniker: val.description.moniker,
160
+ // query에서는 thumbnail이 없으면 빈 문자열이 반환되는데, 밑의 로직에서는 없을 경우 명시적으로 undefined 여야 함.
161
+ thumbnail:
162
+ thumbnail && thumbnail.thumbnail
163
+ ? thumbnail.thumbnail
164
+ : undefined,
165
+ isFetching:
166
+ query.isFetching || (thumbnail ? thumbnail.isFetching : false),
167
+ };
168
+ }
169
+
170
+ if (query.isFetching) {
171
+ return;
172
+ }
173
+ }
174
+ })();
175
+
176
+ if (!validator) {
177
+ return {
178
+ value: undefined,
179
+ done: false,
180
+ };
181
+ }
182
+
183
+ if (!validator.isFetching) {
184
+ this.saveCacheWithoutReaction(chainId, coinMinimalDenom, {
185
+ moniker: validator.moniker,
186
+ thumbnail: validator.thumbnail,
187
+ timestamp: Date.now(),
188
+ });
189
+ }
190
+
191
+ return {
192
+ value: {
193
+ coinMinimalDenom,
194
+ coinDenom: `${(() => {
195
+ if (validator.moniker) {
196
+ let moniker = validator.moniker;
197
+ if (moniker.length >= 10) {
198
+ moniker = moniker.slice(0, 7) + "...";
199
+ }
200
+ return moniker;
201
+ }
202
+
203
+ return "Unknown";
204
+ })()}/${id}`,
205
+ coinDecimals: chainInfo.stakeCurrency.coinDecimals,
206
+ coinImageUrl: validator.thumbnail || undefined,
207
+ },
208
+ done: !validator.isFetching,
209
+ };
210
+ }
211
+ }
@@ -0,0 +1 @@
1
+ export * from "./currency-registrar";
@@ -146,16 +146,29 @@ export class ObservableQueryValidatorsInner extends ObservableChainQuery<Validat
146
146
 
147
147
  readonly getValidatorThumbnail = computedFn(
148
148
  (operatorAddress: string): string => {
149
+ const query = this.getQueryValidatorThumbnail(operatorAddress);
150
+ if (!query) {
151
+ return "";
152
+ }
153
+
154
+ return query.thumbnail;
155
+ }
156
+ );
157
+
158
+ readonly getQueryValidatorThumbnail = computedFn(
159
+ (
160
+ operatorAddress: string
161
+ ): ObservableQueryValidatorThumbnail | undefined => {
149
162
  const validators = this.validators;
150
163
  const validator = validators.find(
151
164
  (val) => val.operator_address === operatorAddress
152
165
  );
153
166
  if (!validator) {
154
- return "";
167
+ return;
155
168
  }
156
169
 
157
170
  if (!validator.description.identity) {
158
- return "";
171
+ return;
159
172
  }
160
173
 
161
174
  const identity = validator.description.identity;
@@ -170,7 +183,7 @@ export class ObservableQueryValidatorsInner extends ObservableChainQuery<Validat
170
183
  }
171
184
 
172
185
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
173
- return this.thumbnailMap.get(identity)!.thumbnail;
186
+ return this.thumbnailMap.get(identity)!;
174
187
  }
175
188
  );
176
189