Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 27 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Earliest Set... | 7891785 | 2491 days ago | IN | 0 ETH | 0.0029867 | ||||
| Set Earliest Set... | 7797170 | 2506 days ago | IN | 0 ETH | 0.0029931 | ||||
| Set Earliest Set... | 7700861 | 2521 days ago | IN | 0 ETH | 0.0029931 | ||||
| Set Earliest Set... | 7644193 | 2529 days ago | IN | 0 ETH | 0.029931 | ||||
| Set Earliest Set... | 7644193 | 2529 days ago | IN | 0 ETH | 0.029931 | ||||
| Set Earliest Set... | 7644193 | 2529 days ago | IN | 0 ETH | 0.0029931 | ||||
| Set Earliest Set... | 7644193 | 2529 days ago | IN | 0 ETH | 0.00059862 | ||||
| Enable Service A... | 7588272 | 2538 days ago | IN | 0 ETH | 0.0090694 | ||||
| Register Service | 7588271 | 2538 days ago | IN | 0 ETH | 0.0067276 | ||||
| Enable Service A... | 7588269 | 2538 days ago | IN | 0 ETH | 0.0090694 | ||||
| Register Service | 7588267 | 2538 days ago | IN | 0 ETH | 0.0067276 | ||||
| Set Earliest Set... | 7588265 | 2538 days ago | IN | 0 ETH | 0.0044931 | ||||
| Set Update Delay... | 7588263 | 2538 days ago | IN | 0 ETH | 0.007347 | ||||
| Set Fraud Stake ... | 7588261 | 2538 days ago | IN | 0 ETH | 0.0088225 | ||||
| Set Operator Set... | 7588258 | 2538 days ago | IN | 0 ETH | 0.0088159 | ||||
| Set Wallet Settl... | 7588256 | 2538 days ago | IN | 0 ETH | 0.0087851 | ||||
| Set Settlement C... | 7588254 | 2538 days ago | IN | 0 ETH | 0.0087989 | ||||
| Set Cancel Order... | 7588252 | 2538 days ago | IN | 0 ETH | 0.0088209 | ||||
| Set Wallet Lock ... | 7588250 | 2538 days ago | IN | 0 ETH | 0.0087573 | ||||
| Set Payment Mini... | 7588248 | 2538 days ago | IN | 0 ETH | 0.0087437 | ||||
| Set Payment Fee | 7588247 | 2538 days ago | IN | 0 ETH | 0.0092182 | ||||
| Set Trade Taker ... | 7588246 | 2538 days ago | IN | 0 ETH | 0.0087965 | ||||
| Set Trade Taker ... | 7588243 | 2538 days ago | IN | 0 ETH | 0.0092272 | ||||
| Set Trade Maker ... | 7588241 | 2538 days ago | IN | 0 ETH | 0.0088735 | ||||
| Set Trade Maker ... | 7588239 | 2538 days ago | IN | 0 ETH | 0.0091676 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Configuration
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 0 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2019-07-11
*/
pragma solidity ^0.4.25;
pragma experimental ABIEncoderV2;
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
/**
* @title Modifiable
* @notice A contract with basic modifiers
*/
contract Modifiable {
//
// Modifiers
// -----------------------------------------------------------------------------------------------------------------
modifier notNullAddress(address _address) {
require(_address != address(0));
_;
}
modifier notThisAddress(address _address) {
require(_address != address(this));
_;
}
modifier notNullOrThisAddress(address _address) {
require(_address != address(0));
require(_address != address(this));
_;
}
modifier notSameAddresses(address _address1, address _address2) {
if (_address1 != _address2)
_;
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
/**
* @title SelfDestructible
* @notice Contract that allows for self-destruction
*/
contract SelfDestructible {
//
// Variables
// -----------------------------------------------------------------------------------------------------------------
bool public selfDestructionDisabled;
//
// Events
// -----------------------------------------------------------------------------------------------------------------
event SelfDestructionDisabledEvent(address wallet);
event TriggerSelfDestructionEvent(address wallet);
//
// Functions
// -----------------------------------------------------------------------------------------------------------------
/// @notice Get the address of the destructor role
function destructor()
public
view
returns (address);
/// @notice Disable self-destruction of this contract
/// @dev This operation can not be undone
function disableSelfDestruction()
public
{
// Require that sender is the assigned destructor
require(destructor() == msg.sender);
// Disable self-destruction
selfDestructionDisabled = true;
// Emit event
emit SelfDestructionDisabledEvent(msg.sender);
}
/// @notice Destroy this contract
function triggerSelfDestruction()
public
{
// Require that sender is the assigned destructor
require(destructor() == msg.sender);
// Require that self-destruction has not been disabled
require(!selfDestructionDisabled);
// Emit event
emit TriggerSelfDestructionEvent(msg.sender);
// Self-destruct and reward destructor
selfdestruct(msg.sender);
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
/**
* @title Ownable
* @notice A modifiable that has ownership roles
*/
contract Ownable is Modifiable, SelfDestructible {
//
// Variables
// -----------------------------------------------------------------------------------------------------------------
address public deployer;
address public operator;
//
// Events
// -----------------------------------------------------------------------------------------------------------------
event SetDeployerEvent(address oldDeployer, address newDeployer);
event SetOperatorEvent(address oldOperator, address newOperator);
//
// Constructor
// -----------------------------------------------------------------------------------------------------------------
constructor(address _deployer) internal notNullOrThisAddress(_deployer) {
deployer = _deployer;
operator = _deployer;
}
//
// Functions
// -----------------------------------------------------------------------------------------------------------------
/// @notice Return the address that is able to initiate self-destruction
function destructor()
public
view
returns (address)
{
return deployer;
}
/// @notice Set the deployer of this contract
/// @param newDeployer The address of the new deployer
function setDeployer(address newDeployer)
public
onlyDeployer
notNullOrThisAddress(newDeployer)
{
if (newDeployer != deployer) {
// Set new deployer
address oldDeployer = deployer;
deployer = newDeployer;
// Emit event
emit SetDeployerEvent(oldDeployer, newDeployer);
}
}
/// @notice Set the operator of this contract
/// @param newOperator The address of the new operator
function setOperator(address newOperator)
public
onlyOperator
notNullOrThisAddress(newOperator)
{
if (newOperator != operator) {
// Set new operator
address oldOperator = operator;
operator = newOperator;
// Emit event
emit SetOperatorEvent(oldOperator, newOperator);
}
}
/// @notice Gauge whether message sender is deployer or not
/// @return true if msg.sender is deployer, else false
function isDeployer()
internal
view
returns (bool)
{
return msg.sender == deployer;
}
/// @notice Gauge whether message sender is operator or not
/// @return true if msg.sender is operator, else false
function isOperator()
internal
view
returns (bool)
{
return msg.sender == operator;
}
/// @notice Gauge whether message sender is operator or deployer on the one hand, or none of these on these on
/// on the other hand
/// @return true if msg.sender is operator, else false
function isDeployerOrOperator()
internal
view
returns (bool)
{
return isDeployer() || isOperator();
}
// Modifiers
// -----------------------------------------------------------------------------------------------------------------
modifier onlyDeployer() {
require(isDeployer());
_;
}
modifier notDeployer() {
require(!isDeployer());
_;
}
modifier onlyOperator() {
require(isOperator());
_;
}
modifier notOperator() {
require(!isOperator());
_;
}
modifier onlyDeployerOrOperator() {
require(isDeployerOrOperator());
_;
}
modifier notDeployerOrOperator() {
require(!isDeployerOrOperator());
_;
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
/**
* @title Servable
* @notice An ownable that contains registered services and their actions
*/
contract Servable is Ownable {
//
// Types
// -----------------------------------------------------------------------------------------------------------------
struct ServiceInfo {
bool registered;
uint256 activationTimestamp;
mapping(bytes32 => bool) actionsEnabledMap;
bytes32[] actionsList;
}
//
// Variables
// -----------------------------------------------------------------------------------------------------------------
mapping(address => ServiceInfo) internal registeredServicesMap;
uint256 public serviceActivationTimeout;
//
// Events
// -----------------------------------------------------------------------------------------------------------------
event ServiceActivationTimeoutEvent(uint256 timeoutInSeconds);
event RegisterServiceEvent(address service);
event RegisterServiceDeferredEvent(address service, uint256 timeout);
event DeregisterServiceEvent(address service);
event EnableServiceActionEvent(address service, string action);
event DisableServiceActionEvent(address service, string action);
//
// Functions
// -----------------------------------------------------------------------------------------------------------------
/// @notice Set the service activation timeout
/// @param timeoutInSeconds The set timeout in unit of seconds
function setServiceActivationTimeout(uint256 timeoutInSeconds)
public
onlyDeployer
{
serviceActivationTimeout = timeoutInSeconds;
// Emit event
emit ServiceActivationTimeoutEvent(timeoutInSeconds);
}
/// @notice Register a service contract whose activation is immediate
/// @param service The address of the service contract to be registered
function registerService(address service)
public
onlyDeployer
notNullOrThisAddress(service)
{
_registerService(service, 0);
// Emit event
emit RegisterServiceEvent(service);
}
/// @notice Register a service contract whose activation is deferred by the service activation timeout
/// @param service The address of the service contract to be registered
function registerServiceDeferred(address service)
public
onlyDeployer
notNullOrThisAddress(service)
{
_registerService(service, serviceActivationTimeout);
// Emit event
emit RegisterServiceDeferredEvent(service, serviceActivationTimeout);
}
/// @notice Deregister a service contract
/// @param service The address of the service contract to be deregistered
function deregisterService(address service)
public
onlyDeployer
notNullOrThisAddress(service)
{
require(registeredServicesMap[service].registered);
registeredServicesMap[service].registered = false;
// Emit event
emit DeregisterServiceEvent(service);
}
/// @notice Enable a named action in an already registered service contract
/// @param service The address of the registered service contract
/// @param action The name of the action to be enabled
function enableServiceAction(address service, string action)
public
onlyDeployer
notNullOrThisAddress(service)
{
require(registeredServicesMap[service].registered);
bytes32 actionHash = hashString(action);
require(!registeredServicesMap[service].actionsEnabledMap[actionHash]);
registeredServicesMap[service].actionsEnabledMap[actionHash] = true;
registeredServicesMap[service].actionsList.push(actionHash);
// Emit event
emit EnableServiceActionEvent(service, action);
}
/// @notice Enable a named action in a service contract
/// @param service The address of the service contract
/// @param action The name of the action to be disabled
function disableServiceAction(address service, string action)
public
onlyDeployer
notNullOrThisAddress(service)
{
bytes32 actionHash = hashString(action);
require(registeredServicesMap[service].actionsEnabledMap[actionHash]);
registeredServicesMap[service].actionsEnabledMap[actionHash] = false;
// Emit event
emit DisableServiceActionEvent(service, action);
}
/// @notice Gauge whether a service contract is registered
/// @param service The address of the service contract
/// @return true if service is registered, else false
function isRegisteredService(address service)
public
view
returns (bool)
{
return registeredServicesMap[service].registered;
}
/// @notice Gauge whether a service contract is registered and active
/// @param service The address of the service contract
/// @return true if service is registered and activate, else false
function isRegisteredActiveService(address service)
public
view
returns (bool)
{
return isRegisteredService(service) && block.timestamp >= registeredServicesMap[service].activationTimestamp;
}
/// @notice Gauge whether a service contract action is enabled which implies also registered and active
/// @param service The address of the service contract
/// @param action The name of action
function isEnabledServiceAction(address service, string action)
public
view
returns (bool)
{
bytes32 actionHash = hashString(action);
return isRegisteredActiveService(service) && registeredServicesMap[service].actionsEnabledMap[actionHash];
}
//
// Internal functions
// -----------------------------------------------------------------------------------------------------------------
function hashString(string _string)
internal
pure
returns (bytes32)
{
return keccak256(abi.encodePacked(_string));
}
//
// Private functions
// -----------------------------------------------------------------------------------------------------------------
function _registerService(address service, uint256 timeout)
private
{
if (!registeredServicesMap[service].registered) {
registeredServicesMap[service].registered = true;
registeredServicesMap[service].activationTimestamp = block.timestamp + timeout;
}
}
//
// Modifiers
// -----------------------------------------------------------------------------------------------------------------
modifier onlyActiveService() {
require(isRegisteredActiveService(msg.sender));
_;
}
modifier onlyEnabledServiceAction(string action) {
require(isEnabledServiceAction(msg.sender, action));
_;
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS based on Open-Zeppelin's SafeMath library
*/
/**
* @title SafeMathIntLib
* @dev Math operations with safety checks that throw on error
*/
library SafeMathIntLib {
int256 constant INT256_MIN = int256((uint256(1) << 255));
int256 constant INT256_MAX = int256(~((uint256(1) << 255)));
//
//Functions below accept positive and negative integers and result must not overflow.
//
function div(int256 a, int256 b)
internal
pure
returns (int256)
{
require(a != INT256_MIN || b != - 1);
return a / b;
}
function mul(int256 a, int256 b)
internal
pure
returns (int256)
{
require(a != - 1 || b != INT256_MIN);
// overflow
require(b != - 1 || a != INT256_MIN);
// overflow
int256 c = a * b;
require((b == 0) || (c / b == a));
return c;
}
function sub(int256 a, int256 b)
internal
pure
returns (int256)
{
require((b >= 0 && a - b <= a) || (b < 0 && a - b > a));
return a - b;
}
function add(int256 a, int256 b)
internal
pure
returns (int256)
{
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a));
return c;
}
//
//Functions below only accept positive integers and result must be greater or equal to zero too.
//
function div_nn(int256 a, int256 b)
internal
pure
returns (int256)
{
require(a >= 0 && b > 0);
return a / b;
}
function mul_nn(int256 a, int256 b)
internal
pure
returns (int256)
{
require(a >= 0 && b >= 0);
int256 c = a * b;
require(a == 0 || c / a == b);
require(c >= 0);
return c;
}
function sub_nn(int256 a, int256 b)
internal
pure
returns (int256)
{
require(a >= 0 && b >= 0 && b <= a);
return a - b;
}
function add_nn(int256 a, int256 b)
internal
pure
returns (int256)
{
require(a >= 0 && b >= 0);
int256 c = a + b;
require(c >= a);
return c;
}
//
//Conversion and validation functions.
//
function abs(int256 a)
public
pure
returns (int256)
{
return a < 0 ? neg(a) : a;
}
function neg(int256 a)
public
pure
returns (int256)
{
return mul(a, - 1);
}
function toNonZeroInt256(uint256 a)
public
pure
returns (int256)
{
require(a > 0 && a < (uint256(1) << 255));
return int256(a);
}
function toInt256(uint256 a)
public
pure
returns (int256)
{
require(a >= 0 && a < (uint256(1) << 255));
return int256(a);
}
function toUInt256(int256 a)
public
pure
returns (uint256)
{
require(a >= 0);
return uint256(a);
}
function isNonZeroPositiveInt256(int256 a)
public
pure
returns (bool)
{
return (a > 0);
}
function isPositiveInt256(int256 a)
public
pure
returns (bool)
{
return (a >= 0);
}
function isNonZeroNegativeInt256(int256 a)
public
pure
returns (bool)
{
return (a < 0);
}
function isNegativeInt256(int256 a)
public
pure
returns (bool)
{
return (a <= 0);
}
//
//Clamping functions.
//
function clamp(int256 a, int256 min, int256 max)
public
pure
returns (int256)
{
if (a < min)
return min;
return (a > max) ? max : a;
}
function clampMin(int256 a, int256 min)
public
pure
returns (int256)
{
return (a < min) ? min : a;
}
function clampMax(int256 a, int256 max)
public
pure
returns (int256)
{
return (a > max) ? max : a;
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
library BlockNumbUintsLib {
//
// Structures
// -----------------------------------------------------------------------------------------------------------------
struct Entry {
uint256 blockNumber;
uint256 value;
}
struct BlockNumbUints {
Entry[] entries;
}
//
// Functions
// -----------------------------------------------------------------------------------------------------------------
function currentValue(BlockNumbUints storage self)
internal
view
returns (uint256)
{
return valueAt(self, block.number);
}
function currentEntry(BlockNumbUints storage self)
internal
view
returns (Entry)
{
return entryAt(self, block.number);
}
function valueAt(BlockNumbUints storage self, uint256 _blockNumber)
internal
view
returns (uint256)
{
return entryAt(self, _blockNumber).value;
}
function entryAt(BlockNumbUints storage self, uint256 _blockNumber)
internal
view
returns (Entry)
{
return self.entries[indexByBlockNumber(self, _blockNumber)];
}
function addEntry(BlockNumbUints storage self, uint256 blockNumber, uint256 value)
internal
{
require(
0 == self.entries.length ||
blockNumber > self.entries[self.entries.length - 1].blockNumber
);
self.entries.push(Entry(blockNumber, value));
}
function count(BlockNumbUints storage self)
internal
view
returns (uint256)
{
return self.entries.length;
}
function entries(BlockNumbUints storage self)
internal
view
returns (Entry[])
{
return self.entries;
}
function indexByBlockNumber(BlockNumbUints storage self, uint256 blockNumber)
internal
view
returns (uint256)
{
require(0 < self.entries.length);
for (uint256 i = self.entries.length - 1; i >= 0; i--)
if (blockNumber >= self.entries[i].blockNumber)
return i;
revert();
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
library BlockNumbIntsLib {
//
// Structures
// -----------------------------------------------------------------------------------------------------------------
struct Entry {
uint256 blockNumber;
int256 value;
}
struct BlockNumbInts {
Entry[] entries;
}
//
// Functions
// -----------------------------------------------------------------------------------------------------------------
function currentValue(BlockNumbInts storage self)
internal
view
returns (int256)
{
return valueAt(self, block.number);
}
function currentEntry(BlockNumbInts storage self)
internal
view
returns (Entry)
{
return entryAt(self, block.number);
}
function valueAt(BlockNumbInts storage self, uint256 _blockNumber)
internal
view
returns (int256)
{
return entryAt(self, _blockNumber).value;
}
function entryAt(BlockNumbInts storage self, uint256 _blockNumber)
internal
view
returns (Entry)
{
return self.entries[indexByBlockNumber(self, _blockNumber)];
}
function addEntry(BlockNumbInts storage self, uint256 blockNumber, int256 value)
internal
{
require(
0 == self.entries.length ||
blockNumber > self.entries[self.entries.length - 1].blockNumber
);
self.entries.push(Entry(blockNumber, value));
}
function count(BlockNumbInts storage self)
internal
view
returns (uint256)
{
return self.entries.length;
}
function entries(BlockNumbInts storage self)
internal
view
returns (Entry[])
{
return self.entries;
}
function indexByBlockNumber(BlockNumbInts storage self, uint256 blockNumber)
internal
view
returns (uint256)
{
require(0 < self.entries.length);
for (uint256 i = self.entries.length - 1; i >= 0; i--)
if (blockNumber >= self.entries[i].blockNumber)
return i;
revert();
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
library ConstantsLib {
// Get the fraction that represents the entirety, equivalent of 100%
function PARTS_PER()
public
pure
returns (int256)
{
return 1e18;
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
library BlockNumbDisdIntsLib {
using SafeMathIntLib for int256;
//
// Structures
// -----------------------------------------------------------------------------------------------------------------
struct Discount {
int256 tier;
int256 value;
}
struct Entry {
uint256 blockNumber;
int256 nominal;
Discount[] discounts;
}
struct BlockNumbDisdInts {
Entry[] entries;
}
//
// Functions
// -----------------------------------------------------------------------------------------------------------------
function currentNominalValue(BlockNumbDisdInts storage self)
internal
view
returns (int256)
{
return nominalValueAt(self, block.number);
}
function currentDiscountedValue(BlockNumbDisdInts storage self, int256 tier)
internal
view
returns (int256)
{
return discountedValueAt(self, block.number, tier);
}
function currentEntry(BlockNumbDisdInts storage self)
internal
view
returns (Entry)
{
return entryAt(self, block.number);
}
function nominalValueAt(BlockNumbDisdInts storage self, uint256 _blockNumber)
internal
view
returns (int256)
{
return entryAt(self, _blockNumber).nominal;
}
function discountedValueAt(BlockNumbDisdInts storage self, uint256 _blockNumber, int256 tier)
internal
view
returns (int256)
{
Entry memory entry = entryAt(self, _blockNumber);
if (0 < entry.discounts.length) {
uint256 index = indexByTier(entry.discounts, tier);
if (0 < index)
return entry.nominal.mul(
ConstantsLib.PARTS_PER().sub(entry.discounts[index - 1].value)
).div(
ConstantsLib.PARTS_PER()
);
else
return entry.nominal;
} else
return entry.nominal;
}
function entryAt(BlockNumbDisdInts storage self, uint256 _blockNumber)
internal
view
returns (Entry)
{
return self.entries[indexByBlockNumber(self, _blockNumber)];
}
function addNominalEntry(BlockNumbDisdInts storage self, uint256 blockNumber, int256 nominal)
internal
{
require(
0 == self.entries.length ||
blockNumber > self.entries[self.entries.length - 1].blockNumber
);
self.entries.length++;
Entry storage entry = self.entries[self.entries.length - 1];
entry.blockNumber = blockNumber;
entry.nominal = nominal;
}
function addDiscountedEntry(BlockNumbDisdInts storage self, uint256 blockNumber, int256 nominal,
int256[] discountTiers, int256[] discountValues)
internal
{
require(discountTiers.length == discountValues.length);
addNominalEntry(self, blockNumber, nominal);
Entry storage entry = self.entries[self.entries.length - 1];
for (uint256 i = 0; i < discountTiers.length; i++)
entry.discounts.push(Discount(discountTiers[i], discountValues[i]));
}
function count(BlockNumbDisdInts storage self)
internal
view
returns (uint256)
{
return self.entries.length;
}
function entries(BlockNumbDisdInts storage self)
internal
view
returns (Entry[])
{
return self.entries;
}
function indexByBlockNumber(BlockNumbDisdInts storage self, uint256 blockNumber)
internal
view
returns (uint256)
{
require(0 < self.entries.length);
for (uint256 i = self.entries.length - 1; i >= 0; i--)
if (blockNumber >= self.entries[i].blockNumber)
return i;
revert();
}
/// @dev The index returned here is 1-based
function indexByTier(Discount[] discounts, int256 tier)
internal
pure
returns (uint256)
{
require(0 < discounts.length);
for (uint256 i = discounts.length; i > 0; i--)
if (tier >= discounts[i - 1].tier)
return i;
return 0;
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
/**
* @title MonetaryTypesLib
* @dev Monetary data types
*/
library MonetaryTypesLib {
//
// Structures
// -----------------------------------------------------------------------------------------------------------------
struct Currency {
address ct;
uint256 id;
}
struct Figure {
int256 amount;
Currency currency;
}
struct NoncedAmount {
uint256 nonce;
int256 amount;
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
library BlockNumbReferenceCurrenciesLib {
//
// Structures
// -----------------------------------------------------------------------------------------------------------------
struct Entry {
uint256 blockNumber;
MonetaryTypesLib.Currency currency;
}
struct BlockNumbReferenceCurrencies {
mapping(address => mapping(uint256 => Entry[])) entriesByCurrency;
}
//
// Functions
// -----------------------------------------------------------------------------------------------------------------
function currentCurrency(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency)
internal
view
returns (MonetaryTypesLib.Currency storage)
{
return currencyAt(self, referenceCurrency, block.number);
}
function currentEntry(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency)
internal
view
returns (Entry storage)
{
return entryAt(self, referenceCurrency, block.number);
}
function currencyAt(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency,
uint256 _blockNumber)
internal
view
returns (MonetaryTypesLib.Currency storage)
{
return entryAt(self, referenceCurrency, _blockNumber).currency;
}
function entryAt(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency,
uint256 _blockNumber)
internal
view
returns (Entry storage)
{
return self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id][indexByBlockNumber(self, referenceCurrency, _blockNumber)];
}
function addEntry(BlockNumbReferenceCurrencies storage self, uint256 blockNumber,
MonetaryTypesLib.Currency referenceCurrency, MonetaryTypesLib.Currency currency)
internal
{
require(
0 == self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].length ||
blockNumber > self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id][self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].length - 1].blockNumber
);
self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].push(Entry(blockNumber, currency));
}
function count(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency)
internal
view
returns (uint256)
{
return self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].length;
}
function entriesByCurrency(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency)
internal
view
returns (Entry[] storage)
{
return self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id];
}
function indexByBlockNumber(BlockNumbReferenceCurrencies storage self, MonetaryTypesLib.Currency referenceCurrency, uint256 blockNumber)
internal
view
returns (uint256)
{
require(0 < self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].length);
for (uint256 i = self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id].length - 1; i >= 0; i--)
if (blockNumber >= self.entriesByCurrency[referenceCurrency.ct][referenceCurrency.id][i].blockNumber)
return i;
revert();
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
library BlockNumbFiguresLib {
//
// Structures
// -----------------------------------------------------------------------------------------------------------------
struct Entry {
uint256 blockNumber;
MonetaryTypesLib.Figure value;
}
struct BlockNumbFigures {
Entry[] entries;
}
//
// Functions
// -----------------------------------------------------------------------------------------------------------------
function currentValue(BlockNumbFigures storage self)
internal
view
returns (MonetaryTypesLib.Figure storage)
{
return valueAt(self, block.number);
}
function currentEntry(BlockNumbFigures storage self)
internal
view
returns (Entry storage)
{
return entryAt(self, block.number);
}
function valueAt(BlockNumbFigures storage self, uint256 _blockNumber)
internal
view
returns (MonetaryTypesLib.Figure storage)
{
return entryAt(self, _blockNumber).value;
}
function entryAt(BlockNumbFigures storage self, uint256 _blockNumber)
internal
view
returns (Entry storage)
{
return self.entries[indexByBlockNumber(self, _blockNumber)];
}
function addEntry(BlockNumbFigures storage self, uint256 blockNumber, MonetaryTypesLib.Figure value)
internal
{
require(
0 == self.entries.length ||
blockNumber > self.entries[self.entries.length - 1].blockNumber
);
self.entries.push(Entry(blockNumber, value));
}
function count(BlockNumbFigures storage self)
internal
view
returns (uint256)
{
return self.entries.length;
}
function entries(BlockNumbFigures storage self)
internal
view
returns (Entry[] storage)
{
return self.entries;
}
function indexByBlockNumber(BlockNumbFigures storage self, uint256 blockNumber)
internal
view
returns (uint256)
{
require(0 < self.entries.length);
for (uint256 i = self.entries.length - 1; i >= 0; i--)
if (blockNumber >= self.entries[i].blockNumber)
return i;
revert();
}
}
/*
* Hubii Nahmii
*
* Compliant with the Hubii Nahmii specification v0.12.
*
* Copyright (C) 2017-2018 Hubii AS
*/
/**
* @title Configuration
* @notice An oracle for configurations values
*/
contract Configuration is Modifiable, Ownable, Servable {
using SafeMathIntLib for int256;
using BlockNumbUintsLib for BlockNumbUintsLib.BlockNumbUints;
using BlockNumbIntsLib for BlockNumbIntsLib.BlockNumbInts;
using BlockNumbDisdIntsLib for BlockNumbDisdIntsLib.BlockNumbDisdInts;
using BlockNumbReferenceCurrenciesLib for BlockNumbReferenceCurrenciesLib.BlockNumbReferenceCurrencies;
using BlockNumbFiguresLib for BlockNumbFiguresLib.BlockNumbFigures;
//
// Constants
// -----------------------------------------------------------------------------------------------------------------
string constant public OPERATIONAL_MODE_ACTION = "operational_mode";
//
// Enums
// -----------------------------------------------------------------------------------------------------------------
enum OperationalMode {Normal, Exit}
//
// Variables
// -----------------------------------------------------------------------------------------------------------------
OperationalMode public operationalMode = OperationalMode.Normal;
BlockNumbUintsLib.BlockNumbUints private updateDelayBlocksByBlockNumber;
BlockNumbUintsLib.BlockNumbUints private confirmationBlocksByBlockNumber;
BlockNumbDisdIntsLib.BlockNumbDisdInts private tradeMakerFeeByBlockNumber;
BlockNumbDisdIntsLib.BlockNumbDisdInts private tradeTakerFeeByBlockNumber;
BlockNumbDisdIntsLib.BlockNumbDisdInts private paymentFeeByBlockNumber;
mapping(address => mapping(uint256 => BlockNumbDisdIntsLib.BlockNumbDisdInts)) private currencyPaymentFeeByBlockNumber;
BlockNumbIntsLib.BlockNumbInts private tradeMakerMinimumFeeByBlockNumber;
BlockNumbIntsLib.BlockNumbInts private tradeTakerMinimumFeeByBlockNumber;
BlockNumbIntsLib.BlockNumbInts private paymentMinimumFeeByBlockNumber;
mapping(address => mapping(uint256 => BlockNumbIntsLib.BlockNumbInts)) private currencyPaymentMinimumFeeByBlockNumber;
BlockNumbReferenceCurrenciesLib.BlockNumbReferenceCurrencies private feeCurrencyByCurrencyBlockNumber;
BlockNumbUintsLib.BlockNumbUints private walletLockTimeoutByBlockNumber;
BlockNumbUintsLib.BlockNumbUints private cancelOrderChallengeTimeoutByBlockNumber;
BlockNumbUintsLib.BlockNumbUints private settlementChallengeTimeoutByBlockNumber;
BlockNumbUintsLib.BlockNumbUints private fraudStakeFractionByBlockNumber;
BlockNumbUintsLib.BlockNumbUints private walletSettlementStakeFractionByBlockNumber;
BlockNumbUintsLib.BlockNumbUints private operatorSettlementStakeFractionByBlockNumber;
BlockNumbFiguresLib.BlockNumbFigures private operatorSettlementStakeByBlockNumber;
uint256 public earliestSettlementBlockNumber;
bool public earliestSettlementBlockNumberUpdateDisabled;
//
// Events
// -----------------------------------------------------------------------------------------------------------------
event SetOperationalModeExitEvent();
event SetUpdateDelayBlocksEvent(uint256 fromBlockNumber, uint256 newBlocks);
event SetConfirmationBlocksEvent(uint256 fromBlockNumber, uint256 newBlocks);
event SetTradeMakerFeeEvent(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues);
event SetTradeTakerFeeEvent(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues);
event SetPaymentFeeEvent(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues);
event SetCurrencyPaymentFeeEvent(uint256 fromBlockNumber, address currencyCt, uint256 currencyId, int256 nominal,
int256[] discountTiers, int256[] discountValues);
event SetTradeMakerMinimumFeeEvent(uint256 fromBlockNumber, int256 nominal);
event SetTradeTakerMinimumFeeEvent(uint256 fromBlockNumber, int256 nominal);
event SetPaymentMinimumFeeEvent(uint256 fromBlockNumber, int256 nominal);
event SetCurrencyPaymentMinimumFeeEvent(uint256 fromBlockNumber, address currencyCt, uint256 currencyId, int256 nominal);
event SetFeeCurrencyEvent(uint256 fromBlockNumber, address referenceCurrencyCt, uint256 referenceCurrencyId,
address feeCurrencyCt, uint256 feeCurrencyId);
event SetWalletLockTimeoutEvent(uint256 fromBlockNumber, uint256 timeoutInSeconds);
event SetCancelOrderChallengeTimeoutEvent(uint256 fromBlockNumber, uint256 timeoutInSeconds);
event SetSettlementChallengeTimeoutEvent(uint256 fromBlockNumber, uint256 timeoutInSeconds);
event SetWalletSettlementStakeFractionEvent(uint256 fromBlockNumber, uint256 stakeFraction);
event SetOperatorSettlementStakeFractionEvent(uint256 fromBlockNumber, uint256 stakeFraction);
event SetOperatorSettlementStakeEvent(uint256 fromBlockNumber, int256 stakeAmount, address stakeCurrencyCt,
uint256 stakeCurrencyId);
event SetFraudStakeFractionEvent(uint256 fromBlockNumber, uint256 stakeFraction);
event SetEarliestSettlementBlockNumberEvent(uint256 earliestSettlementBlockNumber);
event DisableEarliestSettlementBlockNumberUpdateEvent();
//
// Constructor
// -----------------------------------------------------------------------------------------------------------------
constructor(address deployer) Ownable(deployer) public {
updateDelayBlocksByBlockNumber.addEntry(block.number, 0);
}
//
// Public functions
// -----------------------------------------------------------------------------------------------------------------
/// @notice Set operational mode to Exit
/// @dev Once operational mode is set to Exit it may not be set back to Normal
function setOperationalModeExit()
public
onlyEnabledServiceAction(OPERATIONAL_MODE_ACTION)
{
operationalMode = OperationalMode.Exit;
emit SetOperationalModeExitEvent();
}
/// @notice Return true if operational mode is Normal
function isOperationalModeNormal()
public
view
returns (bool)
{
return OperationalMode.Normal == operationalMode;
}
/// @notice Return true if operational mode is Exit
function isOperationalModeExit()
public
view
returns (bool)
{
return OperationalMode.Exit == operationalMode;
}
/// @notice Get the current value of update delay blocks
/// @return The value of update delay blocks
function updateDelayBlocks()
public
view
returns (uint256)
{
return updateDelayBlocksByBlockNumber.currentValue();
}
/// @notice Get the count of update delay blocks values
/// @return The count of update delay blocks values
function updateDelayBlocksCount()
public
view
returns (uint256)
{
return updateDelayBlocksByBlockNumber.count();
}
/// @notice Set the number of update delay blocks
/// @param fromBlockNumber Block number from which the update applies
/// @param newUpdateDelayBlocks The new update delay blocks value
function setUpdateDelayBlocks(uint256 fromBlockNumber, uint256 newUpdateDelayBlocks)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
updateDelayBlocksByBlockNumber.addEntry(fromBlockNumber, newUpdateDelayBlocks);
emit SetUpdateDelayBlocksEvent(fromBlockNumber, newUpdateDelayBlocks);
}
/// @notice Get the current value of confirmation blocks
/// @return The value of confirmation blocks
function confirmationBlocks()
public
view
returns (uint256)
{
return confirmationBlocksByBlockNumber.currentValue();
}
/// @notice Get the count of confirmation blocks values
/// @return The count of confirmation blocks values
function confirmationBlocksCount()
public
view
returns (uint256)
{
return confirmationBlocksByBlockNumber.count();
}
/// @notice Set the number of confirmation blocks
/// @param fromBlockNumber Block number from which the update applies
/// @param newConfirmationBlocks The new confirmation blocks value
function setConfirmationBlocks(uint256 fromBlockNumber, uint256 newConfirmationBlocks)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
confirmationBlocksByBlockNumber.addEntry(fromBlockNumber, newConfirmationBlocks);
emit SetConfirmationBlocksEvent(fromBlockNumber, newConfirmationBlocks);
}
/// @notice Get number of trade maker fee block number tiers
function tradeMakerFeesCount()
public
view
returns (uint256)
{
return tradeMakerFeeByBlockNumber.count();
}
/// @notice Get trade maker relative fee at given block number, possibly discounted by discount tier value
/// @param blockNumber The concerned block number
/// @param discountTier The concerned discount tier
function tradeMakerFee(uint256 blockNumber, int256 discountTier)
public
view
returns (int256)
{
return tradeMakerFeeByBlockNumber.discountedValueAt(blockNumber, discountTier);
}
/// @notice Set trade maker nominal relative fee and discount tiers and values at given block number tier
/// @param fromBlockNumber Block number from which the update applies
/// @param nominal Nominal relative fee
/// @param nominal Discount tier levels
/// @param nominal Discount values
function setTradeMakerFee(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
tradeMakerFeeByBlockNumber.addDiscountedEntry(fromBlockNumber, nominal, discountTiers, discountValues);
emit SetTradeMakerFeeEvent(fromBlockNumber, nominal, discountTiers, discountValues);
}
/// @notice Get number of trade taker fee block number tiers
function tradeTakerFeesCount()
public
view
returns (uint256)
{
return tradeTakerFeeByBlockNumber.count();
}
/// @notice Get trade taker relative fee at given block number, possibly discounted by discount tier value
/// @param blockNumber The concerned block number
/// @param discountTier The concerned discount tier
function tradeTakerFee(uint256 blockNumber, int256 discountTier)
public
view
returns (int256)
{
return tradeTakerFeeByBlockNumber.discountedValueAt(blockNumber, discountTier);
}
/// @notice Set trade taker nominal relative fee and discount tiers and values at given block number tier
/// @param fromBlockNumber Block number from which the update applies
/// @param nominal Nominal relative fee
/// @param nominal Discount tier levels
/// @param nominal Discount values
function setTradeTakerFee(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
tradeTakerFeeByBlockNumber.addDiscountedEntry(fromBlockNumber, nominal, discountTiers, discountValues);
emit SetTradeTakerFeeEvent(fromBlockNumber, nominal, discountTiers, discountValues);
}
/// @notice Get number of payment fee block number tiers
function paymentFeesCount()
public
view
returns (uint256)
{
return paymentFeeByBlockNumber.count();
}
/// @notice Get payment relative fee at given block number, possibly discounted by discount tier value
/// @param blockNumber The concerned block number
/// @param discountTier The concerned discount tier
function paymentFee(uint256 blockNumber, int256 discountTier)
public
view
returns (int256)
{
return paymentFeeByBlockNumber.discountedValueAt(blockNumber, discountTier);
}
/// @notice Set payment nominal relative fee and discount tiers and values at given block number tier
/// @param fromBlockNumber Block number from which the update applies
/// @param nominal Nominal relative fee
/// @param nominal Discount tier levels
/// @param nominal Discount values
function setPaymentFee(uint256 fromBlockNumber, int256 nominal, int256[] discountTiers, int256[] discountValues)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
paymentFeeByBlockNumber.addDiscountedEntry(fromBlockNumber, nominal, discountTiers, discountValues);
emit SetPaymentFeeEvent(fromBlockNumber, nominal, discountTiers, discountValues);
}
/// @notice Get number of payment fee block number tiers of given currency
/// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
/// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
function currencyPaymentFeesCount(address currencyCt, uint256 currencyId)
public
view
returns (uint256)
{
return currencyPaymentFeeByBlockNumber[currencyCt][currencyId].count();
}
/// @notice Get payment relative fee for given currency at given block number, possibly discounted by
/// discount tier value
/// @param blockNumber The concerned block number
/// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
/// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
/// @param discountTier The concerned discount tier
function currencyPaymentFee(uint256 blockNumber, address currencyCt, uint256 currencyId, int256 discountTier)
public
view
returns (int256)
{
if (0 < currencyPaymentFeeByBlockNumber[currencyCt][currencyId].count())
return currencyPaymentFeeByBlockNumber[currencyCt][currencyId].discountedValueAt(
blockNumber, discountTier
);
else
return paymentFee(blockNumber, discountTier);
}
/// @notice Set payment nominal relative fee and discount tiers and values for given currency at given
/// block number tier
/// @param fromBlockNumber Block number from which the update applies
/// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
/// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
/// @param nominal Nominal relative fee
/// @param nominal Discount tier levels
/// @param nominal Discount values
function setCurrencyPaymentFee(uint256 fromBlockNumber, address currencyCt, uint256 currencyId, int256 nominal,
int256[] discountTiers, int256[] discountValues)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
currencyPaymentFeeByBlockNumber[currencyCt][currencyId].addDiscountedEntry(
fromBlockNumber, nominal, discountTiers, discountValues
);
emit SetCurrencyPaymentFeeEvent(
fromBlockNumber, currencyCt, currencyId, nominal, discountTiers, discountValues
);
}
/// @notice Get number of minimum trade maker fee block number tiers
function tradeMakerMinimumFeesCount()
public
view
returns (uint256)
{
return tradeMakerMinimumFeeByBlockNumber.count();
}
/// @notice Get trade maker minimum relative fee at given block number
/// @param blockNumber The concerned block number
function tradeMakerMinimumFee(uint256 blockNumber)
public
view
returns (int256)
{
return tradeMakerMinimumFeeByBlockNumber.valueAt(blockNumber);
}
/// @notice Set trade maker minimum relative fee at given block number tier
/// @param fromBlockNumber Block number from which the update applies
/// @param nominal Minimum relative fee
function setTradeMakerMinimumFee(uint256 fromBlockNumber, int256 nominal)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
tradeMakerMinimumFeeByBlockNumber.addEntry(fromBlockNumber, nominal);
emit SetTradeMakerMinimumFeeEvent(fromBlockNumber, nominal);
}
/// @notice Get number of minimum trade taker fee block number tiers
function tradeTakerMinimumFeesCount()
public
view
returns (uint256)
{
return tradeTakerMinimumFeeByBlockNumber.count();
}
/// @notice Get trade taker minimum relative fee at given block number
/// @param blockNumber The concerned block number
function tradeTakerMinimumFee(uint256 blockNumber)
public
view
returns (int256)
{
return tradeTakerMinimumFeeByBlockNumber.valueAt(blockNumber);
}
/// @notice Set trade taker minimum relative fee at given block number tier
/// @param fromBlockNumber Block number from which the update applies
/// @param nominal Minimum relative fee
function setTradeTakerMinimumFee(uint256 fromBlockNumber, int256 nominal)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
tradeTakerMinimumFeeByBlockNumber.addEntry(fromBlockNumber, nominal);
emit SetTradeTakerMinimumFeeEvent(fromBlockNumber, nominal);
}
/// @notice Get number of minimum payment fee block number tiers
function paymentMinimumFeesCount()
public
view
returns (uint256)
{
return paymentMinimumFeeByBlockNumber.count();
}
/// @notice Get payment minimum relative fee at given block number
/// @param blockNumber The concerned block number
function paymentMinimumFee(uint256 blockNumber)
public
view
returns (int256)
{
return paymentMinimumFeeByBlockNumber.valueAt(blockNumber);
}
/// @notice Set payment minimum relative fee at given block number tier
/// @param fromBlockNumber Block number from which the update applies
/// @param nominal Minimum relative fee
function setPaymentMinimumFee(uint256 fromBlockNumber, int256 nominal)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
paymentMinimumFeeByBlockNumber.addEntry(fromBlockNumber, nominal);
emit SetPaymentMinimumFeeEvent(fromBlockNumber, nominal);
}
/// @notice Get number of minimum payment fee block number tiers for given currency
/// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
/// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
function currencyPaymentMinimumFeesCount(address currencyCt, uint256 currencyId)
public
view
returns (uint256)
{
return currencyPaymentMinimumFeeByBlockNumber[currencyCt][currencyId].count();
}
/// @notice Get payment minimum relative fee for given currency at given block number
/// @param blockNumber The concerned block number
/// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
/// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
function currencyPaymentMinimumFee(uint256 blockNumber, address currencyCt, uint256 currencyId)
public
view
returns (int256)
{
if (0 < currencyPaymentMinimumFeeByBlockNumber[currencyCt][currencyId].count())
return currencyPaymentMinimumFeeByBlockNumber[currencyCt][currencyId].valueAt(blockNumber);
else
return paymentMinimumFee(blockNumber);
}
/// @notice Set payment minimum relative fee for given currency at given block number tier
/// @param fromBlockNumber Block number from which the update applies
/// @param currencyCt The address of the concerned currency contract (address(0) == ETH)
/// @param currencyId The ID of the concerned currency (0 for ETH and ERC20)
/// @param nominal Minimum relative fee
function setCurrencyPaymentMinimumFee(uint256 fromBlockNumber, address currencyCt, uint256 currencyId, int256 nominal)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
currencyPaymentMinimumFeeByBlockNumber[currencyCt][currencyId].addEntry(fromBlockNumber, nominal);
emit SetCurrencyPaymentMinimumFeeEvent(fromBlockNumber, currencyCt, currencyId, nominal);
}
/// @notice Get number of fee currencies for the given reference currency
/// @param currencyCt The address of the concerned reference currency contract (address(0) == ETH)
/// @param currencyId The ID of the concerned reference currency (0 for ETH and ERC20)
function feeCurrenciesCount(address currencyCt, uint256 currencyId)
public
view
returns (uint256)
{
return feeCurrencyByCurrencyBlockNumber.count(MonetaryTypesLib.Currency(currencyCt, currencyId));
}
/// @notice Get the fee currency for the given reference currency at given block number
/// @param blockNumber The concerned block number
/// @param currencyCt The address of the concerned reference currency contract (address(0) == ETH)
/// @param currencyId The ID of the concerned reference currency (0 for ETH and ERC20)
function feeCurrency(uint256 blockNumber, address currencyCt, uint256 currencyId)
public
view
returns (address ct, uint256 id)
{
MonetaryTypesLib.Currency storage _feeCurrency = feeCurrencyByCurrencyBlockNumber.currencyAt(
MonetaryTypesLib.Currency(currencyCt, currencyId), blockNumber
);
ct = _feeCurrency.ct;
id = _feeCurrency.id;
}
/// @notice Set the fee currency for the given reference currency at given block number
/// @param fromBlockNumber Block number from which the update applies
/// @param referenceCurrencyCt The address of the concerned reference currency contract (address(0) == ETH)
/// @param referenceCurrencyId The ID of the concerned reference currency (0 for ETH and ERC20)
/// @param feeCurrencyCt The address of the concerned fee currency contract (address(0) == ETH)
/// @param feeCurrencyId The ID of the concerned fee currency (0 for ETH and ERC20)
function setFeeCurrency(uint256 fromBlockNumber, address referenceCurrencyCt, uint256 referenceCurrencyId,
address feeCurrencyCt, uint256 feeCurrencyId)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
feeCurrencyByCurrencyBlockNumber.addEntry(
fromBlockNumber,
MonetaryTypesLib.Currency(referenceCurrencyCt, referenceCurrencyId),
MonetaryTypesLib.Currency(feeCurrencyCt, feeCurrencyId)
);
emit SetFeeCurrencyEvent(fromBlockNumber, referenceCurrencyCt, referenceCurrencyId,
feeCurrencyCt, feeCurrencyId);
}
/// @notice Get the current value of wallet lock timeout
/// @return The value of wallet lock timeout
function walletLockTimeout()
public
view
returns (uint256)
{
return walletLockTimeoutByBlockNumber.currentValue();
}
/// @notice Set timeout of wallet lock
/// @param fromBlockNumber Block number from which the update applies
/// @param timeoutInSeconds Timeout duration in seconds
function setWalletLockTimeout(uint256 fromBlockNumber, uint256 timeoutInSeconds)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
walletLockTimeoutByBlockNumber.addEntry(fromBlockNumber, timeoutInSeconds);
emit SetWalletLockTimeoutEvent(fromBlockNumber, timeoutInSeconds);
}
/// @notice Get the current value of cancel order challenge timeout
/// @return The value of cancel order challenge timeout
function cancelOrderChallengeTimeout()
public
view
returns (uint256)
{
return cancelOrderChallengeTimeoutByBlockNumber.currentValue();
}
/// @notice Set timeout of cancel order challenge
/// @param fromBlockNumber Block number from which the update applies
/// @param timeoutInSeconds Timeout duration in seconds
function setCancelOrderChallengeTimeout(uint256 fromBlockNumber, uint256 timeoutInSeconds)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
cancelOrderChallengeTimeoutByBlockNumber.addEntry(fromBlockNumber, timeoutInSeconds);
emit SetCancelOrderChallengeTimeoutEvent(fromBlockNumber, timeoutInSeconds);
}
/// @notice Get the current value of settlement challenge timeout
/// @return The value of settlement challenge timeout
function settlementChallengeTimeout()
public
view
returns (uint256)
{
return settlementChallengeTimeoutByBlockNumber.currentValue();
}
/// @notice Set timeout of settlement challenges
/// @param fromBlockNumber Block number from which the update applies
/// @param timeoutInSeconds Timeout duration in seconds
function setSettlementChallengeTimeout(uint256 fromBlockNumber, uint256 timeoutInSeconds)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
settlementChallengeTimeoutByBlockNumber.addEntry(fromBlockNumber, timeoutInSeconds);
emit SetSettlementChallengeTimeoutEvent(fromBlockNumber, timeoutInSeconds);
}
/// @notice Get the current value of fraud stake fraction
/// @return The value of fraud stake fraction
function fraudStakeFraction()
public
view
returns (uint256)
{
return fraudStakeFractionByBlockNumber.currentValue();
}
/// @notice Set fraction of security bond that will be gained from successfully challenging
/// in fraud challenge
/// @param fromBlockNumber Block number from which the update applies
/// @param stakeFraction The fraction gained
function setFraudStakeFraction(uint256 fromBlockNumber, uint256 stakeFraction)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
fraudStakeFractionByBlockNumber.addEntry(fromBlockNumber, stakeFraction);
emit SetFraudStakeFractionEvent(fromBlockNumber, stakeFraction);
}
/// @notice Get the current value of wallet settlement stake fraction
/// @return The value of wallet settlement stake fraction
function walletSettlementStakeFraction()
public
view
returns (uint256)
{
return walletSettlementStakeFractionByBlockNumber.currentValue();
}
/// @notice Set fraction of security bond that will be gained from successfully challenging
/// in settlement challenge triggered by wallet
/// @param fromBlockNumber Block number from which the update applies
/// @param stakeFraction The fraction gained
function setWalletSettlementStakeFraction(uint256 fromBlockNumber, uint256 stakeFraction)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
walletSettlementStakeFractionByBlockNumber.addEntry(fromBlockNumber, stakeFraction);
emit SetWalletSettlementStakeFractionEvent(fromBlockNumber, stakeFraction);
}
/// @notice Get the current value of operator settlement stake fraction
/// @return The value of operator settlement stake fraction
function operatorSettlementStakeFraction()
public
view
returns (uint256)
{
return operatorSettlementStakeFractionByBlockNumber.currentValue();
}
/// @notice Set fraction of security bond that will be gained from successfully challenging
/// in settlement challenge triggered by operator
/// @param fromBlockNumber Block number from which the update applies
/// @param stakeFraction The fraction gained
function setOperatorSettlementStakeFraction(uint256 fromBlockNumber, uint256 stakeFraction)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
operatorSettlementStakeFractionByBlockNumber.addEntry(fromBlockNumber, stakeFraction);
emit SetOperatorSettlementStakeFractionEvent(fromBlockNumber, stakeFraction);
}
/// @notice Get the current value of operator settlement stake
/// @return The value of operator settlement stake
function operatorSettlementStake()
public
view
returns (int256 amount, address currencyCt, uint256 currencyId)
{
MonetaryTypesLib.Figure storage stake = operatorSettlementStakeByBlockNumber.currentValue();
amount = stake.amount;
currencyCt = stake.currency.ct;
currencyId = stake.currency.id;
}
/// @notice Set figure of security bond that will be gained from successfully challenging
/// in settlement challenge triggered by operator
/// @param fromBlockNumber Block number from which the update applies
/// @param stakeAmount The amount gained
/// @param stakeCurrencyCt The address of currency gained
/// @param stakeCurrencyId The ID of currency gained
function setOperatorSettlementStake(uint256 fromBlockNumber, int256 stakeAmount,
address stakeCurrencyCt, uint256 stakeCurrencyId)
public
onlyOperator
onlyDelayedBlockNumber(fromBlockNumber)
{
MonetaryTypesLib.Figure memory stake = MonetaryTypesLib.Figure(stakeAmount, MonetaryTypesLib.Currency(stakeCurrencyCt, stakeCurrencyId));
operatorSettlementStakeByBlockNumber.addEntry(fromBlockNumber, stake);
emit SetOperatorSettlementStakeEvent(fromBlockNumber, stakeAmount, stakeCurrencyCt, stakeCurrencyId);
}
/// @notice Set the block number of the earliest settlement initiation
/// @param _earliestSettlementBlockNumber The block number of the earliest settlement
function setEarliestSettlementBlockNumber(uint256 _earliestSettlementBlockNumber)
public
onlyOperator
{
earliestSettlementBlockNumber = _earliestSettlementBlockNumber;
emit SetEarliestSettlementBlockNumberEvent(earliestSettlementBlockNumber);
}
/// @notice Disable further updates to the earliest settlement block number
/// @dev This operation can not be undone
function disableEarliestSettlementBlockNumberUpdate()
public
onlyOperator
{
earliestSettlementBlockNumberUpdateDisabled = true;
emit DisableEarliestSettlementBlockNumberUpdateEvent();
}
//
// Modifiers
// -----------------------------------------------------------------------------------------------------------------
modifier onlyDelayedBlockNumber(uint256 blockNumber) {
require(
0 == updateDelayBlocksByBlockNumber.count() ||
blockNumber >= block.number + updateDelayBlocksByBlockNumber.currentValue()
);
_;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"},{"name":"discountTiers","type":"int256[]"},{"name":"discountValues","type":"int256[]"}],"name":"setTradeMakerFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"operationalMode","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"name":"feeCurrenciesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"name":"currencyPaymentMinimumFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"service","type":"address"}],"name":"isRegisteredActiveService","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"referenceCurrencyCt","type":"address"},{"name":"referenceCurrencyId","type":"uint256"},{"name":"feeCurrencyCt","type":"address"},{"name":"feeCurrencyId","type":"uint256"}],"name":"setFeeCurrency","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"},{"name":"discountTier","type":"int256"}],"name":"currencyPaymentFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"}],"name":"setPaymentMinimumFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"discountTier","type":"int256"}],"name":"tradeMakerFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"triggerSelfDestruction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"}],"name":"paymentMinimumFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"walletSettlementStakeFraction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paymentMinimumFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"walletLockTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"service","type":"address"},{"name":"action","type":"string"}],"name":"enableServiceAction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"service","type":"address"}],"name":"isRegisteredService","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"selfDestructionDisabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"service","type":"address"},{"name":"action","type":"string"}],"name":"disableServiceAction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"serviceActivationTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"timeoutInSeconds","type":"uint256"}],"name":"setWalletLockTimeout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"stakeFraction","type":"uint256"}],"name":"setWalletSettlementStakeFraction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"destructor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"confirmationBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"},{"name":"discountTiers","type":"int256[]"},{"name":"discountValues","type":"int256[]"}],"name":"setPaymentFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"name":"currencyPaymentMinimumFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"service","type":"address"}],"name":"deregisterService","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tradeMakerMinimumFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"stakeAmount","type":"int256"},{"name":"stakeCurrencyCt","type":"address"},{"name":"stakeCurrencyId","type":"uint256"}],"name":"setOperatorSettlementStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"service","type":"address"},{"name":"action","type":"string"}],"name":"isEnabledServiceAction","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"},{"name":"discountTiers","type":"int256[]"},{"name":"discountValues","type":"int256[]"}],"name":"setTradeTakerFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"}],"name":"setTradeTakerMinimumFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"discountTier","type":"int256"}],"name":"tradeTakerFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableSelfDestruction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"stakeFraction","type":"uint256"}],"name":"setOperatorSettlementStakeFraction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"timeoutInSeconds","type":"uint256"}],"name":"setSettlementChallengeTimeout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"newUpdateDelayBlocks","type":"uint256"}],"name":"setUpdateDelayBlocks","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"stakeFraction","type":"uint256"}],"name":"setFraudStakeFraction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"timeoutInSeconds","type":"uint256"}],"name":"setServiceActivationTimeout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"name":"currencyPaymentFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tradeTakerFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"updateDelayBlocksCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paymentFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tradeTakerMinimumFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"service","type":"address"}],"name":"registerServiceDeferred","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"timeoutInSeconds","type":"uint256"}],"name":"setCancelOrderChallengeTimeout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cancelOrderChallengeTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newDeployer","type":"address"}],"name":"setDeployer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fraudStakeFraction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableEarliestSettlementBlockNumberUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"name":"feeCurrency","outputs":[{"name":"ct","type":"address"},{"name":"id","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operatorSettlementStakeFraction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"},{"name":"discountTier","type":"int256"}],"name":"paymentFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tradeMakerFeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"earliestSettlementBlockNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"OPERATIONAL_MODE_ACTION","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOperationalModeExit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"confirmationBlocksCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"},{"name":"nominal","type":"int256"}],"name":"setCurrencyPaymentMinimumFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"updateDelayBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operatorSettlementStake","outputs":[{"name":"amount","type":"int256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deployer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"earliestSettlementBlockNumberUpdateDisabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"}],"name":"tradeMakerMinimumFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"blockNumber","type":"uint256"}],"name":"tradeTakerMinimumFee","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"nominal","type":"int256"}],"name":"setTradeMakerMinimumFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_earliestSettlementBlockNumber","type":"uint256"}],"name":"setEarliestSettlementBlockNumber","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOperationalModeNormal","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"currencyCt","type":"address"},{"name":"currencyId","type":"uint256"},{"name":"nominal","type":"int256"},{"name":"discountTiers","type":"int256[]"},{"name":"discountValues","type":"int256[]"}],"name":"setCurrencyPaymentFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setOperationalModeExit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"settlementChallengeTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"service","type":"address"}],"name":"registerService","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"fromBlockNumber","type":"uint256"},{"name":"newConfirmationBlocks","type":"uint256"}],"name":"setConfirmationBlocks","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"deployer","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"SetOperationalModeExitEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"newBlocks","type":"uint256"}],"name":"SetUpdateDelayBlocksEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"newBlocks","type":"uint256"}],"name":"SetConfirmationBlocksEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"},{"indexed":false,"name":"discountTiers","type":"int256[]"},{"indexed":false,"name":"discountValues","type":"int256[]"}],"name":"SetTradeMakerFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"},{"indexed":false,"name":"discountTiers","type":"int256[]"},{"indexed":false,"name":"discountValues","type":"int256[]"}],"name":"SetTradeTakerFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"},{"indexed":false,"name":"discountTiers","type":"int256[]"},{"indexed":false,"name":"discountValues","type":"int256[]"}],"name":"SetPaymentFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"currencyCt","type":"address"},{"indexed":false,"name":"currencyId","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"},{"indexed":false,"name":"discountTiers","type":"int256[]"},{"indexed":false,"name":"discountValues","type":"int256[]"}],"name":"SetCurrencyPaymentFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"}],"name":"SetTradeMakerMinimumFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"}],"name":"SetTradeTakerMinimumFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"}],"name":"SetPaymentMinimumFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"currencyCt","type":"address"},{"indexed":false,"name":"currencyId","type":"uint256"},{"indexed":false,"name":"nominal","type":"int256"}],"name":"SetCurrencyPaymentMinimumFeeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"referenceCurrencyCt","type":"address"},{"indexed":false,"name":"referenceCurrencyId","type":"uint256"},{"indexed":false,"name":"feeCurrencyCt","type":"address"},{"indexed":false,"name":"feeCurrencyId","type":"uint256"}],"name":"SetFeeCurrencyEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"timeoutInSeconds","type":"uint256"}],"name":"SetWalletLockTimeoutEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"timeoutInSeconds","type":"uint256"}],"name":"SetCancelOrderChallengeTimeoutEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"timeoutInSeconds","type":"uint256"}],"name":"SetSettlementChallengeTimeoutEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"stakeFraction","type":"uint256"}],"name":"SetWalletSettlementStakeFractionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"stakeFraction","type":"uint256"}],"name":"SetOperatorSettlementStakeFractionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"stakeAmount","type":"int256"},{"indexed":false,"name":"stakeCurrencyCt","type":"address"},{"indexed":false,"name":"stakeCurrencyId","type":"uint256"}],"name":"SetOperatorSettlementStakeEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromBlockNumber","type":"uint256"},{"indexed":false,"name":"stakeFraction","type":"uint256"}],"name":"SetFraudStakeFractionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"earliestSettlementBlockNumber","type":"uint256"}],"name":"SetEarliestSettlementBlockNumberEvent","type":"event"},{"anonymous":false,"inputs":[],"name":"DisableEarliestSettlementBlockNumberUpdateEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timeoutInSeconds","type":"uint256"}],"name":"ServiceActivationTimeoutEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"service","type":"address"}],"name":"RegisterServiceEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"service","type":"address"},{"indexed":false,"name":"timeout","type":"uint256"}],"name":"RegisterServiceDeferredEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"service","type":"address"}],"name":"DeregisterServiceEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"service","type":"address"},{"indexed":false,"name":"action","type":"string"}],"name":"EnableServiceActionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"service","type":"address"},{"indexed":false,"name":"action","type":"string"}],"name":"DisableServiceActionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldDeployer","type":"address"},{"indexed":false,"name":"newDeployer","type":"address"}],"name":"SetDeployerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOperator","type":"address"},{"indexed":false,"name":"newOperator","type":"address"}],"name":"SetOperatorEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"SelfDestructionDisabledEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"TriggerSelfDestructionEvent","type":"event"}]Contract Creation Code
60806040526004805460ff191690553480156200001b57600080fd5b506040516020806200394083398101806040526200003d919081019062000157565b8080600160a060020a03811615156200005557600080fd5b600160a060020a0381163014156200006c57600080fd5b506000805461010060a860020a031916610100600160a060020a039390931692830217815560018054600160a060020a031916909217909155620000c3906005904390640100000000620000ca8102620025e61704565b506200018c565b82541580620000fc5750825483906000198101908110620000e757fe5b90600052602060002090600202016000015482115b15156200010857600080fd5b6040805180820190915291825260208083019182528354600181810186556000958652919094209251600290940290920192835551910155565b600062000150825162000180565b9392505050565b6000602082840312156200016a57600080fd5b600062000178848462000142565b949350505050565b600160a060020a031690565b6137a4806200019c6000396000f30060806040526004361061034a5763ffffffff60e060020a6000350416630783e3db811461034f5780630f4e74691461037157806312e5c6541461039c578063158c1848146103c957806317ba3f90146103e95780631af78f09146104165780631b6eb59f146104365780632585f2781461045657806326c3acc3146104765780632738a11214610496578063273cc25f146104ab57806328b5f95c146104cb57806328eb2edd146104e057806329ea3faa146104f55780632b5672e31461050a5780632b91e0a91461052a5780632f013a001461054a5780633b58c5011461055f5780633b7bea6c1461057f5780633b8bba6c1461059457806342399aea146105b45780634476d23b146105d4578063460a58aa146105f65780634a6cf8451461060b5780634fd9b0e51461062b57806350b08c021461064b578063543877301461066b57806354f4338014610680578063570ca735146106a05780635df1b0a3146106b557806363f6e017146106d55780636c671a52146106f55780636c98600c1461071557806370327ea11461073557806374bcea6b1461074a578063768f594c1461076a578063778228401461078a57806377bad2cf146107aa5780637e15dd5c146107ca5780637e864666146107ea578063847bb1821461080a578063854e7fbf1461081f578063868a674f1461083457806389eec486146108495780638e8cef121461085e57806393d1243f1461087e578063940b81001461089e57806396214735146108b35780639699f337146108d35780639bbb0ff2146108e8578063a329fad5146108fd578063ac00d3b21461092b578063ad08605414610940578063b12aa34314610960578063b3ab15fb14610975578063b6bf417614610995578063b78272e0146109aa578063be189480146109cc578063c136df85146109e1578063c1959cc5146109f6578063c946b6e914610a16578063ccd03d2e14610a2b578063d5f3948814610a4f578063d7f0f97114610a64578063dc7dc62c14610a79578063ecb41ad814610a99578063efda7ffc14610ab9578063f69c70a014610ad9578063f71e860f14610af9578063f8b37af014610b0e578063f8e6e88814610b2e578063fbdfd8e714610b43578063fdd9ec7d14610b58578063fe98a9dc14610b78575b600080fd5b34801561035b57600080fd5b5061036f61036a36600461331d565b610b98565b005b34801561037d57600080fd5b50610386610c30565b60405161039391906134c8565b60405180910390f35b3480156103a857600080fd5b506103bc6103b7366004613076565b610c39565b60405161039391906134d6565b3480156103d557600080fd5b506103bc6103e43660046130e2565b610c75565b3480156103f557600080fd5b50610409610404366004613007565b610cf3565b60405161039391906134ba565b34801561042257600080fd5b5061036f61043136600461312f565b610d27565b34801561044257600080fd5b506103bc6104513660046131a4565b610df2565b34801561046257600080fd5b5061036f6104713660046132ba565b610e73565b34801561048257600080fd5b506103bc6104913660046132ba565b610f03565b3480156104a257600080fd5b5061036f610f17565b3480156104b757600080fd5b506103bc6104c63660046130c4565b610f7d565b3480156104d757600080fd5b506103bc610f90565b3480156104ec57600080fd5b506103bc610fa2565b34801561050157600080fd5b506103bc610fae565b34801561051657600080fd5b5061036f610525366004613025565b610fba565b34801561053657600080fd5b50610409610545366004613007565b6110e8565b34801561055657600080fd5b50610409611106565b34801561056b57600080fd5b5061036f61057a366004613025565b61110f565b34801561058b57600080fd5b506103bc6111ef565b3480156105a057600080fd5b5061036f6105af3660046132ba565b6111f5565b3480156105c057600080fd5b5061036f6105cf3660046132ba565b611278565b3480156105e057600080fd5b506105e96112fb565b6040516103939190613456565b34801561060257600080fd5b506103bc61130f565b34801561061757600080fd5b5061036f61062636600461331d565b61131b565b34801561063757600080fd5b506103bc610646366004613076565b6113a4565b34801561065757600080fd5b5061036f610666366004613007565b6113d0565b34801561067757600080fd5b506103bc611492565b34801561068c57600080fd5b5061036f61069b3660046132d9565b61149e565b3480156106ac57600080fd5b506105e961155d565b3480156106c157600080fd5b506104096106d0366004613025565b61156c565b3480156106e157600080fd5b5061036f6106f036600461331d565b6115be565b34801561070157600080fd5b5061036f6107103660046132ba565b611647565b34801561072157600080fd5b506103bc6107303660046132ba565b6116ca565b34801561074157600080fd5b5061036f6116de565b34801561075657600080fd5b5061036f6107653660046132ba565b611741565b34801561077657600080fd5b5061036f6107853660046132ba565b6117c4565b34801561079657600080fd5b5061036f6107a53660046132ba565b611847565b3480156107b657600080fd5b5061036f6107c53660046132ba565b6118ca565b3480156107d657600080fd5b5061036f6107e53660046130c4565b61194d565b3480156107f657600080fd5b506103bc610805366004613076565b6119a0565b34801561081657600080fd5b506103bc6119cc565b34801561082b57600080fd5b506103bc6119d8565b34801561084057600080fd5b506103bc6119e4565b34801561085557600080fd5b506103bc6119f0565b34801561086a57600080fd5b5061036f610879366004613007565b6119fc565b34801561088a57600080fd5b5061036f6108993660046132ba565b611a7a565b3480156108aa57600080fd5b506103bc611afd565b3480156108bf57600080fd5b5061036f6108ce366004613007565b611b09565b3480156108df57600080fd5b506103bc611bc7565b3480156108f457600080fd5b5061036f611bd3565b34801561090957600080fd5b5061091d6109183660046130e2565b611c1e565b60405161039392919061349f565b34801561093757600080fd5b506103bc611c75565b34801561094c57600080fd5b506103bc61095b3660046132ba565b611c81565b34801561096c57600080fd5b506103bc611c95565b34801561098157600080fd5b5061036f610990366004613007565b611ca1565b3480156109a157600080fd5b506103bc611d4b565b3480156109b657600080fd5b506109bf611d51565b604051610393919061350c565b3480156109d857600080fd5b50610409611d7e565b3480156109ed57600080fd5b506103bc611d9b565b348015610a0257600080fd5b5061036f610a113660046131a4565b611da7565b348015610a2257600080fd5b506103bc611e50565b348015610a3757600080fd5b50610a40611e5c565b604051610393939291906134e4565b348015610a5b57600080fd5b506105e9611e8f565b348015610a7057600080fd5b50610409611ea3565b348015610a8557600080fd5b506103bc610a943660046130c4565b611eac565b348015610aa557600080fd5b506103bc610ab43660046130c4565b611ebf565b348015610ac557600080fd5b5061036f610ad43660046132ba565b611ed2565b348015610ae557600080fd5b5061036f610af43660046130c4565b611f55565b348015610b0557600080fd5b50610409611f9d565b348015610b1a57600080fd5b5061036f610b29366004613205565b611fb8565b348015610b3a57600080fd5b5061036f612078565b348015610b4f57600080fd5b506103bc6120ef565b348015610b6457600080fd5b5061036f610b73366004613007565b6120fb565b348015610b8457600080fd5b5061036f610b933660046132ba565b612174565b610ba06121f7565b1515610bab57600080fd5b83610bb66005612208565b1580610bcd5750610bc7600561220c565b43018110155b1515610bd857600080fd5b610bec60078686868663ffffffff61221816565b7f8ec36e523af9a3433562968ade78ee302be3c4306c6815d30bc17fbc6f658f4485858585604051610c219493929190613644565b60405180910390a15050505050565b60045460ff1681565b6000610c6c604080519081016040528085600160a060020a0316815260200184815250600f6122e190919063ffffffff16565b90505b92915050565b600160a060020a0382166000908152600e602090815260408083208484529091528120610ca190612208565b60001015610ce357600160a060020a0383166000908152600e602090815260408083208584529091529020610cdc908563ffffffff61230b16565b9050610cec565b610cdc84610f7d565b9392505050565b6000610cfe826110e8565b8015610c6f575050600160a060020a031660009081526002602052604090206001015442101590565b610d2f6121f7565b1515610d3a57600080fd5b84610d456005612208565b1580610d5c5750610d56600561220c565b43018110155b1515610d6757600080fd5b604080518082018252600160a060020a0380881682526020808301889052835180850190945290861683528201849052610dab91600f91899163ffffffff61232216565b7fd6db40c81246b0bc2d29bb51b5d58d3e36502ac9898ab35237d4136a5172c2b28686868686604051610de295949392919061351d565b60405180910390a1505050505050565b600160a060020a0383166000908152600a602090815260408083208584529091528120610e1e90612208565b60001015610e6157600160a060020a0384166000908152600a602090815260408083208684529091529020610e5a90868463ffffffff61243e16565b9050610e6b565b610e5a8583611c81565b949350505050565b610e7b6121f7565b1515610e8657600080fd5b81610e916005612208565b1580610ea85750610ea2600561220c565b43018110155b1515610eb357600080fd5b610ec5600d848463ffffffff6125e616565b7f8db08e27454fa2b4fb1a49c88f48d25b6561af54f240ad2f3beb4887830f1e9d8383604051610ef692919061360e565b60405180910390a1505050565b6000610c6c6007848463ffffffff61243e16565b33610f206112fb565b600160a060020a031614610f3357600080fd5b60005460ff1615610f4357600080fd5b7f787a5d936e74f4b564b9153575886059829c78cd9927b1be5e0d976b317ef73633604051610f729190613456565b60405180910390a133ff5b6000610c6f600d8363ffffffff61230b16565b6000610f9c601461220c565b90505b90565b6000610f9c600d612208565b6000610f9c601061220c565b6000610fc461265b565b1515610fcf57600080fd5b82600160a060020a0381161515610fe557600080fd5b600160a060020a038116301415610ffb57600080fd5b600160a060020a03841660009081526002602052604090205460ff16151561102257600080fd5b61102b83612671565b600160a060020a0385166000908152600260208181526040808420858552909201905290205490925060ff161561106157600080fd5b600160a060020a03841660009081526002602081815260408084208685528084018352818520805460ff19166001908117909155938352600301805493840181558452922001839055517fec1b982d69bfc1a6fd8becf191d9a633486c822d3bdedd52303ca81fa6357501906110da908690869061347f565b60405180910390a150505050565b600160a060020a031660009081526002602052604090205460ff1690565b60005460ff1681565b600061111961265b565b151561112457600080fd5b82600160a060020a038116151561113a57600080fd5b600160a060020a03811630141561115057600080fd5b61115983612671565b600160a060020a0385166000908152600260208181526040808420858552909201905290205490925060ff16151561119057600080fd5b600160a060020a0384166000908152600260208181526040808420868552909201905290819020805460ff19169055517f92f4af6130f47c92f3899e06611c8c6ef191fb81207ad2675d134af619d2fe7d906110da908690869061347f565b60035481565b6111fd6121f7565b151561120857600080fd5b816112136005612208565b158061122a5750611224600561220c565b43018110155b151561123557600080fd5b6112476010848463ffffffff6125e616565b7f599f1c845a3e9ff375e1e3c7e61a6ff2faac7ed7e9cc45db40fd2b73f53845048383604051610ef692919061360e565b6112806121f7565b151561128b57600080fd5b816112966005612208565b15806112ad57506112a7600561220c565b43018110155b15156112b857600080fd5b6112ca6014848463ffffffff6125e616565b7f46627504a56b77179118cc2fc2139516c5abaa99efc1d64afa509f91be130c458383604051610ef692919061360e565b6000546101009004600160a060020a031690565b6000610f9c600661220c565b6113236121f7565b151561132e57600080fd5b836113396005612208565b1580611350575061134a600561220c565b43018110155b151561135b57600080fd5b61136f60098686868663ffffffff61221816565b7f8dcd79c2f73c725f825147941deccba2addafb9f7f2e775777710f5debba966885858585604051610c219493929190613644565b600160a060020a0382166000908152600e602090815260408083208484529091528120610c6c90612208565b6113d861265b565b15156113e357600080fd5b80600160a060020a03811615156113f957600080fd5b600160a060020a03811630141561140f57600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561143657600080fd5b600160a060020a03821660009081526002602052604090819020805460ff19169055517f777645c5437dfbf962f57a281ead25f3d513f2f8e938685bbfc1738e81c9880e90611486908490613456565b60405180910390a15050565b6000610f9c600b612208565b6114a6612e18565b6114ae6121f7565b15156114b957600080fd5b846114c46005612208565b15806114db57506114d5600561220c565b43018110155b15156114e657600080fd5b6040805180820182528681528151808301909252600160a060020a0386168252602082810186905281019190915291506115286016878463ffffffff61275616565b7f0446e894f61064d2b9ac2f66e25bc440e0bcb2c00de07a5f1b076b8ed83efa9186868686604051610de2949392919061361c565b600154600160a060020a031681565b60008061157883612671565b905061158384610cf3565b80156115b45750600160a060020a0384166000908152600260208181526040808420858552909201905290205460ff165b91505b5092915050565b6115c66121f7565b15156115d157600080fd5b836115dc6005612208565b15806115f357506115ed600561220c565b43018110155b15156115fe57600080fd5b61161260088686868663ffffffff61221816565b7fd3143532264a48ed8985128261dac4f97460a18e532266606874e734e5f9511985858585604051610c219493929190613644565b61164f6121f7565b151561165a57600080fd5b816116656005612208565b158061167c5750611676600561220c565b43018110155b151561168757600080fd5b611699600c848463ffffffff6125e616565b7f4c67330f24d50310990ba512d41f5016c43176108456cdf8b3afa5f2c56c72e18383604051610ef692919061360e565b6000610c6c6008848463ffffffff61243e16565b336116e76112fb565b600160a060020a0316146116fa57600080fd5b6000805460ff191660011790556040517fd5a2a04a775c741c2ca0dc46ea7ce4835190e1aaf1ca018def0e82568ec3361690611737903390613456565b60405180910390a1565b6117496121f7565b151561175457600080fd5b8161175f6005612208565b15806117765750611770600561220c565b43018110155b151561178157600080fd5b6117936015848463ffffffff6125e616565b7f89d1e4eeae3e50e6d57909b1ff05821c208283d43c3c6eede3463fce9801bcbf8383604051610ef692919061360e565b6117cc6121f7565b15156117d757600080fd5b816117e26005612208565b15806117f957506117f3600561220c565b43018110155b151561180457600080fd5b6118166012848463ffffffff6125e616565b7ffaae0268144aeab0eb789ad33da1cc7f926da22cdc4cfb89e4c2dcc87cf719248383604051610ef692919061360e565b61184f6121f7565b151561185a57600080fd5b816118656005612208565b158061187c5750611876600561220c565b43018110155b151561188757600080fd5b6118996005848463ffffffff6125e616565b7fb18e0b90fd56f3d1f73c768d7f107937813899fe6676f8348f996ad670b990048383604051610ef692919061360e565b6118d26121f7565b15156118dd57600080fd5b816118e86005612208565b15806118ff57506118f9600561220c565b43018110155b151561190a57600080fd5b61191c6013848463ffffffff6125e616565b7fb04162ce72310207d5c9ceced2e6df3ddd15272642b0e53af3c7e83f0d0dc4918383604051610ef692919061360e565b61195561265b565b151561196057600080fd5b60038190556040517f4f1d324a1cbffc352fb64f1d73d95e4b200d92f99ef39bf2d7f5b41f946909d6906119959083906134d6565b60405180910390a150565b600160a060020a0382166000908152600a602090815260408083208484529091528120610c6c90612208565b6000610f9c6008612208565b6000610f9c6005612208565b6000610f9c6009612208565b6000610f9c600c612208565b611a0461265b565b1515611a0f57600080fd5b80600160a060020a0381161515611a2557600080fd5b600160a060020a038116301415611a3b57600080fd5b611a4782600354612803565b7f7f3a8349917003ed377f6e9ae1608b92edd893903f8983bd274b1f8373dd3b118260035460405161148692919061349f565b611a826121f7565b1515611a8d57600080fd5b81611a986005612208565b1580611aaf5750611aa9600561220c565b43018110155b1515611aba57600080fd5b611acc6011848463ffffffff6125e616565b7f081f0b4c81d1de8d02805cc089a2d5a665837d8c19b438f4558128149df8fcfc8383604051610ef692919061360e565b6000610f9c601161220c565b6000611b1361265b565b1515611b1e57600080fd5b81600160a060020a0381161515611b3457600080fd5b600160a060020a038116301415611b4a57600080fd5b600054600160a060020a038481166101009092041614611bc25760008054600160a060020a0385811661010090810261010060a860020a0319841617909355604051929091041692507f977e5fa58e458501775e0008d275006294c5249e3c08d1d0e3a9f3acad14f6e490610ef69084908690613464565b505050565b6000610f9c601361220c565b611bdb6121f7565b1515611be657600080fd5b6018805460ff191660011790556040517f99d6c8c83d6b3086e44ac9a4cff201904eb96dc84e20289516e1d6d5f387d30c90600090a1565b6000806000611c56604080519081016040528087600160a060020a031681526020018681525087600f6128559092919063ffffffff16565b8054600190910154600160a060020a0390911697909650945050505050565b6000610f9c601561220c565b6000610c6c6009848463ffffffff61243e16565b6000610f9c6007612208565b6000611cab6121f7565b1515611cb657600080fd5b81600160a060020a0381161515611ccc57600080fd5b600160a060020a038116301415611ce257600080fd5b600154600160a060020a03848116911614611bc25760018054600160a060020a03858116600160a060020a0319831617909255604051911692507f9f611b789425d0d5b90b920f1b2852907dd865c80074a30b1629aaa041d1812c90610ef69084908690613464565b60175481565b6040805180820190915260108152608060020a6f6f7065726174696f6e616c5f6d6f646502602082015281565b60045460009060ff166001811115611d9257fe5b60015b14905090565b6000610f9c6006612208565b611daf6121f7565b1515611dba57600080fd5b83611dc56005612208565b1580611ddc5750611dd6600561220c565b43018110155b1515611de757600080fd5b600160a060020a0384166000908152600e602090815260408083208684529091529020611e1b90868463ffffffff6125e616565b7ffed51dfd288a74f4e3f4fd59cad1bb9151c6f8e27c781c703ce6ea532e3deac285858585604051610c219493929190613569565b6000610f9c600561220c565b600080600080611e6c601661286d565b805460018201546002909201549096600160a060020a0390921695509350915050565b6000546101009004600160a060020a031681565b60185460ff1681565b6000610c6f600b8363ffffffff61230b16565b6000610c6f600c8363ffffffff61230b16565b611eda6121f7565b1515611ee557600080fd5b81611ef06005612208565b1580611f075750611f01600561220c565b43018110155b1515611f1257600080fd5b611f24600b848463ffffffff6125e616565b7f3fb8054aedc542a59b81ca6dd84e6ed5a0f62964ea31cb27f2d61d7f36f2a3428383604051610ef692919061360e565b611f5d6121f7565b1515611f6857600080fd5b60178190556040517fece7c57702b5ad94b9848802d1e225954b064cd5538fd55082e3e29c29474e45906119959083906134d6565b60045460009060ff166001811115611fb157fe5b6000611d95565b611fc06121f7565b1515611fcb57600080fd5b85611fd66005612208565b1580611fed5750611fe7600561220c565b43018110155b1515611ff857600080fd5b600160a060020a0386166000908152600a60209081526040808320888452909152902061202e908886868663ffffffff61221816565b7ff3fafbde2ad0fcd494a4d98dbde01b8571066edaa67de40a48d794b0583efd0a878787878787604051612067969594939291906135a7565b60405180910390a150505050505050565b6040805180820190915260108152608060020a6f6f7065726174696f6e616c5f6d6f64650260208201526120ac338261156c565b15156120b757600080fd5b6004805460ff191660011790556040517e4feb6c9c7b4bc8e858a1e16b46315cd121d46eb476f1d2a0b79c1508b89e3290600090a150565b6000610f9c601261220c565b61210361265b565b151561210e57600080fd5b80600160a060020a038116151561212457600080fd5b600160a060020a03811630141561213a57600080fd5b612145826000612803565b7fb619d545cb511bd5f02907a1eac4f4cb8dace7b1846852fb0bf5e553937481c1826040516114869190613456565b61217c6121f7565b151561218757600080fd5b816121926005612208565b15806121a957506121a3600561220c565b43018110155b15156121b457600080fd5b6121c66006848463ffffffff6125e616565b7febf63d40c9708ad4550ba5278373615a245fcf66e7b70faf9e6b8b90396fa2c88383604051610ef692919061360e565b600154600160a060020a0316331490565b5490565b6000610c6f8243612879565b6000808251845114151561222b57600080fd5b612236878787612885565b86548790600019810190811061224857fe5b90600052602060002090600302019150600090505b83518110156122d857816002016040805190810160405280868481518110151561228357fe5b90602001906020020151815260200185848151811015156122a057fe5b60209081029091018101519091528254600181810185556000948552938290208351600290920201908155910151908201550161225d565b50505050505050565b8051600160a060020a03166000908152602092835260408082209284015182529190925290205490565b60006123178383612902565b602001519392505050565b8151600160a060020a031660009081526020858152604080832082860151845290915290205415806123b557508151600160a060020a0390811660009081526020868152604080832082870180518552908352818420875190951684528883528184209051845290915290205481546000199091019081106123a057fe5b90600052602060002090600302016000015483115b15156123c057600080fd5b8151600160a060020a0390811660009081526020958652604080822094870151825293865283812084518086019095529484528386019283528454600180820187559582529086902093516003909102909301928355905180519383018054600160a060020a03191694909216939093179055910151600290910155565b6000612448612e38565b60006124548686612954565b9150816040015151600010156125d557612472826040015185612a12565b905080600010156125d5576125ce735fcf3704016b90ded3c81d75613ceab0a6a2602562a123336040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156124c657600080fd5b505af41580156124da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124fe91908101906130a6565b6125c26125b185604001516001860381518110151561251957fe5b9060200190602002015160200151735fcf3704016b90ded3c81d75613ceab0a6a2602562a123336040518163ffffffff1660e060020a02815260040160206040518083038186803b15801561256d57600080fd5b505af4158015612581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125a591908101906130a6565b9063ffffffff612a6f16565b60208601519063ffffffff612aab16565b9063ffffffff612b1416565b92506125dd565b816020015192505b50509392505050565b82541580612616575082548390600019810190811061260157fe5b90600052602060002090600202016000015482115b151561262157600080fd5b6040805180820190915291825260208083019182528354600181810186556000958652919094209251600290940290920192835551910155565b6000546101009004600160a060020a0316331490565b6000816040516020018082805190602001908083835b602083106126a65780518252601f199092019160209182019101612687565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106127095780518252601f1990920191602091820191016126ea565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b82541580612616575082548390600019810190811061260157fe5b82541580612786575082548390600019810190811061277157fe5b90600052602060002090600402016000015482115b151561279157600080fd5b604080518082019091529182526020808301918252835460018082018655600095865294829020935160049091029093019283559051805193830193909355918201518051600283018054600160a060020a031916600160a060020a0390921691909117905590910151600390910155565b600160a060020a03821660009081526002602052604090205460ff16151561285157600160a060020a0382166000908152600260205260409020805460ff1916600190811782554283019101555b5050565b6000612862848484612b49565b600101949350505050565b6000610c6f8243612b9a565b60006123178383612bb0565b825460009015806128b857508354849060001981019081106128a357fe5b90600052602060002090600302016000015483115b15156128c357600080fd5b83546128d28560018301612e5a565b508354849060001981019081106128e557fe5b600091825260209091206003909102019283555060019091015550565b61290a612e86565b826129158184612bc3565b8154811061291f57fe5b906000526020600020906002020160408051908101604052908160008201548152602001600182015481525050905092915050565b61295c612e38565b826129678184612c1b565b8154811061297157fe5b906000526020600020906003020160606040519081016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015612a035760008481526020908190206040805180820190915260028502909101805482526001908101548284015290835290920191016129c4565b50505091525090949350505050565b60008083516000101515612a2557600080fd5b5082515b6000811115612a65578360018203815181101515612a4357fe5b60209081029091010151518312612a5c578091506115b7565b60001901612a29565b5060009392505050565b6000808212158015612a8357508282840313155b80612a9a5750600082128015612a9a575082828403135b1515612aa557600080fd5b50900390565b60008083600019141580612ac3575060ff60020a8314155b1515612ace57600080fd5b82600019141580612ae3575060ff60020a8414155b1515612aee57600080fd5b50828202821580612b095750838382811515612b0657fe5b05145b1515610cec57600080fd5b600060ff60020a83141580612b2b57508160001914155b1515612b3657600080fd5b8183811515612b4157fe5b059392505050565b8151600160a060020a03166000908152602084815260408083208286015184529091528120612b79858585612c73565b81548110612b8357fe5b906000526020600020906003020190509392505050565b6000612ba68383612d3b565b6001019392505050565b612bb8612e86565b826129158184612d68565b815460009081908110612bd557600080fd5b508254600019015b6000811061034a578354849082908110612bf357fe5b60009182526020909120600290910201548310612c12578091506115b7565b60001901612bdd565b815460009081908110612c2d57600080fd5b508254600019015b6000811061034a578354849082908110612c4b57fe5b60009182526020909120600390910201548310612c6a578091506115b7565b60001901612c35565b8151600160a060020a031660009081526020848152604080832082860151845290915281205481908110612ca657600080fd5b508251600160a060020a0316600090815260208581526040808320828701518452909152902054600019015b6000811061034a578351600160a060020a03166000908152602086815260408083208288015184529091529020805482908110612d0b57fe5b60009182526020909120600390910201548310612d2a57809150612d33565b60001901612cd2565b509392505050565b600082612d488184612dc0565b81548110612d5257fe5b9060005260206000209060040201905092915050565b815460009081908110612d7a57600080fd5b508254600019015b6000811061034a578354849082908110612d9857fe5b60009182526020909120600290910201548310612db7578091506115b7565b60001901612d82565b815460009081908110612dd257600080fd5b508254600019015b6000811061034a578354849082908110612df057fe5b60009182526020909120600490910201548310612e0f578091506115b7565b60001901612dda565b60606040519081016040528060008152602001612e33612e86565b905290565b6060604051908101604052806000815260200160008152602001606081525090565b815481835581811115611bc257600302816003028360005260206000209182019101611bc29190612e9d565b604080518082019091526000808252602082015290565b610f9f91905b80821115612ecd57600080825560018201819055612ec46002830182612ed1565b50600301612ea3565b5090565b5080546000825560020290600052602060002090810190612ef29190612ef5565b50565b610f9f91905b80821115612ecd5760008082556001820155600201612efb565b6000610c6c82356136fc565b6000601f82018313612f3257600080fd5b8135612f45612f40826136ab565b613685565b91508181835260208401935060208101905083856020840282011115612f6a57600080fd5b60005b83811015612f965781612f808882612fa0565b8452506020928301929190910190600101612f6d565b5050505092915050565b6000610c6c8235610f9f565b6000610c6c8251610f9f565b6000601f82018313612fc957600080fd5b8135612fd7612f40826136cb565b91508082526020830160208301858383011115612ff357600080fd5b612ffe838284613724565b50505092915050565b60006020828403121561301957600080fd5b60006115b48484612f15565b6000806040838503121561303857600080fd5b60006130448585612f15565b92505060208301356001604060020a0381111561306057600080fd5b61306c85828601612fb8565b9150509250929050565b6000806040838503121561308957600080fd5b60006130958585612f15565b925050602061306c85828601612fa0565b6000602082840312156130b857600080fd5b60006115b48484612fac565b6000602082840312156130d657600080fd5b60006115b48484612fa0565b6000806000606084860312156130f757600080fd5b60006131038686612fa0565b935050602061311486828701612f15565b925050604061312586828701612fa0565b9150509250925092565b600080600080600060a0868803121561314757600080fd5b60006131538888612fa0565b955050602061316488828901612f15565b945050604061317588828901612fa0565b935050606061318688828901612f15565b925050608061319788828901612fa0565b9150509295509295909350565b600080600080608085870312156131ba57600080fd5b60006131c68787612fa0565b94505060206131d787828801612f15565b93505060406131e887828801612fa0565b92505060606131f987828801612fa0565b91505092959194509250565b60008060008060008060c0878903121561321e57600080fd5b600061322a8989612fa0565b965050602061323b89828a01612f15565b955050604061324c89828a01612fa0565b945050606061325d89828a01612fa0565b93505060808701356001604060020a0381111561327957600080fd5b61328589828a01612f21565b92505060a08701356001604060020a038111156132a157600080fd5b6132ad89828a01612f21565b9150509295509295509295565b600080604083850312156132cd57600080fd5b60006130958585612fa0565b600080600080608085870312156132ef57600080fd5b60006132fb8787612fa0565b945050602061330c87828801612fa0565b93505060406131e887828801612f15565b6000806000806080858703121561333357600080fd5b600061333f8787612fa0565b945050602061335087828801612fa0565b93505060408501356001604060020a0381111561336c57600080fd5b61337887828801612f21565b92505060608501356001604060020a0381111561339457600080fd5b6131f987828801612f21565b6133a9816136fc565b82525050565b60006133ba826136f8565b8084526020840193506133cc836136f2565b60005b828110156133fc576133e2868351613418565b6133eb826136f2565b6020969096019591506001016133cf565b5093949350505050565b6133a981613708565b6133a981613719565b6133a981610f9f565b600061342c826136f8565b808452613440816020860160208601613730565b61344981613760565b9093016020019392505050565b60208101610c6f82846133a0565b6040810161347282856133a0565b610cec60208301846133a0565b6040810161348d82856133a0565b8181036020830152610e6b8184613421565b604081016134ad82856133a0565b610cec6020830184613418565b60208101610c6f8284613406565b60208101610c6f828461340f565b60208101610c6f8284613418565b606081016134f28286613418565b6134ff60208301856133a0565b610e6b6040830184613418565b60208082528101610c6c8184613421565b60a0810161352b8288613418565b61353860208301876133a0565b6135456040830186613418565b61355260608301856133a0565b61355f6080830184613418565b9695505050505050565b608081016135778287613418565b61358460208301866133a0565b6135916040830185613418565b61359e6060830184613418565b95945050505050565b60c081016135b58289613418565b6135c260208301886133a0565b6135cf6040830187613418565b6135dc6060830186613418565b81810360808301526135ee81856133af565b905081810360a083015261360281846133af565b98975050505050505050565b604081016134ad8285613418565b6080810161362a8287613418565b6136376020830186613418565b61359160408301856133a0565b608081016136528287613418565b61365f6020830186613418565b818103604083015261367181856133af565b9050818103606083015261355f81846133af565b6040518181016001604060020a03811182821017156136a357600080fd5b604052919050565b60006001604060020a038211156136c157600080fd5b5060209081020190565b60006001604060020a038211156136e157600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b600060028210612ecd57fe5b6000610c6f8261370d565b82818337506000910152565b60005b8381101561374b578181015183820152602001613733565b8381111561375a576000848401525b50505050565b601f01601f1916905600a265627a7a723058206855dd833d2aa3295799c84f9d3dc43cbda2177ea158acd7bb4816f8b9bd00906c6578706572696d656e74616cf50037000000000000000000000000f05179bac3d1fbef58a2fcd7ad0f769840027cc6
Deployed Bytecode
0x60806040526004361061034a5763ffffffff60e060020a6000350416630783e3db811461034f5780630f4e74691461037157806312e5c6541461039c578063158c1848146103c957806317ba3f90146103e95780631af78f09146104165780631b6eb59f146104365780632585f2781461045657806326c3acc3146104765780632738a11214610496578063273cc25f146104ab57806328b5f95c146104cb57806328eb2edd146104e057806329ea3faa146104f55780632b5672e31461050a5780632b91e0a91461052a5780632f013a001461054a5780633b58c5011461055f5780633b7bea6c1461057f5780633b8bba6c1461059457806342399aea146105b45780634476d23b146105d4578063460a58aa146105f65780634a6cf8451461060b5780634fd9b0e51461062b57806350b08c021461064b578063543877301461066b57806354f4338014610680578063570ca735146106a05780635df1b0a3146106b557806363f6e017146106d55780636c671a52146106f55780636c98600c1461071557806370327ea11461073557806374bcea6b1461074a578063768f594c1461076a578063778228401461078a57806377bad2cf146107aa5780637e15dd5c146107ca5780637e864666146107ea578063847bb1821461080a578063854e7fbf1461081f578063868a674f1461083457806389eec486146108495780638e8cef121461085e57806393d1243f1461087e578063940b81001461089e57806396214735146108b35780639699f337146108d35780639bbb0ff2146108e8578063a329fad5146108fd578063ac00d3b21461092b578063ad08605414610940578063b12aa34314610960578063b3ab15fb14610975578063b6bf417614610995578063b78272e0146109aa578063be189480146109cc578063c136df85146109e1578063c1959cc5146109f6578063c946b6e914610a16578063ccd03d2e14610a2b578063d5f3948814610a4f578063d7f0f97114610a64578063dc7dc62c14610a79578063ecb41ad814610a99578063efda7ffc14610ab9578063f69c70a014610ad9578063f71e860f14610af9578063f8b37af014610b0e578063f8e6e88814610b2e578063fbdfd8e714610b43578063fdd9ec7d14610b58578063fe98a9dc14610b78575b600080fd5b34801561035b57600080fd5b5061036f61036a36600461331d565b610b98565b005b34801561037d57600080fd5b50610386610c30565b60405161039391906134c8565b60405180910390f35b3480156103a857600080fd5b506103bc6103b7366004613076565b610c39565b60405161039391906134d6565b3480156103d557600080fd5b506103bc6103e43660046130e2565b610c75565b3480156103f557600080fd5b50610409610404366004613007565b610cf3565b60405161039391906134ba565b34801561042257600080fd5b5061036f61043136600461312f565b610d27565b34801561044257600080fd5b506103bc6104513660046131a4565b610df2565b34801561046257600080fd5b5061036f6104713660046132ba565b610e73565b34801561048257600080fd5b506103bc6104913660046132ba565b610f03565b3480156104a257600080fd5b5061036f610f17565b3480156104b757600080fd5b506103bc6104c63660046130c4565b610f7d565b3480156104d757600080fd5b506103bc610f90565b3480156104ec57600080fd5b506103bc610fa2565b34801561050157600080fd5b506103bc610fae565b34801561051657600080fd5b5061036f610525366004613025565b610fba565b34801561053657600080fd5b50610409610545366004613007565b6110e8565b34801561055657600080fd5b50610409611106565b34801561056b57600080fd5b5061036f61057a366004613025565b61110f565b34801561058b57600080fd5b506103bc6111ef565b3480156105a057600080fd5b5061036f6105af3660046132ba565b6111f5565b3480156105c057600080fd5b5061036f6105cf3660046132ba565b611278565b3480156105e057600080fd5b506105e96112fb565b6040516103939190613456565b34801561060257600080fd5b506103bc61130f565b34801561061757600080fd5b5061036f61062636600461331d565b61131b565b34801561063757600080fd5b506103bc610646366004613076565b6113a4565b34801561065757600080fd5b5061036f610666366004613007565b6113d0565b34801561067757600080fd5b506103bc611492565b34801561068c57600080fd5b5061036f61069b3660046132d9565b61149e565b3480156106ac57600080fd5b506105e961155d565b3480156106c157600080fd5b506104096106d0366004613025565b61156c565b3480156106e157600080fd5b5061036f6106f036600461331d565b6115be565b34801561070157600080fd5b5061036f6107103660046132ba565b611647565b34801561072157600080fd5b506103bc6107303660046132ba565b6116ca565b34801561074157600080fd5b5061036f6116de565b34801561075657600080fd5b5061036f6107653660046132ba565b611741565b34801561077657600080fd5b5061036f6107853660046132ba565b6117c4565b34801561079657600080fd5b5061036f6107a53660046132ba565b611847565b3480156107b657600080fd5b5061036f6107c53660046132ba565b6118ca565b3480156107d657600080fd5b5061036f6107e53660046130c4565b61194d565b3480156107f657600080fd5b506103bc610805366004613076565b6119a0565b34801561081657600080fd5b506103bc6119cc565b34801561082b57600080fd5b506103bc6119d8565b34801561084057600080fd5b506103bc6119e4565b34801561085557600080fd5b506103bc6119f0565b34801561086a57600080fd5b5061036f610879366004613007565b6119fc565b34801561088a57600080fd5b5061036f6108993660046132ba565b611a7a565b3480156108aa57600080fd5b506103bc611afd565b3480156108bf57600080fd5b5061036f6108ce366004613007565b611b09565b3480156108df57600080fd5b506103bc611bc7565b3480156108f457600080fd5b5061036f611bd3565b34801561090957600080fd5b5061091d6109183660046130e2565b611c1e565b60405161039392919061349f565b34801561093757600080fd5b506103bc611c75565b34801561094c57600080fd5b506103bc61095b3660046132ba565b611c81565b34801561096c57600080fd5b506103bc611c95565b34801561098157600080fd5b5061036f610990366004613007565b611ca1565b3480156109a157600080fd5b506103bc611d4b565b3480156109b657600080fd5b506109bf611d51565b604051610393919061350c565b3480156109d857600080fd5b50610409611d7e565b3480156109ed57600080fd5b506103bc611d9b565b348015610a0257600080fd5b5061036f610a113660046131a4565b611da7565b348015610a2257600080fd5b506103bc611e50565b348015610a3757600080fd5b50610a40611e5c565b604051610393939291906134e4565b348015610a5b57600080fd5b506105e9611e8f565b348015610a7057600080fd5b50610409611ea3565b348015610a8557600080fd5b506103bc610a943660046130c4565b611eac565b348015610aa557600080fd5b506103bc610ab43660046130c4565b611ebf565b348015610ac557600080fd5b5061036f610ad43660046132ba565b611ed2565b348015610ae557600080fd5b5061036f610af43660046130c4565b611f55565b348015610b0557600080fd5b50610409611f9d565b348015610b1a57600080fd5b5061036f610b29366004613205565b611fb8565b348015610b3a57600080fd5b5061036f612078565b348015610b4f57600080fd5b506103bc6120ef565b348015610b6457600080fd5b5061036f610b73366004613007565b6120fb565b348015610b8457600080fd5b5061036f610b933660046132ba565b612174565b610ba06121f7565b1515610bab57600080fd5b83610bb66005612208565b1580610bcd5750610bc7600561220c565b43018110155b1515610bd857600080fd5b610bec60078686868663ffffffff61221816565b7f8ec36e523af9a3433562968ade78ee302be3c4306c6815d30bc17fbc6f658f4485858585604051610c219493929190613644565b60405180910390a15050505050565b60045460ff1681565b6000610c6c604080519081016040528085600160a060020a0316815260200184815250600f6122e190919063ffffffff16565b90505b92915050565b600160a060020a0382166000908152600e602090815260408083208484529091528120610ca190612208565b60001015610ce357600160a060020a0383166000908152600e602090815260408083208584529091529020610cdc908563ffffffff61230b16565b9050610cec565b610cdc84610f7d565b9392505050565b6000610cfe826110e8565b8015610c6f575050600160a060020a031660009081526002602052604090206001015442101590565b610d2f6121f7565b1515610d3a57600080fd5b84610d456005612208565b1580610d5c5750610d56600561220c565b43018110155b1515610d6757600080fd5b604080518082018252600160a060020a0380881682526020808301889052835180850190945290861683528201849052610dab91600f91899163ffffffff61232216565b7fd6db40c81246b0bc2d29bb51b5d58d3e36502ac9898ab35237d4136a5172c2b28686868686604051610de295949392919061351d565b60405180910390a1505050505050565b600160a060020a0383166000908152600a602090815260408083208584529091528120610e1e90612208565b60001015610e6157600160a060020a0384166000908152600a602090815260408083208684529091529020610e5a90868463ffffffff61243e16565b9050610e6b565b610e5a8583611c81565b949350505050565b610e7b6121f7565b1515610e8657600080fd5b81610e916005612208565b1580610ea85750610ea2600561220c565b43018110155b1515610eb357600080fd5b610ec5600d848463ffffffff6125e616565b7f8db08e27454fa2b4fb1a49c88f48d25b6561af54f240ad2f3beb4887830f1e9d8383604051610ef692919061360e565b60405180910390a1505050565b6000610c6c6007848463ffffffff61243e16565b33610f206112fb565b600160a060020a031614610f3357600080fd5b60005460ff1615610f4357600080fd5b7f787a5d936e74f4b564b9153575886059829c78cd9927b1be5e0d976b317ef73633604051610f729190613456565b60405180910390a133ff5b6000610c6f600d8363ffffffff61230b16565b6000610f9c601461220c565b90505b90565b6000610f9c600d612208565b6000610f9c601061220c565b6000610fc461265b565b1515610fcf57600080fd5b82600160a060020a0381161515610fe557600080fd5b600160a060020a038116301415610ffb57600080fd5b600160a060020a03841660009081526002602052604090205460ff16151561102257600080fd5b61102b83612671565b600160a060020a0385166000908152600260208181526040808420858552909201905290205490925060ff161561106157600080fd5b600160a060020a03841660009081526002602081815260408084208685528084018352818520805460ff19166001908117909155938352600301805493840181558452922001839055517fec1b982d69bfc1a6fd8becf191d9a633486c822d3bdedd52303ca81fa6357501906110da908690869061347f565b60405180910390a150505050565b600160a060020a031660009081526002602052604090205460ff1690565b60005460ff1681565b600061111961265b565b151561112457600080fd5b82600160a060020a038116151561113a57600080fd5b600160a060020a03811630141561115057600080fd5b61115983612671565b600160a060020a0385166000908152600260208181526040808420858552909201905290205490925060ff16151561119057600080fd5b600160a060020a0384166000908152600260208181526040808420868552909201905290819020805460ff19169055517f92f4af6130f47c92f3899e06611c8c6ef191fb81207ad2675d134af619d2fe7d906110da908690869061347f565b60035481565b6111fd6121f7565b151561120857600080fd5b816112136005612208565b158061122a5750611224600561220c565b43018110155b151561123557600080fd5b6112476010848463ffffffff6125e616565b7f599f1c845a3e9ff375e1e3c7e61a6ff2faac7ed7e9cc45db40fd2b73f53845048383604051610ef692919061360e565b6112806121f7565b151561128b57600080fd5b816112966005612208565b15806112ad57506112a7600561220c565b43018110155b15156112b857600080fd5b6112ca6014848463ffffffff6125e616565b7f46627504a56b77179118cc2fc2139516c5abaa99efc1d64afa509f91be130c458383604051610ef692919061360e565b6000546101009004600160a060020a031690565b6000610f9c600661220c565b6113236121f7565b151561132e57600080fd5b836113396005612208565b1580611350575061134a600561220c565b43018110155b151561135b57600080fd5b61136f60098686868663ffffffff61221816565b7f8dcd79c2f73c725f825147941deccba2addafb9f7f2e775777710f5debba966885858585604051610c219493929190613644565b600160a060020a0382166000908152600e602090815260408083208484529091528120610c6c90612208565b6113d861265b565b15156113e357600080fd5b80600160a060020a03811615156113f957600080fd5b600160a060020a03811630141561140f57600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561143657600080fd5b600160a060020a03821660009081526002602052604090819020805460ff19169055517f777645c5437dfbf962f57a281ead25f3d513f2f8e938685bbfc1738e81c9880e90611486908490613456565b60405180910390a15050565b6000610f9c600b612208565b6114a6612e18565b6114ae6121f7565b15156114b957600080fd5b846114c46005612208565b15806114db57506114d5600561220c565b43018110155b15156114e657600080fd5b6040805180820182528681528151808301909252600160a060020a0386168252602082810186905281019190915291506115286016878463ffffffff61275616565b7f0446e894f61064d2b9ac2f66e25bc440e0bcb2c00de07a5f1b076b8ed83efa9186868686604051610de2949392919061361c565b600154600160a060020a031681565b60008061157883612671565b905061158384610cf3565b80156115b45750600160a060020a0384166000908152600260208181526040808420858552909201905290205460ff165b91505b5092915050565b6115c66121f7565b15156115d157600080fd5b836115dc6005612208565b15806115f357506115ed600561220c565b43018110155b15156115fe57600080fd5b61161260088686868663ffffffff61221816565b7fd3143532264a48ed8985128261dac4f97460a18e532266606874e734e5f9511985858585604051610c219493929190613644565b61164f6121f7565b151561165a57600080fd5b816116656005612208565b158061167c5750611676600561220c565b43018110155b151561168757600080fd5b611699600c848463ffffffff6125e616565b7f4c67330f24d50310990ba512d41f5016c43176108456cdf8b3afa5f2c56c72e18383604051610ef692919061360e565b6000610c6c6008848463ffffffff61243e16565b336116e76112fb565b600160a060020a0316146116fa57600080fd5b6000805460ff191660011790556040517fd5a2a04a775c741c2ca0dc46ea7ce4835190e1aaf1ca018def0e82568ec3361690611737903390613456565b60405180910390a1565b6117496121f7565b151561175457600080fd5b8161175f6005612208565b15806117765750611770600561220c565b43018110155b151561178157600080fd5b6117936015848463ffffffff6125e616565b7f89d1e4eeae3e50e6d57909b1ff05821c208283d43c3c6eede3463fce9801bcbf8383604051610ef692919061360e565b6117cc6121f7565b15156117d757600080fd5b816117e26005612208565b15806117f957506117f3600561220c565b43018110155b151561180457600080fd5b6118166012848463ffffffff6125e616565b7ffaae0268144aeab0eb789ad33da1cc7f926da22cdc4cfb89e4c2dcc87cf719248383604051610ef692919061360e565b61184f6121f7565b151561185a57600080fd5b816118656005612208565b158061187c5750611876600561220c565b43018110155b151561188757600080fd5b6118996005848463ffffffff6125e616565b7fb18e0b90fd56f3d1f73c768d7f107937813899fe6676f8348f996ad670b990048383604051610ef692919061360e565b6118d26121f7565b15156118dd57600080fd5b816118e86005612208565b15806118ff57506118f9600561220c565b43018110155b151561190a57600080fd5b61191c6013848463ffffffff6125e616565b7fb04162ce72310207d5c9ceced2e6df3ddd15272642b0e53af3c7e83f0d0dc4918383604051610ef692919061360e565b61195561265b565b151561196057600080fd5b60038190556040517f4f1d324a1cbffc352fb64f1d73d95e4b200d92f99ef39bf2d7f5b41f946909d6906119959083906134d6565b60405180910390a150565b600160a060020a0382166000908152600a602090815260408083208484529091528120610c6c90612208565b6000610f9c6008612208565b6000610f9c6005612208565b6000610f9c6009612208565b6000610f9c600c612208565b611a0461265b565b1515611a0f57600080fd5b80600160a060020a0381161515611a2557600080fd5b600160a060020a038116301415611a3b57600080fd5b611a4782600354612803565b7f7f3a8349917003ed377f6e9ae1608b92edd893903f8983bd274b1f8373dd3b118260035460405161148692919061349f565b611a826121f7565b1515611a8d57600080fd5b81611a986005612208565b1580611aaf5750611aa9600561220c565b43018110155b1515611aba57600080fd5b611acc6011848463ffffffff6125e616565b7f081f0b4c81d1de8d02805cc089a2d5a665837d8c19b438f4558128149df8fcfc8383604051610ef692919061360e565b6000610f9c601161220c565b6000611b1361265b565b1515611b1e57600080fd5b81600160a060020a0381161515611b3457600080fd5b600160a060020a038116301415611b4a57600080fd5b600054600160a060020a038481166101009092041614611bc25760008054600160a060020a0385811661010090810261010060a860020a0319841617909355604051929091041692507f977e5fa58e458501775e0008d275006294c5249e3c08d1d0e3a9f3acad14f6e490610ef69084908690613464565b505050565b6000610f9c601361220c565b611bdb6121f7565b1515611be657600080fd5b6018805460ff191660011790556040517f99d6c8c83d6b3086e44ac9a4cff201904eb96dc84e20289516e1d6d5f387d30c90600090a1565b6000806000611c56604080519081016040528087600160a060020a031681526020018681525087600f6128559092919063ffffffff16565b8054600190910154600160a060020a0390911697909650945050505050565b6000610f9c601561220c565b6000610c6c6009848463ffffffff61243e16565b6000610f9c6007612208565b6000611cab6121f7565b1515611cb657600080fd5b81600160a060020a0381161515611ccc57600080fd5b600160a060020a038116301415611ce257600080fd5b600154600160a060020a03848116911614611bc25760018054600160a060020a03858116600160a060020a0319831617909255604051911692507f9f611b789425d0d5b90b920f1b2852907dd865c80074a30b1629aaa041d1812c90610ef69084908690613464565b60175481565b6040805180820190915260108152608060020a6f6f7065726174696f6e616c5f6d6f646502602082015281565b60045460009060ff166001811115611d9257fe5b60015b14905090565b6000610f9c6006612208565b611daf6121f7565b1515611dba57600080fd5b83611dc56005612208565b1580611ddc5750611dd6600561220c565b43018110155b1515611de757600080fd5b600160a060020a0384166000908152600e602090815260408083208684529091529020611e1b90868463ffffffff6125e616565b7ffed51dfd288a74f4e3f4fd59cad1bb9151c6f8e27c781c703ce6ea532e3deac285858585604051610c219493929190613569565b6000610f9c600561220c565b600080600080611e6c601661286d565b805460018201546002909201549096600160a060020a0390921695509350915050565b6000546101009004600160a060020a031681565b60185460ff1681565b6000610c6f600b8363ffffffff61230b16565b6000610c6f600c8363ffffffff61230b16565b611eda6121f7565b1515611ee557600080fd5b81611ef06005612208565b1580611f075750611f01600561220c565b43018110155b1515611f1257600080fd5b611f24600b848463ffffffff6125e616565b7f3fb8054aedc542a59b81ca6dd84e6ed5a0f62964ea31cb27f2d61d7f36f2a3428383604051610ef692919061360e565b611f5d6121f7565b1515611f6857600080fd5b60178190556040517fece7c57702b5ad94b9848802d1e225954b064cd5538fd55082e3e29c29474e45906119959083906134d6565b60045460009060ff166001811115611fb157fe5b6000611d95565b611fc06121f7565b1515611fcb57600080fd5b85611fd66005612208565b1580611fed5750611fe7600561220c565b43018110155b1515611ff857600080fd5b600160a060020a0386166000908152600a60209081526040808320888452909152902061202e908886868663ffffffff61221816565b7ff3fafbde2ad0fcd494a4d98dbde01b8571066edaa67de40a48d794b0583efd0a878787878787604051612067969594939291906135a7565b60405180910390a150505050505050565b6040805180820190915260108152608060020a6f6f7065726174696f6e616c5f6d6f64650260208201526120ac338261156c565b15156120b757600080fd5b6004805460ff191660011790556040517e4feb6c9c7b4bc8e858a1e16b46315cd121d46eb476f1d2a0b79c1508b89e3290600090a150565b6000610f9c601261220c565b61210361265b565b151561210e57600080fd5b80600160a060020a038116151561212457600080fd5b600160a060020a03811630141561213a57600080fd5b612145826000612803565b7fb619d545cb511bd5f02907a1eac4f4cb8dace7b1846852fb0bf5e553937481c1826040516114869190613456565b61217c6121f7565b151561218757600080fd5b816121926005612208565b15806121a957506121a3600561220c565b43018110155b15156121b457600080fd5b6121c66006848463ffffffff6125e616565b7febf63d40c9708ad4550ba5278373615a245fcf66e7b70faf9e6b8b90396fa2c88383604051610ef692919061360e565b600154600160a060020a0316331490565b5490565b6000610c6f8243612879565b6000808251845114151561222b57600080fd5b612236878787612885565b86548790600019810190811061224857fe5b90600052602060002090600302019150600090505b83518110156122d857816002016040805190810160405280868481518110151561228357fe5b90602001906020020151815260200185848151811015156122a057fe5b60209081029091018101519091528254600181810185556000948552938290208351600290920201908155910151908201550161225d565b50505050505050565b8051600160a060020a03166000908152602092835260408082209284015182529190925290205490565b60006123178383612902565b602001519392505050565b8151600160a060020a031660009081526020858152604080832082860151845290915290205415806123b557508151600160a060020a0390811660009081526020868152604080832082870180518552908352818420875190951684528883528184209051845290915290205481546000199091019081106123a057fe5b90600052602060002090600302016000015483115b15156123c057600080fd5b8151600160a060020a0390811660009081526020958652604080822094870151825293865283812084518086019095529484528386019283528454600180820187559582529086902093516003909102909301928355905180519383018054600160a060020a03191694909216939093179055910151600290910155565b6000612448612e38565b60006124548686612954565b9150816040015151600010156125d557612472826040015185612a12565b905080600010156125d5576125ce735fcf3704016b90ded3c81d75613ceab0a6a2602562a123336040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156124c657600080fd5b505af41580156124da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124fe91908101906130a6565b6125c26125b185604001516001860381518110151561251957fe5b9060200190602002015160200151735fcf3704016b90ded3c81d75613ceab0a6a2602562a123336040518163ffffffff1660e060020a02815260040160206040518083038186803b15801561256d57600080fd5b505af4158015612581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125a591908101906130a6565b9063ffffffff612a6f16565b60208601519063ffffffff612aab16565b9063ffffffff612b1416565b92506125dd565b816020015192505b50509392505050565b82541580612616575082548390600019810190811061260157fe5b90600052602060002090600202016000015482115b151561262157600080fd5b6040805180820190915291825260208083019182528354600181810186556000958652919094209251600290940290920192835551910155565b6000546101009004600160a060020a0316331490565b6000816040516020018082805190602001908083835b602083106126a65780518252601f199092019160209182019101612687565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106127095780518252601f1990920191602091820191016126ea565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b82541580612616575082548390600019810190811061260157fe5b82541580612786575082548390600019810190811061277157fe5b90600052602060002090600402016000015482115b151561279157600080fd5b604080518082019091529182526020808301918252835460018082018655600095865294829020935160049091029093019283559051805193830193909355918201518051600283018054600160a060020a031916600160a060020a0390921691909117905590910151600390910155565b600160a060020a03821660009081526002602052604090205460ff16151561285157600160a060020a0382166000908152600260205260409020805460ff1916600190811782554283019101555b5050565b6000612862848484612b49565b600101949350505050565b6000610c6f8243612b9a565b60006123178383612bb0565b825460009015806128b857508354849060001981019081106128a357fe5b90600052602060002090600302016000015483115b15156128c357600080fd5b83546128d28560018301612e5a565b508354849060001981019081106128e557fe5b600091825260209091206003909102019283555060019091015550565b61290a612e86565b826129158184612bc3565b8154811061291f57fe5b906000526020600020906002020160408051908101604052908160008201548152602001600182015481525050905092915050565b61295c612e38565b826129678184612c1b565b8154811061297157fe5b906000526020600020906003020160606040519081016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015612a035760008481526020908190206040805180820190915260028502909101805482526001908101548284015290835290920191016129c4565b50505091525090949350505050565b60008083516000101515612a2557600080fd5b5082515b6000811115612a65578360018203815181101515612a4357fe5b60209081029091010151518312612a5c578091506115b7565b60001901612a29565b5060009392505050565b6000808212158015612a8357508282840313155b80612a9a5750600082128015612a9a575082828403135b1515612aa557600080fd5b50900390565b60008083600019141580612ac3575060ff60020a8314155b1515612ace57600080fd5b82600019141580612ae3575060ff60020a8414155b1515612aee57600080fd5b50828202821580612b095750838382811515612b0657fe5b05145b1515610cec57600080fd5b600060ff60020a83141580612b2b57508160001914155b1515612b3657600080fd5b8183811515612b4157fe5b059392505050565b8151600160a060020a03166000908152602084815260408083208286015184529091528120612b79858585612c73565b81548110612b8357fe5b906000526020600020906003020190509392505050565b6000612ba68383612d3b565b6001019392505050565b612bb8612e86565b826129158184612d68565b815460009081908110612bd557600080fd5b508254600019015b6000811061034a578354849082908110612bf357fe5b60009182526020909120600290910201548310612c12578091506115b7565b60001901612bdd565b815460009081908110612c2d57600080fd5b508254600019015b6000811061034a578354849082908110612c4b57fe5b60009182526020909120600390910201548310612c6a578091506115b7565b60001901612c35565b8151600160a060020a031660009081526020848152604080832082860151845290915281205481908110612ca657600080fd5b508251600160a060020a0316600090815260208581526040808320828701518452909152902054600019015b6000811061034a578351600160a060020a03166000908152602086815260408083208288015184529091529020805482908110612d0b57fe5b60009182526020909120600390910201548310612d2a57809150612d33565b60001901612cd2565b509392505050565b600082612d488184612dc0565b81548110612d5257fe5b9060005260206000209060040201905092915050565b815460009081908110612d7a57600080fd5b508254600019015b6000811061034a578354849082908110612d9857fe5b60009182526020909120600290910201548310612db7578091506115b7565b60001901612d82565b815460009081908110612dd257600080fd5b508254600019015b6000811061034a578354849082908110612df057fe5b60009182526020909120600490910201548310612e0f578091506115b7565b60001901612dda565b60606040519081016040528060008152602001612e33612e86565b905290565b6060604051908101604052806000815260200160008152602001606081525090565b815481835581811115611bc257600302816003028360005260206000209182019101611bc29190612e9d565b604080518082019091526000808252602082015290565b610f9f91905b80821115612ecd57600080825560018201819055612ec46002830182612ed1565b50600301612ea3565b5090565b5080546000825560020290600052602060002090810190612ef29190612ef5565b50565b610f9f91905b80821115612ecd5760008082556001820155600201612efb565b6000610c6c82356136fc565b6000601f82018313612f3257600080fd5b8135612f45612f40826136ab565b613685565b91508181835260208401935060208101905083856020840282011115612f6a57600080fd5b60005b83811015612f965781612f808882612fa0565b8452506020928301929190910190600101612f6d565b5050505092915050565b6000610c6c8235610f9f565b6000610c6c8251610f9f565b6000601f82018313612fc957600080fd5b8135612fd7612f40826136cb565b91508082526020830160208301858383011115612ff357600080fd5b612ffe838284613724565b50505092915050565b60006020828403121561301957600080fd5b60006115b48484612f15565b6000806040838503121561303857600080fd5b60006130448585612f15565b92505060208301356001604060020a0381111561306057600080fd5b61306c85828601612fb8565b9150509250929050565b6000806040838503121561308957600080fd5b60006130958585612f15565b925050602061306c85828601612fa0565b6000602082840312156130b857600080fd5b60006115b48484612fac565b6000602082840312156130d657600080fd5b60006115b48484612fa0565b6000806000606084860312156130f757600080fd5b60006131038686612fa0565b935050602061311486828701612f15565b925050604061312586828701612fa0565b9150509250925092565b600080600080600060a0868803121561314757600080fd5b60006131538888612fa0565b955050602061316488828901612f15565b945050604061317588828901612fa0565b935050606061318688828901612f15565b925050608061319788828901612fa0565b9150509295509295909350565b600080600080608085870312156131ba57600080fd5b60006131c68787612fa0565b94505060206131d787828801612f15565b93505060406131e887828801612fa0565b92505060606131f987828801612fa0565b91505092959194509250565b60008060008060008060c0878903121561321e57600080fd5b600061322a8989612fa0565b965050602061323b89828a01612f15565b955050604061324c89828a01612fa0565b945050606061325d89828a01612fa0565b93505060808701356001604060020a0381111561327957600080fd5b61328589828a01612f21565b92505060a08701356001604060020a038111156132a157600080fd5b6132ad89828a01612f21565b9150509295509295509295565b600080604083850312156132cd57600080fd5b60006130958585612fa0565b600080600080608085870312156132ef57600080fd5b60006132fb8787612fa0565b945050602061330c87828801612fa0565b93505060406131e887828801612f15565b6000806000806080858703121561333357600080fd5b600061333f8787612fa0565b945050602061335087828801612fa0565b93505060408501356001604060020a0381111561336c57600080fd5b61337887828801612f21565b92505060608501356001604060020a0381111561339457600080fd5b6131f987828801612f21565b6133a9816136fc565b82525050565b60006133ba826136f8565b8084526020840193506133cc836136f2565b60005b828110156133fc576133e2868351613418565b6133eb826136f2565b6020969096019591506001016133cf565b5093949350505050565b6133a981613708565b6133a981613719565b6133a981610f9f565b600061342c826136f8565b808452613440816020860160208601613730565b61344981613760565b9093016020019392505050565b60208101610c6f82846133a0565b6040810161347282856133a0565b610cec60208301846133a0565b6040810161348d82856133a0565b8181036020830152610e6b8184613421565b604081016134ad82856133a0565b610cec6020830184613418565b60208101610c6f8284613406565b60208101610c6f828461340f565b60208101610c6f8284613418565b606081016134f28286613418565b6134ff60208301856133a0565b610e6b6040830184613418565b60208082528101610c6c8184613421565b60a0810161352b8288613418565b61353860208301876133a0565b6135456040830186613418565b61355260608301856133a0565b61355f6080830184613418565b9695505050505050565b608081016135778287613418565b61358460208301866133a0565b6135916040830185613418565b61359e6060830184613418565b95945050505050565b60c081016135b58289613418565b6135c260208301886133a0565b6135cf6040830187613418565b6135dc6060830186613418565b81810360808301526135ee81856133af565b905081810360a083015261360281846133af565b98975050505050505050565b604081016134ad8285613418565b6080810161362a8287613418565b6136376020830186613418565b61359160408301856133a0565b608081016136528287613418565b61365f6020830186613418565b818103604083015261367181856133af565b9050818103606083015261355f81846133af565b6040518181016001604060020a03811182821017156136a357600080fd5b604052919050565b60006001604060020a038211156136c157600080fd5b5060209081020190565b60006001604060020a038211156136e157600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b600060028210612ecd57fe5b6000610c6f8261370d565b82818337506000910152565b60005b8381101561374b578181015183820152602001613733565b8381111561375a576000848401525b50505050565b601f01601f1916905600a265627a7a723058206855dd833d2aa3295799c84f9d3dc43cbda2177ea158acd7bb4816f8b9bd00906c6578706572696d656e74616cf50037
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f05179bac3d1fbef58a2fcd7ad0f769840027cc6
-----Decoded View---------------
Arg [0] : deployer (address): 0xf05179bAc3D1fbEF58A2fcD7AD0F769840027cc6
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f05179bac3d1fbef58a2fcd7ad0f769840027cc6
Swarm Source
bzzr://6855dd833d2aa3295799c84f9d3dc43cbda2177ea158acd7bb4816f8b9bd0090
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.