Tutoriel Uniswap – Création d’un échange décentralisé

Voici un tutoriel permettant de mettre en place un échange décentralisé minimaliste. En effet, il permettra uniquement d’échanger la paire ETH/DAI. Le token d’entrée étant l’ETH et celui de sortie le DAI.

Détails techniques importants : Ce tutoriel est codé en JavaScript sur une machine Ubuntu. Rappelons que ce développement exploite la version 2 d’Uniswap au sein du réseau Kovan d’Ethereum (Testnet).

1. Mise en place de Web3

var Web3 = require('web3');
var url = 'https://kovan.infura.io/v3/1ddecb8f28c94eab8d84230e8d109bdd';
var web3 = new Web3(url);

Ajoutons la bibliothèque Web3 à notre script que nous faisons interagir avec un noeud Kovan d’Ethereum qui nous est fourni par Infura.

2. Récupération de l’ABI des smart contracts

var abi_router = [ … ];
var abi_DAI = [ … ];

Récupérons l’ABI du smart contract Router ici, ainsi que celle du DAI ici.

3. Mise en place d’un wallet

var wallet = await web3.eth.accounts.wallet.add(‘0x87214a3bad248a1e82e0a86a107bdb020d740e9d3ce4f8c64b025f0f1e60adcd’);

Ajoutons un wallet existant, alimenté auparavant grâce à un faucet Kovan.

4. Création des instances de smart contracts

var router = new web3.eth.Contract(abi_router,'0xf164fC0Ec4E93095b804a4795bBe1e041497b92a');
var Dai = new web3.eth.Contract(abi_Dai,'0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD');

Créons une instance du smart contract Router avec son ABI et son adresse sur le réseau Kovan. Faisons de même pour le DAI.

5. Mise en place de la transaction

var path = ['0xd0A1E359811322d97991E03f863a0C30C2cF029C','0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD'];
var time = Date.now()+15000;
var gasEstimate = await router.methods.swapExactETHForTokens(0,path,wallet.address,time).estimateGas({from:wallet.address,value:10000000000000000});

La variable path est un tableau comportant les tokens de l’échange, ici le WETH et le DAI. Nous avons récupéré ces deux adresses au niveau du smart contract Factory sur kovan.etherscan.io dans l’onglet Events, lequel rencense toutes les paires d’échanges existantes.
La variable time représente l’heure actuelle avec 15 secondes supplémentaires, c’est à dire le temps qu’il faut pour qu’une transaction soit validée sur la Blockchain.
La variable gasEstimate représente le gas qu’il faut fournir pour la transaction à venir.

6. Déploiement de la transaction

var transaction = await router.methods.swapExactETHForTokens(0,path,wallet.address,time).send({from:wallet.address,gas:gasEstimate,value:10000000000000000});

Cette fonction lance la transaction sur la Blockchain. Celle-ci envoie un montant de 0.1 ETH afin de récupérer l’équivalent en DAI.

7. Vérification sur kovan.etherscan.io

Récupérons l’adresse de notre Wallet (0x102fFcdc8E00A259695b4E243c9724435aD625bB) que nous recherchons
sur kovan.etherscan.io. Nous pouvons alors constater que la transaction a bien été effectuée.

Intégralité du code

var Web3 = require('web3');
var url = 'https://kovan.infura.io/v3/1ddecb8f28c94eab8d84230e8d109bdd';
var web3 = new Web3(url);

var abi_router = [ … ];
var abi_DAI = [ … ];

async function run() {

    var wallet = await web3.eth.accounts.wallet.add('0x87214a3bad248a1e82e0a86a107bdb020d740e9d3ce4f8c64b025f0f1e60adcd');
    var balance = await web3.eth.getBalance(wallet.address);
    console.log('Adresse de mon Wallet : ' + wallet.address);
    console.log('Solde avant swap (en WEI) : ' + balance);
    
    var router = new web3.eth.Contract(abi_router,'0xf164fC0Ec4E93095b804a4795bBe1e041497b92a');

    var Dai = new web3.eth.Contract(abi_Dai,'0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD');

    var path = ['0xd0A1E359811322d97991E03f863a0C30C2cF029C','0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD'];    
    var time = Date.now()+15000;
    var gasEstimate = await router.methods.swapExactETHForTokens(0,path,wallet.address,time).estimateGas({from:wallet.address,value:10000000000000000});
    console.log('Frais de transaction estimés (en WEI) : ' + gasEstimate);

    var transaction = await router.methods.swapExactETHForTokens(0,path,wallet.address,time).send({from:wallet.address,gas:gasEstimate,value:10000000000000000});

    var balance_after = await web3.eth.getBalance(wallet.address);
    console.log('Solde après swap (en WEI) : ' + balance_after);

    var balance_Dai = await Dai.methods.balanceOf(wallet.address).call();
    console.log('Solde en Dai : ' + balance_Dai);
}
run();
Thème : Overlay par Kaira. © Copyright 2020. Tous droits réservés.
Paris, France