/ meteredERC20.sol
meteredERC20.sol
1 //SPDX-License-Identifier: MIT 2 pragma solidity ^0.8.0; 3 4 import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 5 import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; 6 import "OdometerInterface.sol"; 7 8 contract meteredToken is ERC20, OdometerInterface, ReentrancyGuard { 9 uint256 masterOdometer; 10 mapping (address => uint256) walletOdometer; 11 12 constructor( 13 string memory name, 14 string memory symbol, 15 uint256 premintAmount, // Specify premint amount in Ether (18 decimals) 16 address premintWallet // Specify address to receive preminted tokens 17 ) ERC20(name, symbol) { 18 if (premintWallet == address(0)) {premintWallet = msg.sender;} 19 _mint(premintWallet, premintAmount * (10 ** uint256(decimals()))); 20 masterOdometer = 0; 21 } 22 23 function transfer(address to, uint256 amount) public nonReentrant override returns (bool) { 24 bool txSuccess = super.transfer(to, amount); 25 masterOdometer = masterOdometer + amount; 26 walletOdometer[msg.sender] = walletOdometer[msg.sender] + amount; 27 return txSuccess; 28 } 29 30 function transferFrom(address from, address to, uint256 amount) public nonReentrant override returns (bool) { 31 bool transferSuccess = super.transferFrom(from, to, amount); 32 masterOdometer = masterOdometer + amount; 33 walletOdometer[from] = walletOdometer[from] + amount; 34 return transferSuccess; 35 } 36 37 function readMasterOdometer() public view returns (uint256) { 38 return masterOdometer; 39 } 40 41 function readWalletOdometer(address wallet) public view returns (uint256) { 42 return walletOdometer[wallet]; 43 } 44 45 }