Merge pull request #4 from GrupoSabra/master

Created AlgoFees contract, tests and playground commands. Added some fixes for AlgoPool and AlgoMiner.
This commit is contained in:
Luis Fernando Molina authored and GitHub committed 2018-12-12 12:21:55 +01:00
commit c6d8236aca
27 files changed
+20647 -3300

No files matched your search

@@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using AdvancedAlgos.AlgoToken.Framework.Ethereum;
using Nethereum.Contracts;
using Nethereum.RPC.Eth.DTOs;
using Nethereum.Web3;
namespace AdvancedAlgos.AlgoToken.AlgoTokenDistribution
{
public class AlgoFees : SmartContract<AlgoFees>
{
private Function _registerMiner;
private Function _unregisterMiner;
private Function _mine;
private Function _addSystem;
private Function _addCoreTeam;
private Function _getMinerCount;
private Function _getMinerByIndex;
public AlgoFees(Web3 web3, IGasPriceProvider gasPriceProvider) : base(web3, gasPriceProvider) { }
public AlgoFees(string contractAddress, Web3 web3, IGasPriceProvider gasPriceProvider) : base(contractAddress, web3, gasPriceProvider) { }
protected override string AbiResourceName => $"SmartContracts.src.bin.{nameof(AlgoFees)}.abi";
protected override string BinResourceName => $"SmartContracts.src.bin.{nameof(AlgoFees)}.bin";
protected override BigInteger DeploymentGasUnits => 1200000;
public Task<TransactionReceipt> DeployAsync(string tokenAddress)
=> base.DeployAsync(tokenAddress);
protected override void Initialize(Contract contractDescriptor)
{
_registerMiner = contractDescriptor.GetFunction("registerMiner");
_unregisterMiner = contractDescriptor.GetFunction("unregisterMiner");
_mine = contractDescriptor.GetFunction("mine");
_addSystem = contractDescriptor.GetFunction("addSystem");
_addCoreTeam = contractDescriptor.GetFunction("addCoreTeam");
_getMinerCount = contractDescriptor.GetFunction("getMinerCount");
_getMinerByIndex = contractDescriptor.GetFunction("getMinerByIndex");
}
public Task<TransactionReceipt> RegisterMinerAsync(string minerAddress) =>
InvokeAsync(_registerMiner, 900000, minerAddress);
public Task<TransactionReceipt> UnregisterMinerAsync(string minerAddress) =>
InvokeAsync(_unregisterMiner, 900000, minerAddress);
public Task<TransactionReceipt> MineAsync() =>
InvokeAsync(_mine, 1500000);
public Task<TransactionReceipt> AddSystemAsync(string account) =>
InvokeAsync(_addSystem, 900000, account);
public Task<TransactionReceipt> AddCoreTeamAsync(string account) =>
InvokeAsync(_addCoreTeam, 900000, account);
public Task<BigInteger> GetMinerCountAsync() =>
_getMinerCount.CallAsync<BigInteger>();
public Task<string> GetMinerByIndexAsync(BigInteger index) =>
_getMinerByIndex.CallAsync<string>(index);
}
}
@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace AdvancedAlgos.AlgoToken.AlgoTokenDistribution.Algorithms
{
public static class FeesDistributionAlgorithm
{
private static decimal[] _categoryProportions = new decimal[]
{
1,
10,
20,
30,
40,
50
};
public static decimal[] Distribute(decimal totalAmount, long[] miners)
{
decimal totalProportion = 0;
for (int i = 0; i < 6; i++)
{
totalProportion += _categoryProportions[i] * miners[i];
}
var allocationPercentage = new decimal[6];
for (int i = 0; i < 6; i++)
{
if (miners[i] > 0) allocationPercentage[i] = _categoryProportions[i] / totalProportion;
}
var feePerMiner = new decimal[6];
for (int i = 0; i < 6; i++)
{
if (miners[i] > 0) feePerMiner[i] = Math.Round(totalAmount * allocationPercentage[i]);
}
return feePerMiner;
}
}
}
@@ -0,0 +1,138 @@
pragma solidity 0.4.24;
import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol";
import "./IAlgoMiner.sol";
import "./AlgoSystemRole.sol";
import "./AlgoCoreTeamRole.sol";
contract AlgoFees is AlgoSystemRole, AlgoCoreTeamRole {
using SafeERC20 for IERC20;
uint256 constant CAT_0_VALUE_PROPORTION = 1;
uint256 constant CAT_1_VALUE_PROPORTION = 10;
uint256 constant CAT_2_VALUE_PROPORTION = 20;
uint256 constant CAT_3_VALUE_PROPORTION = 30;
uint256 constant CAT_4_VALUE_PROPORTION = 40;
uint256 constant CAT_5_VALUE_PROPORTION = 50;
IERC20 private _token;
address[] private _miners;
mapping(address => uint256) private _minersByAddress;
constructor(address tokenAddress)
AlgoSystemRole()
AlgoCoreTeamRole()
public {
_token = IERC20(tokenAddress);
_miners.push(address(0)); // Reserved as a marker for unregistered miner.
}
function registerMiner(address minerAddress) public onlyCoreTeam {
require(_minersByAddress[minerAddress] == 0);
IAlgoMiner algoMiner = IAlgoMiner(minerAddress);
require(algoMiner.isAlgoMiner());
uint8 minerCategory = algoMiner.getCategory();
require(minerCategory >= 0 && minerCategory <= 5);
_minersByAddress[minerAddress] = _miners.length;
_miners.push(minerAddress);
}
function unregisterMiner(address minerAddress) public onlyCoreTeam {
require(_miners.length > 1);
if(_miners.length == 2) {
// Just remove the only registered miner...
delete _miners[1];
_miners.length = 1;
delete _minersByAddress[minerAddress];
} else {
if(_minersByAddress[minerAddress] != _miners.length) {
// Move the latest miner to the gap...
_miners[_minersByAddress[minerAddress]] = _miners[_miners.length - 1];
}
delete _miners[_miners.length - 1];
_miners.length--;
delete _minersByAddress[minerAddress];
}
}
function mine() public onlySystem {
require(_miners.length > 1);
uint256 currentFeesBalance = _token.balanceOf(address(this));
require(currentFeesBalance > 0);
// Count how many ENABLED miners we have for each category...
uint256[6] memory miners;
for(uint256 i = 1; i < _miners.length; i++) {
IAlgoMiner algoMiner = IAlgoMiner(_miners[i]);
if(!algoMiner.isMining()) continue;
uint8 minerCategory = algoMiner.getCategory();
if(minerCategory == 0) {
miners[0]++;
} else if(minerCategory == 1) {
miners[1]++;
} else if(minerCategory == 2) {
miners[2]++;
} else if(minerCategory == 3) {
miners[3]++;
} else if(minerCategory == 4) {
miners[4]++;
} else if(minerCategory == 5) {
miners[5]++;
}
}
// Calculate the fee to pay per miner according to its category...
uint256 totalProportion = CAT_0_VALUE_PROPORTION * miners[0] +
CAT_1_VALUE_PROPORTION * miners[1] +
CAT_2_VALUE_PROPORTION * miners[2] +
CAT_3_VALUE_PROPORTION * miners[3] +
CAT_4_VALUE_PROPORTION * miners[4] +
CAT_5_VALUE_PROPORTION * miners[5];
uint256[6] memory feePerMiner;
feePerMiner[0] = currentFeesBalance * CAT_0_VALUE_PROPORTION / totalProportion;
feePerMiner[1] = currentFeesBalance * CAT_1_VALUE_PROPORTION / totalProportion;
feePerMiner[2] = currentFeesBalance * CAT_2_VALUE_PROPORTION / totalProportion;
feePerMiner[3] = currentFeesBalance * CAT_3_VALUE_PROPORTION / totalProportion;
feePerMiner[4] = currentFeesBalance * CAT_4_VALUE_PROPORTION / totalProportion;
feePerMiner[5] = currentFeesBalance * CAT_5_VALUE_PROPORTION / totalProportion;
// Transfer the fees to ENABLED miners...
for(i = 1; i < _miners.length; i++) {
algoMiner = IAlgoMiner(_miners[i]);
if(!algoMiner.isMining()) continue;
minerCategory = algoMiner.getCategory();
_token.safeTransfer(algoMiner.getMiner(), feePerMiner[minerCategory]);
}
}
function getMinerCount() public view returns (uint256) {
return _miners.length - 1;
}
function getMinerByIndex(uint256 index) public view returns (address) {
return _miners[index + 1];
}
}
@@ -136,6 +136,8 @@ contract AlgoMiner is AlgoSystemRole, AlgoCoreTeamRole, AlgoSupervisorRole, IAlg
uint256 tokens = _currentYearSupply / DAYS_PER_YEAR;
require(tokens > 0);
_token.safeTransfer(_miner, tokens);
}
@@ -146,4 +148,12 @@ contract AlgoMiner is AlgoSystemRole, AlgoCoreTeamRole, AlgoSupervisorRole, IAlg
function getCategory() public view returns (uint8) {
return _category;
}
function isMining() public view returns (bool) {
return _state == MinerState.Activated && _mining;
}
function getMiner() public view returns (address) {
return _miner;
}
}
@@ -19,6 +19,7 @@ contract AlgoPool is AlgoCoreTeamRole {
uint16 private _poolType;
IERC20 private _token;
mapping(address => bool) _fundedMiners;
constructor(uint16 poolType, address tokenAddress)
AlgoCoreTeamRole()
@@ -28,6 +29,8 @@ contract AlgoPool is AlgoCoreTeamRole {
}
function trasferToMiner(address minerAddress) public onlyCoreTeam {
require(!_fundedMiners[minerAddress]);
IAlgoMiner algoMiner = IAlgoMiner(minerAddress);
require(algoMiner.isAlgoMiner());
@@ -54,6 +57,7 @@ contract AlgoPool is AlgoCoreTeamRole {
require(value > 0);
_fundedMiners[minerAddress] = true;
_token.safeTransfer(minerAddress, value);
}
}
@@ -3,4 +3,6 @@ pragma solidity 0.4.24;
contract IAlgoMiner {
function isAlgoMiner() public pure returns (bool);
function getCategory() public view returns (uint8);
function isMining() public view returns (bool);
function getMiner() public view returns (address);
}
@@ -0,0 +1 @@
[{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addCoreTeam","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"minerAddress","type":"address"}],"name":"registerMiner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isSystem","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getMinerByIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isCoreTeam","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addSystem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"minerAddress","type":"address"}],"name":"unregisterMiner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"mine","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getMinerCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceCoreTeam","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceSystem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"tokenAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
@@ -0,0 +1 @@
608060405234801561001057600080fd5b50604051602080610edc8339810160405251610034336401000000006100a2810204565b610046336401000000006100bd810204565b60028054600160a060020a03909216600160a060020a0319928316179055600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180549091169055610163565b6100ba600082640100000000610c436100d582021704565b50565b6100ba600182640100000000610c436100d582021704565b600160a060020a03811615156100ea57600080fd5b6100fd828264010000000061012c810204565b1561010757600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a038216151561014357600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b610d6a806101726000396000f3006080604052600436106100955763ffffffff60e060020a6000350416632e6b6849811461009a578063341ccfcb146100bd57806334cdcf26146100de5780633d19ab1314610113578063608d3d3d1461014757806374be75921461016857806381f909f31461018957806399f4b251146101aa578063bb52c137146101bf578063d43acc79146101e6578063e9d61859146101fb575b600080fd5b3480156100a657600080fd5b506100bb600160a060020a0360043516610210565b005b3480156100c957600080fd5b506100bb600160a060020a0360043516610230565b3480156100ea57600080fd5b506100ff600160a060020a03600435166103e1565b604080519115158252519081900360200190f35b34801561011f57600080fd5b5061012b6004356103f9565b60408051600160a060020a039092168252519081900360200190f35b34801561015357600080fd5b506100ff600160a060020a0360043516610428565b34801561017457600080fd5b506100bb600160a060020a036004351661043b565b34801561019557600080fd5b506100bb600160a060020a0360043516610458565b3480156101b657600080fd5b506100bb6105e7565b3480156101cb57600080fd5b506101d4610b0a565b60408051918252519081900360200190f35b3480156101f257600080fd5b506100bb610b15565b34801561020757600080fd5b506100bb610b20565b61021933610428565b151561022457600080fd5b61022d81610b29565b50565b60008061023c33610428565b151561024757600080fd5b600160a060020a0383166000908152600460205260409020541561026a57600080fd5b82915081600160a060020a0316631777fb4b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156102ab57600080fd5b505af11580156102bf573d6000803e3d6000fd5b505050506040513d60208110156102d557600080fd5b505115156102e257600080fd5b81600160a060020a03166380258e476040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561032057600080fd5b505af1158015610334573d6000803e3d6000fd5b505050506040513d602081101561034a57600080fd5b50519050600060ff821610801590610366575060058160ff1611155b151561037157600080fd5b505060038054600160a060020a039092166000818152600460205260408120849055600184018355919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b909101805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b60006103f3818363ffffffff610b3a16565b92915050565b600060038260010181548110151561040d57fe5b600091825260209091200154600160a060020a031692915050565b60006103f360018363ffffffff610b3a16565b610444336103e1565b151561044f57600080fd5b61022d81610b71565b61046133610428565b151561046c57600080fd5b60035460011061047b57600080fd5b600354600214156104e75760038054600190811061049557fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916905560016104c8600382610cdd565b50600160a060020a03811660009081526004602052604081205561022d565b600354600160a060020a038216600090815260046020526040902054146105815760038054600019810190811061051a57fe5b6000918252602080832090910154600160a060020a038481168452600490925260409092205460038054929093169291811061055257fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a031602179055505b60038054600019810190811061059357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916905560038054906105cc906000198301610cdd565b50600160a060020a0316600090815260046020526040812055565b60006105f1610d01565b6000806000806105ff610d01565b610608336103e1565b151561061357600080fd5b60035460011061062257600080fd5b600254604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561068857600080fd5b505af115801561069c573d6000803e3d6000fd5b505050506040513d60208110156106b257600080fd5b50519650600087116106c357600080fd5b600194505b6003548510156108725760038054869081106106e057fe5b9060005260206000200160009054906101000a9004600160a060020a0316935083600160a060020a03166319a74ab36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b505050506040513d602081101561076857600080fd5b5051151561077557610867565b83600160a060020a03166380258e476040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156107b357600080fd5b505af11580156107c7573d6000803e3d6000fd5b505050506040513d60208110156107dd57600080fd5b5051925060ff831615156107ff578560005b6020020180516001019052610867565b8260ff1660011415610813578560016107ef565b8260ff1660021415610827578560026107ef565b8260ff166003141561083b578560036107ef565b8260ff166004141561084f578560046107ef565b826Line truncated
@@ -0,0 +1,203 @@
{
"abi": [
{
"constant": false,
"inputs": [
{
"name": "account",
"type": "address"
}
],
"name": "addCoreTeam",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "minerAddress",
"type": "address"
}
],
"name": "registerMiner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "account",
"type": "address"
}
],
"name": "isSystem",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "index",
"type": "uint256"
}
],
"name": "getMinerByIndex",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "account",
"type": "address"
}
],
"name": "isCoreTeam",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "account",
"type": "address"
}
],
"name": "addSystem",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "minerAddress",
"type": "address"
}
],
"name": "unregisterMiner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "mine",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getMinerCount",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceCoreTeam",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceSystem",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "tokenAddress",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
}
],
"bytecode": "608060405234801561001057600080fd5b50604051602080610edc8339810160405251610034336401000000006100a2810204565b610046336401000000006100bd810204565b60028054600160a060020a03909216600160a060020a0319928316179055600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180549091169055610163565b6100ba600082640100000000610c436100d582021704565b50565b6100ba600182640100000000610c436100d582021704565b600160a060020a03811615156100ea57600080fd5b6100fd828264010000000061012c810204565b1561010757600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a038216151561014357600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b610d6a806101726000396000f3006080604052600436106100955763ffffffff60e060020a6000350416632e6b6849811461009a578063341ccfcb146100bd57806334cdcf26146100de5780633d19ab1314610113578063608d3d3d1461014757806374be75921461016857806381f909f31461018957806399f4b251146101aa578063bb52c137146101bf578063d43acc79146101e6578063e9d61859146101fb575b600080fd5b3480156100a657600080fd5b506100bb600160a060020a0360043516610210565b005b3480156100c957600080fd5b506100bb600160a060020a0360043516610230565b3480156100ea57600080fd5b506100ff600160a060020a03600435166103e1565b604080519115158252519081900360200190f35b34801561011f57600080fd5b5061012b6004356103f9565b60408051600160a060020a039092168252519081900360200190f35b34801561015357600080fd5b506100ff600160a060020a0360043516610428565b34801561017457600080fd5b506100bb600160a060020a036004351661043b565b34801561019557600080fd5b506100bb600160a060020a0360043516610458565b3480156101b657600080fd5b506100bb6105e7565b3480156101cb57600080fd5b506101d4610b0a565b60408051918252519081900360200190f35b3480156101f257600080fd5b506100bb610b15565b34801561020757600080fd5b506100bb610b20565b61021933610428565b151561022457600080fd5b61022d81610b29565b50565b60008061023c33610428565b151561024757600080fd5b600160a060020a0383166000908152600460205260409020541561026a57600080fd5b82915081600160a060020a0316631777fb4b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156102ab57600080fd5b505af11580156102bf573d6000803e3d6000fd5b505050506040513d60208110156102d557600080fd5b505115156102e257600080fd5b81600160a060020a03166380258e476040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561032057600080fd5b505af1158015610334573d6000803e3d6000fd5b505050506040513d602081101561034a57600080fd5b50519050600060ff821610801590610366575060058160ff1611155b151561037157600080fd5b505060038054600160a060020a039092166000818152600460205260408120849055600184018355919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b909101805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b60006103f3818363ffffffff610b3a16565b92915050565b600060038260010181548110151561040d57fe5b600091825260209091200154600160a060020a031692915050565b60006103f360018363ffffffff610b3a16565b610444336103e1565b151561044f57600080fd5b61022d81610b71565b61046133610428565b151561046c57600080fd5b60035460011061047b57600080fd5b600354600214156104e75760038054600190811061049557fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916905560016104c8600382610cdd565b50600160a060020a03811660009081526004602052604081205561022d565b600354600160a060020a038216600090815260046020526040902054146105815760038054600019810190811061051a57fe5b6000918252602080832090910154600160a060020a038481168452600490925260409092205460038054929093169291811061055257fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a031602179055505b60038054600019810190811061059357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916905560038054906105cc906000198301610cdd565b50600160a060020a0316600090815260046020526040812055565b60006105f1610d01565b6000806000806105ff610d01565b610608336103e1565b151561061357600080fd5b60035460011061062257600080fd5b600254604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561068857600080fd5b505af115801561069c573d6000803e3d6000fd5b505050506040513d60208110156106b257600080fd5b50519650600087116106c357600080fd5b600194505b6003548510156108725760038054869081106106e057fe5b9060005260206000200160009054906101000a9004600160a060020a0316935083600160a060020a03166319a74ab36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b505050506040513d602081101561076857600080fd5b5051151561077557610867565b83600160a060020a03166380258e476040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156107b357600080fd5b505af11580156107c7573d6000803e3d6000fd5b505050506040513d60208110156107dd57600080fd5b5051925060ff831615156107ff578560005b6020020180516001019052610867565b8260ff1660011415610813578560016107ef565b8260ff1660021415610827578560026107ef565b8260ff166003141561083b578560036107ef565b8260ff166004141561084f5785Line truncated
"functionHashes": {
"addCoreTeam(address)": "2e6b6849",
"addSystem(address)": "74be7592",
"getMinerByIndex(uint256)": "3d19ab13",
"getMinerCount()": "bb52c137",
"isCoreTeam(address)": "608d3d3d",
"isSystem(address)": "34cdcf26",
"mine()": "99f4b251",
"registerMiner(address)": "341ccfcb",
"renounceCoreTeam()": "d43acc79",
"renounceSystem()": "e9d61859",
"unregisterMiner(address)": "81f909f3"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "686800",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"addCoreTeam(address)": "infinite",
"addSystem(address)": "infinite",
"getMinerByIndex(uint256)": "980",
"getMinerCount()": "633",
"isCoreTeam(address)": "infinite",
"isSystem(address)": "infinite",
"mine()": "infinite",
"registerMiner(address)": "infinite",
"renounceCoreTeam()": "infinite",
"renounceSystem()": "infinite",
"unregisterMiner(address)": "infinite"
}
}
}
@@ -1 +1 @@
[{"constant":false,"inputs":[],"name":"pauseMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isAlgoMiner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"startMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newMinerAddress","type":"address"}],"name":"migrateMiner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addSupervisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addCoreTeam","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isSystem","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"stopAndRemoveOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"resumeMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isCoreTeam","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addSystem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCategory","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isSupervisor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"mine","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"deactivateMiner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwnerAddress","type":"address"}],"name":"resetMiner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"activateMiner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceSupervisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"DAYS_PER_YEAR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceCoreTeam","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"stopMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceSystem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"minerType","type":"uint16"},{"name":"category","type":"uint8"},{"name":"ownerAddress","type":"address"},{"name":"tokenAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
[{"constant":false,"inputs":[],"name":"pauseMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isAlgoMiner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"isMining","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"startMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newMinerAddress","type":"address"}],"name":"migrateMiner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addSupervisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addCoreTeam","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getMiner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isSystem","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"stopAndRemoveOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"resumeMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isCoreTeam","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addSystem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCategory","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isSupervisor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"mine","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"deactivateMiner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwnerAddress","type":"address"}],"name":"resetMiner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"activateMiner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceSupervisor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"DAYS_PER_YEAR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceCoreTeam","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"stopMining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceSystem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"minerType","type":"uint16"},{"name":"category","type":"uint8"},{"name":"ownerAddress","type":"address"},{"name":"tokenAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
@@ -1 +1 @@
60806040523480156200001157600080fd5b5060405160808062000fb883398101604090815281516020830151918301516060909301519092906200004d33640100000000620000de810204565b6200006133640100000000620000fc810204565b620000753364010000000062000117810204565b6003805461ffff191661ffff959095169490941762ff000019166201000060ff949094169390930292909217630100000060b860020a0319166301000000600160a060020a03928316021790925560048054600160a060020a03191691909216179055620001c5565b620000f960008264010000000062000d1d6200013282021704565b50565b620000f960018264010000000062000d1d6200013282021704565b620000f960028264010000000062000d1d6200013282021704565b600160a060020a03811615156200014857600080fd5b6200015d82826401000000006200018d810204565b156200016857600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a0382161515620001a557600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b610de380620001d56000396000f3006080604052600436106101275763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663162f986d811461012c5780631777fb4b1461014357806321b79d981461016c578063231d4e2a1461018157806329d10b6e146101a25780632e6b6849146101c357806334cdcf26146101e4578063363aa6c714610205578063427534a41461021a578063608d3d3d1461022f57806374be75921461025057806380258e471461027157806381a244591461029c57806399f4b251146102bd5780639e614ca0146102d2578063ada436e9146102e7578063b2a32cd514610308578063be9524941461031d578063c6846ef814610332578063d43acc7914610359578063da4086791461036e578063e9d6185914610383575b600080fd5b34801561013857600080fd5b50610141610398565b005b34801561014f57600080fd5b506101586103fe565b604080519115158252519081900360200190f35b34801561017857600080fd5b50610141610403565b34801561018d57600080fd5b50610141600160a060020a03600435166104a7565b3480156101ae57600080fd5b50610141600160a060020a0360043516610593565b3480156101cf57600080fd5b50610141600160a060020a03600435166105b0565b3480156101f057600080fd5b50610158600160a060020a03600435166105cd565b34801561021157600080fd5b506101416105e5565b34801561022657600080fd5b5061014161068e565b34801561023b57600080fd5b50610158600160a060020a03600435166106f1565b34801561025c57600080fd5b50610141600160a060020a0360043516610704565b34801561027d57600080fd5b50610286610721565b6040805160ff9092168252519081900360200190f35b3480156102a857600080fd5b50610158600160a060020a0360043516610730565b3480156102c957600080fd5b50610141610743565b3480156102de57600080fd5b50610141610915565b3480156102f357600080fd5b50610141600160a060020a036004351661096f565b34801561031457600080fd5b50610141610a05565b34801561032957600080fd5b50610141610b18565b34801561033e57600080fd5b50610347610b23565b60408051918252519081900360200190f35b34801561036557600080fd5b50610141610b29565b34801561037a57600080fd5b50610141610b32565b34801561038f57600080fd5b50610141610bbf565b6103a133610730565b15156103ac57600080fd5b600160045460a060020a900460ff1660038111156103c657fe5b146103d057600080fd5b600480546002919074ff0000000000000000000000000000000000000000191660a060020a835b0217905550565b600190565b60035463010000009004600160a060020a0316331461042157600080fd5b600160045460a060020a900460ff16600381111561043b57fe5b1461044557600080fd5b6004547501000000000000000000000000000000000000000000900460ff161561046e57600080fd5b6004805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055565b6104b0336106f1565b15156104bb57600080fd5b600060045460a060020a900460ff1660038111156104d557fe5b146104df57600080fd5b60048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152309381019390935251610590928492600160a060020a0316916370a08231916024808201926020929091908290030181600087803b15801561054b57600080fd5b505af115801561055f573d6000803e3d6000fd5b505050506040513d602081101561057557600080fd5b5051600454600160a060020a0316919063ffffffff610bc816565b50565b61059c33610730565b15156105a757600080fd5b61059081610c80565b6105b9336106f1565b15156105c457600080fd5b61059081610c91565b60006105df818363ffffffff610ca216565b92915050565b6105ee33610730565b15156105f957600080fd5b600360045460a060020a900460ff16600381111561061357fe5b141561061e57600080fd5b6004805474ff00000000000000000000000000000000000000001916740300000000000000000000000000000000000000001775ff000000000000000000000000000000000000000000191690556003805476ffffffffffffffffffffffffffffffffffffffff00000019169055565b61069733610730565b15156106a257600080fd5b600260045460a060020a900460ff1660038111156106bc57fe5b146106c657600080fd5b600480546001919074ff0000000000000000000000000000000000000000191660a060020a836103f7565b60006105df60018363ffffffff610ca216565b61070d336105cd565b151561071857600080fd5b61059081610cd9565b60035462010000900460ff1690565b60006105df60028363ffffffff610ca216565b600061074e336105cd565b151561075957600080fd5b600160045460a060020a900460ff16600381111561077357fe5b1461077d57600080fd5b6004547501000000000000000000000000000000000000000000900460ff1615156107a757600080fd5b60045460b860020a900461ffff16151561081d576004805478ffff00000000000000000000000000000000000000000000001976ff00000000000000000000000000000000000Line truncated
60806040523480156200001157600080fd5b506040516080806200104f83398101604090815281516020830151918301516060909301519092906200004d3364010000000062000103810204565b620000613364010000000062000121810204565b62000075336401000000006200013c810204565b60008360ff16101580156200008e575060058360ff1611155b15156200009a57600080fd5b6003805461ffff191661ffff959095169490941762ff000019166201000060ff949094169390930292909217630100000060b860020a0319166301000000600160a060020a03928316021790925560048054600160a060020a03191691909216179055620001ea565b6200011e60008264010000000062000d8f6200015782021704565b50565b6200011e60018264010000000062000d8f6200015782021704565b6200011e60028264010000000062000d8f6200015782021704565b600160a060020a03811615156200016d57600080fd5b620001828282640100000000620001b2810204565b156200018d57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a0382161515620001ca57600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b610e5580620001fa6000396000f30060806040526004361061013d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663162f986d81146101425780631777fb4b1461015957806319a74ab31461018257806321b79d9814610197578063231d4e2a146101ac57806329d10b6e146101cd5780632e6b6849146101ee578063302c11ca1461020f57806334cdcf2614610240578063363aa6c714610261578063427534a414610276578063608d3d3d1461028b57806374be7592146102ac57806380258e47146102cd57806381a24459146102f857806399f4b251146103195780639e614ca01461032e578063ada436e914610343578063b2a32cd514610364578063be95249414610379578063c6846ef81461038e578063d43acc79146103b5578063da408679146103ca578063e9d61859146103df575b600080fd5b34801561014e57600080fd5b506101576103f4565b005b34801561016557600080fd5b5061016e61045a565b604080519115158252519081900360200190f35b34801561018e57600080fd5b5061016e61045f565b3480156101a357600080fd5b50610157610496565b3480156101b857600080fd5b50610157600160a060020a0360043516610516565b3480156101d957600080fd5b50610157600160a060020a0360043516610602565b3480156101fa57600080fd5b50610157600160a060020a036004351661061f565b34801561021b57600080fd5b5061022461063c565b60408051600160a060020a039092168252519081900360200190f35b34801561024c57600080fd5b5061016e600160a060020a0360043516610652565b34801561026d57600080fd5b5061015761066a565b34801561028257600080fd5b50610157610713565b34801561029757600080fd5b5061016e600160a060020a0360043516610776565b3480156102b857600080fd5b50610157600160a060020a0360043516610789565b3480156102d957600080fd5b506102e26107a6565b6040805160ff9092168252519081900360200190f35b34801561030457600080fd5b5061016e600160a060020a03600435166107b5565b34801561032557600080fd5b506101576107c8565b34801561033a57600080fd5b50610157610999565b34801561034f57600080fd5b50610157600160a060020a03600435166109f3565b34801561037057600080fd5b50610157610a89565b34801561038557600080fd5b50610157610b9c565b34801561039a57600080fd5b506103a3610ba7565b60408051918252519081900360200190f35b3480156103c157600080fd5b50610157610bad565b3480156103d657600080fd5b50610157610bb6565b3480156103eb57600080fd5b50610157610c31565b6103fd336107b5565b151561040857600080fd5b600160045460a060020a900460ff16600381111561042257fe5b1461042c57600080fd5b600480546002919074ff0000000000000000000000000000000000000000191660a060020a835b0217905550565b600190565b6000600160045460a060020a900460ff16600381111561047b57fe5b148015610491575060045460a860020a900460ff165b905090565b60035463010000009004600160a060020a031633146104b457600080fd5b600160045460a060020a900460ff1660038111156104ce57fe5b146104d857600080fd5b60045460a860020a900460ff16156104ef57600080fd5b6004805475ff000000000000000000000000000000000000000000191660a860020a179055565b61051f33610776565b151561052a57600080fd5b600060045460a060020a900460ff16600381111561054457fe5b1461054e57600080fd5b60048054604080517f70a082310000000000000000000000000000000000000000000000000000000081523093810193909352516105ff928492600160a060020a0316916370a08231916024808201926020929091908290030181600087803b1580156105ba57600080fd5b505af11580156105ce573d6000803e3d6000fd5b505050506040513d60208110156105e457600080fd5b5051600454600160a060020a0316919063ffffffff610c3a16565b50565b61060b336107b5565b151561061657600080fd5b6105ff81610cf2565b61062833610776565b151561063357600080fd5b6105ff81610d03565b60035463010000009004600160a060020a031690565b6000610664818363ffffffff610d1416565b92915050565b610673336107b5565b151561067e57600080fd5b600360045460a060020a900460ff16600381111561069857fe5b14156106a357600080fd5b6004805474ff00000000000000000000000000000000000000001916740300000000000000000000000000000000000000001775ff000000000000000000000000000000000000000000191690556003805476ffffffffffffffffffffffffffffffffffffffff00000019169055565b61071c336107b5565b151561072757600080fd5b600260045460a060020a900460ff16600381111561074157fe5b1461074b57600080fd5b600480546001919074ff0000000000000000000000000000000000000000191660a060020a83610453565b600061066460018363ffffffff610d1416565b61079233610652565b151561079d57600080fd5b6105ff81610d4b565b60035462010000900460ff1690565b600061066460028363ffffffff610d1416565b6Line truncated
@@ -23,6 +23,20 @@
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "isMining",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
@@ -74,6 +88,20 @@
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getMiner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
@@ -292,7 +320,7 @@
"type": "constructor"
}
],
"bytecode": "60806040523480156200001157600080fd5b5060405160808062000fb883398101604090815281516020830151918301516060909301519092906200004d33640100000000620000de810204565b6200006133640100000000620000fc810204565b620000753364010000000062000117810204565b6003805461ffff191661ffff959095169490941762ff000019166201000060ff949094169390930292909217630100000060b860020a0319166301000000600160a060020a03928316021790925560048054600160a060020a03191691909216179055620001c5565b620000f960008264010000000062000d1d6200013282021704565b50565b620000f960018264010000000062000d1d6200013282021704565b620000f960028264010000000062000d1d6200013282021704565b600160a060020a03811615156200014857600080fd5b6200015d82826401000000006200018d810204565b156200016857600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a0382161515620001a557600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b610de380620001d56000396000f3006080604052600436106101275763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663162f986d811461012c5780631777fb4b1461014357806321b79d981461016c578063231d4e2a1461018157806329d10b6e146101a25780632e6b6849146101c357806334cdcf26146101e4578063363aa6c714610205578063427534a41461021a578063608d3d3d1461022f57806374be75921461025057806380258e471461027157806381a244591461029c57806399f4b251146102bd5780639e614ca0146102d2578063ada436e9146102e7578063b2a32cd514610308578063be9524941461031d578063c6846ef814610332578063d43acc7914610359578063da4086791461036e578063e9d6185914610383575b600080fd5b34801561013857600080fd5b50610141610398565b005b34801561014f57600080fd5b506101586103fe565b604080519115158252519081900360200190f35b34801561017857600080fd5b50610141610403565b34801561018d57600080fd5b50610141600160a060020a03600435166104a7565b3480156101ae57600080fd5b50610141600160a060020a0360043516610593565b3480156101cf57600080fd5b50610141600160a060020a03600435166105b0565b3480156101f057600080fd5b50610158600160a060020a03600435166105cd565b34801561021157600080fd5b506101416105e5565b34801561022657600080fd5b5061014161068e565b34801561023b57600080fd5b50610158600160a060020a03600435166106f1565b34801561025c57600080fd5b50610141600160a060020a0360043516610704565b34801561027d57600080fd5b50610286610721565b6040805160ff9092168252519081900360200190f35b3480156102a857600080fd5b50610158600160a060020a0360043516610730565b3480156102c957600080fd5b50610141610743565b3480156102de57600080fd5b50610141610915565b3480156102f357600080fd5b50610141600160a060020a036004351661096f565b34801561031457600080fd5b50610141610a05565b34801561032957600080fd5b50610141610b18565b34801561033e57600080fd5b50610347610b23565b60408051918252519081900360200190f35b34801561036557600080fd5b50610141610b29565b34801561037a57600080fd5b50610141610b32565b34801561038f57600080fd5b50610141610bbf565b6103a133610730565b15156103ac57600080fd5b600160045460a060020a900460ff1660038111156103c657fe5b146103d057600080fd5b600480546002919074ff0000000000000000000000000000000000000000191660a060020a835b0217905550565b600190565b60035463010000009004600160a060020a0316331461042157600080fd5b600160045460a060020a900460ff16600381111561043b57fe5b1461044557600080fd5b6004547501000000000000000000000000000000000000000000900460ff161561046e57600080fd5b6004805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055565b6104b0336106f1565b15156104bb57600080fd5b600060045460a060020a900460ff1660038111156104d557fe5b146104df57600080fd5b60048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152309381019390935251610590928492600160a060020a0316916370a08231916024808201926020929091908290030181600087803b15801561054b57600080fd5b505af115801561055f573d6000803e3d6000fd5b505050506040513d602081101561057557600080fd5b5051600454600160a060020a0316919063ffffffff610bc816565b50565b61059c33610730565b15156105a757600080fd5b61059081610c80565b6105b9336106f1565b15156105c457600080fd5b61059081610c91565b60006105df818363ffffffff610ca216565b92915050565b6105ee33610730565b15156105f957600080fd5b600360045460a060020a900460ff16600381111561061357fe5b141561061e57600080fd5b6004805474ff00000000000000000000000000000000000000001916740300000000000000000000000000000000000000001775ff000000000000000000000000000000000000000000191690556003805476ffffffffffffffffffffffffffffffffffffffff00000019169055565b61069733610730565b15156106a257600080fd5b600260045460a060020a900460ff1660038111156106bc57fe5b146106c657600080fd5b600480546001919074ff0000000000000000000000000000000000000000191660a060020a836103f7565b60006105df60018363ffffffff610ca216565b61070d336105cd565b151561071857600080fd5b61059081610cd9565b60035462010000900460ff1690565b60006105df60028363ffffffff610ca216565b600061074e336105cd565b151561075957600080fd5b600160045460a060020a900460ff16600381111561077357fe5b1461077d57600080fd5b6004547501000000000000000000000000000000000000000000900460ff1615156107a757600080fd5b60045460b860020a900461ffff16151561081d576004805478ffff00000000000000000000000000000000000000000000001976ff000000000000000000Line truncated
"bytecode": "60806040523480156200001157600080fd5b506040516080806200104f83398101604090815281516020830151918301516060909301519092906200004d3364010000000062000103810204565b620000613364010000000062000121810204565b62000075336401000000006200013c810204565b60008360ff16101580156200008e575060058360ff1611155b15156200009a57600080fd5b6003805461ffff191661ffff959095169490941762ff000019166201000060ff949094169390930292909217630100000060b860020a0319166301000000600160a060020a03928316021790925560048054600160a060020a03191691909216179055620001ea565b6200011e60008264010000000062000d8f6200015782021704565b50565b6200011e60018264010000000062000d8f6200015782021704565b6200011e60028264010000000062000d8f6200015782021704565b600160a060020a03811615156200016d57600080fd5b620001828282640100000000620001b2810204565b156200018d57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a0382161515620001ca57600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b610e5580620001fa6000396000f30060806040526004361061013d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663162f986d81146101425780631777fb4b1461015957806319a74ab31461018257806321b79d9814610197578063231d4e2a146101ac57806329d10b6e146101cd5780632e6b6849146101ee578063302c11ca1461020f57806334cdcf2614610240578063363aa6c714610261578063427534a414610276578063608d3d3d1461028b57806374be7592146102ac57806380258e47146102cd57806381a24459146102f857806399f4b251146103195780639e614ca01461032e578063ada436e914610343578063b2a32cd514610364578063be95249414610379578063c6846ef81461038e578063d43acc79146103b5578063da408679146103ca578063e9d61859146103df575b600080fd5b34801561014e57600080fd5b506101576103f4565b005b34801561016557600080fd5b5061016e61045a565b604080519115158252519081900360200190f35b34801561018e57600080fd5b5061016e61045f565b3480156101a357600080fd5b50610157610496565b3480156101b857600080fd5b50610157600160a060020a0360043516610516565b3480156101d957600080fd5b50610157600160a060020a0360043516610602565b3480156101fa57600080fd5b50610157600160a060020a036004351661061f565b34801561021b57600080fd5b5061022461063c565b60408051600160a060020a039092168252519081900360200190f35b34801561024c57600080fd5b5061016e600160a060020a0360043516610652565b34801561026d57600080fd5b5061015761066a565b34801561028257600080fd5b50610157610713565b34801561029757600080fd5b5061016e600160a060020a0360043516610776565b3480156102b857600080fd5b50610157600160a060020a0360043516610789565b3480156102d957600080fd5b506102e26107a6565b6040805160ff9092168252519081900360200190f35b34801561030457600080fd5b5061016e600160a060020a03600435166107b5565b34801561032557600080fd5b506101576107c8565b34801561033a57600080fd5b50610157610999565b34801561034f57600080fd5b50610157600160a060020a03600435166109f3565b34801561037057600080fd5b50610157610a89565b34801561038557600080fd5b50610157610b9c565b34801561039a57600080fd5b506103a3610ba7565b60408051918252519081900360200190f35b3480156103c157600080fd5b50610157610bad565b3480156103d657600080fd5b50610157610bb6565b3480156103eb57600080fd5b50610157610c31565b6103fd336107b5565b151561040857600080fd5b600160045460a060020a900460ff16600381111561042257fe5b1461042c57600080fd5b600480546002919074ff0000000000000000000000000000000000000000191660a060020a835b0217905550565b600190565b6000600160045460a060020a900460ff16600381111561047b57fe5b148015610491575060045460a860020a900460ff165b905090565b60035463010000009004600160a060020a031633146104b457600080fd5b600160045460a060020a900460ff1660038111156104ce57fe5b146104d857600080fd5b60045460a860020a900460ff16156104ef57600080fd5b6004805475ff000000000000000000000000000000000000000000191660a860020a179055565b61051f33610776565b151561052a57600080fd5b600060045460a060020a900460ff16600381111561054457fe5b1461054e57600080fd5b60048054604080517f70a082310000000000000000000000000000000000000000000000000000000081523093810193909352516105ff928492600160a060020a0316916370a08231916024808201926020929091908290030181600087803b1580156105ba57600080fd5b505af11580156105ce573d6000803e3d6000fd5b505050506040513d60208110156105e457600080fd5b5051600454600160a060020a0316919063ffffffff610c3a16565b50565b61060b336107b5565b151561061657600080fd5b6105ff81610cf2565b61062833610776565b151561063357600080fd5b6105ff81610d03565b60035463010000009004600160a060020a031690565b6000610664818363ffffffff610d1416565b92915050565b610673336107b5565b151561067e57600080fd5b600360045460a060020a900460ff16600381111561069857fe5b14156106a357600080fd5b6004805474ff00000000000000000000000000000000000000001916740300000000000000000000000000000000000000001775ff000000000000000000000000000000000000000000191690556003805476ffffffffffffffffffffffffffffffffffffffff00000019169055565b61071c336107b5565b151561072757600080fd5b600260045460a060020a900460ff16600381111561074157fe5b1461074b57600080fd5b600480546001919074ff0000000000000000000000000000000000000000191660a060020a83610453565b600061066460018363ffffffff610d1416565b61079233610652565b151561079d57600080fd5b6105ff81610d4b565b60035462010000900460ff1690565b600061066460028363ffffLine truncated
"functionHashes": {
"DAYS_PER_YEAR()": "c6846ef8",
"activateMiner()": "b2a32cd5",
@@ -301,8 +329,10 @@
"addSystem(address)": "74be7592",
"deactivateMiner()": "9e614ca0",
"getCategory()": "80258e47",
"getMiner()": "302c11ca",
"isAlgoMiner()": "1777fb4b",
"isCoreTeam(address)": "608d3d3d",
"isMining()": "19a74ab3",
"isSupervisor(address)": "81a24459",
"isSystem(address)": "34cdcf26",
"migrateMiner(address)": "231d4e2a",
@@ -319,20 +349,22 @@
},
"gasEstimates": {
"creation": {
"codeDepositCost": "711000",
"codeDepositCost": "733800",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"DAYS_PER_YEAR()": "580",
"DAYS_PER_YEAR()": "624",
"activateMiner()": "infinite",
"addCoreTeam(address)": "infinite",
"addSupervisor(address)": "infinite",
"addSystem(address)": "infinite",
"deactivateMiner()": "infinite",
"getCategory()": "652",
"getCategory()": "696",
"getMiner()": "702",
"isAlgoMiner()": "212",
"isCoreTeam(address)": "infinite",
"isMining()": "859",
"isSupervisor(address)": "infinite",
"isSystem(address)": "infinite",
"migrateMiner(address)": "infinite",
@@ -343,9 +375,9 @@
"renounceSystem()": "infinite",
"resetMiner(address)": "infinite",
"resumeMining()": "infinite",
"startMining()": "21272",
"startMining()": "21420",
"stopAndRemoveOwnership()": "infinite",
"stopMining()": "21665"
"stopMining()": "21772"
}
}
}
@@ -1 +1 @@
608060405234801561001057600080fd5b5060405160408061076083398101604052805160209091015161003b33640100000000610077810204565b60018054600160a060020a0390921662010000026201000060b060020a031961ffff90941661ffff199093169290921792909216179055610120565b61008f60008264010000000061056b61009282021704565b50565b600160a060020a03811615156100a757600080fd5b6100ba82826401000000006100e9810204565b156100c457600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a038216151561010057600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b6106318061012f6000396000f3006080604052600436106100955763ffffffff60e060020a6000350416632296f4c7811461009a57806325109e8b146100bd5780632e6b6849146100e4578063455acbcd14610105578063492fba841461011a57806349dc9ed01461012f578063608d3d3d146101445780639fc3c98314610179578063a89febb21461018e578063aed6183f146101a3578063d43acc79146101b8575b600080fd5b3480156100a657600080fd5b506100bb600160a060020a03600435166101cd565b005b3480156100c957600080fd5b506100d26103cc565b60408051918252519081900360200190f35b3480156100f057600080fd5b506100bb600160a060020a03600435166103d8565b34801561011157600080fd5b506100d26103f8565b34801561012657600080fd5b506100d2610407565b34801561013b57600080fd5b506100d2610415565b34801561015057600080fd5b50610165600160a060020a0360043516610424565b604080519115158252519081900360200190f35b34801561018557600080fd5b506100d261043c565b34801561019a57600080fd5b506100d261044a565b3480156101af57600080fd5b506100d2610459565b3480156101c457600080fd5b506100bb610468565b60008060006101db33610424565b15156101e657600080fd5b83925082600160a060020a0316631777fb4b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561022757600080fd5b505af115801561023b573d6000803e3d6000fd5b505050506040513d602081101561025157600080fd5b5051151561025e57600080fd5b82600160a060020a03166380258e476040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561029c57600080fd5b505af11580156102b0573d6000803e3d6000fd5b505050506040513d60208110156102c657600080fd5b50519150600060ff8316108015906102e2575060058260ff1611155b15156102ed57600080fd5b50600060ff8216151561030b575069152d02c7e14af680000061039c565b8160ff1660011415610328575069d3c21bcecceda100000061039c565b8160ff166002141561034657506a01a784379d99db4200000061039c565b8160ff166003141561036457506a027b46536c66c8e300000061039c565b8160ff166004141561038257506a034f086f3b33b68400000061039c565b8160ff166005141561039c57506a0422ca8b0a00a4250000005b600081116103a957600080fd5b6001546103c690620100009004600160a060020a03168583610473565b50505050565b670de0b6b3a764000081565b6103e133610424565b15156103ec57600080fd5b6103f581610512565b50565b6a034f086f3b33b68400000081565b69d3c21bcecceda100000081565b6a027b46536c66c8e300000081565b6000610436818363ffffffff61052316565b92915050565b69152d02c7e14af680000081565b6a0422ca8b0a00a42500000081565b6a01a784379d99db4200000081565b6104713361055a565b565b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156104d657600080fd5b505af11580156104ea573d6000803e3d6000fd5b505050506040513d602081101561050057600080fd5b5051151561050d57600080fd5b505050565b6103f560008263ffffffff61056b16565b6000600160a060020a038216151561053a57600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b6103f560008263ffffffff6105b916565b600160a060020a038116151561058057600080fd5b61058a8282610523565b1561059457600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b600160a060020a03811615156105ce57600080fd5b6105d88282610523565b15156105e357600080fd5b600160a060020a0316600090815260209190915260409020805460ff191690555600a165627a7a72305820fcd1665b524606952d86f870d91a6ad5ceaed631661ee3cc8731e992b464993a0029
608060405234801561001057600080fd5b506040516040806107aa83398101604052805160209091015161003b33640100000000610077810204565b60018054600160a060020a0390921662010000026201000060b060020a031961ffff90941661ffff199093169290921792909216179055610120565b61008f6000826401000000006105b561009282021704565b50565b600160a060020a03811615156100a757600080fd5b6100ba82826401000000006100e9810204565b156100c457600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a038216151561010057600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b61067b8061012f6000396000f3006080604052600436106100955763ffffffff60e060020a6000350416632296f4c7811461009a57806325109e8b146100bd5780632e6b6849146100e4578063455acbcd14610105578063492fba841461011a57806349dc9ed01461012f578063608d3d3d146101445780639fc3c98314610179578063a89febb21461018e578063aed6183f146101a3578063d43acc79146101b8575b600080fd5b3480156100a657600080fd5b506100bb600160a060020a03600435166101cd565b005b3480156100c957600080fd5b506100d2610416565b60408051918252519081900360200190f35b3480156100f057600080fd5b506100bb600160a060020a0360043516610422565b34801561011157600080fd5b506100d2610442565b34801561012657600080fd5b506100d2610451565b34801561013b57600080fd5b506100d261045f565b34801561015057600080fd5b50610165600160a060020a036004351661046e565b604080519115158252519081900360200190f35b34801561018557600080fd5b506100d2610486565b34801561019a57600080fd5b506100d2610494565b3480156101af57600080fd5b506100d26104a3565b3480156101c457600080fd5b506100bb6104b2565b60008060006101db3361046e565b15156101e657600080fd5b600160a060020a03841660009081526002602052604090205460ff161561020c57600080fd5b83925082600160a060020a0316631777fb4b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561024d57600080fd5b505af1158015610261573d6000803e3d6000fd5b505050506040513d602081101561027757600080fd5b5051151561028457600080fd5b82600160a060020a03166380258e476040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156102c257600080fd5b505af11580156102d6573d6000803e3d6000fd5b505050506040513d60208110156102ec57600080fd5b50519150600060ff831610801590610308575060058260ff1611155b151561031357600080fd5b50600060ff82161515610331575069152d02c7e14af68000006103c2565b8160ff166001141561034e575069d3c21bcecceda10000006103c2565b8160ff166002141561036c57506a01a784379d99db420000006103c2565b8160ff166003141561038a57506a027b46536c66c8e30000006103c2565b8160ff16600414156103a857506a034f086f3b33b6840000006103c2565b8160ff16600514156103c257506a0422ca8b0a00a4250000005b600081116103cf57600080fd5b600160a060020a038085166000908152600260205260409020805460ff1916600190811790915554610410916201000090910416858363ffffffff6104bd16565b50505050565b670de0b6b3a764000081565b61042b3361046e565b151561043657600080fd5b61043f8161055c565b50565b6a034f086f3b33b68400000081565b69d3c21bcecceda100000081565b6a027b46536c66c8e300000081565b6000610480818363ffffffff61056d16565b92915050565b69152d02c7e14af680000081565b6a0422ca8b0a00a42500000081565b6a01a784379d99db4200000081565b6104bb336105a4565b565b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561052057600080fd5b505af1158015610534573d6000803e3d6000fd5b505050506040513d602081101561054a57600080fd5b5051151561055757600080fd5b505050565b61043f60008263ffffffff6105b516565b6000600160a060020a038216151561058457600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b61043f60008263ffffffff61060316565b600160a060020a03811615156105ca57600080fd5b6105d4828261056d565b156105de57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b600160a060020a038116151561061857600080fd5b610622828261056d565b151561062d57600080fd5b600160a060020a0316600090815260209190915260409020805460ff191690555600a165627a7a723058200648204d7a0ac13aa2e9ab7514200c49dd33ae54f0178fd146385ad3444f20ee0029
@@ -170,7 +170,7 @@
"type": "constructor"
}
],
"bytecode": "608060405234801561001057600080fd5b5060405160408061076083398101604052805160209091015161003b33640100000000610077810204565b60018054600160a060020a0390921662010000026201000060b060020a031961ffff90941661ffff199093169290921792909216179055610120565b61008f60008264010000000061056b61009282021704565b50565b600160a060020a03811615156100a757600080fd5b6100ba82826401000000006100e9810204565b156100c457600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a038216151561010057600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b6106318061012f6000396000f3006080604052600436106100955763ffffffff60e060020a6000350416632296f4c7811461009a57806325109e8b146100bd5780632e6b6849146100e4578063455acbcd14610105578063492fba841461011a57806349dc9ed01461012f578063608d3d3d146101445780639fc3c98314610179578063a89febb21461018e578063aed6183f146101a3578063d43acc79146101b8575b600080fd5b3480156100a657600080fd5b506100bb600160a060020a03600435166101cd565b005b3480156100c957600080fd5b506100d26103cc565b60408051918252519081900360200190f35b3480156100f057600080fd5b506100bb600160a060020a03600435166103d8565b34801561011157600080fd5b506100d26103f8565b34801561012657600080fd5b506100d2610407565b34801561013b57600080fd5b506100d2610415565b34801561015057600080fd5b50610165600160a060020a0360043516610424565b604080519115158252519081900360200190f35b34801561018557600080fd5b506100d261043c565b34801561019a57600080fd5b506100d261044a565b3480156101af57600080fd5b506100d2610459565b3480156101c457600080fd5b506100bb610468565b60008060006101db33610424565b15156101e657600080fd5b83925082600160a060020a0316631777fb4b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561022757600080fd5b505af115801561023b573d6000803e3d6000fd5b505050506040513d602081101561025157600080fd5b5051151561025e57600080fd5b82600160a060020a03166380258e476040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561029c57600080fd5b505af11580156102b0573d6000803e3d6000fd5b505050506040513d60208110156102c657600080fd5b50519150600060ff8316108015906102e2575060058260ff1611155b15156102ed57600080fd5b50600060ff8216151561030b575069152d02c7e14af680000061039c565b8160ff1660011415610328575069d3c21bcecceda100000061039c565b8160ff166002141561034657506a01a784379d99db4200000061039c565b8160ff166003141561036457506a027b46536c66c8e300000061039c565b8160ff166004141561038257506a034f086f3b33b68400000061039c565b8160ff166005141561039c57506a0422ca8b0a00a4250000005b600081116103a957600080fd5b6001546103c690620100009004600160a060020a03168583610473565b50505050565b670de0b6b3a764000081565b6103e133610424565b15156103ec57600080fd5b6103f581610512565b50565b6a034f086f3b33b68400000081565b69d3c21bcecceda100000081565b6a027b46536c66c8e300000081565b6000610436818363ffffffff61052316565b92915050565b69152d02c7e14af680000081565b6a0422ca8b0a00a42500000081565b6a01a784379d99db4200000081565b6104713361055a565b565b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156104d657600080fd5b505af11580156104ea573d6000803e3d6000fd5b505050506040513d602081101561050057600080fd5b5051151561050d57600080fd5b505050565b6103f560008263ffffffff61056b16565b6000600160a060020a038216151561053a57600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b6103f560008263ffffffff6105b916565b600160a060020a038116151561058057600080fd5b61058a8282610523565b1561059457600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b600160a060020a03811615156105ce57600080fd5b6105d88282610523565b15156105e357600080fd5b600160a060020a0316600090815260209190915260409020805460ff191690555600a165627a7a72305820fcd1665b524606952d86f870d91a6ad5ceaed631661ee3cc8731e992b464993a0029",
"bytecode": "608060405234801561001057600080fd5b506040516040806107aa83398101604052805160209091015161003b33640100000000610077810204565b60018054600160a060020a0390921662010000026201000060b060020a031961ffff90941661ffff199093169290921792909216179055610120565b61008f6000826401000000006105b561009282021704565b50565b600160a060020a03811615156100a757600080fd5b6100ba82826401000000006100e9810204565b156100c457600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a038216151561010057600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b61067b8061012f6000396000f3006080604052600436106100955763ffffffff60e060020a6000350416632296f4c7811461009a57806325109e8b146100bd5780632e6b6849146100e4578063455acbcd14610105578063492fba841461011a57806349dc9ed01461012f578063608d3d3d146101445780639fc3c98314610179578063a89febb21461018e578063aed6183f146101a3578063d43acc79146101b8575b600080fd5b3480156100a657600080fd5b506100bb600160a060020a03600435166101cd565b005b3480156100c957600080fd5b506100d2610416565b60408051918252519081900360200190f35b3480156100f057600080fd5b506100bb600160a060020a0360043516610422565b34801561011157600080fd5b506100d2610442565b34801561012657600080fd5b506100d2610451565b34801561013b57600080fd5b506100d261045f565b34801561015057600080fd5b50610165600160a060020a036004351661046e565b604080519115158252519081900360200190f35b34801561018557600080fd5b506100d2610486565b34801561019a57600080fd5b506100d2610494565b3480156101af57600080fd5b506100d26104a3565b3480156101c457600080fd5b506100bb6104b2565b60008060006101db3361046e565b15156101e657600080fd5b600160a060020a03841660009081526002602052604090205460ff161561020c57600080fd5b83925082600160a060020a0316631777fb4b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561024d57600080fd5b505af1158015610261573d6000803e3d6000fd5b505050506040513d602081101561027757600080fd5b5051151561028457600080fd5b82600160a060020a03166380258e476040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156102c257600080fd5b505af11580156102d6573d6000803e3d6000fd5b505050506040513d60208110156102ec57600080fd5b50519150600060ff831610801590610308575060058260ff1611155b151561031357600080fd5b50600060ff82161515610331575069152d02c7e14af68000006103c2565b8160ff166001141561034e575069d3c21bcecceda10000006103c2565b8160ff166002141561036c57506a01a784379d99db420000006103c2565b8160ff166003141561038a57506a027b46536c66c8e30000006103c2565b8160ff16600414156103a857506a034f086f3b33b6840000006103c2565b8160ff16600514156103c257506a0422ca8b0a00a4250000005b600081116103cf57600080fd5b600160a060020a038085166000908152600260205260409020805460ff1916600190811790915554610410916201000090910416858363ffffffff6104bd16565b50505050565b670de0b6b3a764000081565b61042b3361046e565b151561043657600080fd5b61043f8161055c565b50565b6a034f086f3b33b68400000081565b69d3c21bcecceda100000081565b6a027b46536c66c8e300000081565b6000610480818363ffffffff61056d16565b92915050565b69152d02c7e14af680000081565b6a0422ca8b0a00a42500000081565b6a01a784379d99db4200000081565b6104bb336105a4565b565b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561052057600080fd5b505af1158015610534573d6000803e3d6000fd5b505050506040513d602081101561054a57600080fd5b5051151561055757600080fd5b505050565b61043f60008263ffffffff6105b516565b6000600160a060020a038216151561058457600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b61043f60008263ffffffff61060316565b600160a060020a03811615156105ca57600080fd5b6105d4828261056d565b156105de57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b600160a060020a038116151561061857600080fd5b610622828261056d565b151561062d57600080fd5b600160a060020a0316600090815260209190915260409020805460ff191690555600a165627a7a723058200648204d7a0ac13aa2e9ab7514200c49dd33ae54f0178fd146385ad3444f20ee0029",
"functionHashes": {
"CAT_0_VALUE()": "9fc3c983",
"CAT_1_VALUE()": "492fba84",
@@ -186,7 +186,7 @@
},
"gasEstimates": {
"creation": {
"codeDepositCost": "317000",
"codeDepositCost": "331800",
"executionCost": "infinite",
"totalCost": "infinite"
},
@@ -0,0 +1,180 @@
using System;
using System.Numerics;
using System.Threading.Tasks;
using AdvancedAlgos.AlgoToken.AlgoErc20Token;
using AdvancedAlgos.AlgoToken.Framework.Ethereum;
using AdvancedAlgos.AlgoToken.Framework.Ethereum.Exceptions;
using AdvancedAlgos.AlgoToken.Framework.Ethereum.IntegrationTest;
using Nethereum.RPC.Accounts;
using Nethereum.Web3;
using Nethereum.Web3.Accounts;
using Xunit;
namespace AdvancedAlgos.AlgoToken.AlgoTokenDistribution.IntegrationTests
{
public class AlgoFeesTests
{
[Fact]
public async Task MinerRegistrationTest()
{
EthNetwork.UseGanacheTestNet();
var prefundedAccount = new Account(EthNetwork.Instance.PrefundedPrivateKey);
var tokenOwnerAccount = EthAccountFactory.Create();
var coreTeamAccount = EthAccountFactory.Create();
await EthNetwork.Instance.RefillAsync(tokenOwnerAccount);
await EthNetwork.Instance.RefillAsync(coreTeamAccount);
// Create the ERC20 token...
var token = new AlgoTokenV1(EthNetwork.Instance.GetWeb3(tokenOwnerAccount), EthNetwork.Instance.GasPriceProvider);
await token.DeployAsync();
// Create a fees...
var fees1 = new AlgoFees(EthNetwork.Instance.GetWeb3(coreTeamAccount), EthNetwork.Instance.GasPriceProvider);
await fees1.DeployAsync(token.ContractAddress);
// Create some miners...
var minerAccounts = new IAccount[3];
AlgoMiner[] miners = new AlgoMiner[3];
for (int i = 0; i < 3; i++)
{
// Create an account for the miner...
minerAccounts[i] = EthAccountFactory.Create();
// Create the miner...
miners[i] = new AlgoMiner(EthNetwork.Instance.GetWeb3(coreTeamAccount), EthNetwork.Instance.GasPriceProvider);
await miners[i].DeployAsync(1, 2, minerAccounts[i].Address, token.ContractAddress);
}
// Register a miner...
await fees1.RegisterMinerAsync(miners[0].ContractAddress);
Assert.Equal(1, await fees1.GetMinerCountAsync());
Assert.Equal(miners[0].ContractAddress, await fees1.GetMinerByIndexAsync(0));
// Remove the only registered miner.
await fees1.UnregisterMinerAsync(miners[0].ContractAddress);
Assert.Equal(0, await fees1.GetMinerCountAsync());
// Register the 3 miners and ensure they are registered...
for (int i = 0; i < 3; i++)
{
await fees1.RegisterMinerAsync(miners[i].ContractAddress);
}
Assert.Equal(3, await fees1.GetMinerCountAsync());
for (int i = 0; i < 3; i++)
{
Assert.Equal(miners[i].ContractAddress, await fees1.GetMinerByIndexAsync(i));
}
// Remove the 2nd miner and check...
await fees1.UnregisterMinerAsync(miners[1].ContractAddress);
Assert.Equal(2, await fees1.GetMinerCountAsync());
Assert.Equal(miners[0].ContractAddress, await fees1.GetMinerByIndexAsync(0));
Assert.Equal(miners[2].ContractAddress, await fees1.GetMinerByIndexAsync(1));
// Add the removed miner back...
await fees1.RegisterMinerAsync(miners[1].ContractAddress);
Assert.Equal(3, await fees1.GetMinerCountAsync());
Assert.Equal(miners[0].ContractAddress, await fees1.GetMinerByIndexAsync(0));
Assert.Equal(miners[2].ContractAddress, await fees1.GetMinerByIndexAsync(1));
Assert.Equal(miners[1].ContractAddress, await fees1.GetMinerByIndexAsync(2));
// Remove the latest miner...
await fees1.UnregisterMinerAsync(miners[1].ContractAddress);
Assert.Equal(2, await fees1.GetMinerCountAsync());
Assert.Equal(miners[0].ContractAddress, await fees1.GetMinerByIndexAsync(0));
Assert.Equal(miners[2].ContractAddress, await fees1.GetMinerByIndexAsync(1));
}
[Fact]
public async Task MineTest()
{
EthNetwork.UseGanacheTestNet();
var prefundedAccount = new Account(EthNetwork.Instance.PrefundedPrivateKey);
var tokenOwnerAccount = EthAccountFactory.Create();
var systemAccount = EthAccountFactory.Create();
var coreTeamAccount = EthAccountFactory.Create();
await EthNetwork.Instance.RefillAsync(tokenOwnerAccount);
await EthNetwork.Instance.RefillAsync(systemAccount);
await EthNetwork.Instance.RefillAsync(coreTeamAccount);
// Create the ERC20 token...
var token = new AlgoTokenV1(EthNetwork.Instance.GetWeb3(tokenOwnerAccount), EthNetwork.Instance.GasPriceProvider);
await token.DeployAsync();
// Create a fees...
var fees1 = new AlgoFees(EthNetwork.Instance.GetWeb3(coreTeamAccount), EthNetwork.Instance.GasPriceProvider);
await fees1.DeployAsync(token.ContractAddress);
// Register the system account...
await fees1.AddSystemAsync(systemAccount.Address);
// Transfer some tokens to the fees...
await token.TransferAsync(fees1.ContractAddress, 151.Algo());
// Create one miner per category...
var minerAccounts = new IAccount[6];
var miners = new AlgoMiner[6];
for (byte i = 0; i <= 5; i++)
{
// Create an account for the miner...
minerAccounts[i] = EthAccountFactory.Create();
await EthNetwork.Instance.RefillAsync(minerAccounts[i]);
// Create the miner...
miners[i] = new AlgoMiner(EthNetwork.Instance.GetWeb3(coreTeamAccount), EthNetwork.Instance.GasPriceProvider);
await miners[i].DeployAsync(1, i, minerAccounts[i].Address, token.ContractAddress);
// Transfer some tokens to the miner so it can be activated...
await token.TransferAsync(miners[i].ContractAddress, 100.Algo());
// Activate the miner...
await miners[i].ActivateMinerAsync();
// Start mining...
{
var miner = new AlgoMiner(miners[i].ContractAddress, EthNetwork.Instance.GetWeb3(minerAccounts[i]), EthNetwork.Instance.GasPriceProvider);
await miner.StartMiningAsync();
}
// Register a miner...
await fees1.RegisterMinerAsync(miners[i].ContractAddress);
}
// Mine the fees...
{
var fees = new AlgoFees(fees1.ContractAddress, EthNetwork.Instance.GetWeb3(systemAccount), EthNetwork.Instance.GasPriceProvider);
await fees.MineAsync();
}
// Ensure the miners received the payment from the fees...
var balance0 = await token.BalanceOfAsync(minerAccounts[0].Address);
var balance1 = await token.BalanceOfAsync(minerAccounts[1].Address);
var balance2 = await token.BalanceOfAsync(minerAccounts[2].Address);
var balance3 = await token.BalanceOfAsync(minerAccounts[3].Address);
var balance4 = await token.BalanceOfAsync(minerAccounts[4].Address);
var balance5 = await token.BalanceOfAsync(minerAccounts[5].Address);
Assert.Equal(1.Algo(), balance0);
Assert.Equal(10.Algo(), balance1);
Assert.Equal(20.Algo(), balance2);
Assert.Equal(30.Algo(), balance3);
Assert.Equal(40.Algo(), balance4);
Assert.Equal(50.Algo(), balance5);
}
}
}
@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AdvancedAlgos.AlgoToken.AlgoTokenDistribution.Algorithms;
using Xunit;
namespace AdvancedAlgos.AlgoToken.AlgoTokenDistribution.IntegrationTests.Algorithms
{
public class FeesDistributionAlgorithmTests
{
[Fact]
public void TestDistributionAlgorithm1()
{
var miners = new long[] { 100, 100, 100, 100, 100, 100 };
var fees = FeesDistributionAlgorithm.Distribute(151000, miners);
Assert.Equal(10, fees[0]);
Assert.Equal(100, fees[1]);
Assert.Equal(200, fees[2]);
Assert.Equal(300, fees[3]);
Assert.Equal(400, fees[4]);
Assert.Equal(500, fees[5]);
Assert.Equal(151000, GetTotalAmount(miners, fees));
}
[Fact]
public void TestDistributionAlgorithm2()
{
var miners = new long[] { 100, 100, 0, 100, 100, 100 };
var fees = FeesDistributionAlgorithm.Distribute(131000, miners);
Assert.Equal(10, fees[0]);
Assert.Equal(100, fees[1]);
Assert.Equal(0, fees[2]);
Assert.Equal(300, fees[3]);
Assert.Equal(400, fees[4]);
Assert.Equal(500, fees[5]);
Assert.Equal(131000, GetTotalAmount(miners, fees));
}
private static decimal GetTotalAmount(long[] miners, decimal[] fees)
{
decimal totalAmount = 0;
for (int i = 0; i < 6; i++)
{
totalAmount += miners[i] * fees[i];
}
return totalAmount;
}
}
}
@@ -0,0 +1,61 @@
new-account -n miner_0_account
new-account -n miner_1_account
new-account -n miner_2_account
new-account -n miner_3_account
new-account -n miner_4_account
new-account -n miner_5_account
import-account 0936af475d2701538aad321f87e0a51f2b297634653393e8cab7290a674009a5 -n prefunded
eth-transfer miner_0_account 1eth
eth-transfer miner_1_account 1eth
eth-transfer miner_2_account 1eth
eth-transfer miner_3_account 1eth
eth-transfer miner_4_account 1eth
eth-transfer miner_5_account 1eth
deploy-algotoken -n token
deploy-algominer 1 0 miner_0_account token -n miner_0
deploy-algominer 1 1 miner_1_account token -n miner_1
deploy-algominer 1 2 miner_2_account token -n miner_2
deploy-algominer 1 3 miner_3_account token -n miner_3
deploy-algominer 1 4 miner_4_account token -n miner_4
deploy-algominer 1 5 miner_5_account token -n miner_5
token.algotoken-transfer miner_0 1m
token.algotoken-transfer miner_1 1m
token.algotoken-transfer miner_2 1m
token.algotoken-transfer miner_3 1m
token.algotoken-transfer miner_4 1m
token.algotoken-transfer miner_5 1m
miner_0.algominer-activateminer
miner_1.algominer-activateminer
miner_2.algominer-activateminer
miner_3.algominer-activateminer
miner_4.algominer-activateminer
miner_5.algominer-activateminer
set-account miner_0_account
miner_0.algominer-startmining
set-account miner_1_account
miner_1.algominer-startmining
set-account miner_2_account
miner_2.algominer-startmining
set-account miner_3_account
miner_3.algominer-startmining
set-account miner_4_account
miner_4.algominer-startmining
set-account miner_5_account
miner_5.algominer-startmining
set-account prefunded
deploy-algofees token -n fees1
token.algotoken-transfer fees1 151eth
token.algotoken-balanceof fees1
fees1.algofees-registerminer miner_0
fees1.algofees-registerminer miner_1
fees1.algofees-registerminer miner_2
fees1.algofees-registerminer miner_3
fees1.algofees-registerminer miner_4
fees1.algofees-registerminer miner_5
fees1.algofees-mine
token.algotoken-balanceof miner_0_account
token.algotoken-balanceof miner_1_account
token.algotoken-balanceof miner_2_account
token.algotoken-balanceof miner_3_account
token.algotoken-balanceof miner_4_account
token.algotoken-balanceof miner_5_account
@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using AdvancedAlgos.AlgoToken.AlgoTokenDistribution;
using AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Commands.ContractManagement;
using AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Runtime;
using Nethereum.RPC.Eth.DTOs;
using Nethereum.Web3;
namespace AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Commands.AlgoFeesContract
{
public class AlgoFeesDeployCommand : DeployContractCommand
{
public override string DefaultName => "AlgoFees";
public string TokenAddress { get; set; }
protected override async Task<TransactionReceipt> DeployContractAsync(RuntimeContext context, Web3 web3)
{
var algoFees = new AlgoFees(web3, context.GasPriceProvider);
return await algoFees.DeployAsync(context.ResolveContractReference(TokenAddress));
}
}
}
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using AdvancedAlgos.AlgoToken.AlgoTokenDistribution;
using AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Commands.ContractManagement;
using AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Runtime;
using Nethereum.RPC.Eth.DTOs;
using Nethereum.Web3;
namespace AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Commands.AlgoFeesContract
{
public class AlgoFeesMineCommand : EthInvokeTransactionalFunctionCommand
{
protected override async Task<TransactionReceipt> ExecuteAsync(RuntimeContext context, string contractAddress, Web3 web3)
{
var algoFees = new AlgoFees(contractAddress, web3, context.GasPriceProvider);
return await algoFees.MineAsync();
}
}
}
@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using AdvancedAlgos.AlgoToken.AlgoTokenDistribution;
using AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Commands.ContractManagement;
using AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Runtime;
using Nethereum.RPC.Eth.DTOs;
using Nethereum.Web3;
namespace AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Commands.AlgoFeesContract
{
public class AlgoFeesRegisterMinerCommand : EthInvokeTransactionalFunctionCommand
{
public string MinerAddress { get; set; }
protected override async Task<TransactionReceipt> ExecuteAsync(RuntimeContext context, string contractAddress, Web3 web3)
{
var algoFees = new AlgoFees(contractAddress, web3, context.GasPriceProvider);
return await algoFees.RegisterMinerAsync(context.ResolveContractReference(MinerAddress));
}
}
}
@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using AdvancedAlgos.AlgoToken.AlgoTokenDistribution;
using AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Commands.ContractManagement;
using AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Runtime;
using Nethereum.RPC.Eth.DTOs;
using Nethereum.Web3;
namespace AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Commands.AlgoFeesContract
{
public class AlgoFeesUnregisterMinerCommand : EthInvokeTransactionalFunctionCommand
{
public string MinerAddress { get; set; }
protected override async Task<TransactionReceipt> ExecuteAsync(RuntimeContext context, string contractAddress, Web3 web3)
{
var algoFees = new AlgoFees(contractAddress, web3, context.GasPriceProvider);
return await algoFees.UnregisterMinerAsync(context.ResolveContractReference(MinerAddress));
}
}
}
@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Text;
using AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Commands.AlgoFeesContract;
using Sprache;
namespace AdvancedAlgos.AlgoToken.AlgoTokenPlayground.Parsers
{
public static class AlgoFeesParsers
{
public static void Register()
{
(from command in CommonParsers.Token("deploy-algofees")
from tokenAddress in CommonParsers.StringValue
from name in CommonParsers.Switch('n', "name", CommonParsers.Identifier).Optional()
select new AlgoFeesDeployCommand
{
Name = name.GetOrDefault(),
TokenAddress = tokenAddress
}).Register();
(from contractReference in CommonParsers.Invoke("algofees-registerminer")
from minerAddress in CommonParsers.StringValue
select new AlgoFeesRegisterMinerCommand
{
ContractReference = contractReference,
MinerAddress = minerAddress
}).Register();
(from contractReference in CommonParsers.Invoke("algofees-unregisterminer")
from minerAddress in CommonParsers.StringValue
select new AlgoFeesUnregisterMinerCommand
{
ContractReference = contractReference,
MinerAddress = minerAddress
}).Register();
(from contractReference in CommonParsers.Invoke("algofees-mine")
select new AlgoFeesMineCommand
{
ContractReference = contractReference
}).Register();
}
}
}
@@ -26,6 +26,7 @@ namespace AdvancedAlgos.AlgoToken.AlgoTokenPlayground
ContractManagementParsers.Register();
AlgoTokenParsers.Register();
AlgoPoolParsers.Register();
AlgoFeesParsers.Register();
AlgoMinerParsers.Register();
}