July 30, 2023

Injective Typescript Token Metadata

Активы в Injective представлены в виде деномов. Деномы (и суммы) не читаются человеком, поэтому нам необходимо иметь возможность "прикреплять" к токену метаданные для конкретного денома. Это можно сделать с помощью пакета @injectivelabs/token-metadata.
Давайте вспомним, какие типы деномов мы рассматривали в разделе "Начало работы":
Родные деномы - существует только один дензнак этого типа, дензнак inj, который представляет собой родную монету Injective,
Peggy denoms - эти деномы представляют активы, переведенные из Ethereum в Injective с помощью моста Peggy. Они имеют следующий формат peggy{ERC20_CONTRACT_ADDRESS}.
Деномы IBC - эти деномы представляют собой активы, переведенные из других цепочек Cosmos через мост IBC. Они имеют следующий формат ibc/{hash}.
Деномы страховых фондов - эти деномы представляют собой токены акций страховых фондов, созданных на Injective. Они имеют следующий формат share{id}.
Factory Denoms - эти деномы являются представлением токена CW20 из Cosmwasm на модуле нативного банка Injective. Они имеют следующий формат factory/{CW20_ADAPTER_CONTRACT}/{CW20_CONTRACT_ADDRESS}, где CW20_ADAPTER_CONTRACT - это адрес контракта адаптера, который выполняет преобразование между CW20 и родным банковским модулем.
Токен - это просто дензнак в цепочке Injective с некоторой метаинформацией. Метаданные включают в себя такую информацию, как символ, название, десятичные знаки, логотип для конкретного денома и т.д. Он имеет следующий интерфейс (более подробную информацию можно найти в файле types.ts)

export interface Token { denom: string

name: string logo: string symbol: string decimals: number tokenType?: TokenType coinGeckoId: string

ibc?: IbcTokenMeta spl?: SplTokenMeta cw20?: Cw20TokenMeta cw20s?: Cw20TokenMetaWithSource[] // When there are multiple variations of the same CW20 token erc20?: Erc20TokenMeta }

Использование
Самый простой способ получить информацию о метаданных токена для конкретного денома - это использовать класс TokenFactory и воспользоваться его методами:

import { TokenFactory } from '@injectivelabs/token-metadata' import { Network } from '@injectivelabs/networks'

const network = Network.Mainnet const tokenFactory = TokenFactory.make(network) // you can omit the network argument if you want to have the TokenFactory for mainnet

// After instantiating, we can start using it in our dApp const denom = 'peggy0x...' const token = tokenFactory.toToken(denom)

console.log(token)

При использовании TokenFactory необходимо учитывать несколько крайних случаев:
Если вы пытаетесь запросить метаданные токена для денома, не существующего в списке токенов, то TokenFactory вернет неопределенный результат. В этом случае необходимо следовать нашему руководству CONTRIBUTION для добавления информации о метаданных токена в пакет.
ВАЖНО TokenFactory не имеет логики для запроса трассировки денома на наличие денома IBC. Вместо этого у нас есть список предопределенных хэшей IBC, которые мы используем для получения метаданных. Как реализовать эту возможность, мы рассмотрим ниже.

DenomClient
В составе пакета @injectivelabs/sdk-ts имеется абстрактный класс DenomClient, который использует класс TokenFactory под капотом и имеет механизм кэширования IBC-хэшей. С его помощью вы можете гарантировать, что получите всю информацию о токенах для деномов, используемых в вашем приложении.
Использование довольно простое, вот пример:

import { DenomClient } from '@injectivelabs/sdk-ts' import { Network } from '@injectivelabs/networks'

const network = Network.Mainnet const denomClient = new DenomClient(network) // you can omit the network argument if you want to have the TokenFactory for mainnet

// After instantiating, we can start using it in our dApp const denom = 'peggy0x...'

/** * We have to use await here in case the IBC denom hash is not * in the list of hardcoded IBC hashes so we fetch all of the * denom traces from the chain and cache them in the local instance of the * DenomClient class so we can access them easily */ const token = await denomClient.getDenomToken(denom)

console.log(token)