ERC20
This contract is an ERC20 token.
Name
Kattana
Symbol
KTN
Decimals
18
Total Supply
10,000,000 KTN
About link
Kattana (KTN) is a cryptocurrency and operates on the Ethereum platform. Kattana has a current supply of 10,000,000 with 1,188,281.49991768 in circulation. The last known price of Kattana is 5.28924699 USD and is up 5.95 over the last 24 hours. It is currently trading on 6 active market(s) with $136,932.18 traded over the last 24 hours. More information can be found at https://kattana.io/.
Stats
Public Functions
24
Event Types
5
Code Size
51,656 bytes
Library Use
Uses SafeERC20 for IERC20.
Events (5) keyboard_arrow_up
State Variables (16) keyboard_arrow_up
Functions
name keyboard_arrow_up
symbol keyboard_arrow_up
decimals keyboard_arrow_up
totalSupply keyboard_arrow_up
balanceOf keyboard_arrow_up
transfer keyboard_arrow_up
Requirements help
Source Code
function transfer(address recipient, uint256 amount)
public
virtual
override
returns (bool)
{
_transfer(_msgSender(), recipient, amount);
return true;
}
allowance keyboard_arrow_up
approve keyboard_arrow_up
Requirements help
Source Code
function approve(address spender, uint256 amount)
public
virtual
override
returns (bool)
{
_approve(_msgSender(), spender, amount);
return true;
}
transferFrom keyboard_arrow_up
Requirements help
Source Code
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(
sender,
_msgSender(),
_allowances[sender][_msgSender()].sub(
amount,
"ERC20: transfer amount exceeds allowance"
)
);
return true;
}
increaseAllowance keyboard_arrow_up
Requirements help
Source Code
function increaseAllowance(address spender, uint256 addedValue)
public
virtual
returns (bool)
{
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender].add(addedValue)
);
return true;
}
decreaseAllowance keyboard_arrow_up
Requirements help
Source Code
function decreaseAllowance(address spender, uint256 subtractedValue)
public
virtual
returns (bool)
{
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender].sub(
subtractedValue,
"ERC20: decreased allowance below zero"
)
);
return true;
}
burn keyboard_arrow_up
burnFrom keyboard_arrow_up
Requirements help
Source Code
function burnFrom(address account, uint256 amount) public virtual {
uint256 decreasedAllowance = allowance(account, _msgSender()).sub(
amount,
"ERC20: burn amount exceeds allowance"
);
_approve(account, _msgSender(), decreasedAllowance);
_burn(account, amount);
}
owner keyboard_arrow_up
renounceOwnership keyboard_arrow_up
transferOwnership keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
Source Code
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
withdrawLocked keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
note checks for the following:
Source Code
function withdrawLocked(
IERC20 _token,
address _receiver,
uint256 _amount
) external onlyOwner() note() {
_token.safeTransfer(_receiver, _amount);
}
batchTransfer keyboard_arrow_up
Requirements help
Source Code
function batchTransfer(address[] memory _to, uint256[] memory _amount) public {
require(_to.length == _amount.length, "Invalid input");
for (uint256 _i = 0; _i < _to.length; _i++) {
transfer(_to[_i], _amount[_i]);
}
}
batchTransferLock keyboard_arrow_up
Requirements help
Source Code
function batchTransferLock(
LockType _lockType,
address[] memory _to,
uint256[] memory _amount
) public {
require(_to.length == _amount.length, "Invalid input");
for (uint256 _i = 0; _i < _to.length; _i++) {
transferLock(_lockType, _to[_i], _amount[_i]);
}
}
transferLock keyboard_arrow_up
Requirements help
Source Code
function transferLock(
LockType _lockType,
address _to,
uint256 _amount
) public {
require(_amount > 0, "Invalid amount");
Lock memory _lock = locks[_lockType][_msgSender()];
require(_lock.released == 0, "Cannot transfer after release");
require(_lock.balance >= _amount, "Insuffisient locked funds");
locks[_lockType][_msgSender()].balance = _lock
.balance
.sub(_amount)
.toUInt128();
locks[_lockType][_to].balance = locks[_lockType][_to]
.balance
.add(_amount)
.toUInt128();
emit LockTransfer(_lockType, _msgSender(), _to, _amount);
}
releaseLock keyboard_arrow_up
releasable keyboard_arrow_up
Source Code
function releasable(LockType _lockType, address _holder)
public
view
returns (uint256)
{
LockConfig memory _lockConfig = lockConfigs[_lockType];
Lock memory _lock = locks[_lockType][_holder];
uint256 _balance = _lock.balance;
uint256 _released = _lock.released;
uint256 _vestedBalance = _balance.mul(_since(_lockConfig.releaseStart)) /
_lockConfig.vesting;
uint256 _balanceToRelease = Math.min(_vestedBalance, _balance);
if (_balanceToRelease <= _released) {
return 0;
}
// Underflow cannot happen here, SafeMath usage left for code style.
return _balanceToRelease.sub(_released);
}
releasableTotal keyboard_arrow_up
Source Code
function releasableTotal(address _holder)
public
view
returns (uint256[9] memory _result)
{
_result[1] = releasable(LockType.Seed, _holder);
_result[2] = releasable(LockType.Private, _holder);
_result[3] = releasable(LockType.Strategic, _holder);
_result[4] = releasable(LockType.Liquidity, _holder);
_result[5] = releasable(LockType.Foundation, _holder);
_result[6] = releasable(LockType.Team, _holder);
_result[7] = releasable(LockType.Reserve, _holder);
_result[8] = releasable(LockType.Advisors, _holder);
}
Internal Functions
Internal functions are parts of the contract that can't be used directly, but instead are used by the public functions listed above.
internal KattanaToken._passed keyboard_arrow_up
internal KattanaToken._notPassed keyboard_arrow_up
internal KattanaToken._since keyboard_arrow_up
internal KattanaToken._not keyboard_arrow_up
internal KattanaToken._release keyboard_arrow_up
Requirements help
Source Code
function _release(LockType _lockType, address _holder) private {
LockConfig memory _lockConfig = lockConfigs[_lockType];
Lock memory _lock = locks[_lockType][_holder];
uint256 _balance = _lock.balance;
uint256 _released = _lock.released;
uint256 _vestedBalance = _balance.mul(_since(_lockConfig.releaseStart)) /
_lockConfig.vesting;
uint256 _balanceToRelease = Math.min(_vestedBalance, _balance);
require(_balanceToRelease > _released, "Insufficient unlocked");
// Underflow cannot happen here, SafeMath usage left for code style.
uint256 _amount = _balanceToRelease.sub(_released);
locks[_lockType][_holder].released = _balanceToRelease.toUInt128();
_transfer(address(uint256(_lockType)), _holder, _amount);
}
internal KattanaToken._beforeTokenTransfer keyboard_arrow_up
Source Code
function _beforeTokenTransfer(
address _from,
address _to,
uint256 _amount
) internal override {
super._beforeTokenTransfer(_from, _to, _amount);
if (protected) {
LiquidityActivityTrap_validateTransfer(_from, _to, _amount);
LiquidityTrap_validateTransfer(_from, _to, _amount);
}
}
internal LiquidityTrap.LiquidityTrap_validateTransfer keyboard_arrow_up
Source Code
function LiquidityTrap_validateTransfer(
address _from,
address _to,
uint256 _amount
) internal {
KnowingLiquidityAddedBlock_validateTransfer(_from, _to, _amount);
if (_blocksSince(liquidityAddedBlock) < TRAP_BLOCKS) {
// Do not trap technical addresses.
if (_from == liquidityPool && _to != liquidityPool && uint256(_to) > 1000) {
bought[_to] = bought[_to].add(_amount);
}
}
if (bought[_from] >= trapAmount) {
require(_to == owner(), "LiquidityTrap: must send to owner()");
require(balanceOf(_from) == _amount, "LiquidityTrap: must send it all");
bought[_from] = 0;
}
}
internal KnowingLiquidityAddedBlock.KnowingLiquidityAddedBlock_validateTransfer keyboard_arrow_up
Source Code
function KnowingLiquidityAddedBlock_validateTransfer(
address,
address _to,
uint256 _amount
) internal {
if (liquidityAddedBlock == 0 && _to == liquidityPool && _amount > 0) {
liquidityAddedBlock = block.number.toUInt96();
}
}
internal LiquidityProtectedBase._blocksSince keyboard_arrow_up
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
internal ERC20._transfer keyboard_arrow_up
Requirements help
Source Code
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);
}
internal ERC20._mint keyboard_arrow_up
Source Code
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
internal ERC20._burn keyboard_arrow_up
Requirements help
Source Code
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);
}
internal ERC20._approve keyboard_arrow_up
Requirements help
Source Code
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);
}
internal ERC20._setupDecimals keyboard_arrow_up
internal ERC20._beforeTokenTransfer keyboard_arrow_up
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
internal LiquidityActivityTrap.LiquidityActivityTrap_validateTransfer keyboard_arrow_up
Source Code
function LiquidityActivityTrap_validateTransfer(
address _from,
address _to,
uint256 _amount
) internal {
KnowingLiquidityAddedBlock_validateTransfer(_from, _to, _amount);
uint256 sinceLiquidity = _blocksSince(liquidityAddedBlock);
if (_blocksSince(liquidityAddedBlock) < ACTIVITY_TRAP_BLOCKS) {
// Do not trap technical addresses.
if (
_from == liquidityPool &&
_to != liquidityPool &&
uint256(_to) > 1000 &&
_amount > 0
) {
tradedInBlock[_to][sinceLiquidity] = true;
if (tradesInBlockCount[sinceLiquidity] < type(uint8).max) {
tradesInBlockCount[sinceLiquidity]++;
}
} else if (
_from != liquidityPool &&
_to == liquidityPool &&
uint256(_from) > 1000 &&
_amount > 0
) {
// Do not count addLiquidity.
if (tradesInBlockCount[sinceLiquidity] > 0) {
tradedInBlock[_from][sinceLiquidity] = true;
if (tradesInBlockCount[sinceLiquidity] < type(uint8).max) {
tradesInBlockCount[sinceLiquidity]++;
}
}
}
}
uint8[ACTIVITY_TRAP_BLOCKS] memory traps = tradesInBlockCount;
bool[ACTIVITY_TRAP_BLOCKS] memory blocks = tradedInBlock[_from];
for (uint256 i = 0; i < ACTIVITY_TRAP_BLOCKS; i++) {
if (traps[i] > TRADES_PER_BLOCK_LIMIT && blocks[i]) {
require(_to == owner(), "LiquidityActivityTrap: must send to owner()");
require(
balanceOf(_from) == _amount,
"LiquidityActivityTrap: must send it all"
);
delete tradedInBlock[_from];
break;
}
}
}
internal KnowingLiquidityAddedBlock.KnowingLiquidityAddedBlock_validateTransfer keyboard_arrow_up
Source Code
function KnowingLiquidityAddedBlock_validateTransfer(
address,
address _to,
uint256 _amount
) internal {
if (liquidityAddedBlock == 0 && _to == liquidityPool && _amount > 0) {
liquidityAddedBlock = block.number.toUInt96();
}
}
internal LiquidityProtectedBase._blocksSince keyboard_arrow_up
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
internal ERC20._transfer keyboard_arrow_up
Requirements help
Source Code
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);
}
internal ERC20._mint keyboard_arrow_up
Source Code
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
internal ERC20._burn keyboard_arrow_up
Requirements help
Source Code
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);
}
internal ERC20._approve keyboard_arrow_up
Requirements help
Source Code
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);
}
internal ERC20._setupDecimals keyboard_arrow_up
internal ERC20._beforeTokenTransfer keyboard_arrow_up
internal Context._msgSender keyboard_arrow_up
internal Context._msgData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}