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"47Exibir 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)4Copiar
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"3Copiar
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})8Copiar
Lembre-se que DAI ERC20 tem 18 decimais, o que significa que você precisa remover 18 zeros para obter o valor correto. uint256 are returned as strings as JavaScript does not handle big numeric values. 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 })10Exibir 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).