Pular para o conteúdo principal

Chamando um contrato inteligente a partir do JavaScript

transaçõesfront-endJavaScriptweb3.js
Iniciante
jdourlens
EthereumDev(opens in a new tab)
19 de abril de 2020
3 minutos de leitura minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

Neste tutorial, veremos como chamar uma função do contrato inteligente a partir do JavaScript. Primeiro vamos ler o estado de um contrato inteligente (por exemplo, o saldo de um titular do ERC20) e logo vamos modificar o estado da blockchain fazendo uma transferência de token. Você já deve estar familiarizado com configurando um ambiente JavaScript para interagir com a blockchain.

Para esses exemplos, vamos usar o token DAI. Para fins de teste, vamos fazer um fork do blockchain usando ganache-cli e desbloquear 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 do seu endereço e ABI:

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
Copiar

Para este projeto, nós removemos parte do ERC20 ABI para manter apenas as funções balanceOf e transfer, mas você pode encontrar aqui o ERC20 ABI completo(opens in a new tab).

Precisamos então instanciar nosso contrato inteligente:

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

Também vamos configurar dois endereços:

  • quem receberá a transferência e
  • o que nós já desbloqueamos que irá enviá-lo:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CB3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
Copiar

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

Chamada: valor de leitura de um contrato inteligente

O primeiro exemplo chamará um método "constant" e executará seu método de contrato inteligente na EVM sem enviar qualquer transação. Para isso, vamos ler o saldo do ERC20 de um endereço. Leia o nosso artigo sobre tokens ERC20.

Você pode acessar um método instanciado do contrato inteligente para o qual forneceu o ABI. Exemplo: yourContract.methods.methodname. Usando a função call você receberá o resultado da execução da função.

1daiToken.methods.balanceOf(senderAddress).call(função (err, res) {
2 if (err) {
3 console.log("Um erro ocorreu", err)
4 return
5 }
6 console.log("O saldo é: ", res)
7})
Copiar

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

Enviar: enviando 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 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 token para transferências:

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("An error occured", err)
6 return
7 }
8 console.log("Hash of the transaction: " + res)
9 })
Exibir tudo
Copiar

A função de chamada retorna o hash da transação que será minerada no blockchain. No Ethereum, hashes de transação são previsívei. É assim que podemos obter o hash da transação antes de ela ser executada (saiba aqui como os hashes são calculados(opens in a new tab)).

Como função só envia a transação para a blockchain, não podemos ver o resultado até sabermos quando ela é minerada e incluída na blockchain. No próximo tutorial, aprenderemos como aguardar por uma transação que será executada na blockchain com base no hash dela(opens in a new tab).

Última edição: @guilhermevendramini(opens in a new tab), 15 de agosto de 2023

Este tutorial foi útil?