Chamando um contrato inteligente a partir do JavaScript
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]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"Exibir tudoCopiar
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")23const 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 return5 }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.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("An error occured", err)6 return7 }8 console.log("Hash of the transaction: " + res)9 })Exibir tudoCopiar
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: @pettinarip(opens in a new tab), 23 de novembro de 2023