pTokens TLOS
ERC20
This contract is an ERC20 token.
Name
pTokens TLOS
Symbol
TLOS
Decimals
18
Total Supply
19,191,574 TLOS
About link description
Telos (TLOS) is a cryptocurrency and operates on the Ethereum platform. Telos has a current supply of 355,208,370.6674 with 270,123,443.8443 in circulation. The last known price of Telos is 0.13428701 USD and is down -0.04 over the last 24 hours. It is currently trading on 9 active market(s) with $217,792.92 traded over the last 24 hours. More information can be found at https://telos.net/.
Stats
Public Functions
34
Event Types
11
Code Size
83,068 bytes
Events (11) keyboard_arrow_up
Constants (8) 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
TOKENS_RECIPIENT_INTERFACE_HASH Constant
bytes32 help
0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b
State Variables (15) keyboard_arrow_up
_revokedDefaultOperators Variable
mapping(address => mapping(address => bool)) help
Internal Variable
Functions
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 {
_send(_msgSender(), _msgSender(), recipient, amount, data, "", true);
}
transfer keyboard_arrow_up
Source Code
function transfer(address recipient, uint256 amount) public 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 {
_burn(_msgSender(), _msgSender(), amount, data, "");
}
isOperatorFor keyboard_arrow_up
Source Code
function isOperatorFor(address operator, address tokenHolder)
public
view
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 {
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 {
require(
isOperatorFor(_msgSender(), sender),
"ERC777: caller is not an operator for holder"
);
_send(_msgSender(), 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 {
require(
isOperatorFor(_msgSender(), account),
"ERC777: caller is not an operator for holder"
);
_burn(_msgSender(), account, amount, data, operatorData);
}
allowance keyboard_arrow_up
approve keyboard_arrow_up
Requirements help
Source Code
function approve(address spender, uint256 value) public 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 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;
}
adminTransfer keyboard_arrow_up
Parameters help
Requirements help
Source Code
function adminTransfer(
address sender,
address recipient,
uint256 amount,
bytes memory data,
bytes memory operatorData
) public {
require(_msgSender() == adminOperator, "caller is not the admin operator");
_send(adminOperator, sender, recipient, amount, data, operatorData, false);
emit AdminTransferInvoked(adminOperator);
}
setAdminOperator keyboard_arrow_up
Requirements help
Source Code
function setAdminOperator(address adminOperator_) public {
require(
msg.sender == adminOperator,
"Only the actual admin operator can change the address"
);
emit AdminOperatorChange(adminOperator, adminOperator_);
adminOperator = adminOperator_;
}
getHubAddr keyboard_arrow_up
relayHubVersion keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function relayHubVersion() public view returns (string memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return "1.0.0";
}
preRelayedCall keyboard_arrow_up
Requirements help
Source Code
function preRelayedCall(bytes calldata context) external returns (bytes32) {
require(msg.sender == getHubAddr(), "GSNRecipient: caller is not RelayHub");
return _preRelayedCall(context);
}
postRelayedCall keyboard_arrow_up
Parameters help
Requirements help
Source Code
function postRelayedCall(
bytes calldata context,
bool success,
uint256 actualCharge,
bytes32 preRetVal
) external {
require(msg.sender == getHubAddr(), "GSNRecipient: caller is not RelayHub");
_postRelayedCall(context, success, actualCharge, preRetVal);
}
setTrustedSigner keyboard_arrow_up
setFeeTarget keyboard_arrow_up
setGSNExtraGas keyboard_arrow_up
acceptRelayedCall keyboard_arrow_up
Parameters help
Source Code
function acceptRelayedCall(
address relay,
address from,
bytes memory encodedFunction,
uint256 transactionFee,
uint256 gasPrice,
uint256 gasLimit,
uint256 nonce,
bytes memory approvalData,
uint256 /* maxPossibleCharge */
) public view returns (uint256, bytes memory) {
(uint256 feeRate, bytes memory signature) = abi.decode(
approvalData,
(uint256, bytes)
);
bytes memory blob = abi.encodePacked(
feeRate,
relay,
from,
encodedFunction,
transactionFee,
gasPrice,
gasLimit,
nonce, // Prevents replays on RelayHub
getHubAddr(), // Prevents replays in multiple RelayHubs
address(this) // Prevents replays in multiple recipients
);
if (
keccak256(blob).toEthSignedMessageHash().recover(signature) ==
gsnTrustedSigner
) {
return
_approveRelayedCall(abi.encode(feeRate, from, transactionFee, gasPrice));
} else {
return _rejectRelayedCall(uint256(GSNErrorCodes.INVALID_SIGNER));
}
}
changePNetwork keyboard_arrow_up
Requirements help
Source Code
function changePNetwork(address newPNetwork) external {
require(
_msgSender() == pNetwork,
"Only the pNetwork can change the `pNetwork` account!"
);
require(newPNetwork != address(0), "pNetwork cannot be the zero address!");
pNetwork = newPNetwork;
}
mint keyboard_arrow_up
Requirements help
Source Code
function mint(address recipient, uint256 value) external returns (bool) {
mint(recipient, value, "", "");
return true;
}
mint keyboard_arrow_up
Parameters help
Requirements help
Source Code
function mint(
address recipient,
uint256 value,
bytes memory userData,
bytes memory operatorData
) public returns (bool) {
require(_msgSender() == pNetwork, "Only the pNetwork can mint tokens!");
require(recipient != address(0), "pToken: Cannot mint to the zero address!");
_mint(pNetwork, recipient, value, userData, operatorData);
return true;
}
redeem keyboard_arrow_up
Requirements help
Source Code
function redeem(uint256 amount, string calldata underlyingAssetRecipient)
external
returns (bool)
{
redeem(amount, "", underlyingAssetRecipient);
return true;
}
redeem keyboard_arrow_up
Requirements help
Source Code
function redeem(
uint256 amount,
bytes memory data,
string memory underlyingAssetRecipient
) public {
_burn(_msgSender(), _msgSender(), amount, data, "");
emit Redeem(msg.sender, amount, underlyingAssetRecipient);
}
operatorRedeem keyboard_arrow_up
Parameters help
Requirements help
null
Source Code
function operatorRedeem(
address account,
uint256 amount,
bytes calldata data,
bytes calldata operatorData,
string calldata underlyingAssetRecipient
) external {
require(
isOperatorFor(_msgSender(), account),
"ERC777: caller is not an operator for holder"
);
_burn(_msgSender(), account, amount, data, operatorData);
emit Redeem(account, amount, underlyingAssetRecipient);
}
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 PToken.owner keyboard_arrow_up
internal AbstractOwnable.owner keyboard_arrow_up
internal AbstractOwnable.isOwner keyboard_arrow_up
internal ERC777._mint keyboard_arrow_up
Parameters help
Source Code
function _mint(
address operator,
address account,
uint256 amount,
bytes memory userData,
bytes memory operatorData
) internal {
require(account != address(0), "ERC777: mint to the zero address");
// 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 operator,
address from,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData,
bool requireReceptionAck
) internal {
require(operator != address(0), "ERC777: operator is the zero address");
require(from != address(0), "ERC777: send from the zero address");
require(to != address(0), "ERC777: send to the zero address");
_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 operator,
address from,
uint256 amount,
bytes memory data,
bytes memory operatorData
) internal {
require(from != address(0), "ERC777: burn from the zero address");
_callTokensToSend(operator, from, address(0), amount, data, operatorData);
// 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 {
_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
) internal {
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
) internal {
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 Context.constructor 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 returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
internal ERC777OptionalAckOnMint._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 {
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 && from != address(0)) {
require(
!to.isContract(),
"ERC777: token recipient contract has no implementer for ERC777TokensRecipient"
);
}
}
internal ERC777._mint keyboard_arrow_up
Parameters help
Source Code
function _mint(
address operator,
address account,
uint256 amount,
bytes memory userData,
bytes memory operatorData
) internal {
require(account != address(0), "ERC777: mint to the zero address");
// 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 operator,
address from,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData,
bool requireReceptionAck
) internal {
require(operator != address(0), "ERC777: operator is the zero address");
require(from != address(0), "ERC777: send from the zero address");
require(to != address(0), "ERC777: send to the zero address");
_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 operator,
address from,
uint256 amount,
bytes memory data,
bytes memory operatorData
) internal {
require(from != address(0), "ERC777: burn from the zero address");
_callTokensToSend(operator, from, address(0), amount, data, operatorData);
// 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 {
_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
) internal {
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
) internal {
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 Context.constructor 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 returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
internal ERC777GSN._msgSender keyboard_arrow_up
internal ERC777GSN._msgData keyboard_arrow_up
internal ERC777GSN._preRelayedCall keyboard_arrow_up
internal ERC777GSN._postRelayedCall keyboard_arrow_up
Source Code
function _postRelayedCall(
bytes memory context,
bool,
uint256 actualCharge,
bytes32
) internal {
(
uint256 feeRate,
address from,
uint256 transactionFee,
uint256 gasPrice
) = abi.decode(context, (uint256, address, uint256, uint256));
// actualCharge is an _estimated_ charge, which assumes postRelayedCall will use all available gas.
// This implementation's gas cost can be roughly estimated as 10k gas, for the two SSTORE operations in an
// ERC20 transfer.
uint256 overestimation = _computeCharge(
POST_RELAYED_CALL_MAX_GAS.sub(gsnExtraGas),
gasPrice,
transactionFee
);
uint256 fee = actualCharge.sub(overestimation).mul(feeRate).div(
GSN_RATE_UNIT
);
if (fee > 0) {
_send(_msgSender(), from, gsnFeeTarget, fee, "", "", false);
}
}
internal AbstractOwnable.owner keyboard_arrow_up
internal AbstractOwnable.isOwner keyboard_arrow_up
internal GSNRecipient._upgradeRelayHub keyboard_arrow_up
Requirements help
Source Code
function _upgradeRelayHub(address newRelayHub) internal {
address currentRelayHub = _relayHub;
require(
newRelayHub != address(0),
"GSNRecipient: new RelayHub is the zero address"
);
require(
newRelayHub != currentRelayHub,
"GSNRecipient: new RelayHub is the current one"
);
emit RelayHubChanged(currentRelayHub, newRelayHub);
_relayHub = newRelayHub;
}
internal GSNRecipient._withdrawDeposits keyboard_arrow_up
internal GSNRecipient._msgSender keyboard_arrow_up
internal GSNRecipient._msgData keyboard_arrow_up
internal GSNRecipient._preRelayedCall keyboard_arrow_up
internal GSNRecipient._postRelayedCall keyboard_arrow_up
Parameters help
Source Code
function _postRelayedCall(
bytes memory context,
bool success,
uint256 actualCharge,
bytes32 preRetVal
) internal;
internal GSNRecipient._approveRelayedCall keyboard_arrow_up
internal GSNRecipient._approveRelayedCall keyboard_arrow_up
internal GSNRecipient._rejectRelayedCall keyboard_arrow_up
internal GSNRecipient._computeCharge keyboard_arrow_up
Source Code
function _computeCharge(
uint256 gas,
uint256 gasPrice,
uint256 serviceFee
) internal pure returns (uint256) {
// The fee is expressed as a percentage. E.g. a value of 40 stands for a 40% fee, so the recipient will be
// charged for 1.4 times the spent amount.
return (gas * gasPrice * (100 + serviceFee)) / 100;
}
internal GSNRecipient._getRelayedCallSender keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _getRelayedCallSender() private pure returns (address payable result) {
// We need to read 20 bytes (an address) located at array index msg.data.length - 20. In memory, the array
// is prefixed with a 32-byte length value, so we first add 32 to get the memory read index. However, doing
// so would leave the address in the upper 20 bytes of the 32-byte word, which is inconvenient and would
// require bit shifting. We therefore subtract 12 from the read index so the address lands on the lower 20
// bytes. This can always be done due to the 32-byte prefix.
// The final memory read index is msg.data.length - 20 + 32 - 12 = msg.data.length. Using inline assembly is the
// easiest/most-efficient way to perform this operation.
// These fields are not accessible from assembly
bytes memory array = msg.data;
uint256 index = msg.data.length;
// solhint-disable-next-line no-inline-assembly
assembly {
// Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
result := and(
mload(add(array, index)),
0xffffffffffffffffffffffffffffffffffffffff
)
}
return result;
}
internal GSNRecipient._getRelayedCallData keyboard_arrow_up
Parameters help
This function has no parameters.
Source Code
function _getRelayedCallData() private pure returns (bytes memory) {
// RelayHub appends the sender address at the end of the calldata, so in order to retrieve the actual msg.data,
// we must strip the last 20 bytes (length of an address type) from it.
uint256 actualDataLength = msg.data.length - 20;
bytes memory actualData = new bytes(actualDataLength);
for (uint256 i = 0; i < actualDataLength; ++i) {
actualData[i] = msg.data[i];
}
return actualData;
}
internal Context.constructor 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 returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
internal ERC777._mint keyboard_arrow_up
Parameters help
Source Code
function _mint(
address operator,
address account,
uint256 amount,
bytes memory userData,
bytes memory operatorData
) internal {
require(account != address(0), "ERC777: mint to the zero address");
// 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 operator,
address from,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData,
bool requireReceptionAck
) internal {
require(operator != address(0), "ERC777: operator is the zero address");
require(from != address(0), "ERC777: send from the zero address");
require(to != address(0), "ERC777: send to the zero address");
_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 operator,
address from,
uint256 amount,
bytes memory data,
bytes memory operatorData
) internal {
require(from != address(0), "ERC777: burn from the zero address");
_callTokensToSend(operator, from, address(0), amount, data, operatorData);
// 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 {
_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
) internal {
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
) internal {
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 Context.constructor 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 returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
internal ERC777._mint keyboard_arrow_up
Parameters help
Source Code
function _mint(
address operator,
address account,
uint256 amount,
bytes memory userData,
bytes memory operatorData
) internal {
require(account != address(0), "ERC777: mint to the zero address");
// 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 operator,
address from,
address to,
uint256 amount,
bytes memory userData,
bytes memory operatorData,
bool requireReceptionAck
) internal {
require(operator != address(0), "ERC777: operator is the zero address");
require(from != address(0), "ERC777: send from the zero address");
require(to != address(0), "ERC777: send to the zero address");
_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 operator,
address from,
uint256 amount,
bytes memory data,
bytes memory operatorData
) internal {
require(from != address(0), "ERC777: burn from the zero address");
_callTokensToSend(operator, from, address(0), amount, data, operatorData);
// 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 {
_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
) internal {
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
) internal {
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 Context.constructor 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 returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}