@keplr-wallet/stores-eth 0.13.32 → 0.13.34

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.
Files changed (34) hide show
  1. package/build/queries/erc20-balance-batch.d.ts +26 -0
  2. package/build/queries/erc20-balance-batch.js +262 -0
  3. package/build/queries/erc20-balance-batch.js.map +1 -0
  4. package/build/queries/erc20-balance-batch.spec.d.ts +1 -0
  5. package/build/queries/erc20-balance-batch.spec.js +157 -0
  6. package/build/queries/erc20-balance-batch.spec.js.map +1 -0
  7. package/build/queries/erc20-balance.d.ts +21 -6
  8. package/build/queries/erc20-balance.js +118 -27
  9. package/build/queries/erc20-balance.js.map +1 -1
  10. package/build/queries/erc20-balance.spec.d.ts +1 -0
  11. package/build/queries/erc20-balance.spec.js +90 -0
  12. package/build/queries/erc20-balance.spec.js.map +1 -0
  13. package/build/queries/erc20-balances.d.ts +18 -4
  14. package/build/queries/erc20-balances.js +200 -25
  15. package/build/queries/erc20-balances.js.map +1 -1
  16. package/build/queries/erc20-balances.spec.d.ts +1 -0
  17. package/build/queries/erc20-balances.spec.js +150 -0
  18. package/build/queries/erc20-balances.spec.js.map +1 -0
  19. package/build/queries/erc20-batch-parent-store.d.ts +8 -0
  20. package/build/queries/erc20-batch-parent-store.js +21 -0
  21. package/build/queries/erc20-batch-parent-store.js.map +1 -0
  22. package/build/queries/index.d.ts +1 -3
  23. package/build/queries/index.js +6 -5
  24. package/build/queries/index.js.map +1 -1
  25. package/jest.config.js +8 -1
  26. package/package.json +8 -8
  27. package/src/queries/erc20-balance-batch.spec.ts +192 -0
  28. package/src/queries/erc20-balance-batch.ts +273 -0
  29. package/src/queries/erc20-balance.spec.ts +129 -0
  30. package/src/queries/erc20-balance.ts +122 -36
  31. package/src/queries/erc20-balances.spec.ts +194 -0
  32. package/src/queries/erc20-balances.ts +220 -37
  33. package/src/queries/erc20-batch-parent-store.ts +28 -0
  34. package/src/queries/index.ts +8 -15
@@ -5,6 +5,15 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
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
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
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
+ };
8
17
  var __importDefault = (this && this.__importDefault) || function (mod) {
9
18
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
19
  };
@@ -13,56 +22,137 @@ exports.ObservableQueryEthereumERC20BalanceRegistry = exports.ObservableQueryEth
13
22
  const unit_1 = require("@keplr-wallet/unit");
14
23
  const mobx_1 = require("mobx");
15
24
  const big_integer_1 = __importDefault(require("big-integer"));
16
- const constants_1 = require("../constants");
17
25
  const common_1 = require("@keplr-wallet/common");
18
26
  const account_1 = require("../account");
