/ 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  }