WEB3DEV

Cover image for Biblioteca de Criptoativos da Ledger
Fernando Teixeira Barros
Fernando Teixeira Barros

Posted on

Biblioteca de Criptoativos da Ledger

Este é um artigo da documentação da Ledger.com traduzido por Fernando T. Barros. O original em inglês pode ser encontrado aqui.

O pacote @ledgerhq/cryptoassets contém todas as definições de criptoativos que podem ser úteis para o Ledger Live.

O Ledger Live lida com diferentes tipos de moedas e ativos: moedas fiduciárias, criptomoedas e tokens. Todos eles compartilham conceitos semelhantes, mas têm especificidades, que são definidas como um modelo de moeda.

Todos os tipos podem ser encontrados em @ledgerhq/cryptoassets/src/types.ts

O modelo Currency (Moeda)

Essencialmente, todas as moedas compartilham esse campo comum:

  • name: string: o nome de exibição de uma moeda. Por exemplo "Bitcoin"ou "Euro".
  • ticker: string: utilizado para o nome do ticker nas corretoras e para taxas (por exemplo, BTC ou EUR).
  • countervalueTicker?: string: um apelido para o ticker (ou ticker alternativo)
  • units: Unit[]: todas unidades disponíveis da moeda (veja abaixo o que é uma Unidade). por convenção, [0] é o padrão e tem a magnitude "mais alta".
  • disableCountervalue?: boolean: se disponível, este campo expressa que devemos assumir que não há valor de contador válido para esta moeda. (porque ou não podemos trocá-la ou não está disponível o suficiente para assumir a ativação de seu valor)
  • symbol?: string: se disponível, é um símbolo curto para a moeda. Na prática, atualmente não é usado e pode ser descartado.

Unidade

type Unit = {
  // nome de exibição de uma unidade (exemplo: satoshi)
  name: string,
  // palavra para usar quando formatar a unidade. como 'BTC' ou 'USD'
  code: string,
  // número de dígitos após o '.' no contexto desta unidade.
  magnitude: number,
  // deve imprimir todos os dígitos mesmo quando são 0 (geralmente: verdadeiro para fiduciárias, falso para criptos)
  showAllDigits?: boolean
};
Enter fullscreen mode Exit fullscreen mode

Uma unidade descreve uma determinada representação de uma moeda para humanos. Uma moeda pode ter muitas unidades, por exemplo, podemos supor que o Euro tenha euros e centavos. Podemos definir Bitcoin como tendo: bitcoin, mBTC, bit, satoshi (mas isso depende de nós).

Existem, no entanto, duas propriedades essenciais que devemos respeitar:

  • a primeira unidade ( [0]) em um vetor de unidades é a unidade mais alta, normalmente a unidade padrão e comumente usada (euro, bitcoin)
  • a última unidade deve ter uma magnitude de 0: é a menor unidade que determina a magnitude da moeda (a unidade mais atômica representável nesta moeda) e impulsiona a representação de inteiros.

Aqui está um exemplo de unidades do Bitcoin:

[
  {
    name: "bitcoin",
    code: "BTC",
    magnitude: 8
  },
  {
    name: "mBTC",
    code: "mBTC",
    magnitude: 5
  },
  {
    name: "bit",
    code: "bit",
    magnitude: 2
  },
  {
    name: "satoshi",
    code: "sat",
    magnitude: 0
  }
];
Enter fullscreen mode Exit fullscreen mode

O campo showAllDigits é geralmente não definido para todas as criptomoedas e definido para moedas fiduciárias como verdadeiro (mas há exceções). Ele força uma unidade a exibir todos os dígitos, mesmo que sejam todos zeros.

Nós não queremos ‘showAllDigits’ para moedas porque elas geralmente têm muitas magnitudes, por exemplo, Ethereum tem 18 que virariam ETH 42.100000000000000000. Em vez disso, queremos ETH 42.1.

Pelo contrário, é comumente desejado que, para moedas fiduciárias populares como o EUR, sempre exibamos EUR 42.10 e nunca EUR 42.1.

Na biblioteca ‘live-common’, nosso formatador é implementado pelo formatCurrencyUnit que recebe um valor BigNumber e uma Unit (e muitas outras opções disponíveis).

Campos específicos da CryptoCurrency

O nível CryptoCurrency introduz muitos campos que são exclusivamente específicos para moedas criptográficas.

