# 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

SafeMath.sol

Récupération des helpers

## Contrat avec Remix
On crée des fichiers suivants:
* ERC20.sol
* SafeMath.sol
* ICOEstiam.sol (le notre)

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

J'active les modules pour compiler, Solidy Compiler

Compiler les fichier .sol

On a les erreurs d'importation suivantes:

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é

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

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

Sur Metamask on fait la demande d'ether avec "Déposer" ensuite il faut cliquer sur "Obtenir des Ether"

Une fois que notre compte possède des Ether on peut effectue le transfert

Ensuite on effectue un transfert. Le transfert est passé. On le voit sur "https://ropsten.etherscan.io"

On peut aussi voir le résultat dans notre wallet

## Adresse publique
https://ropsten.etherscan.io/address/0x56abf6821ffe8f330c993cff0ea3c8685bffa79a