Passer au contenu principal

Appeler un contrat intelligent depuis JavaScript

transactionsfrontendJavaScriptweb3.js
Débutant
jdourlens
EthereumDev(opens in a new tab)
19 avril 2020
3 minutes de lecture minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

Dans ce tutoriel, nous allons voir comment appeler une fonction de contrat intelligent à partir de JavaScript. La première consiste à lire l'état d'un contrat intelligent (par exemple, le solde d'un détenteur d'ERC20), puis nous modifierons l'état de la blockchain en effectuant un transfert de jeton. Vous devriez déjà être familiarisé avec la configuration d'un environnement JS pour interagir avec la blockchain.

Pour cet exemple, nous allons jouer avec le jeton DAI, à des fins de test, nous allons créer une fourche de la blockchain en utilisant ganache-cli et débloquer une adresse qui a déjà beaucoup de DAI :

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

Pour interagir avec un contrat intelligent, nous avons besoin de son adresse et de son 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"
Afficher tout
Copier

Pour ce projet, nous avons dépouillé l'ABI ERC20 complet pour ne garder que les fonctions balanceOf et transfer mais vous pouvez trouver l'ABI ERC20 complète ici(opens in a new tab).

Nous devons ensuite instancier notre contrat intelligent :

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

Nous allons également mettre en place deux adresses :

  • celle qui recevra le transfert et
  • celle déjà débloquée qui l'enverra :
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
Copier

Dans la partie suivante, nous allons appeler la fonction balanceOf pour récupérer la quantité actuelle de jetons que les deux adresses détiennent.

Appel : Lire la valeur d'un contrat intelligent

Le premier exemple appelle une méthode « constante » et exécute sa méthode de contrat intelligent dans l'EVM sans envoyer de transaction. Pour cela, nous allons lire le solde ERC20 d'une adresse. Lisez notre article sur les jetons ERC20.

Vous pouvez accéder aux méthodes d'un contrat intelligent instancié pour lequel vous avez fourni l'ABI comme suit : yourContract.methods.methodname. En utilisant la fonction call, vous recevrez le résultat de l'exécution de la fonction.

1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
2 if (err) {
3 console.log("Une erreur s'est produite", err)
4 return
5 }
6 console.log("Le solde est : ", res)
7})
Copier

N'oubliez pas que le DAI ERC20 comporte 18 décimales, ce qui signifie que vous devez supprimer 18 zéros pour obtenir le montant correct. Les uint256 sont retournés sous forme de chaînes de caractères, car JavaScript ne gère pas les grandes valeurs numériques. Si vous ne savez pas comment traiter les grands nombres dans JS, consultez notre tutoriel sur bignumber.js(opens in a new tab).

Envoyer : Envoi d'une transaction à une fonction de contrat intelligent

Pour le deuxième exemple, nous allons appeler la fonction de transfert du contrat intelligent DAI pour envoyer 10 DAI à notre deuxième adresse. La fonction de transfert accepte deux paramètres : l'adresse du destinataire et le montant du jeton à transférer.

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("Une erreur s'est produite", err)
6 return
7 }
8 console.log("Hash de la transaction : " + res)
9 })
Afficher tout
Copier

La fonction d'appel renvoie le hachage de la transaction qui sera miné dans la blockchain. Sur Ethereum, les hachages de transaction sont prévisibles - c'est ainsi que nous pouvons obtenir le hachage de la transaction avant qu'elle ne soit exécutée (apprenez comment les hachages sont calculés ici(opens in a new tab)).

Comme la fonction ne fait que soumettre la transaction à la blockchain, nous ne pouvons pas voir le résultat avant de savoir quand elle est minée et incluse dans la blockchain. Dans le prochain tutoriel, nous apprendronscomment attendre pour qu'une transaction soit exécutée sur la blockchain en connaissant son hachage(opens in a new tab).

Dernière modification: @PaulOurs(opens in a new tab), 15 août 2023

Ce tutoriel vous a été utile ?