Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- DTXChef
- Optimization enabled
- true
- Compiler version
- v0.8.20+commit.a1b79de6
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2023-09-29T08:42:30.327508Z
Constructor Arguments
0x000000000000000000000000faac6a85c3e123ab2cf7669b1024f146cfef0b38000000000000000000000000e87c806f8afa1ce543ab3c44d1c4b130b83574ce
Arg [0] (address) : 0xfaac6a85c3e123ab2cf7669b1024f146cfef0b38
Arg [1] (address) : 0xe87c806f8afa1ce543ab3c44d1c4b130b83574ce
Contract source code
// File: MAINNET/PulseDAO-main (8)/PulseDAO-main/contracts/interface/IGovernor.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity >=0.7.0 <0.9.0;
interface IGovernor {
event EnforceGovernor(address _newGovernor, address indexed enforcer);
event GiveRolloverBonus(
address recipient,
uint256 amount,
address poolInto
);
event Harvest(address indexed sender, uint256 callFee);
event Multisig(
address signer,
address newGovernor,
bool sign,
uint256 idToVoteFor
);
event SetInflation(uint256 rewardPerBlock);
event TransferOwner(address newOwner, uint256 timestamp);
function acPool1() external view returns (address);
function acPool1ID() external view returns (uint256);
function acPool2() external view returns (address);
function acPool2ID() external view returns (uint256);
function acPool3() external view returns (address);
function acPool3ID() external view returns (uint256);
function acPool4() external view returns (address);
function acPool4ID() external view returns (uint256);
function acPool5() external view returns (address);
function acPool5ID() external view returns (uint256);
function acPool6() external view returns (address);
function acPool6ID() external view returns (uint256);
function allocationPercentages(uint256) external view returns (uint256);
function basicContract() external view returns (address);
function beginMintingPhase() external;
function burnTokens(uint256 amount) external;
function changeGovernorActivated() external view returns (bool);
function changeGovernorForSecurityPriorMintingBegins(address _newGovernor)
external;
function consensusContract() external view returns (address);
function costToVote() external view returns (uint256);
function creditContract() external view returns (address);
function delayBeforeEnforce() external view returns (uint256);
function eligibleNewGovernor() external view returns (address);
function enforceGovernor() external;
function eventFibonacceningActive() external view returns (bool);
function farmContract() external view returns (address);
function fibonacceningContract() external view returns (address);
function getRollBonus(address _bonusForPool)
external
view
returns (uint256);
function governorRejected() external;
function harvest() external;
function hexVault() external view returns (address);
function incVault() external view returns (address);
function isInflationStatic() external view returns (bool);
function lastHarvestedTime() external view returns (uint256);
function lastRegularReward() external view returns (uint256);
function masterchef() external view returns (address);
function maxDelay() external view returns (uint256);
function minDelay() external view returns (uint256);
function mintingPhaseLaunchDate() external view returns (uint256);
function newGovernorBlockDelay() external view returns (uint256);
function newGovernorRequestBlock() external view returns (uint256);
function nftAllocationContract() external view returns (address);
function nftStakingContract() external view returns (address);
function nftStakingPoolID() external view returns (uint256);
function nftWallet() external view returns (address);
function pendingHarvestRewards() external view returns (uint256);
function plsVault() external view returns (address);
function plsxVault() external view returns (address);
function postGrandFibIncreaseCount() external;
function rebalancePools() external;
function referralBonus() external view returns (uint256);
function rememberReward() external;
function rewardContract() external view returns (address);
function senateContract() external view returns (address);
function setActivateFibonaccening(bool _arg) external;
function setCallFee(address _acPool, uint256 _newCallFee) external;
function setGovernorTax(uint256 _amount) external;
function setInflation(uint256 rewardPerBlock) external;
function setNewGovernor(address beneficiary) external;
function setPool(
uint256 _pid,
uint256 _allocPoint,
bool _withUpdate
) external;
function setThresholdFibonaccening(uint256 newThreshold) external;
function stakeRolloverBonus(
address _toAddress,
address _depositToPool,
uint256 _bonusToPay,
uint256 _stakeID
) external;
function thresholdFibonaccening() external view returns (uint256);
function token() external view returns (address);
function tokenDistributionContract() external view returns (address);
function tokenDistributionContractExtraPenalty()
external
view
returns (address);
function tokensSentForReferralRewards() external view returns (uint256);
function totalFibonacciEventsAfterGrand() external view returns (uint256);
function transferCollectedFees(address _tokenContract) external;
function transferRewardBoostThreshold() external;
function transferToReferralContract() external;
function transferToTreasury(uint256 amount) external;
function treasuryRequest(
address _tokenAddr,
address _recipient,
uint256 _amountToSend
) external;
function treasuryWallet() external view returns (address);
function tshareVault() external view returns (address);
function updateCostToVote(uint256 newCostToVote) external;
function updateDelayBeforeEnforce(uint256 newDelay) external;
function updateDelayBetweenEvents(uint256 _amount) external;
function updateGrandEventLength(uint256 _amount) external;
function updateRolloverBonus(address _forPool, uint256 _bonus) external;
function updateVault(uint256 _type, uint256 _amount) external;
}
// File: MAINNET/PulseDAO-main (8)/PulseDAO-main/contracts/interface/ISenate.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity >=0.7.0 <0.9.0;
pragma experimental ABIEncoderV2;
interface ISenate {
event AddSenator(address senator);
event AddVote(address voter, uint256 proposalId);
event RemoveSenator(address senator);
event RemoveVote(address voter, uint256 proposalId);
function addSenator(address _newSenator) external;
function addedSenator(address) external view returns (bool);
function expandSenate(address _newSenator) external;
function expellSenator(address _senator) external;
function grantVotingCredit() external;
function initializeSenators(address[] memory _senators) external;
function isSenator(address) external view returns (bool);
function lastTotalCreditGiven() external view returns (uint256);
function lastVotingCreditGrant() external view returns (uint256);
function massAdd(address[] memory _senators) external;
function maxSenators() external view returns (uint256);
function minSenators() external view returns (uint256);
function multiCall()
external
view
returns (
address[] memory,
uint256[][] memory,
uint256[] memory,
uint256,
uint256[] memory
);
function owner() external view returns (address);
function removeVote(uint256 proposalId) external;
function selfReplaceSenator(address _newSenator) external;
function senatorCount() external view returns (uint256);
function senatorVotes(address, uint256) external view returns (uint256);
function senators(uint256) external view returns (address);
function setSenatorCount(uint256 _min, uint256 _max) external;
function toUint(address self) external pure returns (uint256);
function token() external view returns (address);
function vetoProposal(
uint256 consensusProposalId,
uint256 treasuryProposalId
) external;
function viewSenators() external view returns (address[] memory);
function vote(uint256 proposalId) external;
function votesForProposal(uint256) external view returns (uint256);
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"senator","type":"address"}],"name":"AddSenator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"AddVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"senator","type":"address"}],"name":"RemoveSenator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"RemoveVote","type":"event"},{"inputs":[{"internalType":"address","name":"_newSenator","type":"address"}],"name":"addSenator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addedSenator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newSenator","type":"address"}],"name":"expandSenate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_senator","type":"address"}],"name":"expellSenator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"grantVotingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_senators","type":"address[]"}],"name":"initializeSenators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSenator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTotalCreditGiven","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastVotingCreditGrant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_senators","type":"address[]"}],"name":"massAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSenators","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSenators","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiCall","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[][]","name":"","type":"uint256[][]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"removeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSenator","type":"address"}],"name":"selfReplaceSenator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"senatorCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"senatorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"senators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setSenatorCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"self","type":"address"}],"name":"toUint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"consensusProposalId","type":"uint256"},{"internalType":"uint256","name":"treasuryProposalId","type":"uint256"}],"name":"vetoProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewSenators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"votesForProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
*/
// File: MAINNET/PulseDAO-main (8)/PulseDAO-main/contracts/interface/IDTX.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;
interface IDTX {
error ERC20InsufficientAllowance(
address spender,
uint256 allowance,
uint256 needed
);
error ERC20InsufficientBalance(
address sender,
uint256 balance,
uint256 needed
);
error ERC20InvalidApprover(address approver);
error ERC20InvalidReceiver(address receiver);
error ERC20InvalidSender(address sender);
error ERC20InvalidSpender(address spender);
error OwnableInvalidOwner(address owner);
error OwnableUnauthorizedAccount(address account);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
event Transfer(address indexed from, address indexed to, uint256 value);
function MAX_SUPPLY() external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function burn(uint256 value) external;
function burnFrom(address account, uint256 value) external;
function burnToken(address account, uint256 amount) external returns (bool);
function decimals() external view returns (uint8);
function governor() external view returns (address);
function masterchefAddress() external view returns (address);
function mint(address to, uint256 amount) external;
function name() external view returns (string memory);
function owner() external view returns (address);
function rebrandName(string memory _newName) external;
function rebrandSymbol(string memory _newSymbol) external;
function renounceOwnership() external;
function symbol() external view returns (string memory);
function totalSupply() external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function transferOwnership(address newOwner) external;
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"value","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":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchefAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newName","type":"string"}],"name":"rebrandName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newSymbol","type":"string"}],"name":"rebrandSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/
// File: @openzeppelin/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: MAINNET/PulseDAO-main (8)/PulseDAO-main/contracts/masterchef.sol
pragma solidity 0.8.20;
contract DTXChef is Ownable {
using SafeMath for uint256;
// Info of each pool.
struct PoolInfo { // Address of LP token contract.
uint256 allocPoint; // How many allocation points assigned to this pool. DTXs to distribute per block.
uint256 lastRewardBlock; // Last block number that DTXs distribution occurs.
address participant; // participating contract
}
// The DTX TOKEN!
IDTX public dtx;
// Dev address.
address public devaddr;
//portion of inflation goes to the decentralized governance contract
uint256 public governorFee = 618; //6.18%
// DTX tokens created per block.
uint256 public DTXPerBlock = 850 * 1e18; // start at 850 tokens per block (*roughly* 50,000 tokens per 10minutes; Bitcoin started with 50 BTC per 10minutes)
// Deposit Fee address
address public feeAddress;
bool maxSupplyReached = false;
// Total tokens published to senate
uint256 public fairTokensPublishedToSenate;
// Tokens already accounted for as rewards to senate
uint256 public totalCreditRewardsAtLastFairMint;
// Info of each pool.
PoolInfo[] public poolInfo;
// User Credit (can publish such amount of tokens)
mapping(address => uint256) public credit;
// Does Pool Already Exist?
mapping(address => bool) public existingParticipant;
// Total allocation points. Must be the sum of all allocation points in all pools.
uint256 public totalAllocPoint = 0;
// The block number when DTX mining starts.
uint256 public startBlock = 99999999; // arbitrary date ( is updated when minting phase begins )
// Keep track of total credit given
uint256 public totalCreditRewards;
// Keep track of principal burned
uint256 public totalPrincipalBurned;
// Keep track of total tokens published (by users)
uint256 public totalPublished;
bool public senatorRewards = true;
// can burn tokens without allowance
mapping(address => bool) public trustedContract;
//makes it easier to verify(without event logs)
uint256 public trustedContractCount;
event UpdateEmissions(address indexed user, uint256 newEmissions);
event TrustedContract(address contractAddress, bool setting);
event TransferCredit(address from, address to, uint256 amount);
constructor(
IDTX _DTX,
address _airdropFull
) {
dtx = _DTX;
devaddr = msg.sender;
feeAddress = msg.sender;
credit[_airdropFull] = 1080000000 * 1e18;
totalCreditRewards = 1080000000 * 1e18;
}
function publishTokens(address _to, uint256 _amount) external {
require(credit[msg.sender] >= _amount, "Insufficient credit");
credit[msg.sender] = credit[msg.sender] - _amount;
totalPublished+=_amount;
dtx.mint(_to, _amount);
}
function burn(address _from, uint256 _amount) external returns (bool) {
require(trustedContract[msg.sender], "only trusted contracts");
require(dtx.burnToken(_from, _amount), "burn failed");
credit[msg.sender] = credit[msg.sender] + _amount;
totalPrincipalBurned+= _amount;
return true;
}
function massAdd(uint256[] calldata _allocPoint, address[] calldata _participant, bool[] calldata _withUpdate) external {
require(_allocPoint.length == _participant.length && _allocPoint.length == _withUpdate.length);
for(uint i=0; i < _allocPoint.length; i++) {
add(_allocPoint[i], _participant[i], _withUpdate[i]);
}
}
// In case pools are changed (on migration old contract transfers it's credit to the new one)
function transferCredit(address _to, uint256 _amount) external {
require(credit[msg.sender] >= _amount, "insufficient credit for transfer!");
credit[msg.sender] = credit[msg.sender] - _amount;
credit[_to] = credit[_to] + _amount;
emit TransferCredit(msg.sender, _to, _amount);
}
function fairMintSenate() external {
require(senatorRewards, "senator rewards are turned off");
require(block.number > startBlock, "Must wait until minting phase begins!");
address[] memory senators = ISenate(IGovernor(owner()).senateContract()).viewSenators();
uint256 _senatorRewardAmount;
if(senators.length <= 100) {
_senatorRewardAmount = 100; // 0.01%
} else {
_senatorRewardAmount = 10000 / senators.length; // 1% shared between all the senators
}
uint256 _amount = ((totalCreditRewards - totalCreditRewardsAtLastFairMint) * _senatorRewardAmount) / 1000000;
for(uint i=0; i < senators.length; i++) {
credit[senators[i]]+= _amount;
}
fairTokensPublishedToSenate+= senators.length * _amount;
totalCreditRewards+= senators.length * _amount;
totalCreditRewardsAtLastFairMint = totalCreditRewards;
}
// renounce rewards once maximum supply would be breached
// if there is an "overflow", tokens can simply be burned from the governing contract
function renounceRewards() external {
require(virtualTotalSupply() >= dtx.MAX_SUPPLY(), "Max supply not yet reached!");
governorFee = 0;
massUpdatePools();
DTXPerBlock = 0;
maxSupplyReached = true;
emit UpdateEmissions(tx.origin, 0);
}
// Update the given pool's XPD allocation point and deposit fee. Can only be called by the owner.
function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) external onlyOwner {
if (_withUpdate) {
massUpdatePools();
}
totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
poolInfo[_pid].allocPoint = _allocPoint;
}
function startPublishing(uint256 _pid, address _participant, uint256 _alloc) external onlyOwner {
require(poolInfo[_pid].allocPoint == 0 && poolInfo[_pid].participant == address(0), "already earning");
updatePool(_pid);
poolInfo[_pid].participant = _participant;
poolInfo[_pid].allocPoint = _alloc;
totalAllocPoint = totalAllocPoint.add(_alloc);
}
function stopPublishing(uint256 _pid) external onlyOwner {
updatePool(_pid);
poolInfo[_pid].participant = address(0);
totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint);
poolInfo[_pid].allocPoint = 0;
}
//only owner can set trusted Contracts
function setTrustedContract(address _contractAddress, bool _setting) external onlyOwner {
if(trustedContract[_contractAddress] != _setting) {
trustedContract[_contractAddress] = _setting;
_setting ? trustedContractCount++ : trustedContractCount--;
emit TrustedContract(_contractAddress, _setting);
}
}
function setGovernorFee(uint256 _amount) external onlyOwner {
require(_amount <= 1000 && _amount >= 0);
governorFee = _amount;
}
// Update dev address by the previous dev.
function dev(address _devaddr) external onlyOwner {
devaddr = _devaddr;
}
function setFeeAddress(address _feeAddress) external onlyOwner {
feeAddress = _feeAddress;
}
//Pancake has to add hidden dummy pools inorder to alter the emission, here we make it simple and transparent to all.
function updateEmissionRate(uint256 _DTXPerBlock) external onlyOwner {
if(!maxSupplyReached) {
massUpdatePools();
DTXPerBlock = _DTXPerBlock;
} else {
DTXPerBlock = 0;
}
emit UpdateEmissions(tx.origin, _DTXPerBlock);
}
// Once Merkle Tree Root is submitted, start block is updated
function updateStartBlock(uint256 _startBlock) external onlyOwner {
require(block.number < startBlock, "already started");
startBlock = _startBlock;
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
poolInfo[pid].lastRewardBlock = _startBlock;
}
}
//For flexibility(can transfer to new masterchef if need be!)
function tokenChangeOwnership(address _newOwner) external onlyOwner {
dtx.transferOwnership(_newOwner);
}
function rewardSenators(bool _e) external onlyOwner {
senatorRewards = _e;
}
// Update reward variables for all pools. Be careful of gas spending!
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
// Update reward variables of the given pool to be up-to-date.
function updatePool(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
if (block.number <= pool.lastRewardBlock) {
return;
}
if (pool.participant == address(0) || pool.allocPoint == 0) {
pool.lastRewardBlock = block.number;
return;
}
uint256 multiplier = block.number.sub(pool.lastRewardBlock);
uint256 dtxReward = multiplier.mul(DTXPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
dtx.mint(devaddr, dtxReward.mul(governorFee).div(10000));
credit[pool.participant] = credit[pool.participant] + dtxReward;
totalCreditRewards+=dtxReward;
pool.lastRewardBlock = block.number;
}
// Add a new lp to the pool. Can only be called by the owner.
function add(uint256 _allocPoint, address _participant, bool _withUpdate) public onlyOwner {
require(!existingParticipant[_participant], "contract already participating");
if (_withUpdate) {
massUpdatePools();
}
uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
totalAllocPoint = totalAllocPoint.add(_allocPoint);
existingParticipant[_participant] = true;
poolInfo.push(PoolInfo({
allocPoint: _allocPoint,
lastRewardBlock: lastRewardBlock,
participant: _participant
}));
}
// View function to see pending DTXs on frontend.
function pendingDtx(uint256 _pid) external view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
if (block.number > pool.lastRewardBlock && pool.participant != address(0)) {
uint256 multiplier = block.number.sub(pool.lastRewardBlock);
uint256 dtxReward = multiplier.mul(DTXPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
return dtxReward;
}
return 0;
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
function virtualTotalSupply() public view returns (uint256) {
return (dtx.totalSupply() + totalCreditRewards + totalPrincipalBurned - totalPublished);
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_DTX","internalType":"contract IDTX"},{"type":"address","name":"_airdropFull","internalType":"address"}]},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"TransferCredit","inputs":[{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TrustedContract","inputs":[{"type":"address","name":"contractAddress","internalType":"address","indexed":false},{"type":"bool","name":"setting","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateEmissions","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"newEmissions","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"DTXPerBlock","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"add","inputs":[{"type":"uint256","name":"_allocPoint","internalType":"uint256"},{"type":"address","name":"_participant","internalType":"address"},{"type":"bool","name":"_withUpdate","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burn","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"credit","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"dev","inputs":[{"type":"address","name":"_devaddr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"devaddr","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDTX"}],"name":"dtx","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"existingParticipant","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"fairMintSenate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"fairTokensPublishedToSenate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"feeAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"governorFee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"massAdd","inputs":[{"type":"uint256[]","name":"_allocPoint","internalType":"uint256[]"},{"type":"address[]","name":"_participant","internalType":"address[]"},{"type":"bool[]","name":"_withUpdate","internalType":"bool[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"massUpdatePools","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingDtx","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"allocPoint","internalType":"uint256"},{"type":"uint256","name":"lastRewardBlock","internalType":"uint256"},{"type":"address","name":"participant","internalType":"address"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"poolLength","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"publishTokens","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRewards","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rewardSenators","inputs":[{"type":"bool","name":"_e","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"senatorRewards","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_allocPoint","internalType":"uint256"},{"type":"bool","name":"_withUpdate","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeAddress","inputs":[{"type":"address","name":"_feeAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGovernorFee","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTrustedContract","inputs":[{"type":"address","name":"_contractAddress","internalType":"address"},{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"startBlock","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"startPublishing","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_participant","internalType":"address"},{"type":"uint256","name":"_alloc","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stopPublishing","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"tokenChangeOwnership","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalAllocPoint","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalCreditRewards","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalCreditRewardsAtLastFairMint","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalPrincipalBurned","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalPublished","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferCredit","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"trustedContract","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"trustedContractCount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateEmissionRate","inputs":[{"type":"uint256","name":"_DTXPerBlock","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePool","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateStartBlock","inputs":[{"type":"uint256","name":"_startBlock","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"virtualTotalSupply","inputs":[]}]
Contract Creation Code
0x608060405261026a600355682e141ea081ca0800006004556005805460ff60a01b191690555f600b556305f5e0ff600c556010805460ff1916600117905534801562000049575f80fd5b5060405162001e5738038062001e578339810160408190526200006c916200013c565b6200007733620000d5565b600180546001600160a01b039384166001600160a01b0319918216179091556002805482163390811790915560058054909216179055165f9081526009602052604090206b037d5ae550708a7f3800000090819055600d5562000179565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811462000139575f80fd5b50565b5f80604083850312156200014e575f80fd5b82516200015b8162000124565b60208401519092506200016e8162000124565b809150509250929050565b611cd080620001875f395ff3fe608060405234801561000f575f80fd5b506004361061026b575f3560e01c8063715018a61161014b578063a12428c6116100bf578063ccb09b5211610084578063ccb09b5214610522578063d37bee181461052a578063d49e77cd14610533578063d5d44d8014610546578063f2fde38b14610565578063fac2b9ba14610578575f80fd5b8063a12428c6146104c3578063a3d7a339146104d6578063b2ca2f06146104e9578063b6ec0561146104fc578063cc58a6bb1461050f575f80fd5b80638d88a90e116101105780638d88a90e146104595780638da5cb5b1461046c5780638e24a4631461047c57806398b838081461049e5780639cc34559146104a75780639dc29fac146104b0575f80fd5b8063715018a61461040057806376a9e32e146104085780638061f1321461041b57806380d6806e1461043d5780638705fcd414610446575f80fd5b8063387473aa116101e25780635be4d442116101a75780635be4d442146103ad5780635c28afbb146103c05780635d91d76a146103c9578063624eb438146103dc578063630b5ba1146103e557806364482f79146103ed575f80fd5b8063387473aa14610355578063412753581461035d57806348cd4cb11461038857806351eb05a6146103915780635494d983146103a4575f80fd5b8063145192981161023357806314519298146102d35780631526fe27146102dc57806317caf6f1146103135780631eaaa0451461031c57806320c689261461032f5780632a98027514610342575f80fd5b806303cfa7d91461026f578063081e3eda146102845780630ba84cd21461029b5780631360a0ca146102ae57806313aecab1146102cb575b5f80fd5b61028261027d36600461186f565b61058b565b005b6008545b6040519081526020015b60405180910390f35b6102826102a936600461186f565b61063e565b6010546102bb9060ff1681565b6040519015158152602001610292565b6102886106a6565b610288600f5481565b6102ef6102ea36600461186f565b610747565b6040805193845260208401929092526001600160a01b031690820152606001610292565b610288600b5481565b61028261032a3660046118a7565b610781565b61028261033d3660046118e6565b610907565b61028261035036600461191b565b610a3b565b610282610b37565b600554610370906001600160a01b031681565b6040516001600160a01b039091168152602001610292565b610288600c5481565b61028261039f36600461186f565b610dc3565b610288600e5481565b6102826103bb366004611945565b610f5f565b610288600d5481565b6102826103d73660046119c4565b61102a565b61028860075481565b6102826110cf565b6102826103fb366004611a57565b6110f5565b61028261115a565b610282610416366004611a82565b61116d565b6102bb610429366004611a82565b60116020525f908152604090205460ff1681565b61028860035481565b610282610454366004611a82565b6111d2565b610282610467366004611a82565b6111fc565b5f546001600160a01b0316610370565b6102bb61048a366004611a82565b600a6020525f908152604090205460ff1681565b61028860065481565b61028860045481565b6102bb6104be36600461191b565b611226565b6102826104d1366004611a9d565b611379565b6102826104e436600461186f565b611394565b600154610370906001600160a01b031681565b61028861050a36600461186f565b6113b9565b61028261051d36600461191b565b61144e565b610282611556565b61028860125481565b600254610370906001600160a01b031681565b610288610554366004611a82565b60096020525f908152604090205481565b610282610573366004611a82565b611682565b61028261058636600461186f565b6116fb565b610593611794565b61059c81610dc3565b5f600882815481106105b0576105b0611ab8565b905f5260205f2090600302016002015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610611600882815481106105f8576105f8611ab8565b5f918252602090912060039091020154600b54906117ed565b600b819055505f6008828154811061062b5761062b611ab8565b5f91825260209091206003909102015550565b610646611794565b600554600160a01b900460ff166106695761065f6110cf565b600481905561066e565b5f6004555b60405181815232907fa03d71d21200bfbbb6335bb3f935b1de0d1a7244d68665ae0e6584f07754effa9060200160405180910390a250565b5f600f54600e54600d5460015f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610700573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107249190611acc565b61072e9190611af7565b6107389190611af7565b6107429190611b0a565b905090565b60088181548110610756575f80fd5b5f9182526020909120600390910201805460018201546002909201549092506001600160a01b031683565b610789611794565b6001600160a01b0382165f908152600a602052604090205460ff16156107f65760405162461bcd60e51b815260206004820152601e60248201527f636f6e747261637420616c72656164792070617274696369706174696e67000060448201526064015b60405180910390fd5b8015610804576108046110cf565b5f600c54431161081657600c54610818565b435b600b5490915061082890856117ff565b600b556001600160a01b039283165f818152600a602090815260408083208054600160ff1990911681179091558151606081018352988952918801948552870192835260088054918201815590915294517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360039096029586015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4850155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee590930180546001600160a01b0319169390921692909217905550565b61090f611794565b6008838154811061092257610922611ab8565b905f5260205f2090600302015f01545f14801561097557505f6001600160a01b03166008848154811061095757610957611ab8565b5f9182526020909120600260039092020101546001600160a01b0316145b6109b35760405162461bcd60e51b815260206004820152600f60248201526e616c7265616479206561726e696e6760881b60448201526064016107ed565b6109bc83610dc3565b81600884815481106109d0576109d0611ab8565b905f5260205f2090600302016002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508060088481548110610a1657610a16611ab8565b5f918252602090912060039091020155600b54610a3390826117ff565b600b55505050565b335f90815260096020526040902054811115610a8f5760405162461bcd60e51b8152602060048201526013602482015272125b9cdd59999a58da595b9d0818dc99591a5d606a1b60448201526064016107ed565b335f90815260096020526040902054610aa9908290611b0a565b335f90815260096020526040812091909155600f8054839290610acd908490611af7565b90915550506001546040516340c10f1960e01b81526001600160a01b03848116600483015260248201849052909116906340c10f19906044015f604051808303815f87803b158015610b1d575f80fd5b505af1158015610b2f573d5f803e3d5ffd5b505050505050565b60105460ff16610b895760405162461bcd60e51b815260206004820152601e60248201527f73656e61746f72207265776172647320617265207475726e6564206f6666000060448201526064016107ed565b600c544311610be85760405162461bcd60e51b815260206004820152602560248201527f4d757374207761697420756e74696c206d696e74696e6720706861736520626560448201526467696e732160d81b60648201526084016107ed565b5f80546001600160a01b03166001600160a01b0316635d85fa186040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c539190611b2d565b6001600160a01b0316637ae282896040518163ffffffff1660e01b81526004015f60405180830381865afa158015610c8d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cb49190810190611b5c565b90505f6064825111610cc857506064610cd9565b8151610cd690612710611c1c565b90505b5f620f424082600754600d54610cef9190611b0a565b610cf99190611c3b565b610d039190611c1c565b90505f5b8351811015610d73578160095f868481518110610d2657610d26611ab8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f828254610d5b9190611af7565b90915550819050610d6b81611c52565b915050610d07565b50808351610d819190611c3b565b60065f828254610d919190611af7565b90915550508251610da3908290611c3b565b600d5f828254610db39190611af7565b9091555050600d54600755505050565b5f60088281548110610dd757610dd7611ab8565b905f5260205f209060030201905080600101544311610df4575050565b60028101546001600160a01b03161580610e0d57508054155b15610e1c574360019091015550565b5f610e348260010154436117ed90919063ffffffff16565b90505f610e65600b54610e5f855f0154610e596004548761180a90919063ffffffff16565b9061180a565b90611815565b6001546002546003549293506001600160a01b03918216926340c10f199290911690610e9a9061271090610e5f90879061180a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015610edd575f80fd5b505af1158015610eef573d5f803e3d5ffd5b50505060028401546001600160a01b03165f90815260096020526040902054610f1a91508290611af7565b60028401546001600160a01b03165f90815260096020526040812091909155600d8054839290610f4b908490611af7565b909155505043600190930192909255505050565b610f67611794565b6001600160a01b0382165f9081526011602052604090205460ff16151581151514611026576001600160a01b0382165f908152601160205260409020805460ff191682151517905580610fcc5760128054905f610fc383611c6a565b91905055610fe0565b60128054905f610fdb83611c52565b919050555b50604080516001600160a01b038416815282151560208201527fe2ad9d0600e2a93ef46991efd2c22f65f9ebe472487cc7551647bc52d793289991015b60405180910390a15b5050565b848314801561103857508481145b611040575f80fd5b5f5b858110156110c6576110b487878381811061105f5761105f611ab8565b9050602002013586868481811061107857611078611ab8565b905060200201602081019061108d9190611a82565b85858581811061109f5761109f611ab8565b905060200201602081019061032a9190611a9d565b806110be81611c52565b915050611042565b50505050505050565b6008545f5b81811015611026576110e581610dc3565b6110ee81611c52565b90506110d4565b6110fd611794565b801561110b5761110b6110cf565b61112b82611125600886815481106105f8576105f8611ab8565b906117ff565b600b81905550816008848154811061114557611145611ab8565b5f918252602090912060039091020155505050565b611162611794565b61116b5f611820565b565b611175611794565b60015460405163f2fde38b60e01b81526001600160a01b0383811660048301529091169063f2fde38b906024015f604051808303815f87803b1580156111b9575f80fd5b505af11580156111cb573d5f803e3d5ffd5b5050505050565b6111da611794565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611204611794565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b335f9081526011602052604081205460ff1661127d5760405162461bcd60e51b81526020600482015260166024820152756f6e6c79207472757374656420636f6e74726163747360501b60448201526064016107ed565b600154604051633477cc1b60e21b81526001600160a01b038581166004830152602482018590529091169063d1df306c906044016020604051808303815f875af11580156112cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f19190611c7f565b61132b5760405162461bcd60e51b815260206004820152600b60248201526a189d5c9b8819985a5b195960aa1b60448201526064016107ed565b335f90815260096020526040902054611345908390611af7565b335f90815260096020526040812091909155600e8054849290611369908490611af7565b9091555060019150505b92915050565b611381611794565b6010805460ff1916911515919091179055565b61139c611794565b6103e881111580156113ac575060015b6113b4575f80fd5b600355565b5f80600883815481106113ce576113ce611ab8565b905f5260205f20906003020190508060010154431180156113fb575060028101546001600160a01b031615155b15611446575f6114188260010154436117ed90919063ffffffff16565b90505f61143d600b54610e5f855f0154610e596004548761180a90919063ffffffff16565b95945050505050565b505f92915050565b335f908152600960205260409020548111156114b65760405162461bcd60e51b815260206004820152602160248201527f696e73756666696369656e742063726564697420666f72207472616e736665726044820152602160f81b60648201526084016107ed565b335f908152600960205260409020546114d0908290611b0a565b335f90815260096020526040808220929092556001600160a01b038416815220546114fc908290611af7565b6001600160a01b0383165f818152600960209081526040918290209390935580513381529283019190915281018290527fbfa5afa9ccfabe79b0b21f2a9d778cf773b963e00307dd68c96abc3a30c5d3be9060600161101d565b60015f9054906101000a90046001600160a01b03166001600160a01b03166332cb6b0c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ca9190611acc565b6115d26106a6565b10156116205760405162461bcd60e51b815260206004820152601b60248201527f4d617820737570706c79206e6f7420796574207265616368656421000000000060448201526064016107ed565b5f60035561162c6110cf565b5f60048190556005805460ff60a01b1916600160a01b17905560405132917fa03d71d21200bfbbb6335bb3f935b1de0d1a7244d68665ae0e6584f07754effa9161167891815260200190565b60405180910390a2565b61168a611794565b6001600160a01b0381166116ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107ed565b6116f881611820565b50565b611703611794565b600c5443106117465760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481cdd185c9d1959608a1b60448201526064016107ed565b600c8190556008545f5b8181101561178f57826008828154811061176c5761176c611ab8565b5f91825260209091206001600390920201015561178881611c52565b9050611750565b505050565b5f546001600160a01b0316331461116b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ed565b5f6117f88284611b0a565b9392505050565b5f6117f88284611af7565b5f6117f88284611c3b565b5f6117f88284611c1c565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121561187f575f80fd5b5035919050565b6001600160a01b03811681146116f8575f80fd5b80151581146116f8575f80fd5b5f805f606084860312156118b9575f80fd5b8335925060208401356118cb81611886565b915060408401356118db8161189a565b809150509250925092565b5f805f606084860312156118f8575f80fd5b83359250602084013561190a81611886565b929592945050506040919091013590565b5f806040838503121561192c575f80fd5b823561193781611886565b946020939093013593505050565b5f8060408385031215611956575f80fd5b823561196181611886565b915060208301356119718161189a565b809150509250929050565b5f8083601f84011261198c575f80fd5b50813567ffffffffffffffff8111156119a3575f80fd5b6020830191508360208260051b85010111156119bd575f80fd5b9250929050565b5f805f805f80606087890312156119d9575f80fd5b863567ffffffffffffffff808211156119f0575f80fd5b6119fc8a838b0161197c565b90985096506020890135915080821115611a14575f80fd5b611a208a838b0161197c565b90965094506040890135915080821115611a38575f80fd5b50611a4589828a0161197c565b979a9699509497509295939492505050565b5f805f60608486031215611a69575f80fd5b833592506020840135915060408401356118db8161189a565b5f60208284031215611a92575f80fd5b81356117f881611886565b5f60208284031215611aad575f80fd5b81356117f88161189a565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611adc575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561137357611373611ae3565b8181038181111561137357611373611ae3565b8051611b2881611886565b919050565b5f60208284031215611b3d575f80fd5b81516117f881611886565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215611b6d575f80fd5b825167ffffffffffffffff80821115611b84575f80fd5b818501915085601f830112611b97575f80fd5b815181811115611ba957611ba9611b48565b8060051b604051601f19603f83011681018181108582111715611bce57611bce611b48565b604052918252848201925083810185019188831115611beb575f80fd5b938501935b82851015611c1057611c0185611b1d565b84529385019392850192611bf0565b98975050505050505050565b5f82611c3657634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761137357611373611ae3565b5f60018201611c6357611c63611ae3565b5060010190565b5f81611c7857611c78611ae3565b505f190190565b5f60208284031215611c8f575f80fd5b81516117f88161189a56fea26469706673582212208ac122380701361e0ec4d61311bf6526e7b9d74ba55b343ce9b7be36ebf16db964736f6c63430008140033000000000000000000000000faac6a85c3e123ab2cf7669b1024f146cfef0b38000000000000000000000000e87c806f8afa1ce543ab3c44d1c4b130b83574ce
Deployed ByteCode
0x608060405234801561000f575f80fd5b506004361061026b575f3560e01c8063715018a61161014b578063a12428c6116100bf578063ccb09b5211610084578063ccb09b5214610522578063d37bee181461052a578063d49e77cd14610533578063d5d44d8014610546578063f2fde38b14610565578063fac2b9ba14610578575f80fd5b8063a12428c6146104c3578063a3d7a339146104d6578063b2ca2f06146104e9578063b6ec0561146104fc578063cc58a6bb1461050f575f80fd5b80638d88a90e116101105780638d88a90e146104595780638da5cb5b1461046c5780638e24a4631461047c57806398b838081461049e5780639cc34559146104a75780639dc29fac146104b0575f80fd5b8063715018a61461040057806376a9e32e146104085780638061f1321461041b57806380d6806e1461043d5780638705fcd414610446575f80fd5b8063387473aa116101e25780635be4d442116101a75780635be4d442146103ad5780635c28afbb146103c05780635d91d76a146103c9578063624eb438146103dc578063630b5ba1146103e557806364482f79146103ed575f80fd5b8063387473aa14610355578063412753581461035d57806348cd4cb11461038857806351eb05a6146103915780635494d983146103a4575f80fd5b8063145192981161023357806314519298146102d35780631526fe27146102dc57806317caf6f1146103135780631eaaa0451461031c57806320c689261461032f5780632a98027514610342575f80fd5b806303cfa7d91461026f578063081e3eda146102845780630ba84cd21461029b5780631360a0ca146102ae57806313aecab1146102cb575b5f80fd5b61028261027d36600461186f565b61058b565b005b6008545b6040519081526020015b60405180910390f35b6102826102a936600461186f565b61063e565b6010546102bb9060ff1681565b6040519015158152602001610292565b6102886106a6565b610288600f5481565b6102ef6102ea36600461186f565b610747565b6040805193845260208401929092526001600160a01b031690820152606001610292565b610288600b5481565b61028261032a3660046118a7565b610781565b61028261033d3660046118e6565b610907565b61028261035036600461191b565b610a3b565b610282610b37565b600554610370906001600160a01b031681565b6040516001600160a01b039091168152602001610292565b610288600c5481565b61028261039f36600461186f565b610dc3565b610288600e5481565b6102826103bb366004611945565b610f5f565b610288600d5481565b6102826103d73660046119c4565b61102a565b61028860075481565b6102826110cf565b6102826103fb366004611a57565b6110f5565b61028261115a565b610282610416366004611a82565b61116d565b6102bb610429366004611a82565b60116020525f908152604090205460ff1681565b61028860035481565b610282610454366004611a82565b6111d2565b610282610467366004611a82565b6111fc565b5f546001600160a01b0316610370565b6102bb61048a366004611a82565b600a6020525f908152604090205460ff1681565b61028860065481565b61028860045481565b6102bb6104be36600461191b565b611226565b6102826104d1366004611a9d565b611379565b6102826104e436600461186f565b611394565b600154610370906001600160a01b031681565b61028861050a36600461186f565b6113b9565b61028261051d36600461191b565b61144e565b610282611556565b61028860125481565b600254610370906001600160a01b031681565b610288610554366004611a82565b60096020525f908152604090205481565b610282610573366004611a82565b611682565b61028261058636600461186f565b6116fb565b610593611794565b61059c81610dc3565b5f600882815481106105b0576105b0611ab8565b905f5260205f2090600302016002015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610611600882815481106105f8576105f8611ab8565b5f918252602090912060039091020154600b54906117ed565b600b819055505f6008828154811061062b5761062b611ab8565b5f91825260209091206003909102015550565b610646611794565b600554600160a01b900460ff166106695761065f6110cf565b600481905561066e565b5f6004555b60405181815232907fa03d71d21200bfbbb6335bb3f935b1de0d1a7244d68665ae0e6584f07754effa9060200160405180910390a250565b5f600f54600e54600d5460015f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610700573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107249190611acc565b61072e9190611af7565b6107389190611af7565b6107429190611b0a565b905090565b60088181548110610756575f80fd5b5f9182526020909120600390910201805460018201546002909201549092506001600160a01b031683565b610789611794565b6001600160a01b0382165f908152600a602052604090205460ff16156107f65760405162461bcd60e51b815260206004820152601e60248201527f636f6e747261637420616c72656164792070617274696369706174696e67000060448201526064015b60405180910390fd5b8015610804576108046110cf565b5f600c54431161081657600c54610818565b435b600b5490915061082890856117ff565b600b556001600160a01b039283165f818152600a602090815260408083208054600160ff1990911681179091558151606081018352988952918801948552870192835260088054918201815590915294517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360039096029586015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4850155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee590930180546001600160a01b0319169390921692909217905550565b61090f611794565b6008838154811061092257610922611ab8565b905f5260205f2090600302015f01545f14801561097557505f6001600160a01b03166008848154811061095757610957611ab8565b5f9182526020909120600260039092020101546001600160a01b0316145b6109b35760405162461bcd60e51b815260206004820152600f60248201526e616c7265616479206561726e696e6760881b60448201526064016107ed565b6109bc83610dc3565b81600884815481106109d0576109d0611ab8565b905f5260205f2090600302016002015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508060088481548110610a1657610a16611ab8565b5f918252602090912060039091020155600b54610a3390826117ff565b600b55505050565b335f90815260096020526040902054811115610a8f5760405162461bcd60e51b8152602060048201526013602482015272125b9cdd59999a58da595b9d0818dc99591a5d606a1b60448201526064016107ed565b335f90815260096020526040902054610aa9908290611b0a565b335f90815260096020526040812091909155600f8054839290610acd908490611af7565b90915550506001546040516340c10f1960e01b81526001600160a01b03848116600483015260248201849052909116906340c10f19906044015f604051808303815f87803b158015610b1d575f80fd5b505af1158015610b2f573d5f803e3d5ffd5b505050505050565b60105460ff16610b895760405162461bcd60e51b815260206004820152601e60248201527f73656e61746f72207265776172647320617265207475726e6564206f6666000060448201526064016107ed565b600c544311610be85760405162461bcd60e51b815260206004820152602560248201527f4d757374207761697420756e74696c206d696e74696e6720706861736520626560448201526467696e732160d81b60648201526084016107ed565b5f80546001600160a01b03166001600160a01b0316635d85fa186040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c539190611b2d565b6001600160a01b0316637ae282896040518163ffffffff1660e01b81526004015f60405180830381865afa158015610c8d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cb49190810190611b5c565b90505f6064825111610cc857506064610cd9565b8151610cd690612710611c1c565b90505b5f620f424082600754600d54610cef9190611b0a565b610cf99190611c3b565b610d039190611c1c565b90505f5b8351811015610d73578160095f868481518110610d2657610d26611ab8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f828254610d5b9190611af7565b90915550819050610d6b81611c52565b915050610d07565b50808351610d819190611c3b565b60065f828254610d919190611af7565b90915550508251610da3908290611c3b565b600d5f828254610db39190611af7565b9091555050600d54600755505050565b5f60088281548110610dd757610dd7611ab8565b905f5260205f209060030201905080600101544311610df4575050565b60028101546001600160a01b03161580610e0d57508054155b15610e1c574360019091015550565b5f610e348260010154436117ed90919063ffffffff16565b90505f610e65600b54610e5f855f0154610e596004548761180a90919063ffffffff16565b9061180a565b90611815565b6001546002546003549293506001600160a01b03918216926340c10f199290911690610e9a9061271090610e5f90879061180a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015610edd575f80fd5b505af1158015610eef573d5f803e3d5ffd5b50505060028401546001600160a01b03165f90815260096020526040902054610f1a91508290611af7565b60028401546001600160a01b03165f90815260096020526040812091909155600d8054839290610f4b908490611af7565b909155505043600190930192909255505050565b610f67611794565b6001600160a01b0382165f9081526011602052604090205460ff16151581151514611026576001600160a01b0382165f908152601160205260409020805460ff191682151517905580610fcc5760128054905f610fc383611c6a565b91905055610fe0565b60128054905f610fdb83611c52565b919050555b50604080516001600160a01b038416815282151560208201527fe2ad9d0600e2a93ef46991efd2c22f65f9ebe472487cc7551647bc52d793289991015b60405180910390a15b5050565b848314801561103857508481145b611040575f80fd5b5f5b858110156110c6576110b487878381811061105f5761105f611ab8565b9050602002013586868481811061107857611078611ab8565b905060200201602081019061108d9190611a82565b85858581811061109f5761109f611ab8565b905060200201602081019061032a9190611a9d565b806110be81611c52565b915050611042565b50505050505050565b6008545f5b81811015611026576110e581610dc3565b6110ee81611c52565b90506110d4565b6110fd611794565b801561110b5761110b6110cf565b61112b82611125600886815481106105f8576105f8611ab8565b906117ff565b600b81905550816008848154811061114557611145611ab8565b5f918252602090912060039091020155505050565b611162611794565b61116b5f611820565b565b611175611794565b60015460405163f2fde38b60e01b81526001600160a01b0383811660048301529091169063f2fde38b906024015f604051808303815f87803b1580156111b9575f80fd5b505af11580156111cb573d5f803e3d5ffd5b5050505050565b6111da611794565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611204611794565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b335f9081526011602052604081205460ff1661127d5760405162461bcd60e51b81526020600482015260166024820152756f6e6c79207472757374656420636f6e74726163747360501b60448201526064016107ed565b600154604051633477cc1b60e21b81526001600160a01b038581166004830152602482018590529091169063d1df306c906044016020604051808303815f875af11580156112cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f19190611c7f565b61132b5760405162461bcd60e51b815260206004820152600b60248201526a189d5c9b8819985a5b195960aa1b60448201526064016107ed565b335f90815260096020526040902054611345908390611af7565b335f90815260096020526040812091909155600e8054849290611369908490611af7565b9091555060019150505b92915050565b611381611794565b6010805460ff1916911515919091179055565b61139c611794565b6103e881111580156113ac575060015b6113b4575f80fd5b600355565b5f80600883815481106113ce576113ce611ab8565b905f5260205f20906003020190508060010154431180156113fb575060028101546001600160a01b031615155b15611446575f6114188260010154436117ed90919063ffffffff16565b90505f61143d600b54610e5f855f0154610e596004548761180a90919063ffffffff16565b95945050505050565b505f92915050565b335f908152600960205260409020548111156114b65760405162461bcd60e51b815260206004820152602160248201527f696e73756666696369656e742063726564697420666f72207472616e736665726044820152602160f81b60648201526084016107ed565b335f908152600960205260409020546114d0908290611b0a565b335f90815260096020526040808220929092556001600160a01b038416815220546114fc908290611af7565b6001600160a01b0383165f818152600960209081526040918290209390935580513381529283019190915281018290527fbfa5afa9ccfabe79b0b21f2a9d778cf773b963e00307dd68c96abc3a30c5d3be9060600161101d565b60015f9054906101000a90046001600160a01b03166001600160a01b03166332cb6b0c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ca9190611acc565b6115d26106a6565b10156116205760405162461bcd60e51b815260206004820152601b60248201527f4d617820737570706c79206e6f7420796574207265616368656421000000000060448201526064016107ed565b5f60035561162c6110cf565b5f60048190556005805460ff60a01b1916600160a01b17905560405132917fa03d71d21200bfbbb6335bb3f935b1de0d1a7244d68665ae0e6584f07754effa9161167891815260200190565b60405180910390a2565b61168a611794565b6001600160a01b0381166116ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107ed565b6116f881611820565b50565b611703611794565b600c5443106117465760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481cdd185c9d1959608a1b60448201526064016107ed565b600c8190556008545f5b8181101561178f57826008828154811061176c5761176c611ab8565b5f91825260209091206001600390920201015561178881611c52565b9050611750565b505050565b5f546001600160a01b0316331461116b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ed565b5f6117f88284611b0a565b9392505050565b5f6117f88284611af7565b5f6117f88284611c3b565b5f6117f88284611c1c565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121561187f575f80fd5b5035919050565b6001600160a01b03811681146116f8575f80fd5b80151581146116f8575f80fd5b5f805f606084860312156118b9575f80fd5b8335925060208401356118cb81611886565b915060408401356118db8161189a565b809150509250925092565b5f805f606084860312156118f8575f80fd5b83359250602084013561190a81611886565b929592945050506040919091013590565b5f806040838503121561192c575f80fd5b823561193781611886565b946020939093013593505050565b5f8060408385031215611956575f80fd5b823561196181611886565b915060208301356119718161189a565b809150509250929050565b5f8083601f84011261198c575f80fd5b50813567ffffffffffffffff8111156119a3575f80fd5b6020830191508360208260051b85010111156119bd575f80fd5b9250929050565b5f805f805f80606087890312156119d9575f80fd5b863567ffffffffffffffff808211156119f0575f80fd5b6119fc8a838b0161197c565b90985096506020890135915080821115611a14575f80fd5b611a208a838b0161197c565b90965094506040890135915080821115611a38575f80fd5b50611a4589828a0161197c565b979a9699509497509295939492505050565b5f805f60608486031215611a69575f80fd5b833592506020840135915060408401356118db8161189a565b5f60208284031215611a92575f80fd5b81356117f881611886565b5f60208284031215611aad575f80fd5b81356117f88161189a565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611adc575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561137357611373611ae3565b8181038181111561137357611373611ae3565b8051611b2881611886565b919050565b5f60208284031215611b3d575f80fd5b81516117f881611886565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215611b6d575f80fd5b825167ffffffffffffffff80821115611b84575f80fd5b818501915085601f830112611b97575f80fd5b815181811115611ba957611ba9611b48565b8060051b604051601f19603f83011681018181108582111715611bce57611bce611b48565b604052918252848201925083810185019188831115611beb575f80fd5b938501935b82851015611c1057611c0185611b1d565b84529385019392850192611bf0565b98975050505050505050565b5f82611c3657634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761137357611373611ae3565b5f60018201611c6357611c63611ae3565b5060010190565b5f81611c7857611c78611ae3565b505f190190565b5f60208284031215611c8f575f80fd5b81516117f88161189a56fea26469706673582212208ac122380701361e0ec4d61311bf6526e7b9d74ba55b343ce9b7be36ebf16db964736f6c63430008140033