Transaction Hash:
Block:
14483512 at Mar-29-2022 09:22:30 PM +UTC
Transaction Fee:
0.0019922649075 ETH
$5.01
Gas Used:
48,839 Gas / 40.7925 Gwei
Emitted Events:
31 |
InvictusWhitelist.WhitelistedAdded( account=0xbfa35f24...7B2A0A5d4 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x0000000F...d0dDb60f9 | |||||
0x00192Fb1...d1BF599E8
Miner
| (2Miners: PPLNS) | 5,917.318007595392205346 Eth | 5,917.31809598132929026 Eth | 0.000088385937084914 | |
0x06536B1E...aD7F32f0B |
2.548881325278163993 Eth
Nonce: 18668
|
2.546889060370663993 Eth
Nonce: 18669
| 0.0019922649075 |
Execution Trace
InvictusWhitelist.verifyParticipant( participant=0xbfa35f241A4fe668c8b208Dd20138267B2A0A5d4 )
verifyParticipant[InvictusWhitelist (ln:239)]
isWhitelisted[InvictusWhitelist (ln:240)]
addWhitelisted[InvictusWhitelist (ln:241)]
/** * Invictus Capital - Address Whitelist * https://invictuscapital.com * MIT License - https://github.com/invictuscapital/smartcontracts/ * Uses code from the OpenZeppelin project */ // File: contracts/openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.5.6; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/openzeppelin-solidity/contracts/access/Roles.sol pragma solidity ^0.5.6; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev give an account access to this role */ function add(Role storage role, address account) internal { require(account != address(0)); require(!has(role, account)); role.bearer[account] = true; } /** * @dev remove an account's access to this role */ function remove(Role storage role, address account) internal { require(account != address(0)); require(has(role, account)); role.bearer[account] = false; } /** * @dev check if an account has this role * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0)); return role.bearer[account]; } } // File: contracts/openzeppelin-solidity/contracts/access/roles/WhitelistAdminRole.sol pragma solidity ^0.5.6; /** * @title WhitelistAdminRole * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts. */ contract WhitelistAdminRole { using Roles for Roles.Role; event WhitelistAdminAdded(address indexed account); event WhitelistAdminRemoved(address indexed account); Roles.Role private _whitelistAdmins; constructor () internal { _addWhitelistAdmin(msg.sender); } modifier onlyWhitelistAdmin() { require(isWhitelistAdmin(msg.sender)); _; } function isWhitelistAdmin(address account) public view returns (bool) { return _whitelistAdmins.has(account); } function addWhitelistAdmin(address account) public onlyWhitelistAdmin { _addWhitelistAdmin(account); } function renounceWhitelistAdmin() public { _removeWhitelistAdmin(msg.sender); } function _addWhitelistAdmin(address account) internal { _whitelistAdmins.add(account); emit WhitelistAdminAdded(account); } function _removeWhitelistAdmin(address account) internal { _whitelistAdmins.remove(account); emit WhitelistAdminRemoved(account); } } // File: contracts/openzeppelin-solidity/contracts/access/roles/WhitelistedRole.sol pragma solidity ^0.5.6; /** * @title WhitelistedRole * @dev Whitelisted accounts have been approved by a WhitelistAdmin to perform certain actions (e.g. participate in a * crowdsale). This role is special in that the only accounts that can add it are WhitelistAdmins (who can also remove * it), and not Whitelisteds themselves. */ contract WhitelistedRole is WhitelistAdminRole { using Roles for Roles.Role; event WhitelistedAdded(address indexed account); event WhitelistedRemoved(address indexed account); Roles.Role private _whitelisteds; modifier onlyWhitelisted() { require(isWhitelisted(msg.sender)); _; } function isWhitelisted(address account) public view returns (bool) { return _whitelisteds.has(account); } function addWhitelisted(address account) public onlyWhitelistAdmin { _addWhitelisted(account); } function removeWhitelisted(address account) public onlyWhitelistAdmin { _removeWhitelisted(account); } function renounceWhitelisted() public { _removeWhitelisted(msg.sender); } function _addWhitelisted(address account) internal { _whitelisteds.add(account); emit WhitelistedAdded(account); } function _removeWhitelisted(address account) internal { _whitelisteds.remove(account); emit WhitelistedRemoved(account); } } // File: contracts/InvictusWhitelist.sol pragma solidity ^0.5.6; /** * Manages whitelisted addresses. * */ contract InvictusWhitelist is Ownable, WhitelistedRole { constructor () WhitelistedRole() public { } /// @dev override to support legacy name function verifyParticipant(address participant) public onlyWhitelistAdmin { if (!isWhitelisted(participant)) { addWhitelisted(participant); } } /// Allow the owner to remove a whitelistAdmin function removeWhitelistAdmin(address account) public onlyOwner { require(account != msg.sender, "Use renounceWhitelistAdmin"); _removeWhitelistAdmin(account); } }