Contract Overview
Balance:
0 CRO
CRO Value:
$0.00
[ Download CSV Export ]
Contract Name:
HERD
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-05-29 */ // SPDX-License-Identifier: MIT pragma solidity ^0.7.0; abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } pragma solidity ^0.7.0; library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } pragma solidity ^0.7.0; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } pragma solidity ^0.7.0; library Address { function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.7.0; contract ERC20Custom is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; uint256 private _totalSupply; function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } function burnFrom(address account, uint256 amount) public virtual { uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance"); _approve(account, _msgSender(), decreasedAllowance); _burn(account, amount); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _burnFrom(address account, uint256 amount) internal virtual { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } pragma solidity ^0.7.0; contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _decimals = 18; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } pragma solidity 0.7.6; interface IBUCKPool { function toggleRecollateralize() external; function getRecollateralizePaused() external view returns (bool); function collatDollarBalance() external view returns (uint256); function getCollateralPrice() external view returns (uint256); function getMissingDecimals() external view returns(uint256); function sendExcessCollatToTreasury(uint256 _amount) external; } pragma solidity >=0.6.7; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } pragma solidity 0.7.6; interface ITreasury { function getCollateralSupply() external view returns (uint); function withdraw(uint) external; } pragma solidity 0.7.6; interface V2Oracle { function assetToAsset(address, uint, address, uint32) external view returns (uint, uint); } pragma solidity >=0.6.7; //BAND interface IStdReference { /// A structure returned whenever someone requests for standard reference data. struct ReferenceData { uint256 rate; // base/quote exchange rate, multiplied by 1e18. uint256 lastUpdatedBase; // UNIX epoch of the last time when base price gets updated. uint256 lastUpdatedQuote; // UNIX epoch of the last time when quote price gets updated. } /// Returns the price data for the given base/quote pair. Revert if not available. function getReferenceData(string memory _base, string memory _quote) external view returns (ReferenceData memory); /// Similar to getReferenceData, but with multiple base/quote pairs at once. function getReferenceDataBulk(string[] memory _bases, string[] memory _quotes) external view returns (ReferenceData[] memory); } pragma solidity 0.7.6; pragma experimental ABIEncoderV2; contract BUCK is ERC20Custom { using SafeMath for uint256; /* ========== STATE VARIABLES ========== */ enum PriceChoice { BUCK, HERD } AggregatorV3Interface private cro_usd_chainlink; IStdReference private cro_usd_band; uint8 private cro_usd_chainlink_decimals; V2Oracle public oracle; ITreasury public treasury; string public symbol; string public name; uint8 public constant decimals = 18; uint256 public oracleMode; uint256 public cro_usd_oracle; address public owner_address; address public timelock_address; // Governance timelock address address public controller_address; // Controller contract to dynamically adjust system parameters automatically address public herd_address; address public wcro_address; address public cro_usd_chainlink_address; address public cro_usd_band_address; uint256 public immutable genesis_supply; // This is to help with establishing the Uniswap pools, as they need liquidity // The addresses in this array are added by the oracle and these contracts are able to mint buck address[] public buck_pools_array; // Mapping is also used for faster verification mapping(address => bool) public buck_pools; // Constants for various precisions uint256 private constant PRICE_PRECISION = 1e6; uint256 private constant COLLATERAL_RATIO_PRECISION = 1e6; uint256 public global_collateral_ratio; // 6 decimals of precision, e.g. 924102 = 0.924102 uint256 public buck_step; // Amount to change the collateralization ratio by upon refreshCollateralRatio() uint256 public refresh_cooldown; // Seconds to wait before being able to run refreshCollateralRatio() again uint256 public price_target; // The price of BUCK at which the collateral ratio will respond to; this value is only used for the collateral ratio mechanism and not for minting and redeeming which are hardcoded at USD 1 uint256 public price_band; // The bound above and below the price target at which the refreshCollateralRatio() will not change the collateral ratio uint256 public twap_period; // The twap period in seconds bool public collateral_ratio_paused = false; /* ========== MODIFIERS ========== */ modifier onlyPools() { require(buck_pools[msg.sender] == true, "Only buck pools can call this function"); _; } modifier onlyByOwnerOrGovernance() { require(msg.sender == owner_address || msg.sender == timelock_address || msg.sender == controller_address, "You are not the owner, controller, or the governance timelock"); _; } modifier onlyByOwnerGovernanceOrPool() { require( msg.sender == owner_address || msg.sender == timelock_address || buck_pools[msg.sender] == true, "You are not the owner, the governance timelock, or a pool"); _; } /* ========== CONSTRUCTOR ========== */ constructor( string memory _name, string memory _symbol, uint256 _genesis_supply, address _wcro, address _oracle, address _treasury, address _cro_usd_band, address _timelock_address ) { name = _name; symbol = _symbol; genesis_supply = _genesis_supply; wcro_address = _wcro; oracle = V2Oracle(_oracle); oracleMode = 0; // Default to Twap cro_usd_oracle = 1; // Default to Band treasury = ITreasury(_treasury); timelock_address = _timelock_address; owner_address = msg.sender; _mint(owner_address, _genesis_supply); buck_step = 2500; // 6 decimals of precision, equal to 0.25% global_collateral_ratio = 1000000; // BUCK system starts off fully collateralized (6 decimals of precision) > 100% refresh_cooldown = 3600; // Refresh cooldown period is set to 1 hour (3600 seconds) at genesis price_target = 1000000; // Collateral ratio will adjust according to the USD 1 price target at genesis price_band = 5000; // Collateral ratio will not adjust if between USD 0.995 and USD 1.005 at genesis twap_period = 3600; // default 3600 seconds (1 hour) twap period // CRO/USD Price Feed cro_usd_band_address = _cro_usd_band; cro_usd_band = IStdReference(cro_usd_band_address); } /* ========== VIEWS ========== */ function getLatestPriceChainlink() internal view returns (int) { (,int price,,,) = cro_usd_chainlink.latestRoundData(); return price; } function getLatestPriceBand() internal view returns (uint256) { IStdReference.ReferenceData memory data = cro_usd_band.getReferenceData("CRO","USD"); return data.rate; } function getDecimals() internal view returns (uint8) { return cro_usd_chainlink.decimals(); } function effectiveCollateralRatio() public view returns (uint){ return globalCollateralValue().mul(1e6).div(totalSupply()); } // Choice = 'BUCK' or 'HERD' for now function oracle_price(PriceChoice choice) internal view returns (uint256) { require(address(oracle) != address(0), "Oracle address have not set yet"); require(herd_address != address(0), "HERD address have not set yet"); uint256 price_vs_cro; if (choice == PriceChoice.BUCK) { // How much BUCK if you put in PRICE_PRECISION WCRO (uint p0, uint p1) = oracle.assetToAsset(wcro_address, PRICE_PRECISION, address(this), uint32(twap_period)); if(oracleMode == 0){ price_vs_cro = p0; } else if(oracleMode == 1){ price_vs_cro = p1; } } else if (choice == PriceChoice.HERD) { // How much HERD if you put in PRICE_PRECISION WCRO (uint p0, uint p1) = oracle.assetToAsset(wcro_address, PRICE_PRECISION, herd_address, uint32(twap_period)); if(oracleMode == 0){ price_vs_cro = p0; } else if(oracleMode == 1){ price_vs_cro = p1; } } else revert("INVALID PRICE CHOICE. Needs to be either 0 (BUCK) or 1 (HERD)"); // Will be in 1e6 format return cro_usd_price().mul(PRICE_PRECISION).div(price_vs_cro); } function buck_price() public view returns (uint256) { return oracle_price(PriceChoice.BUCK); } function herd_price() public view returns (uint256) { return oracle_price(PriceChoice.HERD); } function cro_usd_price() public view returns (uint256) { uint256 croUsdPrice = 0; //chainlink if(cro_usd_oracle == 0) { croUsdPrice = uint256(getLatestPriceChainlink()).mul(PRICE_PRECISION).div(uint256(10) ** cro_usd_chainlink_decimals); } //band else if(cro_usd_oracle == 1) { croUsdPrice = uint256(getLatestPriceBand()).mul(PRICE_PRECISION).div(1e18); } return croUsdPrice; } // This is needed to avoid costly repeat calls to different getter functions // It is cheaper gas-wise to just dump everything and only use some of the info function buck_info() public view returns (uint256, uint256, uint256, uint256, uint256, uint256) { uint256 cro_usd_latest_price = 0; if(cro_usd_oracle == 0) { cro_usd_latest_price = uint256(getLatestPriceChainlink()).mul(PRICE_PRECISION).div(uint256(10) ** cro_usd_chainlink_decimals); } //band else if(cro_usd_oracle == 1) { cro_usd_latest_price = uint256(getLatestPriceBand()).mul(PRICE_PRECISION).div(1e18); } return ( oracle_price(PriceChoice.BUCK), // buck_price() oracle_price(PriceChoice.HERD), // herd_price() totalSupply(), // totalSupply() global_collateral_ratio, // global_collateral_ratio() globalCollateralValue(), // globalCollateralValue cro_usd_latest_price ); } // Iterate through all buck pools and calculate all value of collateral in all pools globally function globalCollateralValue() public view returns (uint256) { uint256 total_collateral_value_d18 = 0; for (uint i = 0; i < buck_pools_array.length; i++){ // Exclude null addresses if (buck_pools_array[i] != address(0)){ total_collateral_value_d18 = total_collateral_value_d18.add(IBUCKPool(buck_pools_array[i]).collatDollarBalance()); } } return total_collateral_value_d18; } /* ========== PUBLIC FUNCTIONS ========== */ // There needs to be a time interval that this can be called. Otherwise it can be called multiple times per expansion. uint256 public last_call_time; // Last time the refreshCollateralRatio function was called function refreshCollateralRatio() public { require(collateral_ratio_paused == false, "Collateral Ratio has been paused"); require(address(treasury) != address(0), "Treasury have not set yet"); uint256 buck_price_cur = buck_price(); require(block.timestamp - last_call_time >= refresh_cooldown, "Must wait for the refresh cooldown since last refresh"); // Step increments are 0.25% (upon genesis, changable by setBUCKStep()) if (buck_price_cur > price_target.add(price_band)) { //decrease collateral ratio if(global_collateral_ratio <= buck_step){ //if within a step of 0, go to 0 global_collateral_ratio = 0; } else { global_collateral_ratio = global_collateral_ratio.sub(buck_step); } } else if (buck_price_cur < price_target.sub(price_band)) { //increase collateral ratio if(global_collateral_ratio.add(buck_step) >= 1000000){ global_collateral_ratio = 1000000; // cap collateral ratio at 1.000000 } else { global_collateral_ratio = global_collateral_ratio.add(buck_step); } } last_call_time = block.timestamp; // Set the time of the last expansion // Target CR VS Effective CR if(global_collateral_ratio < effectiveCollateralRatio()){ // if collateral is excess and send it to treasury if(availableExcessCollatDV() > 0){ IBUCKPool(buck_pools_array[0]).sendExcessCollatToTreasury(availableExcessCollatDV()); } // Disable Recollaterize if(IBUCKPool(buck_pools_array[0]).getRecollateralizePaused() == false) { IBUCKPool(buck_pools_array[0]).toggleRecollateralize(); } } else{ // if collateral is insufficient then withdraw it from treasury to Pool uint256 recollat_possible = (global_collateral_ratio.mul(totalSupply()).sub(totalSupply().mul((effectiveCollateralRatio().add(1))))).div(1e6); uint256 treasuryCollateralBalance = treasury.getCollateralSupply(); if(treasuryCollateralBalance > 0){ if(treasuryCollateralBalance >= recollat_possible){ uint256 amount_to_recollat = recollat_possible.mul(1e6).div(IBUCKPool(buck_pools_array[0]).getCollateralPrice()); treasury.withdraw(amount_to_recollat.div(10 ** IBUCKPool(buck_pools_array[0]).getMissingDecimals())); } else{ // Enable Recollaterize if(IBUCKPool(buck_pools_array[0]).getRecollateralizePaused() == true) { IBUCKPool(buck_pools_array[0]).toggleRecollateralize(); } } } } } // Returns the value of excess collateral held in this Buck pool, compared to what is needed to maintain the global collateral ratio function availableExcessCollatDV() public view returns (uint256) { uint256 globalCollateralRatio = global_collateral_ratio; if (globalCollateralRatio > COLLATERAL_RATIO_PRECISION) globalCollateralRatio = COLLATERAL_RATIO_PRECISION; // Handles an overcollateralized contract with CR > 1 uint256 required_collat_dollar_value_d18 = (totalSupply().mul(globalCollateralRatio)).div(COLLATERAL_RATIO_PRECISION); // Calculates collateral needed to back each 1 BUCK with USD 1 of collateral at current collat ratio if (globalCollateralValue() > required_collat_dollar_value_d18) return globalCollateralValue().sub(required_collat_dollar_value_d18); else return 0; } /* ========== RESTRICTED FUNCTIONS ========== */ // Used by pools when user redeems function pool_burn_from(address b_address, uint256 b_amount) public onlyPools { super._burnFrom(b_address, b_amount); emit BUCKBurned(b_address, msg.sender, b_amount); } // This function is what other buck pools will call to mint new BUCK function pool_mint(address m_address, uint256 m_amount) public onlyPools { super._mint(m_address, m_amount); emit BUCKMinted(msg.sender, m_address, m_amount); } // Adds pool addresses supported, such as tether and busd, must be ERC20 function addPool(address pool_address) public onlyByOwnerOrGovernance { require(buck_pools[pool_address] == false, "address already exists"); buck_pools[pool_address] = true; buck_pools_array.push(pool_address); emit PoolAdded(buck_pools_array.length-1, pool_address); } // Change pool address on specific index function changePool(uint index, address new_pool_address) public onlyByOwnerOrGovernance { require(index < buck_pools_array.length, "index not found"); address oldPool = buck_pools_array[index]; require(buck_pools[oldPool] == true, "old address doesn't exist"); // Delete from the mapping delete buck_pools[oldPool]; // Update to new pool buck_pools[new_pool_address] = true; buck_pools_array[index] = new_pool_address; emit PoolChanged(index, oldPool, new_pool_address); } // Remove a pool function removePool(address pool_address) public onlyByOwnerOrGovernance { require(buck_pools[pool_address] == true, "address doesn't exist already"); // Delete from the mapping delete buck_pools[pool_address]; uint deletedIndex; // 'Delete' from the array by setting the address to 0x0 for (uint i = 0; i < buck_pools_array.length; i++){ if (buck_pools_array[i] == pool_address) { buck_pools_array[i] = address(0); // This will leave a null in the array and keep the indices the same deletedIndex = i; break; } } emit PoolRemoved(deletedIndex, pool_address); } function setOwner(address _owner_address) external onlyByOwnerOrGovernance { owner_address = _owner_address; } function setTreasury(address _treasury) public onlyByOwnerOrGovernance { treasury = ITreasury(_treasury); } function setAssetCroOracle(address _oracle) public onlyByOwnerOrGovernance{ oracle = V2Oracle(_oracle); } function setBUCKStep(uint256 _new_step) public onlyByOwnerOrGovernance { buck_step = _new_step; } function setPriceTarget(uint256 _new_price_target) public onlyByOwnerOrGovernance { price_target = _new_price_target; } function setRefreshCooldown(uint256 _new_cooldown) public onlyByOwnerOrGovernance { refresh_cooldown = _new_cooldown; } function setTwapPeriod(uint256 _new_twap_period) public onlyByOwnerOrGovernance { twap_period = _new_twap_period; } function setHERDAddress(address _herd_address) public onlyByOwnerOrGovernance { herd_address = _herd_address; } function setCroUsdChainlinkAddress(address _cro_usd_chainlink_address) public onlyByOwnerOrGovernance { cro_usd_chainlink_address = _cro_usd_chainlink_address; cro_usd_chainlink = AggregatorV3Interface(cro_usd_chainlink_address); cro_usd_chainlink_decimals = getDecimals(); } function setCroUsdBandAddress(address _cro_usd_band_address) public onlyByOwnerOrGovernance { cro_usd_band_address = _cro_usd_band_address; cro_usd_band = IStdReference(cro_usd_band_address); } function setTimelock(address new_timelock) external onlyByOwnerOrGovernance { timelock_address = new_timelock; } function setController(address _controller_address) external onlyByOwnerOrGovernance { controller_address = _controller_address; } function setPriceBand(uint256 _price_band) external onlyByOwnerOrGovernance { price_band = _price_band; } function setWCRO(address _wcro_address) public onlyByOwnerOrGovernance { wcro_address = _wcro_address; } function toggleCollateralRatio() public onlyByOwnerOrGovernance { collateral_ratio_paused = !collateral_ratio_paused; } function setOracleMode(uint256 _mode) public onlyByOwnerOrGovernance{ require(_mode < 2, "Choose between 0 or 1"); // Mode Number Rules // 0 = Twap // 1 = Spot oracleMode = _mode; } function setCroUsdOracleProtocol(uint256 _oracle) public onlyByOwnerOrGovernance{ require(_oracle < 2, "Choose between 0 or 1"); // 0 = Chainlink // 1 = Band cro_usd_oracle = _oracle; } /* ========== EVENTS ========== */ // Track BUCK burned event BUCKBurned(address indexed from, address indexed to, uint256 amount); // Track BUCK minted event BUCKMinted(address indexed from, address indexed to, uint256 amount); // Track Pool added event PoolAdded(uint index, address indexed pool); // Track Pool changed event PoolChanged(uint index, address indexed old_pool, address indexed new_pool); // Track Pool removed event PoolRemoved(uint index, address indexed pool); } pragma solidity 0.7.6; contract HERD is ERC20Custom { using SafeMath for uint256; /* ========== STATE VARIABLES ========== */ string public symbol; string public name; uint8 public constant decimals = 18; uint256 public immutable genesis_supply; address public owner_address; address public timelock_address; // Governance timelock address BUCK public BUCKContract; bool public trackingVotes = true; // Tracking votes (only change if need to disable votes) // A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint96 votes; } // A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; // The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /* ========== MODIFIERS ========== */ modifier onlyPools() { require(BUCKContract.buck_pools(msg.sender) == true, "Only buck pools can mint new HERD"); _; } modifier onlyByOwnerOrGovernance() { require(msg.sender == owner_address || msg.sender == timelock_address, "You are not an owner or the governance timelock"); _; } /* ========== CONSTRUCTOR ========== */ constructor( string memory _name, string memory _symbol, uint256 _genesis_supply, address buck_contract_address, address _timelock_address ) { name = _name; symbol = _symbol; genesis_supply = _genesis_supply; BUCKContract = BUCK(buck_contract_address); owner_address = msg.sender; timelock_address = _timelock_address; _mint(owner_address, _genesis_supply); // Do a checkpoint for the owner _writeCheckpoint(owner_address, 0, 0, uint96(_genesis_supply)); } /* ========== RESTRICTED FUNCTIONS ========== */ function setTimelock(address new_timelock) external onlyByOwnerOrGovernance { timelock_address = new_timelock; } function setBUCKAddress(address buck_contract_address) external onlyByOwnerOrGovernance { BUCKContract = BUCK(buck_contract_address); } function setOwner(address _owner_address) external onlyByOwnerOrGovernance { owner_address = _owner_address; } function mint(address to, uint256 amount) public onlyPools { _mint(to, amount); } // This function is what other buck pools will call to mint new HERD (similar to the BUCKContract mint) function pool_mint(address m_address, uint256 m_amount) external onlyPools { if(trackingVotes){ uint32 srcRepNum = numCheckpoints[address(this)]; uint96 srcRepOld = srcRepNum > 0 ? checkpoints[address(this)][srcRepNum - 1].votes : 0; uint96 srcRepNew = add96(srcRepOld, uint96(m_amount), "pool_mint new votes overflows"); _writeCheckpoint(address(this), srcRepNum, srcRepOld, srcRepNew); // mint new votes trackVotes(address(this), m_address, uint96(m_amount)); } super._mint(m_address, m_amount); emit HERDMinted(address(this), m_address, m_amount); } // This function is what other buck pools will call to burn HERD function pool_burn_from(address b_address, uint256 b_amount) external onlyPools { if(trackingVotes){ trackVotes(b_address, address(this), uint96(b_amount)); uint32 srcRepNum = numCheckpoints[address(this)]; uint96 srcRepOld = srcRepNum > 0 ? checkpoints[address(this)][srcRepNum - 1].votes : 0; uint96 srcRepNew = sub96(srcRepOld, uint96(b_amount), "pool_burn_from new votes underflows"); _writeCheckpoint(address(this), srcRepNum, srcRepOld, srcRepNew); // burn votes } super._burnFrom(b_address, b_amount); emit HERDBurned(b_address, address(this), b_amount); } function toggleVotes() external onlyByOwnerOrGovernance { trackingVotes = !trackingVotes; } /* ========== OVERRIDDEN PUBLIC FUNCTIONS ========== */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { if(trackingVotes){ // Transfer votes trackVotes(_msgSender(), recipient, uint96(amount)); } _transfer(_msgSender(), recipient, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { if(trackingVotes){ // Transfer votes trackVotes(sender, recipient, uint96(amount)); } _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /* ========== PUBLIC FUNCTIONS ========== */ /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint96) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) public view returns (uint96) { require(blockNumber < block.number, "HERD::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } /* ========== INTERNAL FUNCTIONS ========== */ // From compound's _moveDelegates // Keep track of votes. "Delegates" is a misnomer here function trackVotes(address srcRep, address dstRep, uint96 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { uint32 srcRepNum = numCheckpoints[srcRep]; uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint96 srcRepNew = sub96(srcRepOld, amount, "HERD::_moveVotes: vote amount underflows"); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { uint32 dstRepNum = numCheckpoints[dstRep]; uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint96 dstRepNew = add96(dstRepOld, amount, "HERD::_moveVotes: vote amount overflows"); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint(address voter, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal { uint32 blockNumber = safe32(block.number, "HERD::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[voter][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[voter][nCheckpoints - 1].votes = newVotes; } else { checkpoints[voter][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[voter] = nCheckpoints + 1; } emit VoterVotesChanged(voter, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function safe96(uint n, string memory errorMessage) internal pure returns (uint96) { require(n < 2**96, errorMessage); return uint96(n); } function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) { uint96 c = a + b; require(c >= a, errorMessage); return c; } function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) { require(b <= a, errorMessage); return a - b; } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } /* ========== EVENTS ========== */ /// @notice An event thats emitted when a voters account's vote balance changes event VoterVotesChanged(address indexed voter, uint previousBalance, uint newBalance); // Track HERD burned event HERDBurned(address indexed from, address indexed to, uint256 amount); // Track HERD minted event HERDMinted(address indexed from, address indexed to, uint256 amount); }
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_genesis_supply","type":"uint256"},{"internalType":"address","name":"buck_contract_address","type":"address"},{"internalType":"address","name":"_timelock_address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"HERDBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"HERDMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"VoterVotesChanged","type":"event"},{"inputs":[],"name":"BUCKContract","outputs":[{"internalType":"contract BUCK","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesis_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"b_address","type":"address"},{"internalType":"uint256","name":"b_amount","type":"uint256"}],"name":"pool_burn_from","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"m_address","type":"address"},{"internalType":"uint256","name":"m_amount","type":"uint256"}],"name":"pool_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"buck_contract_address","type":"address"}],"name":"setBUCKAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner_address","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trackingVotes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526007805460ff60a01b1916600160a01b1790553480156200002457600080fd5b50604051620025a5380380620025a583398101604081905262000047916200052e565b84516200005c906004906020880190620003ec565b50835162000072906003906020870190620003ec565b506080839052600780546001600160a01b038085166001600160a01b03199283161790925560058054821633179081905560068054858516931692909217909155620000c0911684620000e6565b600554620000db906001600160a01b031660008086620001d2565b5050505050620006bd565b6001600160a01b038216620001185760405162461bcd60e51b81526004016200010f9062000630565b60405180910390fd5b620001266000838362000385565b62000142816002546200038a60201b6200101d1790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620001759183906200101d6200038a821b17901c565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620001c690859062000667565b60405180910390a35050565b6000620001f9436040518060600160405280603481526020016200257160349139620003b9565b905060008463ffffffff161180156200024357506001600160a01b038516600090815260086020908152604080832063ffffffff6000198901811685529252909120548282169116145b156200029f576001600160a01b0385166000908152600860209081526040808320600019880163ffffffff16845290915290208054600160201b600160801b0319166401000000006001600160601b0385160217905562000339565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152600883528781208c87168252835287812096518754945190951664010000000002600160201b600160801b031995871663ffffffff19958616179590951694909417909555938252600990935292909220805460018801909316929091169190911790555b846001600160a01b03167f3eaa1c4be29b4a4c60e00300b5a17a8ec6c982b5b0ad5870cc84ebdc3b24d68e84846040516200037692919062000670565b60405180910390a25050505050565b505050565b600082820183811015620003b25760405162461bcd60e51b81526004016200010f90620005f9565b9392505050565b6000816401000000008410620003e45760405162461bcd60e51b81526004016200010f9190620005c4565b509192915050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200042457600085556200046f565b82601f106200043f57805160ff19168380011785556200046f565b828001600101855582156200046f579182015b828111156200046f57825182559160200191906001019062000452565b506200047d92915062000481565b5090565b5b808211156200047d576000815560010162000482565b80516001600160a01b0381168114620004b057600080fd5b919050565b600082601f830112620004c6578081fd5b81516001600160401b0380821115620004db57fe5b604051601f8301601f191681016020018281118282101715620004fa57fe5b60405282815284830160200186101562000512578384fd5b620005258360208301602088016200068a565b95945050505050565b600080600080600060a0868803121562000546578081fd5b85516001600160401b03808211156200055d578283fd5b6200056b89838a01620004b5565b9650602088015191508082111562000581578283fd5b506200059088828901620004b5565b94505060408601519250620005a86060870162000498565b9150620005b86080870162000498565b90509295509295909350565b6000602082528251806020840152620005e58160408501602087016200068a565b601f01601f19169190910160400192915050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b6001600160601b0392831681529116602082015260400190565b60005b83811015620006a75781810151838201526020016200068d565b83811115620006b7576000848401525b50505050565b608051611e99620006d8600039806107495250611e996000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063a9059cbb116100a2578063dc6663c711610071578063dc6663c7146103bd578063dcf17ea3146103c5578063dd62ed3e146103cd578063f1127ed8146103e0576101cf565b8063a9059cbb14610371578063b4b5ea5714610384578063b4f56b2614610397578063bdacb303146103aa576101cf565b806380edef8e116100de57806380edef8e1461032e57806395d89b4114610343578063a457c2d71461034b578063a8a778ae1461035e576101cf565b806370a08231146102e8578063782d6fe1146102fb57806379cc67901461031b576101cf565b8063395093511161017157806345791d191161014b57806345791d19146102a557806351e238e3146102ad5780636020745c146102b55780636fcfff45146102c8576101cf565b8063395093511461026c57806340c10f191461027f57806342966c6814610292576101cf565b806318160ddd116101ad57806318160ddd1461022757806323b872dd1461023c57806328a4aeaa1461024f578063313ce56714610257576101cf565b806306fdde03146101d4578063095ea7b3146101f257806313af403514610212575b600080fd5b6101dc610401565b6040516101e991906119a8565b60405180910390f35b6102056102003660046118ea565b61048f565b6040516101e9919061199d565b610225610220366004611863565b6104ad565b005b61022f610517565b6040516101e99190611c8f565b61020561024a3660046118af565b61051d565b6102056105c2565b61025f6105d2565b6040516101e99190611cc8565b61020561027a3660046118ea565b6105d7565b61022561028d3660046118ea565b610625565b6102256102a0366004611971565b6106d3565b6102256106e7565b61022f610747565b6102256102c3366004611863565b61076b565b6102db6102d6366004611863565b6107cc565b6040516101e99190611c98565b61022f6102f6366004611863565b6107e4565b61030e6103093660046118ea565b610803565b6040516101e99190611cd6565b6102256103293660046118ea565b610a0c565b610336610a61565b6040516101e99190611989565b6101dc610a70565b6102056103593660046118ea565b610acb565b61022561036c3660046118ea565b610b33565b61020561037f3660046118ea565b610cdb565b61030e610392366004611863565b610d14565b6102256103a53660046118ea565b610d85565b6102256103b8366004611863565b610f3e565b610336610f9f565b610336610fae565b61022f6103db36600461187d565b610fbd565b6103f36103ee366004611913565b610fe8565b6040516101e9929190611ca9565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104875780601f1061045c57610100808354040283529160200191610487565b820191906000526020600020905b81548152906001019060200180831161046a57829003601f168201915b505050505081565b60006104a361049c611042565b8484611046565b5060015b92915050565b6005546001600160a01b03163314806104d057506006546001600160a01b031633145b6104f55760405162461bcd60e51b81526004016104ec90611c09565b60405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b60025490565b600754600090600160a01b900460ff161561053d5761053d8484846110fa565b610548848484611294565b6105b884610554611042565b6105b385604051806060016040528060288152602001611dcc602891396001600160a01b038a16600090815260016020526040812090610592611042565b6001600160a01b0316815260208101919091526040016000205491906113a9565b611046565b5060019392505050565b600754600160a01b900460ff1681565b601281565b60006104a36105e4611042565b846105b385600160006105f5611042565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061101d565b600754604051623af52d60e81b81526001600160a01b0390911690633af52d0090610654903390600401611989565b60206040518083038186803b15801561066c57600080fd5b505afa158015610680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a49190611951565b15156001146106c55760405162461bcd60e51b81526004016104ec90611afe565b6106cf82826113d5565b5050565b6106e46106de611042565b82611489565b50565b6005546001600160a01b031633148061070a57506006546001600160a01b031633145b6107265760405162461bcd60e51b81526004016104ec90611c09565b6007805460ff60a01b198116600160a01b9182900460ff1615909102179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6005546001600160a01b031633148061078e57506006546001600160a01b031633145b6107aa5760405162461bcd60e51b81526004016104ec90611c09565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60096020526000908152604090205463ffffffff1681565b6001600160a01b0381166000908152602081905260409020545b919050565b60004382106108245760405162461bcd60e51b81526004016104ec90611ab7565b6001600160a01b03831660009081526009602052604090205463ffffffff16806108525760009150506104a7565b6001600160a01b038416600090815260086020908152604080832063ffffffff6000198601811685529252909120541683106108ce576001600160a01b03841660009081526008602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b031690506104a7565b6001600160a01b038416600090815260086020908152604080832083805290915290205463ffffffff168310156109095760009150506104a7565b600060001982015b8163ffffffff168163ffffffff1611156109c7576000600263ffffffff848403166001600160a01b038916600090815260086020908152604080832094909304860363ffffffff818116845294825291839020835180850190945254938416808452600160201b9094046001600160601b0316908301529250908714156109a2576020015194506104a79350505050565b805163ffffffff168711156109b9578193506109c0565b6001820392505b5050610911565b506001600160a01b038516600090815260086020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b6000610a3e82604051806060016040528060248152602001611df460249139610a37866103db611042565b91906113a9565b9050610a5283610a4c611042565b83611046565b610a5c8383611489565b505050565b6005546001600160a01b031681565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104875780601f1061045c57610100808354040283529160200191610487565b60006104a3610ad8611042565b846105b385604051806060016040528060258152602001611e3f6025913960016000610b02611042565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906113a9565b600754604051623af52d60e81b81526001600160a01b0390911690633af52d0090610b62903390600401611989565b60206040518083038186803b158015610b7a57600080fd5b505afa158015610b8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb29190611951565b1515600114610bd35760405162461bcd60e51b81526004016104ec90611afe565b600754600160a01b900460ff1615610c8257610bf08230836110fa565b3060009081526009602052604081205463ffffffff169081610c13576000610c49565b306000908152600860209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000610c708285604051806060016040528060238152602001611d836023913961155f565b9050610c7e30848484611596565b5050505b610c8c828261174b565b306001600160a01b0316826001600160a01b03167ff2c89b20196f97e781098098bf5f5e5b75c1f2953eccfe9684b86dde33d4fc3a83604051610ccf9190611c8f565b60405180910390a35050565b600754600090600160a01b900460ff1615610d0257610d02610cfb611042565b84846110fa565b6104a3610d0d611042565b8484611294565b6001600160a01b03811660009081526009602052604081205463ffffffff1680610d3f576000610d7e565b6001600160a01b0383166000908152600860209081526040808320600019850163ffffffff168452909152902054600160201b90046001600160601b03165b9392505050565b600754604051623af52d60e81b81526001600160a01b0390911690633af52d0090610db4903390600401611989565b60206040518083038186803b158015610dcc57600080fd5b505afa158015610de0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e049190611951565b1515600114610e255760405162461bcd60e51b81526004016104ec90611afe565b600754600160a01b900460ff1615610ef1573060009081526009602052604081205463ffffffff169081610e5a576000610e90565b306000908152600860209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b90506000610ed482856040518060400160405280601d81526020017f706f6f6c5f6d696e74206e657720766f746573206f766572666c6f777300000081525061179f565b9050610ee230848484611596565b610eed3086866110fa565b5050505b610efb82826113d5565b816001600160a01b0316306001600160a01b03167f771078297a8e3efa92986c79cb7653ee9cd847115c5f367b481ece679aca817683604051610ccf9190611c8f565b6005546001600160a01b0316331480610f6157506006546001600160a01b031633145b610f7d5760405162461bcd60e51b81526004016104ec90611c09565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031681565b6007546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600860209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b600082820183811015610d7e5760405162461bcd60e51b81526004016104ec90611a80565b3390565b6001600160a01b03831661106c5760405162461bcd60e51b81526004016104ec90611bc5565b6001600160a01b0382166110925760405162461bcd60e51b81526004016104ec90611a3e565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906110ed908590611c8f565b60405180910390a3505050565b816001600160a01b0316836001600160a01b03161415801561112557506000816001600160601b0316115b15610a5c576001600160a01b038316156111dd576001600160a01b03831660009081526009602052604081205463ffffffff1690816111655760006111a4565b6001600160a01b0385166000908152600860209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b905060006111cb8285604051806060016040528060288152602001611d5b6028913961155f565b90506111d986848484611596565b5050505b6001600160a01b03821615610a5c576001600160a01b03821660009081526009602052604081205463ffffffff169081611218576000611257565b6001600160a01b0384166000908152600860209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b9050600061127e8285604051806060016040528060278152602001611e186027913961179f565b905061128c85848484611596565b505050505050565b6001600160a01b0383166112ba5760405162461bcd60e51b81526004016104ec90611b80565b6001600160a01b0382166112e05760405162461bcd60e51b81526004016104ec906119fb565b6112eb838383610a5c565b61132881604051806060016040528060268152602001611da6602691396001600160a01b03861660009081526020819052604090205491906113a9565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611357908261101d565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110ed908590611c8f565b600081848411156113cd5760405162461bcd60e51b81526004016104ec91906119a8565b505050900390565b6001600160a01b0382166113fb5760405162461bcd60e51b81526004016104ec90611c58565b61140760008383610a5c565b600254611414908261101d565b6002556001600160a01b03821660009081526020819052604090205461143a908261101d565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610ccf908590611c8f565b6001600160a01b0382166114af5760405162461bcd60e51b81526004016104ec90611b3f565b6114bb82600083610a5c565b6114f881604051806060016040528060228152602001611d39602291396001600160a01b03851660009081526020819052604090205491906113a9565b6001600160a01b03831660009081526020819052604090205560025461151e90826117db565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610ccf908590611c8f565b6000836001600160601b0316836001600160601b0316111582906113cd5760405162461bcd60e51b81526004016104ec91906119a8565b60006115ba43604051806060016040528060348152602001611d056034913961181d565b905060008463ffffffff1611801561160357506001600160a01b038516600090815260086020908152604080832063ffffffff6000198901811685529252909120548282169116145b15611662576001600160a01b0385166000908152600860209081526040808320600019880163ffffffff168452909152902080546fffffffffffffffffffffffff000000001916600160201b6001600160601b03851602179055611701565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152600883528781208c871682528352878120965187549451909516600160201b026fffffffffffffffffffffffff000000001995871663ffffffff19958616179590951694909417909555938252600990935292909220805460018801909316929091169190911790555b846001600160a01b03167f3eaa1c4be29b4a4c60e00300b5a17a8ec6c982b5b0ad5870cc84ebdc3b24d68e848460405161173c929190611cea565b60405180910390a25050505050565b6117558282611489565b6106cf82611761611042565b6105b384604051806060016040528060248152602001611df4602491396001600160a01b038816600090815260016020526040812090610592611042565b6000838301826001600160601b0380871690831610156117d25760405162461bcd60e51b81526004016104ec91906119a8565b50949350505050565b6000610d7e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506113a9565b600081600160201b84106118445760405162461bcd60e51b81526004016104ec91906119a8565b509192915050565b80356001600160a01b03811681146107fe57600080fd5b600060208284031215611874578081fd5b610d7e8261184c565b6000806040838503121561188f578081fd5b6118988361184c565b91506118a66020840161184c565b90509250929050565b6000806000606084860312156118c3578081fd5b6118cc8461184c565b92506118da6020850161184c565b9150604084013590509250925092565b600080604083850312156118fc578182fd5b6119058361184c565b946020939093013593505050565b60008060408385031215611925578182fd5b61192e8361184c565b9150602083013563ffffffff81168114611946578182fd5b809150509250929050565b600060208284031215611962578081fd5b81518015158114610d7e578182fd5b600060208284031215611982578081fd5b5035919050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602080835283518082850152825b818110156119d4578581018301518582016040015282016119b8565b818111156119e55783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526027908201527f484552443a3a6765745072696f72566f7465733a206e6f742079657420646574604082015266195c9b5a5b995960ca1b606082015260800190565b60208082526021908201527f4f6e6c79206275636b20706f6f6c732063616e206d696e74206e6577204845526040820152601160fa1b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252602f908201527f596f7520617265206e6f7420616e206f776e6572206f722074686520676f766560408201526e726e616e63652074696d656c6f636b60881b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b63ffffffff91909116815260200190565b63ffffffff9290921682526001600160601b0316602082015260400190565b60ff91909116815260200190565b6001600160601b0391909116815260200190565b6001600160601b039283168152911660208201526040019056fe484552443a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365484552443a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773706f6f6c5f6275726e5f66726f6d206e657720766f74657320756e646572666c6f777345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e6365484552443a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f777345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cc8f11834d5a7a7945d59a0ee2f6830cd4ef757b0fff3e7889349c55d19d50de64736f6c63430007060033484552443a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000d27f4dc61fa734e3f375fe5122df04f242131fe80000000000000000000000009c3d2eb5647c8fda7b27ef13b4d815c3ae9951c80000000000000000000000000000000000000000000000000000000000000004486572640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044845524400000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000d27f4dc61fa734e3f375fe5122df04f242131fe80000000000000000000000009c3d2eb5647c8fda7b27ef13b4d815c3ae9951c80000000000000000000000000000000000000000000000000000000000000004486572640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044845524400000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Herd
Arg [1] : _symbol (string): HERD
Arg [2] : _genesis_supply (uint256): 100000000000000000000000000
Arg [3] : buck_contract_address (address): 0xd27f4dc61fa734e3f375fe5122df04f242131fe8
Arg [4] : _timelock_address (address): 0x9c3d2eb5647c8fda7b27ef13b4d815c3ae9951c8
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [3] : 000000000000000000000000d27f4dc61fa734e3f375fe5122df04f242131fe8
Arg [4] : 0000000000000000000000009c3d2eb5647c8fda7b27ef13b4d815c3ae9951c8
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4865726400000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4845524400000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
36117:10207:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36266:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7045:169;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38419:124::-;;;;;;:::i;:::-;;:::i;:::-;;6468:100;;;:::i;:::-;;;;;;;:::i;40715:463::-;;;;;;:::i;:::-;;:::i;36524:32::-;;;:::i;36291:35::-;;;:::i;:::-;;;;;;;:::i;7551:218::-;;;;;;:::i;:::-;;:::i;38551:95::-;;;;;;:::i;:::-;;:::i;8987:91::-;;;;;;:::i;:::-;;:::i;40210:105::-;;;:::i;36339:39::-;;;:::i;38262:149::-;;;;;;:::i;:::-;;:::i;36969:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6576:119::-;;;;;;:::i;:::-;;:::i;42084:1218::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9086:295::-;;;;;;:::i;:::-;;:::i;36387:28::-;;;:::i;:::-;;;;;;;:::i;36239:20::-;;;:::i;7777:269::-;;;;;;:::i;:::-;;:::i;39523:679::-;;;;;;:::i;:::-;;:::i;40386:321::-;;;;;;:::i;:::-;;:::i;41431:222::-;;;;;;:::i;:::-;;:::i;38768:676::-;;;;;;:::i;:::-;;:::i;38124:126::-;;;;;;:::i;:::-;;:::i;36422:31::-;;;:::i;36491:24::-;;;:::i;6886:151::-;;;;;;:::i;:::-;;:::i;36839:70::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;36266:18::-;;;;;;;;;;;;;;;-1:-1:-1;;36266:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7045:169::-;7128:4;7145:39;7154:12;:10;:12::i;:::-;7168:7;7177:6;7145:8;:39::i;:::-;-1:-1:-1;7202:4:0;7045:169;;;;;:::o;38419:124::-;37292:13;;-1:-1:-1;;;;;37292:13:0;37278:10;:27;;:61;;-1:-1:-1;37323:16:0;;-1:-1:-1;;;;;37323:16:0;37309:10;:30;37278:61;37270:121;;;;-1:-1:-1;;;37270:121:0;;;;;;;:::i;:::-;;;;;;;;;38505:13:::1;:30:::0;;-1:-1:-1;;;;;;38505:30:0::1;-1:-1:-1::0;;;;;38505:30:0;;;::::1;::::0;;;::::1;::::0;;38419:124::o;6468:100::-;6548:12;;6468:100;:::o;40715:463::-;40841:13;;40821:4;;-1:-1:-1;;;40841:13:0;;;;40838:120;;;40901:45;40912:6;40920:9;40938:6;40901:10;:45::i;:::-;40978:36;40988:6;40996:9;41007:6;40978:9;:36::i;:::-;41025:121;41034:6;41042:12;:10;:12::i;:::-;41056:89;41094:6;41056:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41056:19:0;;;;;;:11;:19;;;;;;41076:12;:10;:12::i;:::-;-1:-1:-1;;;;;41056:33:0;;;;;;;;;;;;-1:-1:-1;41056:33:0;;;:89;:37;:89::i;:::-;41025:8;:121::i;:::-;-1:-1:-1;41166:4:0;40715:463;;;;;:::o;36524:32::-;;;-1:-1:-1;;;36524:32:0;;;;;:::o;36291:35::-;36324:2;36291:35;:::o;7551:218::-;7639:4;7656:83;7665:12;:10;:12::i;:::-;7679:7;7688:50;7727:10;7688:11;:25;7700:12;:10;:12::i;:::-;-1:-1:-1;;;;;7688:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;7688:25:0;;;:34;;;;;;;;;;;:38;:50::i;38551:95::-;37111:12;;:35;;-1:-1:-1;;;37111:35:0;;-1:-1:-1;;;;;37111:12:0;;;;:23;;:35;;37135:10;;37111:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;37150:4;37111:43;37103:89;;;;-1:-1:-1;;;37103:89:0;;;;;;;:::i;:::-;38621:17:::1;38627:2;38631:6;38621:5;:17::i;:::-;38551:95:::0;;:::o;8987:91::-;9043:27;9049:12;:10;:12::i;:::-;9063:6;9043:5;:27::i;:::-;8987:91;:::o;40210:105::-;37292:13;;-1:-1:-1;;;;;37292:13:0;37278:10;:27;;:61;;-1:-1:-1;37323:16:0;;-1:-1:-1;;;;;37323:16:0;37309:10;:30;37278:61;37270:121;;;;-1:-1:-1;;;37270:121:0;;;;;;;:::i;:::-;40294:13:::1;::::0;;-1:-1:-1;;;;40277:30:0;::::1;-1:-1:-1::0;;;40294:13:0;;;::::1;;;40293:14;40277:30:::0;;::::1;;::::0;;40210:105::o;36339:39::-;;;:::o;38262:149::-;37292:13;;-1:-1:-1;;;;;37292:13:0;37278:10;:27;;:61;;-1:-1:-1;37323:16:0;;-1:-1:-1;;;;;37323:16:0;37309:10;:30;37278:61;37270:121;;;;-1:-1:-1;;;37270:121:0;;;;;;;:::i;:::-;38361:12:::1;:42:::0;;-1:-1:-1;;;;;;38361:42:0::1;-1:-1:-1::0;;;;;38361:42:0;;;::::1;::::0;;;::::1;::::0;;38262:149::o;36969:49::-;;;;;;;;;;;;;;;:::o;6576:119::-;-1:-1:-1;;;;;6669:18:0;;6642:7;6669:18;;;;;;;;;;;6576:119;;;;:::o;42084:1218::-;42163:6;42204:12;42190:11;:26;42182:78;;;;-1:-1:-1;;;42182:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42295:23:0;;42273:19;42295:23;;;:14;:23;;;;;;;;42333:17;42329:58;;42374:1;42367:8;;;;;42329:58;-1:-1:-1;;;;;42447:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;42468:16:0;;42447:38;;;;;;;;;:48;;:63;-1:-1:-1;42443:147:0;;-1:-1:-1;;;;;42534:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;42555:16:0;;;;42534:38;;;;;;;;:44;-1:-1:-1;;;42534:44:0;;-1:-1:-1;;;;;42534:44:0;;-1:-1:-1;42527:51:0;;42443:147;-1:-1:-1;;;;;42651:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;42647:88:0;;;42722:1;42715:8;;;;;42647:88;42747:12;-1:-1:-1;;42789:16:0;;42816:428;42831:5;42823:13;;:5;:13;;;42816:428;;;42853:13;42895:1;42877:19;42878:13;;;42877:19;-1:-1:-1;;;;;42961:20:0;;42938;42961;;;:11;:20;;;;;;;;42877:19;;;;42869:27;;42961:28;;;;;;;;;;;;;42938:51;;;;;;;;;;;;;;;-1:-1:-1;;;42938:51:0;;;-1:-1:-1;;;;;42938:51:0;;;;;42869:27;-1:-1:-1;42938:51:0;43008:27;;43004:229;;;43063:8;;;;-1:-1:-1;43056:15:0;;-1:-1:-1;;;;43056:15:0;43004:229;43097:12;;:26;;;-1:-1:-1;43093:140:0;;;43152:6;43144:14;;43093:140;;;43216:1;43207:6;:10;43199:18;;43093:140;42816:428;;;;;-1:-1:-1;;;;;;43261:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;-1:-1:-1;;;;;;;;43261:33:0;;;;;-1:-1:-1;;42084:1218:0;;;;:::o;9086:295::-;9163:26;9192:84;9229:6;9192:84;;;;;;;;;;;;;;;;;:32;9202:7;9211:12;:10;:12::i;9192:32::-;:36;:84;:36;:84::i;:::-;9163:113;;9289:51;9298:7;9307:12;:10;:12::i;:::-;9321:18;9289:8;:51::i;:::-;9351:22;9357:7;9366:6;9351:5;:22::i;:::-;9086:295;;;:::o;36387:28::-;;;-1:-1:-1;;;;;36387:28:0;;:::o;36239:20::-;;;;;;;;;;;;;;;-1:-1:-1;;36239:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7777:269;7870:4;7887:129;7896:12;:10;:12::i;:::-;7910:7;7919:96;7958:15;7919:96;;;;;;;;;;;;;;;;;:11;:25;7931:12;:10;:12::i;:::-;-1:-1:-1;;;;;7919:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;7919:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;39523:679::-;37111:12;;:35;;-1:-1:-1;;;37111:35:0;;-1:-1:-1;;;;;37111:12:0;;;;:23;;:35;;37135:10;;37111:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;37150:4;37111:43;37103:89;;;;-1:-1:-1;;;37103:89:0;;;;;;;:::i;:::-;39617:13:::1;::::0;-1:-1:-1;;;39617:13:0;::::1;;;39614:462;;;39646:54;39657:9;39676:4;39690:8;39646:10;:54::i;:::-;39757:4;39715:16;39734:29:::0;;;:14:::1;:29;::::0;;;;;::::1;;::::0;39797:13;:67:::1;;39863:1;39797:67;;;39833:4;39813:26;::::0;;;:11:::1;:26;::::0;;;;;;;-1:-1:-1;;39840:13:0;;39813:41:::1;;::::0;;;;;;;:47;-1:-1:-1;;;39813:47:0;::::1;-1:-1:-1::0;;;;;39813:47:0::1;39797:67;39778:86;;39879:16;39898:73;39904:9;39922:8;39898:73;;;;;;;;;;;;;;;;;:5;:73::i;:::-;39879:92;;39986:64;40011:4;40018:9;40029;40040;39986:16;:64::i;:::-;39614:462;;;;40096:36;40112:9;40123:8;40096:15;:36::i;:::-;40178:4;-1:-1:-1::0;;;;;40148:46:0::1;40159:9;-1:-1:-1::0;;;;;40148:46:0::1;;40185:8;40148:46;;;;;;:::i;:::-;;;;;;;;39523:679:::0;;:::o;40386:321::-;40492:13;;40472:4;;-1:-1:-1;;;40492:13:0;;;;40489:126;;;40552:51;40563:12;:10;:12::i;:::-;40577:9;40595:6;40552:10;:51::i;:::-;40635:42;40645:12;:10;:12::i;:::-;40659:9;40670:6;40635:9;:42::i;41431:222::-;-1:-1:-1;;;;;41537:23:0;;41496:6;41537:23;;;:14;:23;;;;;;;;41578:16;:67;;41644:1;41578:67;;;-1:-1:-1;;;;;41597:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;41618:16:0;;41597:38;;;;;;;;;:44;-1:-1:-1;;;41597:44:0;;-1:-1:-1;;;;;41597:44:0;41578:67;41571:74;41431:222;-1:-1:-1;;;41431:222:0:o;38768:676::-;37111:12;;:35;;-1:-1:-1;;;37111:35:0;;-1:-1:-1;;;;;37111:12:0;;;;:23;;:35;;37135:10;;37111:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;37150:4;37111:43;37103:89;;;;-1:-1:-1;;;37103:89:0;;;;;;;:::i;:::-;38865:13:::1;::::0;-1:-1:-1;;;38865:13:0;::::1;;;38862:460;;;38936:4;38894:16;38913:29:::0;;;:14:::1;:29;::::0;;;;;::::1;;::::0;38976:13;:67:::1;;39042:1;38976:67;;;39012:4;38992:26;::::0;;;:11:::1;:26;::::0;;;;;;;-1:-1:-1;;39019:13:0;;38992:41:::1;;::::0;;;;;;;:47;-1:-1:-1;;;38992:47:0;::::1;-1:-1:-1::0;;;;;38992:47:0::1;38976:67;38957:86;;39058:16;39077:67;39083:9;39101:8;39077:67;;;;;;;;;;;;;;;;::::0;:5:::1;:67::i;:::-;39058:86;;39159:64;39184:4;39191:9;39202;39213;39159:16;:64::i;:::-;39256:54;39275:4;39282:9;39300:8;39256:10;:54::i;:::-;38862:460;;;;39342:32;39354:9;39365:8;39342:11;:32::i;:::-;39416:9;-1:-1:-1::0;;;;;39390:46:0::1;39409:4;-1:-1:-1::0;;;;;39390:46:0::1;;39427:8;39390:46;;;;;;:::i;38124:126::-:0;37292:13;;-1:-1:-1;;;;;37292:13:0;37278:10;:27;;:61;;-1:-1:-1;37323:16:0;;-1:-1:-1;;;;;37323:16:0;37309:10;:30;37278:61;37270:121;;;;-1:-1:-1;;;37270:121:0;;;;;;;:::i;:::-;38211:16:::1;:31:::0;;-1:-1:-1;;;;;;38211:31:0::1;-1:-1:-1::0;;;;;38211:31:0;;;::::1;::::0;;;::::1;::::0;;38124:126::o;36422:31::-;;;-1:-1:-1;;;;;36422:31:0;;:::o;36491:24::-;;;-1:-1:-1;;;;;36491:24:0;;:::o;6886:151::-;-1:-1:-1;;;;;7002:18:0;;;6975:7;7002:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6886:151::o;36839:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36839:70:0;;-1:-1:-1;;;;;36839:70:0;;:::o;504:181::-;562:7;594:5;;;618:6;;;;610:46;;;;-1:-1:-1;;;610:46:0;;;;;;;:::i;95:106::-;183:10;95:106;:::o;9815:346::-;-1:-1:-1;;;;;9917:19:0;;9909:68;;;;-1:-1:-1;;;9909:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9996:21:0;;9988:68;;;;-1:-1:-1;;;9988:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10069:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;10121:32;;;;;10099:6;;10121:32;:::i;:::-;;;;;;;;9815:346;;;:::o;43463:935::-;43564:6;-1:-1:-1;;;;;43554:16:0;:6;-1:-1:-1;;;;;43554:16:0;;;:30;;;;;43583:1;43574:6;-1:-1:-1;;;;;43574:10:0;;43554:30;43550:841;;;-1:-1:-1;;;;;43605:20:0;;;43601:382;;-1:-1:-1;;;;;43665:22:0;;43646:16;43665:22;;;:14;:22;;;;;;;;;43725:13;:60;;43784:1;43725:60;;;-1:-1:-1;;;;;43741:19:0;;;;;;:11;:19;;;;;;;;-1:-1:-1;;43761:13:0;;43741:34;;;;;;;;;:40;-1:-1:-1;;;43741:40:0;;-1:-1:-1;;;;;43741:40:0;43725:60;43706:79;;43804:16;43823:68;43829:9;43840:6;43823:68;;;;;;;;;;;;;;;;;:5;:68::i;:::-;43804:87;;43910:57;43927:6;43935:9;43946;43957;43910:16;:57::i;:::-;43601:382;;;;-1:-1:-1;;;;;44003:20:0;;;43999:381;;-1:-1:-1;;;;;44063:22:0;;44044:16;44063:22;;;:14;:22;;;;;;;;;44123:13;:60;;44182:1;44123:60;;;-1:-1:-1;;;;;44139:19:0;;;;;;:11;:19;;;;;;;;-1:-1:-1;;44159:13:0;;44139:34;;;;;;;;;:40;-1:-1:-1;;;44139:40:0;;-1:-1:-1;;;;;44139:40:0;44123:60;44104:79;;44202:16;44221:67;44227:9;44238:6;44221:67;;;;;;;;;;;;;;;;;:5;:67::i;:::-;44202:86;;44307:57;44324:6;44332:9;44343;44354;44307:16;:57::i;:::-;43999:381;;;43463:935;;;:::o;8054:539::-;-1:-1:-1;;;;;8160:20:0;;8152:70;;;;-1:-1:-1;;;8152:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8241:23:0;;8233:71;;;;-1:-1:-1;;;8233:71:0;;;;;;;:::i;:::-;8317:47;8338:6;8346:9;8357:6;8317:20;:47::i;:::-;8397:71;8419:6;8397:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8397:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;8377:17:0;;;:9;:17;;;;;;;;;;;:91;;;;8502:20;;;;;;;:32;;8527:6;8502:24;:32::i;:::-;-1:-1:-1;;;;;8479:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8550:35;;;;;;;;;;8578:6;;8550:35;:::i;837:192::-;923:7;959:12;951:6;;;;943:29;;;;-1:-1:-1;;;943:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;995:5:0;;;837:192::o;8601:378::-;-1:-1:-1;;;;;8685:21:0;;8677:65;;;;-1:-1:-1;;;8677:65:0;;;;;;;:::i;:::-;8755:49;8784:1;8788:7;8797:6;8755:20;:49::i;:::-;8832:12;;:24;;8849:6;8832:16;:24::i;:::-;8817:12;:39;-1:-1:-1;;;;;8888:18:0;;:9;:18;;;;;;;;;;;:30;;8911:6;8888:22;:30::i;:::-;-1:-1:-1;;;;;8867:18:0;;:9;:18;;;;;;;;;;;:51;;;;8934:37;;8867:18;;:9;8934:37;;;;8964:6;;8934:37;:::i;9389:418::-;-1:-1:-1;;;;;9473:21:0;;9465:67;;;;-1:-1:-1;;;9465:67:0;;;;;;;:::i;:::-;9545:49;9566:7;9583:1;9587:6;9545:20;:49::i;:::-;9628:68;9651:6;9628:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9628:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;9607:18:0;;:9;:18;;;;;;;;;;:89;9722:12;;:24;;9739:6;9722:16;:24::i;:::-;9707:12;:39;9762:37;;9788:1;;-1:-1:-1;;;;;9762:37:0;;;;;;;9792:6;;9762:37;:::i;45550:165::-;45636:6;45668:1;-1:-1:-1;;;;;45663:6:0;:1;-1:-1:-1;;;;;45663:6:0;;;45671:12;45655:29;;;;;-1:-1:-1;;;45655:29:0;;;;;;;;:::i;44406:602::-;44520:18;44541:76;44548:12;44541:76;;;;;;;;;;;;;;;;;:6;:76::i;:::-;44520:97;;44647:1;44632:12;:16;;;:81;;;;-1:-1:-1;;;;;;44652:18:0;;;;;;:11;:18;;;;;;;;:61;-1:-1:-1;;44671:16:0;;44652:36;;;;;;;;;:46;:61;;;:46;;:61;44632:81;44628:313;;;-1:-1:-1;;;;;44728:18:0;;;;;;:11;:18;;;;;;;;-1:-1:-1;;44747:16:0;;44728:36;;;;;;;;;:53;;-1:-1:-1;;44728:53:0;-1:-1:-1;;;;;;;;44728:53:0;;;;;;44628:313;;;44845:33;;;;;;;;;;;;;;-1:-1:-1;;;;;44845:33:0;;;;;;;;;;-1:-1:-1;;;;;44810:18:0;;-1:-1:-1;44810:18:0;;;:11;:18;;;;;:32;;;;;;;;;;:68;;;;;;;;;-1:-1:-1;;;44810:68:0;-1:-1:-1;;44810:68:0;;;-1:-1:-1;;44810:68:0;;;;;;;;;;;;;;;44891:21;;;:14;:21;;;;;;;:40;;44810:68;44915:16;;44891:40;;;;;;;;;;;;;44628:313;44974:5;-1:-1:-1;;;;;44956:44:0;;44981:8;44991;44956:44;;;;;;;:::i;:::-;;;;;;;;44406:602;;;;;:::o;10169:240::-;10249:22;10255:7;10264:6;10249:5;:22::i;:::-;10282:119;10291:7;10300:12;:10;:12::i;:::-;10314:86;10353:6;10314:86;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10314:20:0;;;;;;:11;:20;;;;;;10335:12;:10;:12::i;45354:188::-;45440:6;45470:5;;;45502:12;-1:-1:-1;;;;;45494:6:0;;;;;;;;45486:29;;;;-1:-1:-1;;;45486:29:0;;;;;;;;:::i;:::-;-1:-1:-1;45533:1:0;45354:188;-1:-1:-1;;;;45354:188:0:o;693:136::-;751:7;778:43;782:1;785;778:43;;;;;;;;;;;;;;;;;:3;:43::i;45016:161::-;45091:6;45129:12;-1:-1:-1;;;45118:9:0;;45110:32;;;;-1:-1:-1;;;45110:32:0;;;;;;;;:::i;:::-;-1:-1:-1;45167:1:0;;45016:161;-1:-1:-1;;45016:161:0:o;14:175:1:-;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:198;;306:2;294:9;285:7;281:23;277:32;274:2;;;327:6;319;312:22;274:2;355:31;376:9;355:31;:::i;397:274::-;;;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;575:31;596:9;575:31;:::i;:::-;565:41;;625:40;661:2;650:9;646:18;625:40;:::i;:::-;615:50;;484:187;;;;;:::o;676:342::-;;;;822:2;810:9;801:7;797:23;793:32;790:2;;;843:6;835;828:22;790:2;871:31;892:9;871:31;:::i;:::-;861:41;;921:40;957:2;946:9;942:18;921:40;:::i;:::-;911:50;;1008:2;997:9;993:18;980:32;970:42;;780:238;;;;;:::o;1023:266::-;;;1152:2;1140:9;1131:7;1127:23;1123:32;1120:2;;;1173:6;1165;1158:22;1120:2;1201:31;1222:9;1201:31;:::i;:::-;1191:41;1279:2;1264:18;;;;1251:32;;-1:-1:-1;;;1110:179:1:o;1294:372::-;;;1422:2;1410:9;1401:7;1397:23;1393:32;1390:2;;;1443:6;1435;1428:22;1390:2;1471:31;1492:9;1471:31;:::i;:::-;1461:41;;1552:2;1541:9;1537:18;1524:32;1596:10;1589:5;1585:22;1578:5;1575:33;1565:2;;1627:6;1619;1612:22;1565:2;1655:5;1645:15;;;1380:286;;;;;:::o;1671:297::-;;1791:2;1779:9;1770:7;1766:23;1762:32;1759:2;;;1812:6;1804;1797:22;1759:2;1849:9;1843:16;1902:5;1895:13;1888:21;1881:5;1878:32;1868:2;;1929:6;1921;1914:22;1973:190;;2085:2;2073:9;2064:7;2060:23;2056:32;2053:2;;;2106:6;2098;2091:22;2053:2;-1:-1:-1;2134:23:1;;2043:120;-1:-1:-1;2043:120:1:o;2168:203::-;-1:-1:-1;;;;;2332:32:1;;;;2314:51;;2302:2;2287:18;;2269:102::o;2592:187::-;2757:14;;2750:22;2732:41;;2720:2;2705:18;;2687:92::o;3005:603::-;;3146:2;3175;3164:9;3157:21;3207:6;3201:13;3250:6;3245:2;3234:9;3230:18;3223:34;3275:4;3288:140;3302:6;3299:1;3296:13;3288:140;;;3397:14;;;3393:23;;3387:30;3363:17;;;3382:2;3359:26;3352:66;3317:10;;3288:140;;;3446:6;3443:1;3440:13;3437:2;;;3516:4;3511:2;3502:6;3491:9;3487:22;3483:31;3476:45;3437:2;-1:-1:-1;3592:2:1;3571:15;-1:-1:-1;;3567:29:1;3552:45;;;;3599:2;3548:54;;3126:482;-1:-1:-1;;;3126:482:1:o;3613:399::-;3815:2;3797:21;;;3854:2;3834:18;;;3827:30;3893:34;3888:2;3873:18;;3866:62;-1:-1:-1;;;3959:2:1;3944:18;;3937:33;4002:3;3987:19;;3787:225::o;4017:398::-;4219:2;4201:21;;;4258:2;4238:18;;;4231:30;4297:34;4292:2;4277:18;;4270:62;-1:-1:-1;;;4363:2:1;4348:18;;4341:32;4405:3;4390:19;;4191:224::o;4420:351::-;4622:2;4604:21;;;4661:2;4641:18;;;4634:30;4700:29;4695:2;4680:18;;4673:57;4762:2;4747:18;;4594:177::o;4776:403::-;4978:2;4960:21;;;5017:2;4997:18;;;4990:30;5056:34;5051:2;5036:18;;5029:62;-1:-1:-1;;;5122:2:1;5107:18;;5100:37;5169:3;5154:19;;4950:229::o;5184:397::-;5386:2;5368:21;;;5425:2;5405:18;;;5398:30;5464:34;5459:2;5444:18;;5437:62;-1:-1:-1;;;5530:2:1;5515:18;;5508:31;5571:3;5556:19;;5358:223::o;5586:397::-;5788:2;5770:21;;;5827:2;5807:18;;;5800:30;5866:34;5861:2;5846:18;;5839:62;-1:-1:-1;;;5932:2:1;5917:18;;5910:31;5973:3;5958:19;;5760:223::o;5988:401::-;6190:2;6172:21;;;6229:2;6209:18;;;6202:30;6268:34;6263:2;6248:18;;6241:62;-1:-1:-1;;;6334:2:1;6319:18;;6312:35;6379:3;6364:19;;6162:227::o;6394:400::-;6596:2;6578:21;;;6635:2;6615:18;;;6608:30;6674:34;6669:2;6654:18;;6647:62;-1:-1:-1;;;6740:2:1;6725:18;;6718:34;6784:3;6769:19;;6568:226::o;6799:411::-;7001:2;6983:21;;;7040:2;7020:18;;;7013:30;7079:34;7074:2;7059:18;;7052:62;-1:-1:-1;;;7145:2:1;7130:18;;7123:45;7200:3;7185:19;;6973:237::o;7215:355::-;7417:2;7399:21;;;7456:2;7436:18;;;7429:30;7495:33;7490:2;7475:18;;7468:61;7561:2;7546:18;;7389:181::o;7575:177::-;7721:25;;;7709:2;7694:18;;7676:76::o;7757:192::-;7931:10;7919:23;;;;7901:42;;7889:2;7874:18;;7856:93::o;7954:294::-;8154:10;8142:23;;;;8124:42;;-1:-1:-1;;;;;8202:39:1;8197:2;8182:18;;8175:67;8112:2;8097:18;;8079:169::o;8253:184::-;8425:4;8413:17;;;;8395:36;;8383:2;8368:18;;8350:87::o;8442:208::-;-1:-1:-1;;;;;8604:39:1;;;;8586:58;;8574:2;8559:18;;8541:109::o;8655:309::-;-1:-1:-1;;;;;8890:15:1;;;8872:34;;8942:15;;8937:2;8922:18;;8915:43;8815:2;8800:18;;8782:182::o
Swarm Source
ipfs://cc8f11834d5a7a7945d59a0ee2f6830cd4ef757b0fff3e7889349c55d19d50de
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.