# Blockchain - COYLA J. Carlos - DWM M1 Estiam - Sources: Hackmd https://hackmd.io/@sensei/ryE5sfHUB # Procedure ## Helpers Je récupère le zip du projet openzepplin-contracts et je récupère les sources suivantes: ERC20 ![](https://i.imgur.com/csCvuPD.png) SafeMath.sol ![](https://i.imgur.com/v4cxMfN.png) Récupération des helpers ![](https://i.imgur.com/53j7OK3.png) ## Contrat avec Remix On crée des fichiers suivants: * ERC20.sol * SafeMath.sol * ICOEstiam.sol (le notre) ![](https://i.imgur.com/nVDWufI.png) On copie le contenue des ressources qu'on a téléchargé avant et on les colle sur ces nouveaux fichiers dans la console web remix ![](https://i.imgur.com/Hs77XIQ.png) J'active les modules pour compiler, Solidy Compiler ![](https://i.imgur.com/6YkW9m8.png) Compiler les fichier .sol ![](https://i.imgur.com/FcdodqY.png) On a les erreurs d'importation suivantes: ![](https://i.imgur.com/K4wBV4C.png) La solution est de dire le chemin des dépendances/importations Changer l'importation des modules le fichier ERC20 ```sol import "./Context.sol"; import "./IERC20.sol"; import "./SafeMath.sol"; ``` Importer les interfaces IERC20 et Context Le fichier ERC20.sol est prêt pour être compilé ![](https://i.imgur.com/58P4Xj4.png) On implémente les fonction balanceOf et transfer Le transfer doit d'abord vérifier les soldes ```sol pragma solidity ^0.5.0; import "./ERC20.sol"; contract ICOEstiam is ERC20 { mapping (address => uint256) private _balances; event Transfer(address indexed _from, address indexed _to, uint256 _value); function balanceOf(address account) public view returns (uint256) { return _balances[account]; } function transfer(address _to, uint256 _value) public returns (bool success) { // verification de solde if (_balances[msg.sender] >= _value && _value > 0) { _balances[msg.sender] -= _value; _balances[_to] += _value; emit Transfer(msg.sender, _to, _value); return true; } else { return false; } } } ``` Ensuite on crée un producer.sol ```sol pragma solidity ^0.5.0; import "./ERC20.sol"; import "./SafeMath.sol"; contract producer is ERC20 { mapping(address => uint256) public balances; mapping(address=>mapping(address=>uint256)) internal allowed; constructor() public { balances[msg.sender]; } event Approval(address _from, address _to, uint256 _value); function balanceOf(address _address) public view returns(uint256) { return balances[_address]; } function approve(address _spender, uint256 _value) public returns(bool) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } function increaseApproval(address _spender, uint _addedValue) public returns (bool) { allowed[msg.sender][_spender] = SafeMath.add(allowed[msg.sender][_spender], _addedValue); emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } ``` On effectue un transfert avec la Javascript VM Avec le debug on peut voir le from et to (destination). Ici le transfer passe car on n'envoie que 0 eth. Vue qu'on a pas une provision de base supérieur à 0. C'est possible d'instancier un solde de base dans le code # Transfers sur Ropsten ![](https://i.imgur.com/SBw7RoO.png) On passe maintenant au déploiement sur ropsten, c'est la blockchain de test. Il faut d'abord aller sur Metamask.io et créer un wallet Dans Remix on change l'environnement ver Injected Web3. On confirme la connexion ![](https://i.imgur.com/w57Yrth.png) Sur Metamask on fait la demande d'ether avec "Déposer" ensuite il faut cliquer sur "Obtenir des Ether" ![](https://i.imgur.com/o5Gt8TX.png) Une fois que notre compte possède des Ether on peut effectue le transfert ![](https://i.imgur.com/B5bmSPf.png) Ensuite on effectue un transfert. Le transfert est passé. On le voit sur "https://ropsten.etherscan.io" ![](https://i.imgur.com/4OGmYBB.png) On peut aussi voir le résultat dans notre wallet ![](https://i.imgur.com/amNxaDO.png) ## Adresse publique https://ropsten.etherscan.io/address/0x56abf6821ffe8f330c993cff0ea3c8685bffa79a