@injectivelabs/sdk-ts 1.0.417 → 1.0.419
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/dist/core/utils/Denom/DenomClient.d.ts +20 -5
- package/dist/core/utils/Denom/DenomClient.d.ts.map +1 -1
- package/dist/core/utils/Denom/DenomClient.js +82 -4
- package/dist/core/utils/Denom/DenomClient.js.map +1 -1
- package/dist/core/utils/Denom/DenomClientSync.d.ts +20 -0
- package/dist/core/utils/Denom/DenomClientSync.d.ts.map +1 -0
- package/dist/core/utils/Denom/DenomClientSync.js +37 -0
- package/dist/core/utils/Denom/DenomClientSync.js.map +1 -0
- package/dist/core/utils/Denom/index.d.ts +1 -1
- package/dist/core/utils/Denom/index.d.ts.map +1 -1
- package/dist/core/utils/Denom/index.js +1 -1
- package/dist/core/utils/Denom/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/core/utils/Denom/DenomClientAsync.d.ts +0 -31
- package/dist/core/utils/Denom/DenomClientAsync.d.ts.map +0 -1
- package/dist/core/utils/Denom/DenomClientAsync.js +0 -107
- package/dist/core/utils/Denom/DenomClientAsync.js.map +0 -1
|
@@ -1,20 +1,35 @@
|
|
|
1
|
-
import { Token, TokenInfo, TokenMeta,
|
|
1
|
+
import { Token, TokenInfo, TokenMeta, TokenFactory, TokenMetaUtils } from '@injectivelabs/token-metadata';
|
|
2
|
+
import { DenomTrace } from '@injectivelabs/chain-api/ibc/applications/transfer/v1/transfer_pb';
|
|
2
3
|
import { Network } from '@injectivelabs/networks';
|
|
4
|
+
import { ChainGrpcIbcApi } from '../../../client/chain/grpc/ChainGrpcIbcApi';
|
|
3
5
|
/**
|
|
4
6
|
* This client can be used to fetch token
|
|
5
|
-
* denoms
|
|
7
|
+
* denoms including API calls as well
|
|
8
|
+
*
|
|
9
|
+
* Special Case:
|
|
10
|
+
* If IBC denom is not within the hardcoded
|
|
11
|
+
* IBC hashes we should query the denom traces API
|
|
12
|
+
* to find the token meta for the denom
|
|
6
13
|
*
|
|
7
14
|
* @category Utility Classes
|
|
8
15
|
*/
|
|
9
16
|
export declare class DenomClient {
|
|
10
|
-
protected
|
|
17
|
+
protected cachedDenomTraces: Record<string, DenomTrace.AsObject>;
|
|
18
|
+
protected tokenFactory: TokenFactory;
|
|
11
19
|
protected tokenMetaUtils: TokenMetaUtils;
|
|
20
|
+
protected ibcApi: ChainGrpcIbcApi;
|
|
12
21
|
constructor(network?: Network);
|
|
13
|
-
getDenomTokenInfo(denom: string): TokenInfo | undefined
|
|
14
|
-
getDenomToken(denom: string): Token | undefined
|
|
22
|
+
getDenomTokenInfo(denom: string): Promise<TokenInfo | undefined>;
|
|
23
|
+
getDenomToken(denom: string): Promise<Token | undefined>;
|
|
15
24
|
getTokenMetaDataBySymbol(symbol: string): TokenMeta | undefined;
|
|
16
25
|
getTokenMetaDataByAddress(address: string): TokenMeta | undefined;
|
|
17
26
|
getTokenMetaDataByName(name: string): TokenMeta | undefined;
|
|
18
27
|
getCoinGeckoId(denom: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Find token based on the hash and the base denom
|
|
30
|
+
* from the denom trace of the particular hash
|
|
31
|
+
*/
|
|
32
|
+
private getIbcDenomToken;
|
|
33
|
+
private fetchAndCacheDenomTraces;
|
|
19
34
|
}
|
|
20
35
|
//# sourceMappingURL=DenomClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DenomClient.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/Denom/DenomClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"DenomClient.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/Denom/DenomClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,YAAY,EACZ,cAAc,EAEf,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,mEAAmE,CAAA;AAG9F,OAAO,EAAuB,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAE5E;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;IACtB,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAK;IAErE,SAAS,CAAC,YAAY,EAAE,YAAY,CAAA;IAEpC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAA;IAExC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAA;gBAErB,OAAO,GAAE,OAAyB;IAMxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAgBhE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAc9D,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI/D,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIjE,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI3D,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIrC;;;OAGG;YACW,gBAAgB;YAyChB,wBAAwB;CAoBvC"}
|
|
@@ -1,24 +1,63 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
exports.DenomClient = void 0;
|
|
4
13
|
const token_metadata_1 = require("@injectivelabs/token-metadata");
|
|
14
|
+
const exceptions_1 = require("@injectivelabs/exceptions");
|
|
15
|
+
const utf8_1 = require("../../../utils/utf8");
|
|
16
|
+
const crypto_1 = require("../../../utils/crypto");
|
|
5
17
|
const networks_1 = require("@injectivelabs/networks");
|
|
18
|
+
const ChainGrpcIbcApi_1 = require("../../../client/chain/grpc/ChainGrpcIbcApi");
|
|
6
19
|
/**
|
|
7
20
|
* This client can be used to fetch token
|
|
8
|
-
* denoms
|
|
21
|
+
* denoms including API calls as well
|
|
22
|
+
*
|
|
23
|
+
* Special Case:
|
|
24
|
+
* If IBC denom is not within the hardcoded
|
|
25
|
+
* IBC hashes we should query the denom traces API
|
|
26
|
+
* to find the token meta for the denom
|
|
9
27
|
*
|
|
10
28
|
* @category Utility Classes
|
|
11
29
|
*/
|
|
12
30
|
class DenomClient {
|
|
13
31
|
constructor(network = networks_1.Network.Mainnet) {
|
|
14
|
-
this.
|
|
32
|
+
this.cachedDenomTraces = {};
|
|
33
|
+
this.tokenFactory = token_metadata_1.TokenFactory.make(network);
|
|
15
34
|
this.tokenMetaUtils = token_metadata_1.TokenMetaUtilsFactory.make(network);
|
|
35
|
+
this.ibcApi = new ChainGrpcIbcApi_1.ChainGrpcIbcApi((0, networks_1.getNetworkEndpoints)(network).grpc);
|
|
16
36
|
}
|
|
17
37
|
getDenomTokenInfo(denom) {
|
|
18
|
-
return this
|
|
38
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
+
const token = this.tokenFactory.toTokenInfo(denom);
|
|
40
|
+
if (token) {
|
|
41
|
+
return token;
|
|
42
|
+
}
|
|
43
|
+
if (denom.startsWith('ibc')) {
|
|
44
|
+
const token = yield this.getIbcDenomToken(denom);
|
|
45
|
+
return token ? token_metadata_1.TokenInfo.fromToken(token) : undefined;
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
});
|
|
19
49
|
}
|
|
20
50
|
getDenomToken(denom) {
|
|
21
|
-
return this
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
const token = this.tokenFactory.toToken(denom);
|
|
53
|
+
if (token) {
|
|
54
|
+
return token;
|
|
55
|
+
}
|
|
56
|
+
if (denom.startsWith('ibc')) {
|
|
57
|
+
return yield this.getIbcDenomToken(denom);
|
|
58
|
+
}
|
|
59
|
+
return;
|
|
60
|
+
});
|
|
22
61
|
}
|
|
23
62
|
getTokenMetaDataBySymbol(symbol) {
|
|
24
63
|
return this.tokenMetaUtils.getMetaBySymbol(symbol);
|
|
@@ -32,6 +71,45 @@ class DenomClient {
|
|
|
32
71
|
getCoinGeckoId(denom) {
|
|
33
72
|
return this.tokenMetaUtils.getCoinGeckoIdFromSymbol(denom);
|
|
34
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Find token based on the hash and the base denom
|
|
76
|
+
* from the denom trace of the particular hash
|
|
77
|
+
*/
|
|
78
|
+
getIbcDenomToken(denom) {
|
|
79
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
+
const hash = denom.replace('ibc/', '');
|
|
81
|
+
if (Object.keys(this.cachedDenomTraces).length === 0) {
|
|
82
|
+
yield this.fetchAndCacheDenomTraces();
|
|
83
|
+
}
|
|
84
|
+
const cachedDenomTrace = this.cachedDenomTraces[hash];
|
|
85
|
+
if (cachedDenomTrace) {
|
|
86
|
+
const token = this.tokenFactory.toToken(cachedDenomTrace.baseDenom);
|
|
87
|
+
return token
|
|
88
|
+
? Object.assign(Object.assign({}, token), { denom }) : undefined;
|
|
89
|
+
}
|
|
90
|
+
const denomTrace = yield this.ibcApi.fetchDenomTrace(hash);
|
|
91
|
+
if (!denomTrace) {
|
|
92
|
+
throw new exceptions_1.GeneralException(new Error(`Denom trace not found for ${denom}`), {
|
|
93
|
+
type: exceptions_1.ErrorType.NotFoundError,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
const token = this.tokenFactory.toToken(denomTrace.baseDenom);
|
|
97
|
+
return token
|
|
98
|
+
? Object.assign(Object.assign({}, token), { denom }) : undefined;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
fetchAndCacheDenomTraces() {
|
|
102
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
const denomTraces = yield this.ibcApi.fetchDenomsTrace();
|
|
104
|
+
const denomHashes = denomTraces.map((trace) => {
|
|
105
|
+
return {
|
|
106
|
+
trace: trace,
|
|
107
|
+
hash: Buffer.from((0, crypto_1.sha256)((0, utf8_1.fromUtf8)(`${trace.path}/${trace.baseDenom}`))).toString('hex'),
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
this.cachedDenomTraces = denomHashes.reduce((denomTraces, denomTrace) => (Object.assign(Object.assign({}, denomTraces), { [denomTrace.hash.toUpperCase()]: denomTrace.trace })), {});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
35
113
|
}
|
|
36
114
|
exports.DenomClient = DenomClient;
|
|
37
115
|
//# sourceMappingURL=DenomClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DenomClient.js","sourceRoot":"","sources":["../../../../src/core/utils/Denom/DenomClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DenomClient.js","sourceRoot":"","sources":["../../../../src/core/utils/Denom/DenomClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Token, TokenInfo, TokenMeta, TokenFactory, TokenMetaUtils } from '@injectivelabs/token-metadata';
|
|
2
|
+
import { Network } from '@injectivelabs/networks';
|
|
3
|
+
/**
|
|
4
|
+
* This client can be used to fetch token
|
|
5
|
+
* denoms in a fully sync way (without API calls)
|
|
6
|
+
*
|
|
7
|
+
* @category Utility Classes
|
|
8
|
+
*/
|
|
9
|
+
export declare class DenomClientSync {
|
|
10
|
+
protected tokenFactory: TokenFactory;
|
|
11
|
+
protected tokenMetaUtils: TokenMetaUtils;
|
|
12
|
+
constructor(network?: Network);
|
|
13
|
+
getDenomTokenInfo(denom: string): TokenInfo | undefined;
|
|
14
|
+
getDenomToken(denom: string): Token | undefined;
|
|
15
|
+
getTokenMetaDataBySymbol(symbol: string): TokenMeta | undefined;
|
|
16
|
+
getTokenMetaDataByAddress(address: string): TokenMeta | undefined;
|
|
17
|
+
getTokenMetaDataByName(name: string): TokenMeta | undefined;
|
|
18
|
+
getCoinGeckoId(denom: string): string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=DenomClientSync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DenomClientSync.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/Denom/DenomClientSync.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,YAAY,EACZ,cAAc,EAEf,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAEjD;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,SAAS,CAAC,YAAY,EAAE,YAAY,CAAA;IAEpC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAA;gBAE5B,OAAO,GAAE,OAAyB;IAK9C,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIvD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAI/C,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI/D,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIjE,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI3D,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAGtC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DenomClientSync = void 0;
|
|
4
|
+
const token_metadata_1 = require("@injectivelabs/token-metadata");
|
|
5
|
+
const networks_1 = require("@injectivelabs/networks");
|
|
6
|
+
/**
|
|
7
|
+
* This client can be used to fetch token
|
|
8
|
+
* denoms in a fully sync way (without API calls)
|
|
9
|
+
*
|
|
10
|
+
* @category Utility Classes
|
|
11
|
+
*/
|
|
12
|
+
class DenomClientSync {
|
|
13
|
+
constructor(network = networks_1.Network.Mainnet) {
|
|
14
|
+
this.tokenFactory = token_metadata_1.TokenFactory.make(network);
|
|
15
|
+
this.tokenMetaUtils = token_metadata_1.TokenMetaUtilsFactory.make(network);
|
|
16
|
+
}
|
|
17
|
+
getDenomTokenInfo(denom) {
|
|
18
|
+
return this.tokenFactory.toTokenInfo(denom);
|
|
19
|
+
}
|
|
20
|
+
getDenomToken(denom) {
|
|
21
|
+
return this.tokenFactory.toToken(denom);
|
|
22
|
+
}
|
|
23
|
+
getTokenMetaDataBySymbol(symbol) {
|
|
24
|
+
return this.tokenMetaUtils.getMetaBySymbol(symbol);
|
|
25
|
+
}
|
|
26
|
+
getTokenMetaDataByAddress(address) {
|
|
27
|
+
return this.tokenMetaUtils.getMetaByAddress(address);
|
|
28
|
+
}
|
|
29
|
+
getTokenMetaDataByName(name) {
|
|
30
|
+
return this.tokenMetaUtils.getMetaByName(name);
|
|
31
|
+
}
|
|
32
|
+
getCoinGeckoId(denom) {
|
|
33
|
+
return this.tokenMetaUtils.getCoinGeckoIdFromSymbol(denom);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.DenomClientSync = DenomClientSync;
|
|
37
|
+
//# sourceMappingURL=DenomClientSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DenomClientSync.js","sourceRoot":"","sources":["../../../../src/core/utils/Denom/DenomClientSync.ts"],"names":[],"mappings":";;;AAAA,kEAOsC;AACtC,sDAAiD;AAEjD;;;;;GAKG;AACH,MAAa,eAAe;IAK1B,YAAY,UAAmB,kBAAO,CAAC,OAAO;QAC5C,IAAI,CAAC,YAAY,GAAG,6BAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC9C,IAAI,CAAC,cAAc,GAAG,sCAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3D,CAAC;IAED,iBAAiB,CAAC,KAAa;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC;IAED,wBAAwB,CAAC,MAAc;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC;IAED,yBAAyB,CAAC,OAAe;QACvC,OAAO,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACtD,CAAC;IAED,sBAAsB,CAAC,IAAY;QACjC,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IAChD,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,OAAO,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAA;IAC5D,CAAC;CACF;AAjCD,0CAiCC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/Denom/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/Denom/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA"}
|
|
@@ -14,6 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./DenomClientSync"), exports);
|
|
17
18
|
__exportStar(require("./DenomClient"), exports);
|
|
18
|
-
__exportStar(require("./DenomClientAsync"), exports);
|
|
19
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/utils/Denom/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/utils/Denom/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAiC;AACjC,gDAA6B"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@injectivelabs/sdk-ts",
|
|
3
3
|
"description": "SDK in TypeScript for building Injective applications in a browser, node, and react native environment.",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.419",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Bojan Angjelkoski",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@injectivelabs/indexer-api": "1.9.1",
|
|
46
46
|
"@injectivelabs/networks": "^1.0.87",
|
|
47
47
|
"@injectivelabs/ninja-api": "^1.0.11",
|
|
48
|
-
"@injectivelabs/token-metadata": "^1.0.
|
|
48
|
+
"@injectivelabs/token-metadata": "^1.0.152",
|
|
49
49
|
"@injectivelabs/ts-types": "^1.0.28",
|
|
50
50
|
"@injectivelabs/utils": "^1.0.75",
|
|
51
51
|
"@metamask/eth-sig-util": "^4.0.0",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"shx": "^0.3.2",
|
|
69
69
|
"snakecase-keys": "^5.4.1"
|
|
70
70
|
},
|
|
71
|
-
"gitHead": "
|
|
71
|
+
"gitHead": "5990e3e736f69b902ebe2a553926b86f01c3fff4",
|
|
72
72
|
"typedoc": {
|
|
73
73
|
"entryPoint": "./src/index.ts",
|
|
74
74
|
"readmeFile": "./README.md",
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Token, TokenInfo, TokenMeta, TokenMetaUtils, TokenInfoFactory } from '@injectivelabs/token-metadata';
|
|
2
|
-
import { DenomTrace } from '@injectivelabs/chain-api/ibc/applications/transfer/v1/transfer_pb';
|
|
3
|
-
import { Network } from '@injectivelabs/networks';
|
|
4
|
-
import { ChainGrpcIbcApi } from '../../../client/chain/grpc/ChainGrpcIbcApi';
|
|
5
|
-
/**
|
|
6
|
-
* This client can be used to fetch token
|
|
7
|
-
* denoms including API calls as well
|
|
8
|
-
*
|
|
9
|
-
* Special Case:
|
|
10
|
-
* If IBC denom is not within the hardcoded
|
|
11
|
-
* IBC hashes we should query the denom traces API
|
|
12
|
-
* to find the token meta for the denom
|
|
13
|
-
*
|
|
14
|
-
* @category Utility Classes
|
|
15
|
-
*/
|
|
16
|
-
export declare class DenomClientAsync {
|
|
17
|
-
protected cachedDenomTraces: Record<string, DenomTrace.AsObject>;
|
|
18
|
-
protected tokenInfoFactory: TokenInfoFactory;
|
|
19
|
-
protected tokenMetaUtils: TokenMetaUtils;
|
|
20
|
-
protected ibcApi: ChainGrpcIbcApi;
|
|
21
|
-
constructor(network?: Network);
|
|
22
|
-
getDenomTokenInfo(denom: string): Promise<TokenInfo | undefined>;
|
|
23
|
-
getDenomToken(denom: string): Promise<Token | undefined>;
|
|
24
|
-
getTokenMetaDataBySymbol(symbol: string): TokenMeta | undefined;
|
|
25
|
-
getTokenMetaDataByAddress(address: string): TokenMeta | undefined;
|
|
26
|
-
getTokenMetaDataByName(name: string): TokenMeta | undefined;
|
|
27
|
-
getCoinGeckoId(denom: string): string;
|
|
28
|
-
private getIbcDenomToken;
|
|
29
|
-
private fetchAndCacheDenomTraces;
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=DenomClientAsync.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DenomClientAsync.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/Denom/DenomClientAsync.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,cAAc,EACd,gBAAgB,EAEjB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,mEAAmE,CAAA;AAG9F,OAAO,EAAuB,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAE5E;;;;;;;;;;GAUG;AACH,qBAAa,gBAAgB;IAC3B,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAK;IAErE,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAA;IAE5C,SAAS,CAAC,cAAc,EAAE,cAAc,CAAA;IAExC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAA;gBAErB,OAAO,GAAE,OAAyB;IAMxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAgBhE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAc9D,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI/D,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIjE,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI3D,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;YAIvB,gBAAgB;YA2BhB,wBAAwB;CAoBvC"}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.DenomClientAsync = void 0;
|
|
13
|
-
const token_metadata_1 = require("@injectivelabs/token-metadata");
|
|
14
|
-
const exceptions_1 = require("@injectivelabs/exceptions");
|
|
15
|
-
const utf8_1 = require("../../../utils/utf8");
|
|
16
|
-
const crypto_1 = require("../../../utils/crypto");
|
|
17
|
-
const networks_1 = require("@injectivelabs/networks");
|
|
18
|
-
const ChainGrpcIbcApi_1 = require("../../../client/chain/grpc/ChainGrpcIbcApi");
|
|
19
|
-
/**
|
|
20
|
-
* This client can be used to fetch token
|
|
21
|
-
* denoms including API calls as well
|
|
22
|
-
*
|
|
23
|
-
* Special Case:
|
|
24
|
-
* If IBC denom is not within the hardcoded
|
|
25
|
-
* IBC hashes we should query the denom traces API
|
|
26
|
-
* to find the token meta for the denom
|
|
27
|
-
*
|
|
28
|
-
* @category Utility Classes
|
|
29
|
-
*/
|
|
30
|
-
class DenomClientAsync {
|
|
31
|
-
constructor(network = networks_1.Network.Mainnet) {
|
|
32
|
-
this.cachedDenomTraces = {};
|
|
33
|
-
this.tokenInfoFactory = token_metadata_1.TokenInfoFactory.make(network);
|
|
34
|
-
this.tokenMetaUtils = token_metadata_1.TokenMetaUtilsFactory.make(network);
|
|
35
|
-
this.ibcApi = new ChainGrpcIbcApi_1.ChainGrpcIbcApi((0, networks_1.getNetworkEndpoints)(network).grpc);
|
|
36
|
-
}
|
|
37
|
-
getDenomTokenInfo(denom) {
|
|
38
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
-
const token = this.tokenInfoFactory.toTokenInfo(denom);
|
|
40
|
-
if (token) {
|
|
41
|
-
return token;
|
|
42
|
-
}
|
|
43
|
-
if (denom.startsWith('ibc')) {
|
|
44
|
-
const token = yield this.getIbcDenomToken(denom);
|
|
45
|
-
return token ? token_metadata_1.TokenInfo.fromToken(token) : undefined;
|
|
46
|
-
}
|
|
47
|
-
return;
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
getDenomToken(denom) {
|
|
51
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
-
const token = this.tokenInfoFactory.toToken(denom);
|
|
53
|
-
if (token) {
|
|
54
|
-
return token;
|
|
55
|
-
}
|
|
56
|
-
if (denom.startsWith('ibc')) {
|
|
57
|
-
return yield this.getIbcDenomToken(denom);
|
|
58
|
-
}
|
|
59
|
-
return;
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
getTokenMetaDataBySymbol(symbol) {
|
|
63
|
-
return this.tokenMetaUtils.getMetaBySymbol(symbol);
|
|
64
|
-
}
|
|
65
|
-
getTokenMetaDataByAddress(address) {
|
|
66
|
-
return this.tokenMetaUtils.getMetaByAddress(address);
|
|
67
|
-
}
|
|
68
|
-
getTokenMetaDataByName(name) {
|
|
69
|
-
return this.tokenMetaUtils.getMetaByName(name);
|
|
70
|
-
}
|
|
71
|
-
getCoinGeckoId(denom) {
|
|
72
|
-
return this.tokenMetaUtils.getCoinGeckoIdFromSymbol(denom);
|
|
73
|
-
}
|
|
74
|
-
getIbcDenomToken(denom) {
|
|
75
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
-
const hash = denom.replace('ibc/', '');
|
|
77
|
-
if (Object.keys(this.cachedDenomTraces).length === 0) {
|
|
78
|
-
yield this.fetchAndCacheDenomTraces();
|
|
79
|
-
}
|
|
80
|
-
const cachedDenomTrace = this.cachedDenomTraces[hash];
|
|
81
|
-
if (cachedDenomTrace) {
|
|
82
|
-
return this.tokenInfoFactory.toToken(cachedDenomTrace.baseDenom);
|
|
83
|
-
}
|
|
84
|
-
const denomTrace = yield this.ibcApi.fetchDenomTrace(hash);
|
|
85
|
-
if (!denomTrace) {
|
|
86
|
-
throw new exceptions_1.GeneralException(new Error(`Denom trace not found for ${denom}`), {
|
|
87
|
-
type: exceptions_1.ErrorType.NotFoundError,
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
return this.tokenInfoFactory.toToken(denomTrace.baseDenom);
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
fetchAndCacheDenomTraces() {
|
|
94
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
-
const denomTraces = yield this.ibcApi.fetchDenomsTrace();
|
|
96
|
-
const denomHashes = denomTraces.map((trace) => {
|
|
97
|
-
return {
|
|
98
|
-
trace: trace,
|
|
99
|
-
hash: Buffer.from((0, crypto_1.sha256)((0, utf8_1.fromUtf8)(`${trace.path}/${trace.baseDenom}`))).toString('hex'),
|
|
100
|
-
};
|
|
101
|
-
});
|
|
102
|
-
this.cachedDenomTraces = denomHashes.reduce((denomTraces, denomTrace) => (Object.assign(Object.assign({}, denomTraces), { [denomTrace.hash.toUpperCase()]: denomTrace.trace })), {});
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
exports.DenomClientAsync = DenomClientAsync;
|
|
107
|
-
//# sourceMappingURL=DenomClientAsync.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DenomClientAsync.js","sourceRoot":"","sources":["../../../../src/core/utils/Denom/DenomClientAsync.ts"],"names":[],"mappings":"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"}
|