Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
EventsHub
Compiler Version
v0.5.17+commit.d19bba13
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-08-07
*/
pragma solidity ^0.5.2;
interface IGovernance {
function update(address target, bytes calldata data) external;
}
contract Governable {
IGovernance public governance;
constructor(address _governance) public {
governance = IGovernance(_governance);
}
modifier onlyGovernance() {
_assertGovernance();
_;
}
function _assertGovernance() private view {
require(
msg.sender == address(governance),
"Only governance contract is authorized"
);
}
}
contract IWithdrawManager {
function createExitQueue(address token) external;
function verifyInclusion(
bytes calldata data,
uint8 offset,
bool verifyTxInclusion
) external view returns (uint256 age);
function addExitToQueue(
address exitor,
address childToken,
address rootToken,
uint256 exitAmountOrTokenId,
bytes32 txHash,
bool isRegularExit,
uint256 priority
) external;
function addInput(
uint256 exitId,
uint256 age,
address utxoOwner,
address token
) external;
function challengeExit(
uint256 exitId,
uint256 inputId,
bytes calldata challengeData,
address adjudicatorPredicate
) external;
}
contract Registry is Governable {
// @todo hardcode constants
bytes32 private constant WETH_TOKEN = keccak256("wethToken");
bytes32 private constant DEPOSIT_MANAGER = keccak256("depositManager");
bytes32 private constant STAKE_MANAGER = keccak256("stakeManager");
bytes32 private constant VALIDATOR_SHARE = keccak256("validatorShare");
bytes32 private constant WITHDRAW_MANAGER = keccak256("withdrawManager");
bytes32 private constant CHILD_CHAIN = keccak256("childChain");
bytes32 private constant STATE_SENDER = keccak256("stateSender");
bytes32 private constant SLASHING_MANAGER = keccak256("slashingManager");
address public erc20Predicate;
address public erc721Predicate;
mapping(bytes32 => address) public contractMap;
mapping(address => address) public rootToChildToken;
mapping(address => address) public childToRootToken;
mapping(address => bool) public proofValidatorContracts;
mapping(address => bool) public isERC721;
enum Type {Invalid, ERC20, ERC721, Custom}
struct Predicate {
Type _type;
}
mapping(address => Predicate) public predicates;
event TokenMapped(address indexed rootToken, address indexed childToken);
event ProofValidatorAdded(address indexed validator, address indexed from);
event ProofValidatorRemoved(address indexed validator, address indexed from);
event PredicateAdded(address indexed predicate, address indexed from);
event PredicateRemoved(address indexed predicate, address indexed from);
event ContractMapUpdated(bytes32 indexed key, address indexed previousContract, address indexed newContract);
constructor(address _governance) public Governable(_governance) {}
function updateContractMap(bytes32 _key, address _address) external onlyGovernance {
emit ContractMapUpdated(_key, contractMap[_key], _address);
contractMap[_key] = _address;
}
/**
* @dev Map root token to child token
* @param _rootToken Token address on the root chain
* @param _childToken Token address on the child chain
* @param _isERC721 Is the token being mapped ERC721
*/
function mapToken(
address _rootToken,
address _childToken,
bool _isERC721
) external onlyGovernance {
require(_rootToken != address(0x0) && _childToken != address(0x0), "INVALID_TOKEN_ADDRESS");
rootToChildToken[_rootToken] = _childToken;
childToRootToken[_childToken] = _rootToken;
isERC721[_rootToken] = _isERC721;
IWithdrawManager(contractMap[WITHDRAW_MANAGER]).createExitQueue(_rootToken);
emit TokenMapped(_rootToken, _childToken);
}
function addErc20Predicate(address predicate) public onlyGovernance {
require(predicate != address(0x0), "Can not add null address as predicate");
erc20Predicate = predicate;
addPredicate(predicate, Type.ERC20);
}
function addErc721Predicate(address predicate) public onlyGovernance {
erc721Predicate = predicate;
addPredicate(predicate, Type.ERC721);
}
function addPredicate(address predicate, Type _type) public onlyGovernance {
require(predicates[predicate]._type == Type.Invalid, "Predicate already added");
predicates[predicate]._type = _type;
emit PredicateAdded(predicate, msg.sender);
}
function removePredicate(address predicate) public onlyGovernance {
require(predicates[predicate]._type != Type.Invalid, "Predicate does not exist");
delete predicates[predicate];
emit PredicateRemoved(predicate, msg.sender);
}
function getValidatorShareAddress() public view returns (address) {
return contractMap[VALIDATOR_SHARE];
}
function getWethTokenAddress() public view returns (address) {
return contractMap[WETH_TOKEN];
}
function getDepositManagerAddress() public view returns (address) {
return contractMap[DEPOSIT_MANAGER];
}
function getStakeManagerAddress() public view returns (address) {
return contractMap[STAKE_MANAGER];
}
function getSlashingManagerAddress() public view returns (address) {
return contractMap[SLASHING_MANAGER];
}
function getWithdrawManagerAddress() public view returns (address) {
return contractMap[WITHDRAW_MANAGER];
}
function getChildChainAndStateSender() public view returns (address, address) {
return (contractMap[CHILD_CHAIN], contractMap[STATE_SENDER]);
}
function isTokenMapped(address _token) public view returns (bool) {
return rootToChildToken[_token] != address(0x0);
}
function isTokenMappedAndIsErc721(address _token) public view returns (bool) {
require(isTokenMapped(_token), "TOKEN_NOT_MAPPED");
return isERC721[_token];
}
function isTokenMappedAndGetPredicate(address _token) public view returns (address) {
if (isTokenMappedAndIsErc721(_token)) {
return erc721Predicate;
}
return erc20Predicate;
}
function isChildTokenErc721(address childToken) public view returns (bool) {
address rootToken = childToRootToken[childToken];
require(rootToken != address(0x0), "Child token is not mapped");
return isERC721[rootToken];
}
}
contract Initializable {
bool inited = false;
modifier initializer() {
require(!inited, "already inited");
inited = true;
_;
}
}
contract IStakeManagerEventsHub {
struct Validator {
uint256 amount;
uint256 reward;
uint256 activationEpoch;
uint256 deactivationEpoch;
uint256 jailTime;
address signer;
address contractAddress;
}
mapping(uint256 => Validator) public validators;
}
contract EventsHub is Initializable {
Registry public registry;
modifier onlyValidatorContract(uint256 validatorId) {
address _contract;
(, , , , , , _contract) = IStakeManagerEventsHub(registry.getStakeManagerAddress()).validators(validatorId);
require(_contract == msg.sender, "not validator");
_;
}
modifier onlyStakeManager() {
require(registry.getStakeManagerAddress() == msg.sender,
"Invalid sender, not stake manager");
_;
}
function initialize(Registry _registry) external initializer {
registry = _registry;
}
event ShareBurnedWithId(
uint256 indexed validatorId,
address indexed user,
uint256 indexed amount,
uint256 tokens,
uint256 nonce
);
function logShareBurnedWithId(
uint256 validatorId,
address user,
uint256 amount,
uint256 tokens,
uint256 nonce
) public onlyValidatorContract(validatorId) {
emit ShareBurnedWithId(validatorId, user, amount, tokens, nonce);
}
event DelegatorUnstakeWithId(
uint256 indexed validatorId,
address indexed user,
uint256 amount,
uint256 nonce
);
function logDelegatorUnstakedWithId(
uint256 validatorId,
address user,
uint256 amount,
uint256 nonce
) public onlyValidatorContract(validatorId) {
emit DelegatorUnstakeWithId(validatorId, user, amount, nonce);
}
event RewardParams(
uint256 rewardDecreasePerCheckpoint,
uint256 maxRewardedCheckpoints,
uint256 checkpointRewardDelta
);
function logRewardParams(
uint256 rewardDecreasePerCheckpoint,
uint256 maxRewardedCheckpoints,
uint256 checkpointRewardDelta
) public onlyStakeManager {
emit RewardParams(rewardDecreasePerCheckpoint, maxRewardedCheckpoints, checkpointRewardDelta);
}
event UpdateCommissionRate(
uint256 indexed validatorId,
uint256 indexed newCommissionRate,
uint256 indexed oldCommissionRate
);
function logUpdateCommissionRate(
uint256 validatorId,
uint256 newCommissionRate,
uint256 oldCommissionRate
) public onlyStakeManager {
emit UpdateCommissionRate(
validatorId,
newCommissionRate,
oldCommissionRate
);
}
event SharesTransfer(
uint256 indexed validatorId,
address indexed from,
address indexed to,
uint256 value
);
function logSharesTransfer(
uint256 validatorId,
address from,
address to,
uint256 value
) public onlyValidatorContract(validatorId) {
emit SharesTransfer(validatorId, from, to, value);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"validatorId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"DelegatorUnstakeWithId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardDecreasePerCheckpoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxRewardedCheckpoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"checkpointRewardDelta","type":"uint256"}],"name":"RewardParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"validatorId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"ShareBurnedWithId","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"validatorId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SharesTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"validatorId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newCommissionRate","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldCommissionRate","type":"uint256"}],"name":"UpdateCommissionRate","type":"event"},{"constant":false,"inputs":[{"internalType":"contract Registry","name":"_registry","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"validatorId","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"logDelegatorUnstakedWithId","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"rewardDecreasePerCheckpoint","type":"uint256"},{"internalType":"uint256","name":"maxRewardedCheckpoints","type":"uint256"},{"internalType":"uint256","name":"checkpointRewardDelta","type":"uint256"}],"name":"logRewardParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"validatorId","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"logShareBurnedWithId","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"validatorId","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"logSharesTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"validatorId","type":"uint256"},{"internalType":"uint256","name":"newCommissionRate","type":"uint256"},{"internalType":"uint256","name":"oldCommissionRate","type":"uint256"}],"name":"logUpdateCommissionRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"internalType":"contract Registry","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]Contract Creation Code
60806040526000805460ff1916905534801561001a57600080fd5b506109678061002a6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063abf158d51161005b578063abf158d51461011e578063c08b3f9d14610147578063c4d66de814610183578063c98cc002146101a95761007d565b80635536b682146100825780636e699d87146100c25780637b103999146100fa575b600080fd5b6100c0600480360360a081101561009857600080fd5b508035906001600160a01b0360208201351690604081013590606081013590608001356101d2565b005b6100c0600480360360808110156100d857600080fd5b508035906001600160a01b036020820135169060408101359060600135610369565b6101026104fe565b604080516001600160a01b039092168252519081900360200190f35b6100c06004803603606081101561013457600080fd5b5080359060208101359060400135610512565b6100c06004803603608081101561015d57600080fd5b508035906001600160a01b03602082013581169160408101359091169060600135610611565b6100c06004803603602081101561019957600080fd5b50356001600160a01b03166107a8565b6100c0600480360360608110156101bf57600080fd5b5080359060208101359060400135610823565b8460008060019054906101000a90046001600160a01b03166001600160a01b031663287be3e46040518163ffffffff1660e01b815260040160206040518083038186803b15801561022257600080fd5b505afa158015610236573d6000803e3d6000fd5b505050506040513d602081101561024c57600080fd5b505160408051630d6a8b9160e21b81526004810185905290516001600160a01b03909216916335aa2e449160248082019260e092909190829003018186803b15801561029757600080fd5b505afa1580156102ab573d6000803e3d6000fd5b505050506040513d60e08110156102c157600080fd5b5060c0015190506001600160a01b0381163314610315576040805162461bcd60e51b815260206004820152600d60248201526c3737ba103b30b634b230ba37b960991b604482015290519081900360640190fd5b84866001600160a01b0316887f502f5a6697a92e602c626b931a4a771fef4360eb9cece7bf906f10c5cec96aaa8787604051808381526020018281526020019250505060405180910390a450505050505050565b8360008060019054906101000a90046001600160a01b03166001600160a01b031663287be3e46040518163ffffffff1660e01b815260040160206040518083038186803b1580156103b957600080fd5b505afa1580156103cd573d6000803e3d6000fd5b505050506040513d60208110156103e357600080fd5b505160408051630d6a8b9160e21b81526004810185905290516001600160a01b03909216916335aa2e449160248082019260e092909190829003018186803b15801561042e57600080fd5b505afa158015610442573d6000803e3d6000fd5b505050506040513d60e081101561045857600080fd5b5060c0015190506001600160a01b03811633146104ac576040805162461bcd60e51b815260206004820152600d60248201526c3737ba103b30b634b230ba37b960991b604482015290519081900360640190fd5b846001600160a01b0316867f7beb9bef91040fcf7607c78d4fc668370a9036788d7e6f202a4a2db5b0c28c808686604051808381526020018281526020019250505060405180910390a3505050505050565b60005461010090046001600160a01b031681565b60005460408051630a1ef8f960e21b81529051339261010090046001600160a01b03169163287be3e4916004808301926020929190829003018186803b15801561055b57600080fd5b505afa15801561056f573d6000803e3d6000fd5b505050506040513d602081101561058557600080fd5b50516001600160a01b0316146105cc5760405162461bcd60e51b81526004018080602001828103825260218152602001806109126021913960400191505060405180910390fd5b604080518481526020810184905280820183905290517f801c2d11f1d1780f228c2a497cf5eae033694c8eb057d636044683def26e03ec9181900360600190a1505050565b8360008060019054906101000a90046001600160a01b03166001600160a01b031663287be3e46040518163ffffffff1660e01b815260040160206040518083038186803b15801561066157600080fd5b505afa158015610675573d6000803e3d6000fd5b505050506040513d602081101561068b57600080fd5b505160408051630d6a8b9160e21b81526004810185905290516001600160a01b03909216916335aa2e449160248082019260e092909190829003018186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d60e081101561070057600080fd5b5060c0015190506001600160a01b0381163314610754576040805162461bcd60e51b815260206004820152600d60248201526c3737ba103b30b634b230ba37b960991b604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316877f0a11785f16076d5ade1b5a7a0867d5ec042b8ae8c4f0609d0a72bfd062ba2ee0866040518082815260200191505060405180910390a4505050505050565b60005460ff16156107f1576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015290519081900360640190fd5b600080546001600160a01b0390921661010002610100600160a81b031960ff1990931660011792909216919091179055565b60005460408051630a1ef8f960e21b81529051339261010090046001600160a01b03169163287be3e4916004808301926020929190829003018186803b15801561086c57600080fd5b505afa158015610880573d6000803e3d6000fd5b505050506040513d602081101561089657600080fd5b50516001600160a01b0316146108dd5760405162461bcd60e51b81526004018080602001828103825260218152602001806109126021913960400191505060405180910390fd5b8082847f7d5da5ece9d43013d62ab966f4704ca376b92be29ca6fbb958154baf1c0dc17e60405160405180910390a450505056fe496e76616c69642073656e6465722c206e6f74207374616b65206d616e61676572a265627a7a7231582027ca180fc2a4cbde2d5b741d866eb22f230381d7de0bfeeca6f13523bb5de99564736f6c63430005110032
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063abf158d51161005b578063abf158d51461011e578063c08b3f9d14610147578063c4d66de814610183578063c98cc002146101a95761007d565b80635536b682146100825780636e699d87146100c25780637b103999146100fa575b600080fd5b6100c0600480360360a081101561009857600080fd5b508035906001600160a01b0360208201351690604081013590606081013590608001356101d2565b005b6100c0600480360360808110156100d857600080fd5b508035906001600160a01b036020820135169060408101359060600135610369565b6101026104fe565b604080516001600160a01b039092168252519081900360200190f35b6100c06004803603606081101561013457600080fd5b5080359060208101359060400135610512565b6100c06004803603608081101561015d57600080fd5b508035906001600160a01b03602082013581169160408101359091169060600135610611565b6100c06004803603602081101561019957600080fd5b50356001600160a01b03166107a8565b6100c0600480360360608110156101bf57600080fd5b5080359060208101359060400135610823565b8460008060019054906101000a90046001600160a01b03166001600160a01b031663287be3e46040518163ffffffff1660e01b815260040160206040518083038186803b15801561022257600080fd5b505afa158015610236573d6000803e3d6000fd5b505050506040513d602081101561024c57600080fd5b505160408051630d6a8b9160e21b81526004810185905290516001600160a01b03909216916335aa2e449160248082019260e092909190829003018186803b15801561029757600080fd5b505afa1580156102ab573d6000803e3d6000fd5b505050506040513d60e08110156102c157600080fd5b5060c0015190506001600160a01b0381163314610315576040805162461bcd60e51b815260206004820152600d60248201526c3737ba103b30b634b230ba37b960991b604482015290519081900360640190fd5b84866001600160a01b0316887f502f5a6697a92e602c626b931a4a771fef4360eb9cece7bf906f10c5cec96aaa8787604051808381526020018281526020019250505060405180910390a450505050505050565b8360008060019054906101000a90046001600160a01b03166001600160a01b031663287be3e46040518163ffffffff1660e01b815260040160206040518083038186803b1580156103b957600080fd5b505afa1580156103cd573d6000803e3d6000fd5b505050506040513d60208110156103e357600080fd5b505160408051630d6a8b9160e21b81526004810185905290516001600160a01b03909216916335aa2e449160248082019260e092909190829003018186803b15801561042e57600080fd5b505afa158015610442573d6000803e3d6000fd5b505050506040513d60e081101561045857600080fd5b5060c0015190506001600160a01b03811633146104ac576040805162461bcd60e51b815260206004820152600d60248201526c3737ba103b30b634b230ba37b960991b604482015290519081900360640190fd5b846001600160a01b0316867f7beb9bef91040fcf7607c78d4fc668370a9036788d7e6f202a4a2db5b0c28c808686604051808381526020018281526020019250505060405180910390a3505050505050565b60005461010090046001600160a01b031681565b60005460408051630a1ef8f960e21b81529051339261010090046001600160a01b03169163287be3e4916004808301926020929190829003018186803b15801561055b57600080fd5b505afa15801561056f573d6000803e3d6000fd5b505050506040513d602081101561058557600080fd5b50516001600160a01b0316146105cc5760405162461bcd60e51b81526004018080602001828103825260218152602001806109126021913960400191505060405180910390fd5b604080518481526020810184905280820183905290517f801c2d11f1d1780f228c2a497cf5eae033694c8eb057d636044683def26e03ec9181900360600190a1505050565b8360008060019054906101000a90046001600160a01b03166001600160a01b031663287be3e46040518163ffffffff1660e01b815260040160206040518083038186803b15801561066157600080fd5b505afa158015610675573d6000803e3d6000fd5b505050506040513d602081101561068b57600080fd5b505160408051630d6a8b9160e21b81526004810185905290516001600160a01b03909216916335aa2e449160248082019260e092909190829003018186803b1580156106d657600080fd5b505afa1580156106ea573d6000803e3d6000fd5b505050506040513d60e081101561070057600080fd5b5060c0015190506001600160a01b0381163314610754576040805162461bcd60e51b815260206004820152600d60248201526c3737ba103b30b634b230ba37b960991b604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316877f0a11785f16076d5ade1b5a7a0867d5ec042b8ae8c4f0609d0a72bfd062ba2ee0866040518082815260200191505060405180910390a4505050505050565b60005460ff16156107f1576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015290519081900360640190fd5b600080546001600160a01b0390921661010002610100600160a81b031960ff1990931660011792909216919091179055565b60005460408051630a1ef8f960e21b81529051339261010090046001600160a01b03169163287be3e4916004808301926020929190829003018186803b15801561086c57600080fd5b505afa158015610880573d6000803e3d6000fd5b505050506040513d602081101561089657600080fd5b50516001600160a01b0316146108dd5760405162461bcd60e51b81526004018080602001828103825260218152602001806109126021913960400191505060405180910390fd5b8082847f7d5da5ece9d43013d62ab966f4704ca376b92be29ca6fbb958154baf1c0dc17e60405160405180910390a450505056fe496e76616c69642073656e6465722c206e6f74207374616b65206d616e61676572a265627a7a7231582027ca180fc2a4cbde2d5b741d866eb22f230381d7de0bfeeca6f13523bb5de99564736f6c63430005110032
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.