denom은 Injective의 Bank 모듈 내에서 토큰이 표현되는 방식입니다. 이러한 자산은 거래, exchange 모듈에서 새 마켓 생성, 경매 참여, 다른 주소로의 전송 등에 사용될 수 있습니다.
개발자와 트레이더에게 가장 큰 어려움 중 하나는 이러한 denom의 메타데이터를 가져오는 것입니다. 이 메타데이터에는 decimals, symbol, name 등이 포함됩니다.
이 가이드는 injective-lists 리포지토리에서 직접 denom 메타데이터를 가져와 여러분의 denom에 매핑하는 방법을 보여줍니다. 이 접근 방식을 사용하여 Spot 및 Derivative 마켓의 denom 메타데이터도 매핑할 수 있습니다.
Injective Lists
injective-lists는 Injective의 모든 토큰에 대한 메타데이터 정보를 보관하는 공개 리포지토리입니다. 이 특정 정보의 가장 최신이고 신뢰할 수 있는 소스입니다. 이 리포에 PR을 생성하여 토큰 정보를 제출할 수 있습니다. 필드를 올바르게 지정해야 합니다. 특히 "denom" 필드(토큰 표준에 대해 읽어보세요)는 토큰 표준에 따라 각각 ibc, peggy 및 factory 접두사를 가져야 합니다.
새로운 denom에 대해 메타데이터가 30분마다 자동으로 가져오고 json 파일이 재생성됩니다.
https://github.com/InjectiveLabs/injective-lists/tree/master/json/tokens 폴더로 이동하여 환경에 따라 메타데이터를 다운로드할 수 있습니다:
- Mainnet Raw JSON
- Testnet Raw JSON
JSON을 가져오면 메타데이터를 특정 denom에 매핑해야 합니다.
이 메타데이터 정보의 인터페이스는 다음과 같습니다:
export interface Token {
name: string;
logo: string;
symbol: string;
decimals: number;
coinGeckoId: string;
denom: string;
address: string;
tokenType: string;
tokenVerification: string;
}
Bank Balance
특정 주소의 bank balance를 가져온다고 가정하면(아래 TypeScript 예제에서 보여주는 것처럼), 위의 JSON 파일의 메타데이터 정보에 쉽게 매핑할 수 있습니다.
import { config } from "dotenv";
import { getNetworkEndpoints, Network } from "@injectivelabs/networks";
import { ChainGrpcBankApi } from "@injectivelabs/sdk-ts/client/chain";
import { IndexerGrpcPortfolioApi } from "@injectivelabs/sdk-ts/client/indexer";
config();
/** Querying Example */
(async () => {
const endpoints = getNetworkEndpoints(Network.MainnetSentry);
const chainGrpcBankApi = new ChainGrpcBankApi(endpoints.grpc);
const injectiveAddress = "inj...";
const { balances } = chainGrpcBankApi.fetchBalances(injectiveAddress);
console.log(bankBalances);
const metadata = JSON.parse(await readFile("./mainnet.json", "utf8")) as {
denom: string;
address: string;
decimals: string;
logo: string;
name: string;
tokenType: string;
coinGeckoId: string
}[];
const balances = bankBalances.map((balance) => {
const meta = metadata.find((m) => m.denom === balance.denom);
return {
...balance,
...meta,
};
}
console.log(balances)
})();
이제 bank balance에는 필요한 모든 메타데이터 정보(decimals, symbol, name, logo 등)가 포함됩니다.
Spot Market
Bank balance와 마찬가지로 동일한 접근 방식을 사용하여 Spot 마켓 내의 denom을 해당 메타데이터와 매핑할 수 있습니다.
import { config } from "dotenv";
import { readFile } from "fs/promises";
import { getNetworkEndpoints, Network } from "@injectivelabs/networks";
import { IndexerGrpcSpotApi } from "@injectivelabs/sdk-ts/client/indexer";
config();
/** Querying Example */
(async () => {
const endpoints = getNetworkEndpoints(Network.Testnet);
const indexerGrpcSpotApi = new IndexerGrpcSpotApi(endpoints.indexer);
const markets = await indexerGrpcSpotApi.fetchMarkets();
console.log(markets);
const metadata = JSON.parse(await readFile("./mainnet.json", "utf8")) as {
denom: string;
address: string;
decimals: string;
logo: string;
name: string;
tokenType: string;
coinGeckoId: string;
}[];
const marketsWithMetadata = markets.map((market) => {
const baseTokenMetadata = metadata.find(
(m) => m.denom === market.baseDenom
);
const quoteTokenMetadata = metadata.find(
(m) => m.denom === market.quoteDenom
);
return {
...market,
baseTokenMetadata,
quoteTokenMetadata,
};
});
console.log(marketsWithMetadata);
})();
Derivative Market
Bank balance와 마찬가지로 동일한 접근 방식을 사용하여 Derivative 마켓 내의 denom을 해당 메타데이터와 매핑할 수 있습니다.
import { config } from "dotenv";
import { readFile } from "fs/promises";
import { getNetworkEndpoints, Network } from "@injectivelabs/networks";
import { IndexerGrpcDerivativesApi } from "@injectivelabs/sdk-ts/client/indexer";
config();
/** Querying Example */
(async () => {
const endpoints = getNetworkEndpoints(Network.Testnet);
const indexerGrpcDerivativeApi = new IndexerGrpcDerivativesApi(
endpoints.indexer
);
const markets = await indexerGrpcDerivativeApi.fetchMarkets();
console.log(markets);
const metadata = JSON.parse(await readFile("./mainnet.json", "utf8")) as {
denom: string;
address: string;
decimals: string;
logo: string;
name: string;
tokenType: string;
coinGeckoId: string;
}[];
const marketsWithMetadata = markets.map((market) => {
const baseTokenMetadata = metadata.find(
(m) => m.denom === market.baseDenom
);
return {
...market,
quoteTokenMetadata,
};
});
console.log(marketsWithMetadata);
})();
Last modified on April 3, 2026