Denom 元数据

一个 denom 是 Injective 的Bank模块中如何表示代币的方式。这些资产可以用于交易、在交易模块上创建新市场、参与拍卖、转移到其他地址等。

对于开发者和交易者来说,最大的痛点之一就是获取这些 denoms 的元数据。元数据包括小数位数(decimals)、符号(symbol)、名称(name)等。

本指南将展示如何直接从 injective-lists 仓库获取 denom 元数据并将其映射到您的 denom。您还可以使用这种方法来映射现货和衍生品市场的 denom's 元数据。

Injective Lists

injective-lists 是一个公开的仓库,保存了 Injective 上所有代币的元数据。它是该信息的最新和最可靠来源。您可以通过为此仓库创建一个 PR 来提交您的代币信息。确保正确指定字段,特别是 "denom" 字段(请阅读代币标准),该字段应根据代币标准使用相应的 ibcpeggyfactory 前缀。

元数据每 30 分钟自动从链上获取新 denoms,并重新生成 json 文件。

您可以访问 https://github.com/InjectiveLabs/injective-lists/tree/master/json/tokens 文件夹,基于环境下载元数据。

一旦您获得了 JSON 文件,您需要将元数据与特定的 denom 映射。 该元数据的接口如下:

export interface Token {
  name: string
  logo: string
  symbol: string
  decimals: number
  coinGeckoId: string
  denom: string
  address: string
  tokenType: string
  tokenVerification: string
}

Bank 余额

假设您获取了某个地址的Bank余额(如下例所示,使用 TypeScript),您可以轻松地将其映射到上述 JSON 文件中的元数据。

import { config } from "dotenv";
import {
  ChainGrpcBankApi,
  IndexerGrpcAccountPortfolioApi,
} from "@injectivelabs/sdk-ts";
import { getNetworkEndpoints, Network } from "@injectivelabs/networks";

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)
})();

现在,您的银行余额包含了所有您需要的元数据(包括小数位(decimals)、符号(symbol)、名称(namename)、logo 等)。

现货市场

与银行余额类似,您可以使用相同的方法将现货市场中的代币 denom 映射到其元数据。

import { config } from "dotenv";
import { IndexerGrpcSpotApi } from "@injectivelabs/sdk-ts";
import { getNetworkEndpoints, Network } from "@injectivelabs/networks";
import { readFile } from "fs/promises";

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);
})();

衍生品市场

Bank余额类似,您可以使用相同的方法将衍生品市场中的代币 denom 映射到其元数据。

import { config } from "dotenv";
import { IndexerGrpcDerivativeApi } from "@injectivelabs/sdk-ts";
import { getNetworkEndpoints, Network } from "@injectivelabs/networks";
import { readFile } from "fs/promises";

config();

/** Querying Example */
(async () => {
  const endpoints = getNetworkEndpoints(Network.Testnet);
  const indexerGrpcDerivativeApi = new IndexerGrpcDerivativeApi(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 updated