type CryptoCurrency = CurrencyCommon & {
  type: "CryptoCurrency",
  // id único interno de uma criptomoeda
  id: string,
  // define se a cripto é uma bifurcação de outra moeda. ajuda tratar divisão/junção
  forkedFrom?: string,
  // nome do app que mostra no Manager
  managerAppName: string,
  // tipo da moeda de acordo com o slip44. ISSO NÃO GARANTE UNICIDADE entre as moedas (ex: testnest,...)
  coinType: number,
  // o nome do esquema usado para formatar um URI (sem os ':')
  scheme: string,
  // usado para IU (Interface do Usuário)
  color: string,
  // um nome para implementação (algumas moedas compartilham uma implementação em comum como bitcoin ou ethereum) - corresponde ao nome do diretório 'family' da biblioteca 'live-commom' 
  family: string,
  // o tempo esperado de um bloco
  blockAvgTime?: number, // em segundos
  supportsSegwit?: boolean,
  supportsNativeSegwit?: boolean,
  // se definido, essa moeda é uma testnet pra outra cripto (id);
  isTestnetFor?: string,
  // deve ser definido para a família bitcoin
  bitcoinLikeInfo?: {
    P2PKH: number,
    P2SH: number
  },
  // deve ser definido para a família ethereum
  ethereumLikeInfo?: {
    chainId: number
  },
  explorerViews: ExplorerView[],
  terminated?: {
    link: string
  }
};
Enter fullscreen mode Exit fullscreen mode

• Dica: CoinType é geralmente encontrado em github.com/satoshilabs/slips/blob/master/slip-0044.md , embora a unicidade não seja garantida em todas as redes (testnets, etc...).

ExplorerView (Visualização do Explorador)

Você pode definir um ou vários exploradores com urls, que serão usados ​​para links externos no Ledger Live.

type ExplorerView = {
  // url para transações com parâmetro $hash 
  tx?: string,
  // url para endereços com parâmetro $address
  address?: string,
  // url para um token com parâmetros $contractAddress e $address 
  token?: string
};
Enter fullscreen mode Exit fullscreen mode

• Dica: Encontre um explorador confiável. Se você encontrar mais de um explorador, liste-os do mais para o menos popular. O Ledger Live provavelmente usará o primeiro explorador como padrão.

Campos específicos do TokenCurrency

Os tokens também estão disponíveis através do pacote cryptoassets. Regularmente, os tokens ERC20, TRC10 e TRC20 são mantidos automaticamente. Mas se a sua blockchain suporta tokens e você gostaria de adicioná-los, sinta-se à vontade para entrar em contato conosco.

type TokenCurrency = CurrencyCommon & {
  type: "TokenCurrency",
  id: string,
  ledgerSignature?: string,
  contractAddress: string,
  // a moeda que ele pertence. ex. 'ethereum'
  parentCurrency: CryptoCurrency,
  // o tipo de token na blockchain que ele pertence. ex. 'erc20'
  tokenType: string
};
Enter fullscreen mode Exit fullscreen mode

Adicionando MyCoin

Certifique-se de que antes de integrar sua moeda ao Ledger Live, sua moeda esteja bem definida em @ledgerhq/cryptoassets/src/currencies.js

mycoin: {
   type: "CryptoCurrency",
   id: "mycoin",
   coinType: 8008, // O tipo slip-0044 da moeda, se registrado
   name: "MyCoin",
   managerAppName: "MyCoin", // nome do nano aplicativo no manager, case-sensitive
   ticker: "MYC",
   countervalueTicker: "MYC", // dependendo dao api countervaluevalor do contador api
   scheme: "mycoin",
   color: "#E6007A", // cor a ser exibida na área de trabalho ativaao vivo e no celular
   family: "mycoin", // nome da pasta no live-common/desktop e mobile
   units: [
    {
       name: "MYC",
       code: "MYC",
       magnitude: 8,
    },
    {
       name: "SmallestUnit",
       code: "SMALLESTUNIT",
       magnitude: 0,
    },
  ],
   explorerViews: [
    {
       address: "https://mycoinexplorer.com/account/$address", // url para explorar um endereço
       tx: "https://mycoinexplorer.com/transaction/$hash", // url para explorar uma transação
       token: "https://mycoinexplorer.com/token/$contractAddress/?a=$address", // url para explorar um endereço de token
    },
  ],
},
Enter fullscreen mode Exit fullscreen mode

Latest comments (0)