Pular para o conteúdo principal

Chamando um contrato inteligente a partir do JavaScript

transações
frontend
JavaScript
web3.js
Iniciante
jdourlens
19 de abril de 2020
3 minutos de leitura

Neste tutorial, veremos como chamar uma função de contrato inteligente a partir do JavaScript. Primeiro, lendo o estado de um contrato inteligente (por exemplo, o saldo de um detentor de ERC-20), depois modificaremos o estado da blockchain fazendo uma transferência de token. Você já deve estar familiarizado com a configuração de um ambiente JS para interagir com a blockchain.

Para este exemplo, vamos brincar com o token DAI. Para fins de teste, faremos uma bifurcação (fork) da blockchain usando o ganache-cli e desbloquearemos um endereço que já possui muitos DAI:

ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81

Para interagir com um contrato inteligente, precisaremos de seu endereço e ABI:

Para este projeto, reduzimos a ABI completa do ERC-20 para manter apenas as funções balanceOf e transfer, mas você pode encontrar a ABI completa do ERC-20 aqui (abre em uma nova aba).

Em seguida, precisamos instanciar nosso contrato inteligente:

const web3 = new Web3("http://localhost:8545")

const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)

Também configuraremos dois endereços:

  • o que receberá a transferência e
  • o que já desbloqueamos que a enviará:
const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"

Na próxima parte, chamaremos a função balanceOf para recuperar a quantidade atual de tokens que ambos os endereços possuem.

Call: Lendo o valor de um contrato inteligente

O primeiro exemplo chamará um método “constante” e executará seu método de contrato inteligente na EVM sem enviar nenhuma transação. Para isso, leremos o saldo ERC-20 de um endereço. Leia nosso artigo sobre tokens ERC-20.

Você pode acessar os métodos de um contrato inteligente instanciado para o qual você forneceu a ABI da seguinte forma: yourContract.methods.methodname. Ao usar a função call, você receberá o resultado da execução da função.

daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
  if (err) {
    console.log("An error occurred", err)
    return
  }
  console.log("The balance is: ", res)
})

Lembre-se de que o ERC-20 DAI tem 18 casas decimais, o que significa que você precisa remover 18 zeros para obter o valor correto. Os uint256 são retornados como strings, pois o JavaScript não lida com grandes valores numéricos. Se você não tem certeza de como lidar com números grandes em JS, confira nosso tutorial sobre bignumber.js (abre em uma nova aba).

Send: Enviando uma transação para uma função de contrato inteligente

Para o segundo exemplo, chamaremos a função de transferência (transfer) do contrato inteligente DAI para enviar 10 DAI para o nosso segundo endereço. A função de transferência aceita dois parâmetros: o endereço do destinatário e a quantidade de tokens a transferir:

A função de chamada retorna o hash da transação que será minerada na blockchain. No Ethereum, os hashes de transação são previsíveis - é assim que podemos obter o hash da transação antes que ela seja executada (saiba como os hashes são calculados aqui (abre em uma nova aba)).

Como a função apenas envia a transação para a blockchain, não podemos ver o resultado até sabermos quando ela for minerada e incluída na blockchain. No próximo tutorial, aprenderemos como aguardar a execução de uma transação na blockchain conhecendo seu hash (abre em uma nova aba).