Pular para o conteúdo principal

Chamando um contrato inteligente a partir do JavaScript

transações
front-end
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, leremos o estado de um contrato inteligente (p. ex., o saldo de um detentor de ERC20), depois modificaremos o estado da cadeia de blocos fazendo uma transferência de token. Você já deve estar familiarizado com a configuração de um ambiente JS para interagir com a cadeia de blocos.

Para este exemplo, vamos interagir com o token DAI. Para fins de teste, faremos uma bifurcação da cadeia de blocos usando ganache-cli e desbloquearemos um endereço que já tenha muito 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 IAB:

1const ERC20TransferABI = [
2 {
3 constant: false,
4 inputs: [
5 {
6 name: "_to",
7 type: "address",
8 },
9 {
10 name: "_value",
11 type: "uint256",
12 },
13 ],
14 name: "transfer",
15 outputs: [
16 {
17 name: "",
18 type: "bool",
19 },
20 ],
21 payable: false,
22 stateMutability: "nonpayable",
23 type: "function",
24 },
25 {
26 constant: true,
27 inputs: [
28 {
29 name: "_owner",
30 type: "address",
31 },
32 ],
33 name: "balanceOf",
34 outputs: [
35 {
36 name: "balance",
37 type: "uint256",
38 },
39 ],
40 payable: false,
41 stateMutability: "view",
42 type: "function",
43 },
44]
45
46const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"
Exibir tudo

Para este projeto, removemos parte da IAB do ERC20 para manter apenas as funções balanceOf e transfer, mas você pode encontrar a IAB completa do ERC20 aqui (opens in a new tab).

Em seguida, precisamos instanciar nosso contrato inteligente:

1const web3 = new Web3("http://localhost:8545")
2
3const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)

Também configuraremos dois endereços:

  • aquele que receberá a transferência e
  • aquele que já desbloqueamos e que fará o envio:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"

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

Chamada: 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 ERC20 de um endereço. Leia nosso artigo sobre tokens ERC20.

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

1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
2 if (err) {
3 console.log("Ocorreu um erro", err)
4 return
5 }
6 console.log("O saldo é: ", res)
7})

Lembre-se de que o DAI ERC20 tem 18 casas decimais, o que significa que você precisa remover 18 zeros para obter o valor correto. Valores uint256 são retornados como strings, pois o JavaScript não lida com valores numéricos grandes. Se você não tiver certeza de como lidar com números grandes em JS, confira nosso tutorial sobre bignumber.js (opens in a new tab).

Envio: enviando uma transação para uma função de contrato inteligente

Para o segundo exemplo, chamaremos a função de transferência do contrato inteligente DAI para enviar 10 DAI para 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 ser transferida:

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("Ocorreu um erro", err)
6 return
7 }
8 console.log("Hash da transação: " + res)
9 })
Exibir tudo

A função de chamada retorna o hash da transação que será minerada na cadeia de blocos. No Ethereum, os hashes de transação são previsíveis - é assim que podemos obter o hash da transação antes de ela ser executada (aprenda como os hashes são calculados aqui (opens in a new tab)).

Como a função apenas envia a transação para a cadeia de blocos, não podemos ver o resultado até sabermos quando ela for minerada e incluída na cadeia de blocos. No próximo tutorial, aprenderemos como esperar que uma transação seja executada na cadeia de blocos, conhecendo seu hash (opens in a new tab).

Última atualização da página: 21 de outubro de 2025

Este tutorial foi útil?