ERC20
This contract is an ERC20 token.
Name
SKALE
Symbol
SKL
Decimals
18
Total Supply
4,309,175,751 SKL
About link description
SKALE Network (SKL) is a cryptocurrency and operates on the Ethereum platform. SKALE Network has a current supply of 4,276,664,349 with 1,213,100,288 in circulation. The last known price of SKALE Network is 0.21120668 USD and is down -0.58 over the last 24 hours. It is currently trading on 43 active market(s) with $28,686,553.75 traded over the last 24 hours. More information can be found at https://skale.network/.
Stats
Public Functions
30
Event Types
9
Code Size
217,794 bytes
Library Use
Uses SafeMath for uint.
Events (9) keyboard_arrow_up
Constants (10) keyboard_arrow_up
_ERC1820_REGISTRY Constant
IERC1820Registry help
the result of calling IERC1820Registry with UNKNOWN ARGUMENT
_TOKENS_SENDER_INTERFACE_HASH Constant
bytes32 help
0x29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe895
_TOKENS_RECIPIENT_INTERFACE_HASH Constant
bytes32 help
0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b
State Variables (17) keyboard_arrow_up
_revokedDefaultOperators Variable
mapping(address => mapping(address => bool)) help
Internal Variable
Functions
hasRole keyboard_arrow_up
getRoleMemberCount keyboard_arrow_up
getRoleMember keyboard_arrow_up
getRoleAdmin keyboard_arrow_up
grantRole keyboard_arrow_up
Requirements help
null
Source Code
function grantRole(bytes32 role, address account) public virtual {
require(
hasRole(_roles[role].adminRole, _msgSender()),
"AccessControl: sender must be an admin to grant"
);
_grantRole(role, account);
}
revokeRole keyboard_arrow_up
Requirements help
null
Source Code
function revokeRole(bytes32 role, address account) public virtual {
require(
hasRole(_roles[role].adminRole, _msgSender()),
"AccessControl: sender must be an admin to revoke"
);
_revokeRole(role, account);
}
renounceRole keyboard_arrow_up
Requirements help
Source Code
function renounceRole(bytes32 role, address account) public virtual {
require(
account == _msgSender(),
"AccessControl: can only renounce roles for self"
);
_revokeRole(role, account);
}
initialize keyboard_arrow_up
Modifiers help
initializer checks for the following:
Requirements help
Source Code
function initialize(address contractManagerAddress) public virtual initializer {
AccessControlUpgradeSafe.__AccessControl_init();
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
_setContractManager(contractManagerAddress);
}
name keyboard_arrow_up
symbol keyboard_arrow_up
decimals keyboard_arrow_up
granularity keyboard_arrow_up
totalSupply keyboard_arrow_up
balanceOf keyboard_arrow_up
send keyboard_arrow_up
Requirements help
Source Code
function send(
address recipient,
uint256 amount,
bytes memory data
) public override {
_send(_msgSender(), recipient, amount, data, "", true);
}
transfer keyboard_arrow_up
Source Code
function transfer(address recipient, uint256 amount)
public
override
returns (bool)
{
require(recipient != address(0), "ERC777: transfer to the zero address");
address from = _msgSender();
_callTokensToSend(from, from, recipient, amount, "", "");
_move(from, from, recipient, amount, "", "");
_callTokensReceived(from, from, recipient, amount, "", "", false);
return true;
}
burn keyboard_arrow_up
Requirements help
Source Code
function burn(uint256 amount, bytes memory data) public override {
_burn(_msgSender(), amount, data, "");
}
isOperatorFor keyboard_arrow_up
Source Code
function isOperatorFor(address operator, address tokenHolder)
public
view
override
returns (bool)
{
return
operator == tokenHolder ||
(_defaultOperators[operator] &&
!_revokedDefaultOperators[tokenHolder][operator]) ||
_operators[tokenHolder][operator];
}
authorizeOperator keyboard_arrow_up
revokeOperator keyboard_arrow_up
Requirements help
Source Code
function revokeOperator(address operator) public override {
require(operator != _msgSender(), "ERC777: revoking self as operator");
if (_defaultOperators[operator]) {
_revokedDefaultOperators[_msgSender()][operator] = true;
} else {
delete _operators[_msgSender()][operator];
}
emit RevokedOperator(operator, _msgSender());
}
defaultOperators keyboard_arrow_up
operatorSend keyboard_arrow_up
Parameters help
Requirements help
null
Source Code
function operatorSend(
address sender,
address recipient,
uint256 amount,
bytes memory data,
bytes memory operatorData
) public override {
require(
isOperatorFor(_msgSender(), sender),
"ERC777: caller is not an operator for holder"
);
_send(sender, recipient, amount, data, operatorData, true);
}
operatorBurn keyboard_arrow_up
Parameters help
Requirements help
null
Source Code
function operatorBurn(
address account,
uint256 amount,
bytes memory data,
bytes memory operatorData
) public override {
require(
isOperatorFor(_msgSender(), account),
"ERC777: caller is not an operator for holder"
);
_burn(account, amount, data, operatorData);
}
allowance keyboard_arrow_up
approve keyboard_arrow_up
Requirements help
Source Code
function approve(address spender, uint256 value)
public
override
returns (bool)
{
address holder = _msgSender();
_approve(holder, spender, value);
return true;
}
transferFrom keyboard_arrow_up
Requirements help
Source Code
function transferFrom(
address holder,
address recipient,
uint256 amount
) public override returns (bool) {
require(recipient != address(0), "ERC777: transfer to the zero address");
require(holder != address(0), "ERC777: transfer from the zero address");
address spender = _msgSender();
_callTokensToSend(spender, holder, recipient, amount, "", "");
_move(spender, holder, recipient, amount, "", "");
_approve(
holder,
spender,
_allowances[holder][spender].sub(
amount,
"ERC777: transfer amount exceeds allowance"
)
);
_callTokensReceived(spender, holder, recipient, amount, "", "", false);
return true;
}
mint keyboard_arrow_up
Parameters help
Modifiers help
allow checks for the following:
Requirements help
Source Code
function mint(
address account,
uint256 amount,
bytes calldata userData,
bytes calldata operatorData
)
external
allow("SkaleManager")
returns (
//onlyAuthorized
bool
)
{
require(amount <= CAP.sub(totalSupply()), "Amount is too big");
_mint(account, amount, userData, operatorData);
return true;
}
getAndUpdateDelegatedAmount keyboard_arrow_up
Source Code
function getAndUpdateDelegatedAmount(address wallet)
external
override
returns (uint256)
{
return
DelegationController(contractManager.getContract("DelegationController"))
.getAndUpdateDelegatedAmount(wallet);
}
getAndUpdateSlashedAmount keyboard_arrow_up
Source Code
function getAndUpdateSlashedAmount(address wallet)
external
override
returns (uint256)
{
return
Punisher(contractManager.getContract("Punisher")).getAndUpdateLockedAmount(
wallet
);
}
getAndUpdateLockedAmount keyboard_arrow_up
Source Code
function getAndUpdateLockedAmount(address wallet)
public
override
returns (uint256)
{
return
TokenState(contractManager.getContract("TokenState"))
.getAndUpdateLockedAmount(wallet);
}
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 SkaleToken._beforeTokenTransfer keyboard_arrow_up
Source Code
function _beforeTokenTransfer(
address, // operator
address from,
address, // to
uint256 tokenId
) internal override {
uint256 locked = getAndUpdateLockedAmount(from);
if (locked > 0) {
require(
balanceOf(from) >= locked.add(tokenId),
"Token should be unlocked for transferring"
);
}
}
internal SkaleToken._callTokensToSend keyboard_arrow_up
Parameters help
Source Code
function _callTokensToSend(
address operator,
address from,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData
) internal override nonReentrant {
super._callTokensToSend(operator, from, to, amount, userData, operatorData);
}
internal SkaleToken._callTokensReceived keyboard_arrow_up
Parameters help
Source Code
function _callTokensReceived(
address operator,
address from,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData,
bool requireReceptionAck
) internal override nonReentrant {
super._callTokensReceived(
operator,
from,
to,
amount,
userData,
operatorData,
requireReceptionAck
);
}
internal SkaleToken._msgData keyboard_arrow_up
internal SkaleToken._msgSender keyboard_arrow_up
internal ERC777._mint keyboard_arrow_up
Parameters help
Source Code
function _mint(
address account,
uint256 amount,
bytes memory userData,
bytes memory operatorData
) internal virtual {
require(account != address(0), "ERC777: mint to the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), account, amount);
// Update state variables
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
_callTokensReceived(
operator,
address(0),
account,
amount,
userData,
operatorData,
true
);
emit Minted(operator, account, amount, userData, operatorData);
emit Transfer(address(0), account, amount);
}
internal ERC777._send keyboard_arrow_up
Parameters help
Requirements help
Source Code
function _send(
address from,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData,
bool requireReceptionAck
) internal {
require(from != address(0), "ERC777: send from the zero address");
require(to != address(0), "ERC777: send to the zero address");
address operator = _msgSender();
_callTokensToSend(operator, from, to, amount, userData, operatorData);
_move(operator, from, to, amount, userData, operatorData);
_callTokensReceived(
operator,
from,
to,
amount,
userData,
operatorData,
requireReceptionAck
);
}
internal ERC777._burn keyboard_arrow_up
Parameters help
Requirements help
Source Code
function _burn(
address from,
uint256 amount,
bytes memory data,
bytes memory operatorData
) internal virtual {
require(from != address(0), "ERC777: burn from the zero address");
address operator = _msgSender();
/* Chaged by SKALE: we swapped these lines to prevent delegation of burning tokens */
_callTokensToSend(operator, from, address(0), amount, data, operatorData);
_beforeTokenTransfer(operator, from, address(0), amount);
/* End of changed by SKALE */
// Update state variables
_balances[from] = _balances[from].sub(
amount,
"ERC777: burn amount exceeds balance"
);
_totalSupply = _totalSupply.sub(amount);
emit Burned(operator, from, amount, data, operatorData);
emit Transfer(from, address(0), amount);
}
internal ERC777._move keyboard_arrow_up
Parameters help
Source Code
function _move(
address operator,
address from,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData
) private {
_beforeTokenTransfer(operator, from, to, amount);
_balances[from] = _balances[from].sub(
amount,
"ERC777: transfer amount exceeds balance"
);
_balances[to] = _balances[to].add(amount);
emit Sent(operator, from, to, amount, userData, operatorData);
emit Transfer(from, to, amount);
}
internal ERC777._approve keyboard_arrow_up
Requirements help
Source Code
function _approve(
address holder,
address spender,
uint256 value
) internal {
require(holder != address(0), "ERC777: approve from the zero address");
require(spender != address(0), "ERC777: approve to the zero address");
_allowances[holder][spender] = value;
emit Approval(holder, spender, value);
}
internal ERC777._callTokensToSend keyboard_arrow_up
Parameters help
Source Code
function _callTokensToSend(
address operator,
address from,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData /* End of changed by SKALE */ /* End of added by SKALE */
) internal virtual /* Chaged by SKALE from private */
/* Added by SKALE */
{
address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(
from,
_TOKENS_SENDER_INTERFACE_HASH
);
if (implementer != address(0)) {
IERC777Sender(implementer).tokensToSend(
operator,
from,
to,
amount,
userData,
operatorData
);
}
}
internal ERC777._callTokensReceived keyboard_arrow_up
Parameters help
Source Code
function _callTokensReceived(
address operator,
address from,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData,
bool requireReceptionAck /* End of changed by SKALE */ /* End of added by SKALE */
) internal virtual /* Chaged by SKALE from private */
/* Added by SKALE */
{
address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(
to,
_TOKENS_RECIPIENT_INTERFACE_HASH
);
if (implementer != address(0)) {
IERC777Recipient(implementer).tokensReceived(
operator,
from,
to,
amount,
userData,
operatorData
);
} else if (requireReceptionAck) {
require(
!to.isContract(),
"ERC777: token recipient contract has no implementer for ERC777TokensRecipient"
);
}
}
internal ERC777._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 Permissions._isOwner keyboard_arrow_up
internal Permissions._isAdmin keyboard_arrow_up
Source Code
function _isAdmin(address account) internal view returns (bool) {
address skaleManagerAddress = contractManager.contracts(
keccak256(abi.encodePacked("SkaleManager"))
);
if (skaleManagerAddress != address(0)) {
AccessControlUpgradeSafe skaleManager = AccessControlUpgradeSafe(
skaleManagerAddress
);
return skaleManager.hasRole(keccak256("ADMIN_ROLE"), account) || _isOwner();
} else {
return _isOwner();
}
}
internal Permissions._setContractManager keyboard_arrow_up
Requirements help
Source Code
function _setContractManager(address contractManagerAddress) private {
require(
contractManagerAddress != address(0),
"ContractManager address is not set"
);
require(contractManagerAddress.isContract(), "Address is not contract");
contractManager = ContractManager(contractManagerAddress);
}
internal AccessControlUpgradeSafe.__AccessControl_init keyboard_arrow_up
internal AccessControlUpgradeSafe.__AccessControl_init_unchained keyboard_arrow_up
internal AccessControlUpgradeSafe._setupRole keyboard_arrow_up
internal AccessControlUpgradeSafe._setRoleAdmin keyboard_arrow_up
internal AccessControlUpgradeSafe._grantRole keyboard_arrow_up
internal AccessControlUpgradeSafe._revokeRole keyboard_arrow_up
internal Initializable.isConstructor keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function isConstructor() private view returns (bool) {
// extcodesize checks the size of the code stored in an address, and
// address returns the current address. Since the code is still not
// deployed when running a constructor, any checks on its code size will
// yield zero, making it an effective way to detect if a contract is
// under construction or not.
address self = address(this);
uint256 cs;
assembly {
cs := extcodesize(self)
}
return cs == 0;
}
internal ContextUpgradeSafe.__Context_init keyboard_arrow_up
internal ContextUpgradeSafe.__Context_init_unchained keyboard_arrow_up
internal ContextUpgradeSafe._msgSender keyboard_arrow_up
internal ContextUpgradeSafe._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 Initializable.isConstructor keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function isConstructor() private view returns (bool) {
// extcodesize checks the size of the code stored in an address, and
// address returns the current address. Since the code is still not
// deployed when running a constructor, any checks on its code size will
// yield zero, making it an effective way to detect if a contract is
// under construction or not.
address self = address(this);
uint256 cs;
assembly {
cs := extcodesize(self)
}
return cs == 0;
}