Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
8913791 | 1872 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Minimal Proxy Contract for 0xc04bd2f0d484b7e0156b21c98b2923ca8b9ce149
Contract Name:
SimpleGriefing
Compiler Version
v0.5.11+commit.c082d0b4
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-09-24 */ pragma solidity ^0.5.0; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error. */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } /** * @title ERC20 interface * @dev see https://eips.ethereum.org/EIPS/eip-20 */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract EventMetadata { event MetadataSet(bytes metadata); // state functions function _setMetadata(bytes memory metadata) internal { emit MetadataSet(metadata); } } contract Operated { address private _operator; bool private _status; event OperatorUpdated(address operator, bool status); // state functions function _setOperator(address operator) internal { require(_operator != operator, "cannot set same operator"); _operator = operator; emit OperatorUpdated(operator, hasActiveOperator()); } function _transferOperator(address operator) internal { // transferring operator-ship implies there was an operator set before this require(_operator != address(0), "operator not set"); _setOperator(operator); } function _renounceOperator() internal { require(hasActiveOperator(), "only when operator active"); _operator = address(0); _status = false; emit OperatorUpdated(address(0), false); } function _activateOperator() internal { require(!hasActiveOperator(), "only when operator not active"); _status = true; emit OperatorUpdated(_operator, true); } function _deactivateOperator() internal { require(hasActiveOperator(), "only when operator active"); _status = false; emit OperatorUpdated(_operator, false); } // view functions function getOperator() public view returns (address operator) { operator = _operator; } function isOperator(address caller) public view returns (bool ok) { return (caller == getOperator()); } function hasActiveOperator() public view returns (bool ok) { return _status; } function isActiveOperator(address caller) public view returns (bool ok) { return (isOperator(caller) && hasActiveOperator()); } } /* Deadline * */ contract Deadline { uint256 private _deadline; event DeadlineSet(uint256 deadline); // state functions function _setDeadline(uint256 deadline) internal { _deadline = deadline; emit DeadlineSet(deadline); } // view functions function getDeadline() public view returns (uint256 deadline) { deadline = _deadline; } // if the _deadline is not set yet, isAfterDeadline will return true // due to now - 0 = now function isAfterDeadline() public view returns (bool status) { if (_deadline == 0) { status = false; } else { status = (now >= _deadline); } } } /* @title DecimalMath * @dev taken from https://github.com/PolymathNetwork/polymath-core * @dev Apache v2 License */ library DecimalMath { using SafeMath for uint256; uint256 internal constant e18 = uint256(10) ** uint256(18); /** * @notice This function multiplies two decimals represented as (decimal * 10**DECIMALS) * @return uint256 Result of multiplication represented as (decimal * 10**DECIMALS) */ function mul(uint256 x, uint256 y) internal pure returns(uint256 z) { z = SafeMath.add(SafeMath.mul(x, y), (e18) / 2) / (e18); } /** * @notice This function divides two decimals represented as (decimal * 10**DECIMALS) * @return uint256 Result of division represented as (decimal * 10**DECIMALS) */ function div(uint256 x, uint256 y) internal pure returns(uint256 z) { z = SafeMath.add(SafeMath.mul(x, (e18)), y / 2) / y; } } /* TODO: Update eip165 interface * bytes4(keccak256('create(bytes)')) == 0xcf5ba53f * bytes4(keccak256('getInstanceType()')) == 0x18c2f4cf * bytes4(keccak256('getInstanceRegistry()')) == 0xa5e13904 * bytes4(keccak256('getImplementation()')) == 0xaaf10f42 * * => 0xcf5ba53f ^ 0x18c2f4cf ^ 0xa5e13904 ^ 0xaaf10f42 == 0xd88967b6 */ interface iFactory { event InstanceCreated(address indexed instance, address indexed creator, string initABI, bytes initData); function create(bytes calldata initData) external returns (address instance); function createSalty(bytes calldata initData, bytes32 salt) external returns (address instance); function getInitSelector() external view returns (bytes4 initSelector); function getInstanceRegistry() external view returns (address instanceRegistry); function getTemplate() external view returns (address template); function getSaltyInstance(bytes calldata, bytes32 salt) external view returns (address instance); function getNextInstance(bytes calldata) external view returns (address instance); function getInstanceCreator(address instance) external view returns (address creator); function getInstanceType() external view returns (bytes4 instanceType); function getInstanceCount() external view returns (uint256 count); function getInstance(uint256 index) external view returns (address instance); function getInstances() external view returns (address[] memory instances); function getPaginatedInstances(uint256 startIndex, uint256 endIndex) external view returns (address[] memory instances); } contract iNMR { // ERC20 function totalSupply() external returns (uint256); function balanceOf(address _owner) external returns (uint256); function allowance(address _owner, address _spender) external returns (uint256); function transfer(address _to, uint256 _value) external returns (bool ok); function transferFrom(address _from, address _to, uint256 _value) external returns (bool ok); function approve(address _spender, uint256 _value) external returns (bool ok); function changeApproval(address _spender, uint256 _oldValue, uint256 _newValue) external returns (bool ok); // burn function mint(uint256 _value) external returns (bool ok); // burnFrom function numeraiTransfer(address _to, uint256 _value) external returns (bool ok); } /* Countdown timer */ contract Countdown is Deadline { using SafeMath for uint256; uint256 private _length; event LengthSet(uint256 length); // state functions function _setLength(uint256 length) internal { _length = length; emit LengthSet(length); } function _start() internal returns (uint256 deadline) { deadline = _length.add(now); Deadline._setDeadline(deadline); } // view functions function getLength() public view returns (uint256 length) { length = _length; } // if Deadline._setDeadline or Countdown._setLength is not called, // isOver will yield false function isOver() public view returns (bool status) { // when deadline not set, // countdown has not started, hence not isOver if (Deadline.getDeadline() == 0) { status = false; } else { status = Deadline.isAfterDeadline(); } } // timeRemaining will default to 0 if _setDeadline is not called // if the now exceeds deadline, just return 0 as the timeRemaining function timeRemaining() public view returns (uint256 time) { if (now >= Deadline.getDeadline()) { time = 0; } else { time = Deadline.getDeadline().sub(now); } } } contract Template { address private _factory; // modifiers modifier initializeTemplate() { // set factory _factory = msg.sender; // only allow function to be delegatecalled from within a constructor. uint32 codeSize; assembly { codeSize := extcodesize(address) } require(codeSize == 0, "must be called within contract constructor"); _; } // view functions function getCreator() public view returns (address creator) { // iFactory(...) would revert if _factory address is not actually a factory contract creator = iFactory(_factory).getInstanceCreator(address(this)); } function isCreator(address caller) public view returns (bool ok) { ok = (caller == getCreator()); } function getFactory() public view returns (address factory) { factory = _factory; } } /** * @title NMR token burning helper * @dev Allows for calling NMR burn functions using regular openzeppelin ERC20Burnable interface and revert on failure. */ contract BurnNMR { // address of the token address private constant _Token = address(0x1776e1F26f98b1A5dF9cD347953a26dd3Cb46671); /** * @dev Burns a specific amount of tokens. * @param value The amount of token to be burned. */ function _burn(uint256 value) internal { require(iNMR(_Token).mint(value), "nmr burn failed"); } /** * @dev Burns a specific amount of tokens from the target address and decrements allowance. * @param from address The account whose tokens will be burned. * @param value uint256 The amount of token to be burned. */ function _burnFrom(address from, uint256 value) internal { require(iNMR(_Token).numeraiTransfer(from, value), "nmr burnFrom failed"); } function getToken() public pure returns (address token) { token = _Token; } } contract Staking is BurnNMR { using SafeMath for uint256; mapping (address => uint256) private _stake; event StakeAdded(address staker, address funder, uint256 amount, uint256 newStake); event StakeTaken(address staker, address recipient, uint256 amount, uint256 newStake); event StakeBurned(address staker, uint256 amount, uint256 newStake); function _addStake(address staker, address funder, uint256 currentStake, uint256 amountToAdd) internal { // require current stake amount matches expected amount require(currentStake == _stake[staker], "current stake incorrect"); // require non-zero stake to add require(amountToAdd > 0, "no stake to add"); // calculate new stake amount uint256 newStake = currentStake.add(amountToAdd); // set new stake to storage _stake[staker] = newStake; // transfer the stake amount require(IERC20(BurnNMR.getToken()).transferFrom(funder, address(this), amountToAdd), "token transfer failed"); // emit event emit StakeAdded(staker, funder, amountToAdd, newStake); } function _takeStake(address staker, address recipient, uint256 currentStake, uint256 amountToTake) internal { // require current stake amount matches expected amount require(currentStake == _stake[staker], "current stake incorrect"); // require non-zero stake to take require(amountToTake > 0, "no stake to take"); // amountToTake has to be less than equal currentStake require(amountToTake <= currentStake, "cannot take more than currentStake"); // calculate new stake amount uint256 newStake = currentStake.sub(amountToTake); // set new stake to storage _stake[staker] = newStake; // transfer the stake amount require(IERC20(BurnNMR.getToken()).transfer(recipient, amountToTake), "token transfer failed"); // emit event emit StakeTaken(staker, recipient, amountToTake, newStake); } function _takeFullStake(address staker, address recipient) internal returns (uint256 stake) { // get stake from storage stake = _stake[staker]; // take full stake _takeStake(staker, recipient, stake, stake); } function _burnStake(address staker, uint256 currentStake, uint256 amountToBurn) internal { // require current stake amount matches expected amount require(currentStake == _stake[staker], "current stake incorrect"); // require non-zero stake to burn require(amountToBurn > 0, "no stake to burn"); // amountToTake has to be less than equal currentStake require(amountToBurn <= currentStake, "cannot burn more than currentStake"); // calculate new stake amount uint256 newStake = currentStake.sub(amountToBurn); // set new stake to storage _stake[staker] = newStake; // burn the stake amount BurnNMR._burn(amountToBurn); // emit event emit StakeBurned(staker, amountToBurn, newStake); } function _burnFullStake(address staker) internal returns (uint256 stake) { // get stake from storage stake = _stake[staker]; // burn full stake _burnStake(staker, stake, stake); } // view functions function getStake(address staker) public view returns (uint256 stake) { stake = _stake[staker]; } } contract Griefing is Staking { enum RatioType { NaN, Inf, Dec } mapping (address => GriefRatio) private _griefRatio; struct GriefRatio { uint256 ratio; RatioType ratioType; } event RatioSet(address staker, uint256 ratio, RatioType ratioType); event Griefed(address punisher, address staker, uint256 punishment, uint256 cost, bytes message); uint256 internal constant e18 = uint256(10) ** uint256(18); // state functions function _setRatio(address staker, uint256 ratio, RatioType ratioType) internal { if (ratioType == RatioType.NaN || ratioType == RatioType.Inf) { require(ratio == 0, "ratio must be 0 when ratioType is NaN or Inf"); } // set data in storage _griefRatio[staker].ratio = ratio; _griefRatio[staker].ratioType = ratioType; // emit event emit RatioSet(staker, ratio, ratioType); } function _grief( address punisher, address staker, uint256 currentStake, uint256 punishment, bytes memory message ) internal returns (uint256 cost) { // prevent accidental double punish // cannot be strict equality to prevent frontrunning require(currentStake <= Staking.getStake(staker), "current stake incorrect"); // get grief data from storage uint256 ratio = _griefRatio[staker].ratio; RatioType ratioType = _griefRatio[staker].ratioType; require(ratioType != RatioType.NaN, "no punishment allowed"); // calculate cost // getCost also acts as a guard when _setRatio is not called before cost = getCost(ratio, punishment, ratioType); // burn the cost from the punisher's balance BurnNMR._burnFrom(punisher, cost); // burn the punishment from the target's stake Staking._burnStake(staker, currentStake, punishment); // emit event emit Griefed(punisher, staker, punishment, cost, message); } // view functions function getRatio(address staker) public view returns (uint256 ratio, RatioType ratioType) { // get stake data from storage ratio = _griefRatio[staker].ratio; ratioType = _griefRatio[staker].ratioType; } // pure functions function getCost(uint256 ratio, uint256 punishment, RatioType ratioType) public pure returns(uint256 cost) { /* Dec: Cost multiplied by ratio interpreted as a decimal number with 18 decimals, e.g. 1 -> 1e18 * Inf: Punishment at no cost * NaN: No Punishment */ if (ratioType == RatioType.Dec) { return DecimalMath.mul(SafeMath.mul(punishment, e18), ratio) / e18; } if (ratioType == RatioType.Inf) return 0; if (ratioType == RatioType.NaN) revert("ratioType cannot be RatioType.NaN"); } function getPunishment(uint256 ratio, uint256 cost, RatioType ratioType) public pure returns(uint256 punishment) { /* Dec: Ratio is a decimal number with 18 decimals * Inf: Punishment at no cost * NaN: No Punishment */ if (ratioType == RatioType.Dec) { return DecimalMath.div(SafeMath.mul(cost, e18), ratio) / e18; } if (ratioType == RatioType.Inf) revert("ratioType cannot be RatioType.Inf"); if (ratioType == RatioType.NaN) revert("ratioType cannot be RatioType.NaN"); } } /* Immediately engage with specific buyer * - Stake can be increased at any time. * - Counterparty can greif the staker at predefined ratio. * * NOTE: * - This top level contract should only perform access control and state transitions * */ contract SimpleGriefing is Griefing, EventMetadata, Operated, Template { using SafeMath for uint256; Data private _data; struct Data { address staker; address counterparty; } event Initialized(address operator, address staker, address counterparty, uint256 ratio, Griefing.RatioType ratioType, bytes metadata); function initialize( address operator, address staker, address counterparty, uint256 ratio, Griefing.RatioType ratioType, bytes memory metadata ) public initializeTemplate() { // set storage values _data.staker = staker; _data.counterparty = counterparty; // set operator if (operator != address(0)) { Operated._setOperator(operator); Operated._activateOperator(); } // set griefing ratio Griefing._setRatio(staker, ratio, ratioType); // set metadata if (metadata.length != 0) { EventMetadata._setMetadata(metadata); } // log initialization params emit Initialized(operator, staker, counterparty, ratio, ratioType, metadata); } // state functions function setMetadata(bytes memory metadata) public { // restrict access require(isStaker(msg.sender) || Operated.isActiveOperator(msg.sender), "only staker or active operator"); // update metadata EventMetadata._setMetadata(metadata); } function increaseStake(uint256 currentStake, uint256 amountToAdd) public { // restrict access require(isStaker(msg.sender) || Operated.isActiveOperator(msg.sender), "only staker or active operator"); // add stake Staking._addStake(_data.staker, msg.sender, currentStake, amountToAdd); } function reward(uint256 currentStake, uint256 amountToAdd) public { // restrict access require(isCounterparty(msg.sender) || Operated.isActiveOperator(msg.sender), "only counterparty or active operator"); // add stake Staking._addStake(_data.staker, msg.sender, currentStake, amountToAdd); } function punish(uint256 currentStake, uint256 punishment, bytes memory message) public returns (uint256 cost) { // restrict access require(isCounterparty(msg.sender) || Operated.isActiveOperator(msg.sender), "only counterparty or active operator"); // execute griefing cost = Griefing._grief(msg.sender, _data.staker, currentStake, punishment, message); } function releaseStake(uint256 currentStake, uint256 amountToRelease) public { // restrict access require(isCounterparty(msg.sender) || Operated.isActiveOperator(msg.sender), "only counterparty or active operator"); // release stake back to the staker Staking._takeStake(_data.staker, _data.staker, currentStake, amountToRelease); } function transferOperator(address operator) public { // restrict access require(Operated.isActiveOperator(msg.sender), "only active operator"); // transfer operator Operated._transferOperator(operator); } function renounceOperator() public { // restrict access require(Operated.isActiveOperator(msg.sender), "only active operator"); // transfer operator Operated._renounceOperator(); } // view functions function isStaker(address caller) public view returns (bool validity) { validity = (caller == _data.staker); } function isCounterparty(address caller) public view returns (bool validity) { validity = (caller == _data.counterparty); } }
[{"constant":true,"inputs":[],"name":"getCreator","outputs":[{"internalType":"address","name":"creator","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"currentStake","type":"uint256"},{"internalType":"uint256","name":"punishment","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"punish","outputs":[{"internalType":"uint256","name":"cost","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getToken","outputs":[{"internalType":"address","name":"token","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"transferOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"isActiveOperator","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"counterparty","type":"address"},{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"enum Griefing.RatioType","name":"ratioType","type":"uint8"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"uint256","name":"punishment","type":"uint256"},{"internalType":"enum Griefing.RatioType","name":"ratioType","type":"uint8"}],"name":"getCost","outputs":[{"internalType":"uint256","name":"cost","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"currentStake","type":"uint256"},{"internalType":"uint256","name":"amountToRelease","type":"uint256"}],"name":"releaseStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"enum Griefing.RatioType","name":"ratioType","type":"uint8"}],"name":"getPunishment","outputs":[{"internalType":"uint256","name":"punishment","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"isStaker","outputs":[{"internalType":"bool","name":"validity","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"isCounterparty","outputs":[{"internalType":"bool","name":"validity","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"enum Griefing.RatioType","name":"ratioType","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStake","outputs":[{"internalType":"uint256","name":"stake","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFactory","outputs":[{"internalType":"address","name":"factory","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasActiveOperator","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"currentStake","type":"uint256"},{"internalType":"uint256","name":"amountToAdd","type":"uint256"}],"name":"reward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"currentStake","type":"uint256"},{"internalType":"uint256","name":"amountToAdd","type":"uint256"}],"name":"increaseStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getOperator","outputs":[{"internalType":"address","name":"operator","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"setMetadata","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"isCreator","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"counterparty","type":"address"},{"indexed":false,"internalType":"uint256","name":"ratio","type":"uint256"},{"indexed":false,"internalType":"enum Griefing.RatioType","name":"ratioType","type":"uint8"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"MetadataSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"ratio","type":"uint256"},{"indexed":false,"internalType":"enum Griefing.RatioType","name":"ratioType","type":"uint8"}],"name":"RatioSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"punisher","type":"address"},{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"punishment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"Griefed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"funder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newStake","type":"uint256"}],"name":"StakeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newStake","type":"uint256"}],"name":"StakeTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newStake","type":"uint256"}],"name":"StakeBurned","type":"event"}]
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
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.