Appeler un contrat intelligent depuis JavaScript
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]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"Afficher toutCopier
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")23const 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("An error occurred", err)4 return5 }6 console.log("The balance is: ", 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.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("An error occurred", err)6 return7 }8 console.log("Hash of the transaction: " + res)9 })Afficher toutCopier
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: @pettinarip(opens in a new tab), 23 novembre 2023