WEB3DEV

Cover image for Exemplo de DEX - Internet Computer
Panegali
Panegali

Posted on • Atualizado em

Exemplo de DEX - Internet Computer

Para permitir aplicações DEFI na IC (Internet Computer), os cânister precisam interagir com cânisters de tokens e cânister livro-razão. Este exemplo de dapp ilustra como facilitar estas interações. Você pode ver uma rápida introdução no YouTube.

A troca de amostras é implementada em Motoko e Rust e pode ser vista rodando na IC.

Arquitetura

O projeto da IC permite cálculos on-chain mais complexos. Em combinação com armazenamento barato, é possível ter livros de pedidos on-chain. Este código de exemplo aproveita estas características e armazena os saldos dos usuários e pedidos dentro do cânister de troca. A funcionalidade de troca de amostras pode ser condensada nas seguintes etapas:

  • A troca toma a custódia dos fundos (mecanismo diferente para tokens e ICP, veja abaixo).
  • A troca atualiza o livro de saldos interno.
  • Os usuários negociam na corretora, fazendo com que a corretora atualize seu livro de saldos interno.
  • A retirada de fundos da corretora devolve a custódia ao usuário.

Interface

Solicitar identificador de conta contábil específico do usuário da corretora. Este identificador de conta exclusivo representa uma subconta específica do usuário na conta do livro razão da corretora, permitindo diferenciar os depósitos dos usuários.

getDepositAddress: () -> (blob);

Iniciar depósito do usuário na corretora. Se o usuário deseja depositar ICP, a corretora move os fundos do endereço de depósito específico do usuário para seu sub endereço padrão e ajusta o saldo de ICP do usuário na DEX. Se o usuário quiser depositar um token DIP, a corretora tenta mover os fundos aprovados para sua conta de tokens e ajusta o saldo do usuário.

deposit: (Token) -> (DepositReceipt);

Pedido de retirada para a corretora. A corretora enviará os fundos de volta ao usuário se o usuário tiver um saldo suficiente.

withdraw: (Token, nat, principal) -> (WithdrawReceipt);

Fazer novo pedido de troca. Se o pedido corresponder a um pedido existente, ele será executado.

placeOrder: (Token, nat, Token, nat) -> (OrderPlacementReceipt);

Permite que o usuário cancele pedidos submetidos.

cancelOrder: (OrderId) -> (CancelOrderReceipt);

Solicite o saldo específico de um token do usuário na corretora .

getBalance: (Token) -> (nat) query;

Taxas

É responsabilidade da corretora deduzir as taxas das negociações. Isto é importante porque a corretora deve pagar taxas por saques e transferências internas.

Passo a passo da corretora de tokens

Esta seção contém um passo-a-passo detalhado das principais funcionalidades da corretora. A maioria das interações requer várias etapas e são simplificadas usando o frontend fornecido. Como o cânister das corretoras são públicos, os usuários avançados podem usar o dfx para interagir com a corretora.

Depositando ICP

O cânister livro-razão fornece uma interface única para que as interações com ICP devam ser resolvidas separadamente.

  • O usuário chama a função getDepositAddress. A resposta contém um identificador de conta único que representa uma subconta específica do usuário controlada pela corretora. A corretora pode identificar o usuário responsável pelos depósitos através deste endereço.
  • O usuário transfere ICP para o endereço de depósito buscado e espera que a transferência seja concluída.
  • Para notificar a corretora, o usuário chama deposit com o token ICP principal. A corretora examinará a subconta do usuário e ajustará o saldo do usuário na corretora. Em uma segunda etapa, a corretora transferirá os fundos da subconta do usuário para sua subconta padrão, onde a corretora mantém todos os seus ICPs.

Depositando Tokens

Há uma série de tokens padrões em desenvolvimento (por exemplo, IS20, DFT, e DRC20); Esta amostra usa DIP20.

  • O usuário chama a função approve do cânister de tokens. Isto dá à corretora a capacidade de transferir fundos para si mesma em nome do usuário.
  • Semelhante ao depósito de ICP, o usuário chama a função deposit da corretora. A corretora então transfere os fundos dos tokens aprovados para si mesma e ajusta o saldo do usuário na corretora

Colocação de ordens

Após depositar fundos na corretora, o usuário pode fazer ordens. Uma ordem consiste em duas tuplas. from: (Token1, amount1) e to: (Token2, amount2) Estas ordens são adicionadas à corretora. O que acontece com estas ordens é específico para a implementação da corretora. Este exemplo apresenta uma corretora simples que só executa ordens exatamente iguais. Esteja ciente de que esta é uma corretora apenas para brincar, e a funcionalidade da corretora é apenas para completar. Dica: A corretora pode ser gananciosa às vezes ;)

Retirada de fundos

Em comparação com o depósito de fundos, a retirada de fundos é mais simples. Como a corretora tem a custódia dos fundos, a corretora enviará os fundos de volta ao usuário em pedidos de withdraw. Os saldos internos da corretora são ajustados de acordo.

Erros comuns

  • Execução simultânea: Se as funções do cânister tiverem declarações await, é possível que a execução seja intercalada. Para evitar erros, é necessário considerar cuidadosamente a colocação de atualizações da estrutura de dados para evitar ataques de gastos duplos.
  • Pontos Flutuantes: As corretoras mais avançadas devem cuidar dos pontos flutuantes e certificar-se de limitar os decimais.
  • Sem pânico depois de esperar: Quando um problema acontece, o estado é revertido. Isto pode causar problemas com a exatidão da corretora.

Este artigo foi publicado no Portal do desenvolvedor Internet Computer. Traduzido por Marcelo Panegali.

Top comments (0)