编译器
0.6.12+commit.27d51765
文件 1 的 3:Context.sol
pragma solidity ^0.6.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
文件 2 的 3:Ownable.sol
pragma solidity ^0.6.0;
import "./Context.sol";
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 3 的 3:Users.sol
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
import "./Ownable.sol";
interface RolesUsers {
function hasEndUserAdminRights(address addr) external view returns (bool);
}
contract Users is Ownable {
mapping(address => bytes32) _walletToUser;
RolesUsers private _roles;
event AddedWallet(bytes32 indexed userBytes, address wallet, string user);
event RemovedWallet(bytes32 indexed userBytes, address wallet);
modifier onlyEndUserAdmin {
require(_roles.hasEndUserAdminRights(msg.sender), "Whitelisted: You need to have end user admin rights!");
_;
}
constructor(address roles) public {
_roles = RolesUsers(roles);
}
function changeRolesAddress(address newRoles) public onlyOwner {
_roles = RolesUsers(newRoles);
}
function _addWallet(string memory user, address wallet) private {
bytes32 userBytes = getUserBytes(user);
_walletToUser[wallet] = userBytes;
emit AddedWallet(userBytes, wallet, user);
}
function _removeWallet(address wallet) private {
bytes32 userBytes = getUserBytesFromWallet(wallet);
delete _walletToUser[wallet];
emit RemovedWallet(userBytes, wallet);
}
function addWalletList(string[] memory users, address[] memory wallets) public onlyEndUserAdmin {
require(users.length == wallets.length, "Whitelisted: User and wallet lists must be of same length!");
for (uint i = 0; i < wallets.length; i++) {
_addWallet(users[i], wallets[i]);
}
}
function removeWalletList(address[] memory wallets) public onlyEndUserAdmin {
for (uint i = 0; i < wallets.length; i++) {
_removeWallet(wallets[i]);
}
}
function getUserBytesFromWallet(address wallet) public view returns (bytes32) {
return _walletToUser[wallet];
}
function getUserBytes(string memory user) public pure returns (bytes32) {
return keccak256(abi.encode(user));
}
}
{
"compilationTarget": {
"Users.sol": "Users"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"roles","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userBytes","type":"bytes32"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"string","name":"user","type":"string"}],"name":"AddedWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"userBytes","type":"bytes32"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"RemovedWallet","type":"event"},{"inputs":[{"internalType":"string[]","name":"users","type":"string[]"},{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addWalletList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRoles","type":"address"}],"name":"changeRolesAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"user","type":"string"}],"name":"getUserBytes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getUserBytesFromWallet","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"removeWalletList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]