19
- const evm_chain_json_rpc_1 = require("./evm-chain-json-rpc");
20
- class ObservableQueryEthereumERC20BalanceImpl extends evm_chain_json_rpc_1.ObservableEvmChainJsonRpcQuery {
21
- constructor(sharedContext, chainId, chainGetter, denomHelper, ethereumHexAddress, contractAddress) {
22
- super(sharedContext, chainId, chainGetter, "eth_call", [
23
- {
24
- to: contractAddress,
25
- data: constants_1.erc20ContractInterface.encodeFunctionData("balanceOf", [
26
- ethereumHexAddress,
27
- ]),
28
- },
29
- "latest",
30
- ]);
27
+ class ObservableQueryEthereumERC20BalanceImpl {
28
+ constructor(parent, chainId, chainGetter, denomHelper, contractAddress) {
29
+ this.parent = parent;
30
+ this.chainId = chainId;
31
+ this.chainGetter = chainGetter;
31
32
  this.denomHelper = denomHelper;
32
- this.ethereumHexAddress = ethereumHexAddress;
33
33
  this.contractAddress = contractAddress;
34
+ this._observedProps = 0;
34
35
  (0, mobx_1.makeObservable)(this);
36
+ // Readiness gates (hooks-evm) can early-return on `response` before
37
+ // reading `balance`, so either property being observed must register
38
+ // the contract into the shared batch parent.
39
+ const attach = (prop) => {
40
+ (0, mobx_1.onBecomeObserved)(this, prop, () => {
41
+ (0, mobx_1.runInAction)(() => {
42
+ this._observedProps += 1;
43
+ });
44
+ if (this._observedProps === 1) {
45
+ this.parent.addContract(contractAddress);
46
+ }
47
+ });
48
+ (0, mobx_1.onBecomeUnobserved)(this, prop, () => {
49
+ (0, mobx_1.runInAction)(() => {
50
+ this._observedProps -= 1;
51
+ });
52
+ if (this._observedProps === 0) {
53
+ this.parent.removeContract(contractAddress);
54
+ }
55
+ });
56
+ };
57
+ attach("balance");
58
+ attach("response");
59
+ attach("error");
35
60
  }
36
61
  get balance() {
37
- const denom = this.denomHelper.denom;
38
- const currency = this.chainGetter
39
- .getModularChain(this.chainId)
40
- .findCurrency(denom);
41
- if (!currency) {
42
- throw new Error(`Unknown currency: ${this.contractAddress}`);
43
- }
44
- if (!this.response || !this.response.data) {
62
+ const currency = this.currency;
63
+ const raw = this.parent.getBalance(this.contractAddress);
64
+ if (raw === undefined) {
45
65
  return new unit_1.CoinPretty(currency, new unit_1.Int(0)).ready(false);
46
66
  }
47
- return new unit_1.CoinPretty(currency, new unit_1.Int((0, big_integer_1.default)(this.response.data.replace("0x", ""), 16).toString()));
67
+ return new unit_1.CoinPretty(currency, new unit_1.Int((0, big_integer_1.default)(raw.replace("0x", ""), 16).toString()));
48
68
  }
49
69
  get currency() {
50
- const denom = this.denomHelper.denom;
51
70
  return this.chainGetter
52
71
  .getModularChain(this.chainId)
53
- .forceFindCurrency(denom);
72
+ .forceFindCurrency(this.denomHelper.denom);
73
+ }
74
+ get isFetching() {
75
+ return this.parent.isFetching;
76
+ }
77
+ get isObserved() {
78
+ return this._observedProps > 0;
79
+ }
80
+ get isStarted() {
81
+ return this._observedProps > 0;
82
+ }
83
+ get error() {
84
+ return this.parent.getError(this.contractAddress);
85
+ }
86
+ get response() {
87
+ // hooks-evm tx flow gates readiness on truthy `bal.response`. Synthesize
88
+ // from the shared batch parent so the Child advertises fetch completion.
89
+ const raw = this.parent.getBalance(this.contractAddress);
90
+ if (raw === undefined)
91
+ return undefined;
92
+ return {
93
+ data: raw,
94
+ staled: false,
95
+ local: false,
96
+ timestamp: 0,
97
+ };
98
+ }
99
+ ensureFetched() {
100
+ return __awaiter(this, void 0, void 0, function* () {
101
+ // balanceImplMap doesn't evict on currency removal.
102
+ if (!this.isCurrencyRegistered())
103
+ return;
104
+ // Force temporary registration so imperative callers (outside a reactive
105
+ // observer) still trigger an actual eth_call.
106
+ this.parent.addContract(this.contractAddress);
107
+ try {
108
+ yield this.parent.waitFreshResponse();
109
+ }
110
+ finally {
111
+ this.parent.removeContract(this.contractAddress);
112
+ }
113
+ });
114
+ }
115
+ isCurrencyRegistered() {
116
+ const target = common_1.DenomHelper.normalizeDenom(this.denomHelper.denom);
117
+ return this.chainGetter
118
+ .getModularChain(this.chainId)
119
+ .currencies.some((c) => common_1.DenomHelper.normalizeDenom(c.coinMinimalDenom) === target);
120
+ }
121
+ fetch() {
122
+ return this.ensureFetched();
123
+ }
124
+ waitFreshResponse() {
125
+ return __awaiter(this, void 0, void 0, function* () {
126
+ yield this.ensureFetched();
127
+ return this.response;
128
+ });
129
+ }
130
+ waitResponse() {
131
+ return __awaiter(this, void 0, void 0, function* () {
132
+ return yield this.waitFreshResponse();
133
+ });
54
134
  }
55
135
  }
136
+ __decorate([
137
+ mobx_1.observable
138
+ ], ObservableQueryEthereumERC20BalanceImpl.prototype, "_observedProps", void 0);
56
139
  __decorate([
57
140
  mobx_1.computed
58
141
  ], ObservableQueryEthereumERC20BalanceImpl.prototype, "balance", null);
59
142
  __decorate([
60
143
  mobx_1.computed
61
144
  ], ObservableQueryEthereumERC20BalanceImpl.prototype, "currency", null);
145
+ __decorate([
146
+ mobx_1.computed
147
+ ], ObservableQueryEthereumERC20BalanceImpl.prototype, "error", null);
148
+ __decorate([
149
+ mobx_1.computed
150
+ ], ObservableQueryEthereumERC20BalanceImpl.prototype, "response", null);
62
151
  exports.ObservableQueryEthereumERC20BalanceImpl = ObservableQueryEthereumERC20BalanceImpl;
63
152
  class ObservableQueryEthereumERC20BalanceRegistry {
64
- constructor(sharedContext) {
153
+ constructor(sharedContext, batchParentStore) {
65
154
  this.sharedContext = sharedContext;
155
+ this.batchParentStore = batchParentStore;
66
156
  }
67
157
  getBalanceImpl(chainId, chainGetter, address, minimalDenom) {
68
158
  const denomHelper = new common_1.DenomHelper(minimalDenom);
@@ -73,7 +163,8 @@ class ObservableQueryEthereumERC20BalanceRegistry {
73
163
  (mcInfo.type !== "evm" && mcInfo.type !== "ethermint")) {
74
164
  return;
75
165
  }
76
- return new ObservableQueryEthereumERC20BalanceImpl(this.sharedContext, chainId, chainGetter, denomHelper, address, denomHelper.contractAddress);
166
+ const parent = this.batchParentStore.getOrCreate(chainId, chainGetter, address);
167
+ return new ObservableQueryEthereumERC20BalanceImpl(parent, chainId, chainGetter, denomHelper, denomHelper.contractAddress);
77
168
  }
78
169
  }
79
170
  exports.ObservableQueryEthereumERC20BalanceRegistry = ObservableQueryEthereumERC20BalanceRegistry;
@@ -1 +1 @@
1
- {"version":3,"file":"erc20-balance.js","sourceRoot":"","sources":["../../src/queries/erc20-balance.ts"],"names":[],"mappings":";;;;;;;;;;;;AAOA,6CAAqD;AACrD,+BAAgD;AAChD,8DAAqC;AACrC,4CAAsD;AACtD,iDAAmD;AACnD,wCAAiD;AACjD,6DAAsE;AAEtE,MAAa,uCACX,SAAQ,mDAAsC;IAG9C,YACE,aAAiC,EACjC,OAAe,EACf,WAAwB,EACL,WAAwB,EACxB,kBAA0B,EAC1B,eAAuB;QAE1C,KAAK,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE;YACrD;gBACE,EAAE,EAAE,eAAe;gBACnB,IAAI,EAAE,kCAAsB,CAAC,kBAAkB,CAAC,WAAW,EAAE;oBAC3D,kBAAkB;iBACnB,CAAC;aACH;YACD,QAAQ;SACT,CAAC,CAAC;QAZgB,gBAAW,GAAX,WAAW,CAAa;QACxB,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC1B,oBAAe,GAAf,eAAe,CAAQ;QAY1C,IAAA,qBAAc,EAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAGD,IAAI,OAAO;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW;aAC9B,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;aAC7B,YAAY,CAAC,KAAK,CAAC,CAAC;QAEvB,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;SAC9D;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACzC,OAAO,IAAI,iBAAU,CAAC,QAAQ,EAAE,IAAI,UAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAC1D;QAED,OAAO,IAAI,iBAAU,CACnB,QAAQ,EACR,IAAI,UAAG,CAAC,IAAA,qBAAU,EAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CACzE,CAAC;IACJ,CAAC;IAGD,IAAI,QAAQ;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAErC,OAAO,IAAI,CAAC,WAAW;aACpB,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;aAC7B,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AA7BC;IADC,eAAQ;sEAoBR;AAGD;IADC,eAAQ;uEAOR;AAtDH,0FAuDC;AAED,MAAa,2CAA2C;IAGtD,YAA+B,aAAiC;QAAjC,kBAAa,GAAb,aAAa,CAAoB;IAAG,CAAC;IAEpE,cAAc,CACZ,OAAe,EACf,WAAwB,EACxB,OAAe,EACf,YAAoB;QAEpB,MAAM,WAAW,GAAG,IAAI,oBAAW,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,YAAY,GAChB,6BAAmB,CAAC,gCAAgC,CAAC,OAAO,CAAC,CAAC;QAChE,IACE,WAAW,CAAC,IAAI,KAAK,OAAO;YAC5B,CAAC,YAAY;YACb,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,EACtD;YACA,OAAO;SACR;QAED,OAAO,IAAI,uCAAuC,CAChD,IAAI,CAAC,aAAa,EAClB,OAAO,EACP,WAAW,EACX,WAAW,EACX,OAAO,EACP,WAAW,CAAC,eAAe,CAC5B,CAAC;IACJ,CAAC;CACF;AAhCD,kGAgCC"}
1
+ {"version":3,"file":"erc20-balance.js","sourceRoot":"","sources":["../../src/queries/erc20-balance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const common_1 = require("@keplr-wallet/common");
4
+ const stores_1 = require("@keplr-wallet/stores");
5
+ const erc20_balance_1 = require("./erc20-balance");
6
+ jest.mock("../account", () => ({
7
+ EthereumAccountBase: {
8
+ isEthereumHexAddressWithChecksum: jest.fn(() => true),
9
+ },
10
+ }));
11
+ jest.mock("@keplr-wallet/stores", () => {
12
+ const context = jest.requireActual("../../../stores/src/common/query/context");
13
+ const jsonRpc = jest.requireActual("../../../stores/src/common/query/json-rpc");
14
+ const map = jest.requireActual("../../../stores/src/common/map");
15
+ return {
16
+ QuerySharedContext: context.QuerySharedContext,
17
+ ObservableJsonRPCQuery: jsonRpc.ObservableJsonRPCQuery,
18
+ HasMapStore: map.HasMapStore,
19
+ getKeplrFromWindow: jest.fn(),
20
+ };
21
+ });
22
+ const ADDRESS = "0x0000000000000000000000000000000000000001";
23
+ const CONTRACT = "0x0000000000000000000000000000000000000002";
24
+ const DENOM = `erc20:${CONTRACT}`;
25
+ const CURRENCY = {
26
+ coinMinimalDenom: DENOM,
27
+ coinDenom: "TEST",
28
+ coinDecimals: 18,
29
+ };
30
+ describe("ObservableQueryEthereumERC20BalanceRegistry", () => {
31
+ it("keeps ethermint ERC20 balances on the shared batch query for hex senders", () => {
32
+ const batchParentStore = mockBatchParentStore();
33
+ const chainGetter = mockChainGetter("ethermint");
34
+ const registry = createRegistry(batchParentStore);
35
+ const impl = registry.getBalanceImpl("injective-1", chainGetter, ADDRESS, DENOM);
36
+ expect(impl).toBeInstanceOf(erc20_balance_1.ObservableQueryEthereumERC20BalanceImpl);
37
+ expect(batchParentStore.getOrCreate).toHaveBeenCalledWith("injective-1", chainGetter, ADDRESS);
38
+ });
39
+ it("keeps pure EVM ERC20 balances on the shared batch query", () => {
40
+ const batchParentStore = mockBatchParentStore();
41
+ const chainGetter = mockChainGetter("evm");
42
+ const registry = createRegistry(batchParentStore);
43
+ const impl = registry.getBalanceImpl("eip155:1", chainGetter, ADDRESS, DENOM);
44
+ expect(impl).toBeInstanceOf(erc20_balance_1.ObservableQueryEthereumERC20BalanceImpl);
45
+ expect(batchParentStore.getOrCreate).toHaveBeenCalledWith("eip155:1", chainGetter, ADDRESS);
46
+ });
47
+ });
48
+ function createRegistry(batchParentStore) {
49
+ return new erc20_balance_1.ObservableQueryEthereumERC20BalanceRegistry(new stores_1.QuerySharedContext(new common_1.MemoryKVStore("erc20-balance-registry-test"), {
50
+ responseDebounceMs: 0,
51
+ }), batchParentStore);
52
+ }
53
+ function mockBatchParentStore() {
54
+ return {
55
+ getOrCreate: jest.fn(() => ({
56
+ addContract: jest.fn(),
57
+ removeContract: jest.fn(),
58
+ waitFreshResponse: jest.fn(),
59
+ getBalance: jest.fn(),
60
+ getError: jest.fn(),
61
+ isFetching: false,
62
+ })),
63
+ };
64
+ }
65
+ function mockChainGetter(type) {
66
+ return {
67
+ getModularChain() {
68
+ return {
69
+ type,
70
+ unwrapped: {
71
+ type,
72
+ evm: {
73
+ rpc: "https://rpc.example",
74
+ },
75
+ },
76
+ currencies: [CURRENCY],
77
+ forceFindCurrency(denom) {
78
+ if (denom === DENOM) {
79
+ return CURRENCY;
80
+ }
81
+ throw new Error(`Unknown currency: ${denom}`);
82
+ },
83
+ };
84
+ },
85
+ hasModularChain() {
86
+ return true;
87
+ },
88
+ };
89
+ }
90
+ //# sourceMappingURL=erc20-balance.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc20-balance.spec.js","sourceRoot":"","sources":["../../src/queries/erc20-balance.spec.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
1
  import { DenomHelper } from "@keplr-wallet/common";
2
+ import { IReactionDisposer } from "mobx";
2
3
  import { CoinPretty } from "@keplr-wallet/unit";
3
4
  import { AppCurrency } from "@keplr-wallet/types";
4
5
  import { BalanceRegistry, ChainGetter, IObservableQueryBalanceImpl, ObservableJsonRPCQuery, QueryError, QueryResponse, QuerySharedContext } from "@keplr-wallet/stores";
6
+ import { ObservableQueryEthereumERC20BalancesBatchParent } from "./erc20-balance-batch";
7
+ import { ERC20BalanceBatchParentStore } from "./erc20-batch-parent-store";
5
8
  interface ThirdpartyERC20TokenBalance {
6
9
  address: string;
7
10
  tokenBalances: {
@@ -12,39 +15,50 @@ interface ThirdpartyERC20TokenBalance {
12
15
  message: string;
13
16
  } | null;
14
17
  }[];
15
- pageKey: string;
18
+ pageKey?: string;
16
19
  }
17
20
  export declare class ObservableQueryThirdpartyERC20BalancesImplParent extends ObservableJsonRPCQuery<ThirdpartyERC20TokenBalance> {
18
21
  protected readonly chainId: string;
19
22
  protected readonly chainGetter: ChainGetter;
20
23
  protected readonly ethereumHexAddress: string;
24
+ readonly batchParent: ObservableQueryEthereumERC20BalancesBatchParent;
21
25
  duplicatedFetchResolver?: Promise<void>;
22
- constructor(sharedContext: QuerySharedContext, chainId: string, chainGetter: ChainGetter, ethereumHexAddress: string);
26
+ protected alchemyContractSet: Set<string>;
27
+ constructor(sharedContext: QuerySharedContext, chainId: string, chainGetter: ChainGetter, ethereumHexAddress: string, batchParent: ObservableQueryEthereumERC20BalancesBatchParent);
23
28
  protected canFetch(): boolean;
24
29
  protected onReceiveResponse(response: Readonly<QueryResponse<ThirdpartyERC20TokenBalance>>): void;
30
+ hasAlchemyBalance(contract: string): boolean;
31
+ getAlchemyTokenBalance(contract: string): ThirdpartyERC20TokenBalance["tokenBalances"][number] | undefined;
32
+ resolvesAlchemyBalance(contract: string): boolean;
25
33
  }
26
34
  export declare class ObservableQueryThirdpartyERC20BalancesImpl implements IObservableQueryBalanceImpl {
27
35
  protected readonly parent: ObservableQueryThirdpartyERC20BalancesImplParent;
28
36
  protected readonly chainId: string;
29
37
  protected readonly chainGetter: ChainGetter;
30
38
  protected readonly denomHelper: DenomHelper;
39
+ protected batchReactionDisposer?: IReactionDisposer;
40
+ protected isInBatch: boolean;
41
+ protected observedProps: number;
31
42
  constructor(parent: ObservableQueryThirdpartyERC20BalancesImplParent, chainId: string, chainGetter: ChainGetter, denomHelper: DenomHelper);
32
43
  get balance(): CoinPretty;
33
44
  get currency(): AppCurrency;
45
+ protected get alchemyResolvesBalance(): boolean;
34
46
  get error(): Readonly<QueryError<unknown>> | undefined;
35
47
  get isFetching(): boolean;
36
48
  get isObserved(): boolean;
37
49
  get isStarted(): boolean;
38
50
  get response(): Readonly<QueryResponse<ThirdpartyERC20TokenBalance>> | undefined;
39
51
  fetch(): Promise<void>;
52
+ protected awaitFallbackIfMissing(): Promise<void>;
53
+ protected isCurrencyRegistered(): boolean;
40
54
  waitFreshResponse(): Promise<Readonly<QueryResponse<unknown>> | undefined>;
41
55
  waitResponse(): Promise<Readonly<QueryResponse<unknown>> | undefined>;
42
56
  }
43
57
  export declare class ObservableQueryThirdpartyERC20BalanceRegistry implements BalanceRegistry {
44
58
  protected readonly sharedContext: QuerySharedContext;
45
- protected readonly forceNativeERC20Query: (chainId: string, chainGetter: ChainGetter, address: string, minimalDenom: string) => boolean;
59
+ protected readonly batchParentStore: ERC20BalanceBatchParentStore;
46
60
  protected parentMap: Map<string, ObservableQueryThirdpartyERC20BalancesImplParent>;
47
- constructor(sharedContext: QuerySharedContext, forceNativeERC20Query: (chainId: string, chainGetter: ChainGetter, address: string, minimalDenom: string) => boolean);
61
+ constructor(sharedContext: QuerySharedContext, batchParentStore: ERC20BalanceBatchParentStore);
48
62
  getBalanceImpl(chainId: string, chainGetter: ChainGetter, address: string, minimalDenom: string): ObservableQueryThirdpartyERC20BalancesImpl | undefined;
49
63
  }
50
64
  export {};