diff --git a/foundry.toml b/foundry.toml index bc87240..9d74069 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,7 +1,10 @@ [profile.default] src = 'src' out = 'out' +solc = "0.8.18" libs = ['lib'] +optimizer = true +optimizerRun = 200 # See more config options https://github.com/foundry-rs/foundry/tree/master/config \ No newline at end of file diff --git a/src/Gas.sol b/src/Gas.sol index aa95425..6167876 100644 --- a/src/Gas.sol +++ b/src/Gas.sol @@ -1,294 +1,196 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.0; +// SPDX-License-Identifier: MIT +pragma solidity 0.8.18; -import "./Ownable.sol"; -contract Constants { - uint256 public tradeFlag = 1; - uint256 public basicFlag = 0; - uint256 public dividendFlag = 1; -} - -contract GasContract is Ownable, Constants { - uint256 public totalSupply = 0; // cannot be updated - uint256 public paymentCounter = 0; +contract GasContract { + uint256 totalSupply; // cannot be updated + uint256 paymentCounter; mapping(address => uint256) public balances; - uint256 public tradePercent = 12; - address public contractOwner; - uint256 public tradeMode = 0; - mapping(address => Payment[]) public payments; + address contractOwner; + // mapping(address => Payment[]) public payments; mapping(address => uint256) public whitelist; address[5] public administrators; - bool public isReady = false; + bool isReady ; +/** enum PaymentType { Unknown, - BasicPayment, - Refund, - Dividend, - GroupPayment - } - PaymentType constant defaultPayment = PaymentType.Unknown; - - History[] public paymentHistory; // when a payment was updated - - struct Payment { - PaymentType paymentType; - uint256 paymentID; - bool adminUpdated; - string recipientName; // max 8 characters - address recipient; - address admin; // administrators address - uint256 amount; + BasicPayment } - - struct History { - uint256 lastUpdate; - address updatedBy; - uint256 blockNumber; - } - uint256 wasLastOdd = 1; - mapping(address => uint256) public isOddWhitelistUser; +*/ + // History[] paymentHistory; // when a payment was updated + struct ImportantStruct { uint256 amount; - uint256 valueA; // max 3 digits - uint256 bigValue; - uint256 valueB; // max 3 digits bool paymentStatus; - address sender; } + + // struct Payment { + // uint256 paymentID; + // bool adminUpdated; + // string recipientName; // max 8 characters + // address recipient; + // address admin; // administrators address + // uint256 amount; + // } + + // struct History { + // uint256 lastUpdate; + // address updatedBy; + // uint256 blockNumber; + // } + + + + mapping(address => ImportantStruct) public whiteListStruct; + error SthWrong(); + event AddedToWhitelist(address userAddress, uint256 tier); - modifier onlyAdminOrOwner() { - address senderOfTx = msg.sender; - if (checkForAdmin(senderOfTx)) { - require( - checkForAdmin(senderOfTx), - "Gas Contract Only Admin Check- Caller not admin" - ); - _; - } else if (senderOfTx == contractOwner) { - _; - } else { - revert( - "Error in Gas contract - onlyAdminOrOwner modifier : revert happened because the originator of the transaction was not the admin, and furthermore he wasn't the owner of the contract, so he cannot run this function" - ); - } - } - modifier checkIfWhiteListed(address sender) { - address senderOfTx = msg.sender; - require( - senderOfTx == sender, - "Gas Contract CheckIfWhiteListed modifier : revert happened because the originator of the transaction was not the sender" - ); - uint256 usersTier = whitelist[senderOfTx]; - require( - usersTier > 0, - "Gas Contract CheckIfWhiteListed modifier : revert happened because the user is not whitelisted" - ); - require( - usersTier < 4, - "Gas Contract CheckIfWhiteListed modifier : revert happened because the user's tier is incorrect, it cannot be over 4 as the only tier we have are: 1, 2, 3; therfore 4 is an invalid tier for the whitlist of this contract. make sure whitlist tiers were set correctly" - ); - _; - } event supplyChanged(address indexed, uint256 indexed); event Transfer(address recipient, uint256 amount); - event PaymentUpdated( - address admin, - uint256 ID, - uint256 amount, - string recipient - ); + // event PaymentUpdated( + // address admin, + // uint256 ID, + // uint256 amount, + // string recipient + // ); event WhiteListTransfer(address indexed); constructor(address[] memory _admins, uint256 _totalSupply) { contractOwner = msg.sender; totalSupply = _totalSupply; - for (uint256 ii = 0; ii < administrators.length; ii++) { + unchecked { + + for (uint256 ii = 0; ii < 5; ++ii) { if (_admins[ii] != address(0)) { administrators[ii] = _admins[ii]; if (_admins[ii] == contractOwner) { balances[contractOwner] = totalSupply; - } else { - balances[_admins[ii]] = 0; - } - if (_admins[ii] == contractOwner) { emit supplyChanged(_admins[ii], totalSupply); - } else if (_admins[ii] != contractOwner) { + } else { + balances[_admins[ii]]; emit supplyChanged(_admins[ii], 0); } } } + } + } + + function onlyAdminOrOwner(address sndr) internal view { + if (contractOwner != sndr || !checkForAdmin(sndr)) { + revert SthWrong(); + } + } +/** function getPaymentHistory() - public + external payable returns (History[] memory paymentHistory_) { return paymentHistory; } - function checkForAdmin(address _user) public view returns (bool admin_) { - bool admin = false; - for (uint256 ii = 0; ii < administrators.length; ii++) { - if (administrators[ii] == _user) { - admin = true; - } - } - return admin; - } - - function balanceOf(address _user) public view returns (uint256 balance_) { - uint256 balance = balances[_user]; - return balance; - } +*/ - function getTradingMode() public view returns (bool mode_) { - bool mode = false; - if (tradeFlag == 1 || dividendFlag == 1) { - mode = true; - } else { - mode = false; + function checkForAdmin(address _user) internal view returns (bool admin_) { + unchecked { + for (uint256 ii = 0; ii < 5; ++ii) { + if (administrators[ii] == _user) { + admin_ = true; + } + } } - return mode; + return admin_; } - - function addHistory(address _updateAddress, bool _tradeMode) - public - returns (bool status_, bool tradeMode_) - { - History memory history; - history.blockNumber = block.number; - history.lastUpdate = block.timestamp; - history.updatedBy = _updateAddress; - paymentHistory.push(history); - bool[] memory status = new bool[](tradePercent); - for (uint256 i = 0; i < tradePercent; i++) { - status[i] = true; - } - return ((status[0] == true), _tradeMode); + function balanceOf(address _user) external view returns (uint256 balance_) { + balance_ = balances[_user]; + } +/** function getPayments(address _user) - public + internal view returns (Payment[] memory payments_) { - require( - _user != address(0), - "Gas Contract - getPayments function - User must have a valid non zero address" - ); return payments[_user]; } - +*/ function transfer( address _recipient, uint256 _amount, string calldata _name - ) public returns (bool status_) { - address senderOfTx = msg.sender; - require( - balances[senderOfTx] >= _amount, - "Gas Contract - Transfer function - Sender has insufficient Balance" - ); - require( - bytes(_name).length < 9, - "Gas Contract - Transfer function - The recipient name is too long, there is a max length of 8 characters" - ); - balances[senderOfTx] -= _amount; - balances[_recipient] += _amount; - emit Transfer(_recipient, _amount); - Payment memory payment; - payment.admin = address(0); - payment.adminUpdated = false; - payment.paymentType = PaymentType.BasicPayment; - payment.recipient = _recipient; - payment.amount = _amount; - payment.recipientName = _name; - payment.paymentID = ++paymentCounter; - payments[senderOfTx].push(payment); - bool[] memory status = new bool[](tradePercent); - for (uint256 i = 0; i < tradePercent; i++) { - status[i] = true; + ) external payable returns (bool status_) { + + if(bytes(_name).length > 8){ + revert SthWrong(); } - return (status[0] == true); + + balances[msg.sender] -= _amount; + unchecked { + balances[_recipient] += _amount; + } + emit Transfer(_recipient, _amount); + return (true); } - +/** function updatePayment( address _user, uint256 _ID, uint256 _amount, PaymentType _type - ) public onlyAdminOrOwner { - require( - _ID > 0, - "Gas Contract - Update Payment function - ID must be greater than 0" - ); - require( - _amount > 0, - "Gas Contract - Update Payment function - Amount must be greater than 0" - ); - require( - _user != address(0), - "Gas Contract - Update Payment function - Administrator must have a valid non zero address" - ); - - address senderOfTx = msg.sender; - - for (uint256 ii = 0; ii < payments[_user].length; ii++) { + ) external payable { + + + onlyAdminOrOwner(msg.sender); + if (_ID < 0 || _amount < 0 || _user == address(0)){ + revert SthWrong(); + } + + unchecked { + + for (uint256 ii = 0; ii < payments[_user].length; ++ii) { if (payments[_user][ii].paymentID == _ID) { payments[_user][ii].adminUpdated = true; payments[_user][ii].admin = _user; payments[_user][ii].paymentType = _type; payments[_user][ii].amount = _amount; - bool tradingMode = getTradingMode(); - addHistory(_user, tradingMode); emit PaymentUpdated( - senderOfTx, + msg.sender, _ID, _amount, payments[_user][ii].recipientName ); } } + } } +*/ function addToWhitelist(address _userAddrs, uint256 _tier) - public - onlyAdminOrOwner + external + payable + { - require( - _tier < 255, - "Gas Contract - addToWhitelist function - tier level should not be greater than 255" - ); + onlyAdminOrOwner(msg.sender); + + if (_tier > 255){ + revert SthWrong(); + } whitelist[_userAddrs] = _tier; if (_tier > 3) { - whitelist[_userAddrs] -= _tier; whitelist[_userAddrs] = 3; - } else if (_tier == 1) { - whitelist[_userAddrs] -= _tier; - whitelist[_userAddrs] = 1; - } else if (_tier > 0 && _tier < 3) { - whitelist[_userAddrs] -= _tier; - whitelist[_userAddrs] = 2; - } - uint256 wasLastAddedOdd = wasLastOdd; - if (wasLastAddedOdd == 1) { - wasLastOdd = 0; - isOddWhitelistUser[_userAddrs] = wasLastAddedOdd; - } else if (wasLastAddedOdd == 0) { - wasLastOdd = 1; - isOddWhitelistUser[_userAddrs] = wasLastAddedOdd; } else { - revert("Contract hacked, imposible, call help"); + whitelist[_userAddrs] = _tier; } emit AddedToWhitelist(_userAddrs, _tier); } @@ -296,37 +198,36 @@ contract GasContract is Ownable, Constants { function whiteTransfer( address _recipient, uint256 _amount - ) public checkIfWhiteListed(msg.sender) { - address senderOfTx = msg.sender; - whiteListStruct[senderOfTx] = ImportantStruct(_amount, 0, 0, 0, true, msg.sender); - - require( - balances[senderOfTx] >= _amount, - "Gas Contract - whiteTransfers function - Sender has insufficient Balance" - ); - require( - _amount > 3, - "Gas Contract - whiteTransfers function - amount to send have to be bigger than 3" - ); - balances[senderOfTx] -= _amount; - balances[_recipient] += _amount; - balances[senderOfTx] += whitelist[senderOfTx]; - balances[_recipient] -= whitelist[senderOfTx]; + ) external payable { + + whiteListStruct[msg.sender] = ImportantStruct(_amount, true); + if(_amount < 3 ){ + revert SthWrong(); + } + if (_amount > balances[msg.sender]){ + revert SthWrong(); + } + + balances[msg.sender] -= _amount; + unchecked { + balances[_recipient] += _amount; + balances[msg.sender] += whitelist[msg.sender]; + } + balances[_recipient] -= whitelist[msg.sender]; emit WhiteListTransfer(_recipient); } - function getPaymentStatus(address sender) public returns (bool, uint256) { + function getPaymentStatus(address sender) external view returns (bool, uint256) { return (whiteListStruct[sender].paymentStatus, whiteListStruct[sender].amount); } - receive() external payable { + fallback() external payable { payable(msg.sender).transfer(msg.value); } - - fallback() external payable { - payable(msg.sender).transfer(msg.value); + receive() external payable { + payable(msg.sender).transfer(msg.value); } } \ No newline at end of file diff --git a/src/Ownable.sol b/src/Ownable.sol index a8736c8..7a42b3d 100644 --- a/src/Ownable.sol +++ b/src/Ownable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.0; +pragma solidity 0.8.18; /** * @dev Provides information about the current execution context, including the diff --git a/test/Gas.UnitTests.t.sol b/test/Gas.UnitTests.t.sol index 3ee8423..af2ebcc 100644 --- a/test/Gas.UnitTests.t.sol +++ b/test/Gas.UnitTests.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; +pragma solidity 0.8.18; import "forge-std/Test.sol"; import "../../src/Gas.sol";