Contract Source Code:
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
interface ISWPx {
function initialMint(address _recipient) external;
function totalSupply() external view returns (uint);
function balanceOf(address) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address, uint) external returns (bool);
function transferFrom(address,address,uint) external returns (bool);
function mint(address, uint) external returns (bool);
function minter() external returns (address);
}
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.13;
import {ISWPx} from "./interfaces/ISWPx.sol";
contract SWPx is ISWPx {
string public constant name = "SwapX";
string public constant symbol = "SWPx";
uint8 public constant decimals = 18;
uint public totalSupply = 0;
mapping(address => uint) public balanceOf;
mapping(address => mapping(address => uint)) public allowance;
bool public initialMinted;
address public minter;
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
constructor() {
minter = msg.sender;
_mint(msg.sender, 0);
}
// No checks as its meant to be once off to set minting rights to BaseV1 Minter
function setMinter(address _minter) external {
require(msg.sender == minter);
minter = _minter;
}
// Initial mint: total 42M
function initialMint(address _recipient) external {
require(msg.sender == minter && !initialMinted);
initialMinted = true;
_mint(_recipient, 42 * 1e6 * 1e18);
}
function approve(address _spender, uint _value) external returns (bool) {
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function _mint(address _to, uint _amount) internal returns (bool) {
totalSupply += _amount;
unchecked {
balanceOf[_to] += _amount;
}
emit Transfer(address(0x0), _to, _amount);
return true;
}
function _burn(address account, uint256 amount) internal {
uint256 accountBalance = balanceOf[account];
require(accountBalance >= amount && amount > 0, "burn amount exceeds balance or zero");
unchecked {
balanceOf[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
}
function _transfer(address _from, address _to, uint _value) internal returns (bool) {
balanceOf[_from] -= _value;
unchecked {
balanceOf[_to] += _value;
}
emit Transfer(_from, _to, _value);
return true;
}
function transfer(address _to, uint _value) external returns (bool) {
return _transfer(msg.sender, _to, _value);
}
function transferFrom(address _from, address _to, uint _value) external returns (bool) {
uint allowed_from = allowance[_from][msg.sender];
if (allowed_from != type(uint).max) {
allowance[_from][msg.sender] -= _value;
}
return _transfer(_from, _to, _value);
}
function mint(address account, uint amount) external returns (bool) {
require(msg.sender == minter, 'not allowed');
_mint(account, amount);
return true;
}
function burn(uint amount) external {
_burn(msg.sender, amount);
}
}