This contract's source code is verified! Compiler
0.7.5+commit.eb77ed08
File 1 of 7: Address.sol
pragma solidity 0.7.5;
library Address {
function isContract (address account ) internal view returns (bool ) {
uint256 size;
assembly { size := extcodesize (account) }
return size > 0 ;
}
function sendValue (address payable recipient, uint256 amount ) internal {
require (address (this ).balance > = amount, "Address: insufficient balance" );
(bool success, ) = recipient.call { value : amount }("" );
require (success, "Address: unable to send value, recipient may have reverted" );
}
function functionCall (address target, bytes memory data ) internal returns (bytes memory ) {
return functionCall(target, data, "Address: low-level call failed" );
}
function functionCall (address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory ) {
return _functionCallWithValue(target, data, 0 , errorMessage);
}
function functionCallWithValue (address target, bytes memory data, uint256 value ) internal returns (bytes memory ) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed" );
}
function functionCallWithValue (address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory ) {
require (address (this ).balance > = value, "Address: insufficient balance for call" );
require (isContract(target), "Address: call to non-contract" );
(bool success, bytes memory returndata) = target.call { value : value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _functionCallWithValue (address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory ) {
require (isContract(target), "Address: call to non-contract" );
(bool success, bytes memory returndata) = target.call { value : weiValue }(data);
if (success) {
return returndata;
} else {
if (returndata.length > 0 ) {
assembly {
let returndata_size := mload (returndata)
revert (add (32 , returndata), returndata_size)
}
} else {
revert (errorMessage);
}
}
}
function functionStaticCall (address target, bytes memory data ) internal view returns (bytes memory ) {
return functionStaticCall(target, data, "Address: low-level static call failed" );
}
function functionStaticCall (address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory ) {
require (isContract(target), "Address: static call to non-contract" );
(bool success, bytes memory returndata) = target.staticcall (data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall (address target, bytes memory data ) internal returns (bytes memory ) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed" );
}
function functionDelegateCall (address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory ) {
require (isContract(target), "Address: delegate call to non-contract" );
(bool success, bytes memory returndata) = target.delegatecall (data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult (bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory ) {
if (success) {
return returndata;
} else {
if (returndata.length > 0 ) {
assembly {
let returndata_size := mload (returndata)
revert (add (32 , returndata), returndata_size)
}
} else {
revert (errorMessage);
}
}
}
function addressToString (address _address ) internal pure returns (string memory ) {
bytes32 _bytes = bytes32 (uint256 (_address));
bytes memory HEX = "0123456789abcdef" ;
bytes memory _addr = new bytes (42 );
_addr[0 ] = '0' ;
_addr[1 ] = 'x' ;
for (uint256 i = 0 ; i < 20 ; i+ + ) {
_addr[2 + i* 2 ] = HEX[uint8 (_bytes[i + 12 ] > > 4 )];
_addr[3 + i* 2 ] = HEX[uint8 (_bytes[i + 12 ] & 0x0f )];
}
return string (_addr);
}
}
File 2 of 7: Counters.sol
pragma solidity 0.7.5;
import "./SafeMath.sol" ;
library Counters {
using SafeMath for uint256 ;
struct Counter {
uint256 _value;
}
function current (Counter storage counter ) internal view returns (uint256 ) {
return counter._value;
}
function increment (Counter storage counter ) internal {
counter._value + = 1 ;
}
function decrement (Counter storage counter ) internal {
counter._value = counter._value.sub(1 );
}
}
File 3 of 7: ERC20.sol
pragma solidity 0.7.5;
import "../interfaces/IERC20.sol" ;
import "./SafeMath.sol" ;
import "./Counters.sol" ;
import "./Address.sol" ;
abstract contract ERC20 is IERC20 {
using SafeMath for uint256 ;
bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256 ( "ERC20Token" );
mapping (address = > uint256 ) internal _balances;
mapping (address = > mapping (address = > uint256 )) internal _allowances;
uint256 internal _totalSupply;
string internal _name;
string internal _symbol;
uint8 internal _decimals;
constructor (string memory name_, string memory symbol_, uint8 decimals_ ) {
_name = name_;
_symbol = symbol_;
_decimals = decimals_;
}
function name ( ) public view override returns (string memory ) {
return _name;
}
function symbol ( ) public view override returns (string memory ) {
return _symbol;
}
function decimals ( ) public view override returns (uint8 ) {
return _decimals;
}
function totalSupply ( ) public view override returns (uint256 ) {
return _totalSupply;
}
function balanceOf (address account ) public view virtual override returns (uint256 ) {
return _balances[account];
}
function transfer (address recipient, uint256 amount ) public virtual override returns (bool ) {
_transfer(msg .sender , recipient, amount);
return true ;
}
function allowance (address owner, address spender ) public view virtual override returns (uint256 ) {
return _allowances[owner][spender];
}
function approve (address spender, uint256 amount ) public virtual override returns (bool ) {
_approve(msg .sender , spender, amount);
return true ;
}
function transferFrom (address sender, address recipient, uint256 amount ) public virtual override returns (bool ) {
_transfer(sender, recipient, amount);
_approve(sender, msg .sender , _allowances[sender][msg .sender ].sub(amount, "ERC20: transfer amount exceeds allowance" ));
return true ;
}
function increaseAllowance (address spender, uint256 addedValue ) public virtual returns (bool ) {
_approve(msg .sender , spender, _allowances[msg .sender ][spender].add(addedValue));
return true ;
}
function decreaseAllowance (address spender, uint256 subtractedValue ) public virtual returns (bool ) {
_approve(msg .sender , spender, _allowances[msg .sender ][spender].sub(subtractedValue, "ERC20: decreased allowance below zero" ));
return true ;
}
function _transfer (address sender, address recipient, uint256 amount ) internal virtual {
require (sender ! = address (0 ), "ERC20: transfer from the zero address" );
require (recipient ! = address (0 ), "ERC20: transfer to the zero address" );
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance" );
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
function _mint (address account_, uint256 ammount_ ) internal virtual {
require (account_ ! = address (0 ), "ERC20: mint to the zero address" );
_beforeTokenTransfer(address ( this ), account_, ammount_);
_totalSupply = _totalSupply.add(ammount_);
_balances[account_] = _balances[account_].add(ammount_);
emit Transfer(address ( this ), account_, ammount_);
}
function _burn (address account, uint256 amount ) internal virtual {
require (account ! = address (0 ), "ERC20: burn from the zero address" );
_beforeTokenTransfer(account, address (0 ), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance" );
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address (0 ), amount);
}
function _approve (address owner, address spender, uint256 amount ) internal virtual {
require (owner ! = address (0 ), "ERC20: approve from the zero address" );
require (spender ! = address (0 ), "ERC20: approve to the zero address" );
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _beforeTokenTransfer ( address from_, address to_, uint256 amount_ ) internal virtual { }
}
interface IERC2612Permit {
function permit (
address owner,
address spender,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external ;
function nonces (address owner ) external view returns (uint256 ) ;
}
abstract contract ERC20Permit is ERC20 , IERC2612Permit {
using Counters for Counters .Counter ;
mapping (address = > Counters.Counter) private _nonces;
bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9 ;
bytes32 public DOMAIN_SEPARATOR;
constructor ( ) {
uint256 chainID;
assembly {
chainID := chainid ()
}
DOMAIN_SEPARATOR = keccak256 (
abi .encode (
keccak256 ("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ),
keccak256 (bytes (name())),
keccak256 (bytes ("1" )),
chainID,
address (this )
)
);
}
function permit (
address owner,
address spender,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual override {
require (block .timestamp < = deadline, "Permit: expired deadline" );
bytes32 hashStruct =
keccak256 (abi .encode (PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline));
bytes32 _hash = keccak256 (abi .encodePacked (uint16 (0x1901 ), DOMAIN_SEPARATOR, hashStruct));
address signer = ecrecover (_hash, v, r, s);
require (signer ! = address (0 ) & & signer = = owner, "Permit: Invalid signature" );
_nonces[owner].increment();
_approve(owner, spender, amount);
}
function nonces (address owner ) public view override returns (uint256 ) {
return _nonces[owner].current();
}
}
library SafeERC20 {
using SafeMath for uint256 ;
using Address for address ;
function safeTransfer (IERC20 token, address to, uint256 value ) internal {
_callOptionalReturn(token, abi .encodeWithSelector (token.transfer .selector , to, value));
}
function safeTransferFrom (IERC20 token, address from , address to, uint256 value ) internal {
_callOptionalReturn(token, abi .encodeWithSelector (token.transferFrom.selector , from , to, value));
}
function safeApprove (IERC20 token, address spender, uint256 value ) internal {
require ((value = = 0 ) | | (token.allowance(address (this ), spender) = = 0 ),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi .encodeWithSelector (token.approve.selector , spender, value));
}
function safeIncreaseAllowance (IERC20 token, address spender, uint256 value ) internal {
uint256 newAllowance = token.allowance(address (this ), spender).add(value);
_callOptionalReturn(token, abi .encodeWithSelector (token.approve.selector , spender, newAllowance));
}
function safeDecreaseAllowance (IERC20 token, address spender, uint256 value ) internal {
uint256 newAllowance = token.allowance(address (this ), spender).sub(value, "SafeERC20: decreased allowance below zero" );
_callOptionalReturn(token, abi .encodeWithSelector (token.approve.selector , spender, newAllowance));
}
function _callOptionalReturn (IERC20 token, bytes memory data ) private {
bytes memory returndata = address (token).functionCall(data, "SafeERC20: low-level call failed" );
if (returndata.length > 0 ) {
require (abi .decode (returndata, (bool )), "SafeERC20: ERC20 operation did not succeed" );
}
}
}
File 4 of 7: IERC20.sol
pragma solidity >=0.5.0;
interface IERC20 {
event Approval (address indexed owner, address indexed spender, uint value ) ;
event Transfer (address indexed from , address indexed to, uint value ) ;
function name ( ) external view returns (string memory ) ;
function symbol ( ) external view returns (string memory ) ;
function decimals ( ) external view returns (uint8 ) ;
function totalSupply ( ) external view returns (uint ) ;
function balanceOf (address owner ) external view returns (uint ) ;
function allowance (address owner, address spender ) external view returns (uint ) ;
function approve (address spender, uint value ) external returns (bool ) ;
function transfer (address to, uint value ) external returns (bool ) ;
function transferFrom (address from , address to, uint value ) external returns (bool ) ;
}
interface IERC20Mintable {
function mint ( uint256 amount_ ) external ;
function mint ( address account_, uint256 ammount_ ) external ;
}
File 5 of 7: MonasteryZenERC20.sol
pragma solidity 0.7.5;
import "./libraries/Ownable.sol" ;
import "./libraries/ERC20.sol" ;
import "./libraries/SafeMath.sol" ;
contract VaultOwned is Ownable {
address internal _vault;
function setVault ( address vault_ ) external onlyOwner ( ) returns ( bool ) {
_vault = vault_;
return true ;
}
function vault ( ) public view returns (address ) {
return _vault;
}
modifier onlyVault ( ) {
require ( _vault = = msg .sender , "VaultOwned: caller is not the Vault" );
_ ;
}
}
contract MonasteryERC20 is ERC20Permit , VaultOwned {
using SafeMath for uint256 ;
constructor ( ) ERC20 ("Monastery" , "MONK" , 9 ) {
}
function mint (address account_, uint256 amount_ ) external onlyVault ( ) {
_mint(account_, amount_);
}
function burn (uint256 amount ) public virtual {
_burn(msg .sender , amount);
}
function burnFrom (address account_, uint256 amount_ ) public virtual {
_burnFrom(account_, amount_);
}
function _burnFrom (address account_, uint256 amount_ ) public virtual {
uint256 decreasedAllowance_ =
allowance(account_, msg .sender ).sub(
amount_,
"ERC20: burn amount exceeds allowance"
);
_approve(account_, msg .sender , decreasedAllowance_);
_burn(account_, amount_);
}
}
File 6 of 7: Ownable.sol
pragma solidity 0.7.5;
interface IOwnable {
function owner ( ) external view returns (address ) ;
function renounceManagement ( ) external ;
function pushManagement ( address newOwner_ ) external ;
function pullManagement ( ) external ;
}
contract Ownable is IOwnable {
address internal _owner;
address internal _newOwner;
event OwnershipPushed (address indexed previousOwner, address indexed newOwner ) ;
event OwnershipPulled (address indexed previousOwner, address indexed newOwner ) ;
constructor ( ) {
_owner = msg .sender ;
emit OwnershipPushed( address (0 ), _owner );
}
function owner ( ) public view override returns (address ) {
return _owner;
}
modifier onlyOwner ( ) {
require ( _owner = = msg .sender , "Ownable: caller is not the owner" );
_ ;
}
function renounceManagement ( ) public virtual override onlyOwner ( ) {
emit OwnershipPushed( _owner, address (0 ) );
_owner = address (0 );
}
function pushManagement ( address newOwner_ ) public virtual override onlyOwner ( ) {
require ( newOwner_ ! = address (0 ), "Ownable: new owner is the zero address" );
emit OwnershipPushed( _owner, newOwner_ );
_newOwner = newOwner_;
}
function pullManagement ( ) public virtual override {
require ( msg .sender = = _newOwner, "Ownable: must be new owner to pull" );
emit OwnershipPulled( _owner, _newOwner );
_owner = _newOwner;
}
}
File 7 of 7: SafeMath.sol
pragma solidity 0.7.5;
library SafeMath {
function add (uint256 a, uint256 b ) internal pure returns (uint256 ) {
uint256 c = a + b;
require (c > = a, "SafeMath: addition overflow" );
return c;
}
function sub (uint256 a, uint256 b ) internal pure returns (uint256 ) {
return sub(a, b, "SafeMath: subtraction overflow" );
}
function sub (uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256 ) {
require (b < = a, errorMessage);
uint256 c = a - b;
return c;
}
function mul (uint256 a, uint256 b ) internal pure returns (uint256 ) {
if (a = = 0 ) {
return 0 ;
}
uint256 c = a * b;
require (c / a = = b, "SafeMath: multiplication overflow" );
return c;
}
function div (uint256 a, uint256 b ) internal pure returns (uint256 ) {
return div(a, b, "SafeMath: division by zero" );
}
function div (uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256 ) {
require (b > 0 , errorMessage);
uint256 c = a / b;
return c;
}
function sqrrt (uint256 a ) internal pure returns (uint c ) {
if (a > 3 ) {
c = a;
uint b = add( div( a, 2 ), 1 );
while (b < c) {
c = b;
b = div( add( div( a, b ), b), 2 );
}
} else if (a ! = 0 ) {
c = 1 ;
}
}
}
{
"compilationTarget" : {
"contracts/MonasteryZenERC20.sol" : "MonasteryERC20"
} ,
"evmVersion" : "istanbul" ,
"libraries" : { } ,
"metadata" : {
"bytecodeHash" : "ipfs" ,
"useLiteralContent" : true
} ,
"optimizer" : {
"enabled" : false ,
"runs" : 200
} ,
"remappings" : [ ]
} [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"_burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_","type":"address"}],"name":"setVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]