More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
||||
---|---|---|---|---|---|---|---|
11380519 | 1542 days ago | 0 ETH | |||||
11380519 | 1542 days ago | 0 ETH | |||||
11380519 | 1542 days ago | 0 ETH | |||||
11380519 | 1542 days ago | 0 ETH | |||||
11380519 | 1542 days ago | 0 ETH | |||||
11380519 | 1542 days ago | 0 ETH | |||||
9931167 | 1766 days ago | 0 ETH | |||||
9931167 | 1766 days ago | 0 ETH | |||||
9931167 | 1766 days ago | 0 ETH | |||||
9931167 | 1766 days ago | 0 ETH | |||||
9931167 | 1766 days ago | 0 ETH | |||||
9931167 | 1766 days ago | 0 ETH | |||||
9931167 | 1766 days ago | 0 ETH | |||||
9430384 | 1843 days ago | 0 ETH | |||||
9430384 | 1843 days ago | 0 ETH | |||||
9430384 | 1843 days ago | 0 ETH | |||||
9384566 | 1850 days ago | 0 ETH | |||||
9384566 | 1850 days ago | 0 ETH | |||||
9384566 | 1850 days ago | 0 ETH | |||||
9338927 | 1857 days ago | 0 ETH | |||||
9338927 | 1857 days ago | 0 ETH | |||||
9338927 | 1857 days ago | 0 ETH | |||||
9247389 | 1871 days ago | 0 ETH | |||||
9247389 | 1871 days ago | 0 ETH | |||||
9247389 | 1871 days ago | 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 | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $11.17 | 0.0112 | $0.1246 |
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.