Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- FortGovernance
- Optimization enabled
- true
- Compiler version
- v0.8.13+commit.abaa5c0e
- Optimization runs
- 888888
- EVM Version
- default
- Verified at
- 2022-03-22T08:32:48.343894Z
Contract source code
// Sources flattened with hardhat v2.5.0 https://hardhat.org
// File contracts/interfaces/IFortMapping.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.6;
/// @dev The interface defines methods for Fort builtin contract address mapping
interface IFortMapping {
/// @dev Address updated event
/// @param name Address name
/// @param oldAddress Old address
/// @param newAddress New address
event AddressUpdated(string name, address oldAddress, address newAddress);
/// @dev Set the built-in contract address of the system
/// @param dcuToken Address of dcu token contract
/// @param fortDAO IFortDAO implementation contract address
/// @param fortOptions IFortOptions implementation contract address
/// @param fortFutures IFortFutures implementation contract address
/// @param fortVaultForStaking IFortVaultForStaking implementation contract address
/// @param nestPriceFacade INestPriceFacade implementation contract address
function setBuiltinAddress(
address dcuToken,
address fortDAO,
address fortOptions,
address fortFutures,
address fortVaultForStaking,
address nestPriceFacade
) external;
/// @dev Get the built-in contract address of the system
/// @return dcuToken Address of dcu token contract
/// @return fortDAO IFortDAO implementation contract address
/// @return fortOptions IFortOptions implementation contract address
/// @return fortFutures IFortFutures implementation contract address
/// @return fortVaultForStaking IFortVaultForStaking implementation contract address
/// @return nestPriceFacade INestPriceFacade implementation contract address
function getBuiltinAddress() external view returns (
address dcuToken,
address fortDAO,
address fortOptions,
address fortFutures,
address fortVaultForStaking,
address nestPriceFacade
);
/// @dev Get address of dcu token contract
/// @return Address of dcu token contract
function getDCUTokenAddress() external view returns (address);
/// @dev Get IFortDAO implementation contract address
/// @return IFortDAO implementation contract address
function getFortDAOAddress() external view returns (address);
/// @dev Get IFortOptions implementation contract address
/// @return IFortOptions implementation contract address
function getFortOptionsAddress() external view returns (address);
/// @dev Get IFortFutures implementation contract address
/// @return IFortFutures implementation contract address
function getFortFuturesAddress() external view returns (address);
/// @dev Get IFortVaultForStaking implementation contract address
/// @return IFortVaultForStaking implementation contract address
function getFortVaultForStakingAddress() external view returns (address);
/// @dev Get INestPriceFacade implementation contract address
/// @return INestPriceFacade implementation contract address
function getNestPriceFacade() external view returns (address);
/// @dev Registered address. The address registered here is the address accepted by Fort system
/// @param key The key
/// @param addr Destination address. 0 means to delete the registration information
function registerAddress(string calldata key, address addr) external;
/// @dev Get registered address
/// @param key The key
/// @return Destination address. 0 means empty
function checkAddress(string calldata key) external view returns (address);
}
// File contracts/interfaces/IFortGovernance.sol
// GPL-3.0-or-later
pragma solidity ^0.8.6;
/// @dev This interface defines the governance methods
interface IFortGovernance is IFortMapping {
/// @dev Governance flag changed event
/// @param addr Target address
/// @param oldFlag Old governance flag
/// @param newFlag New governance flag
event FlagChanged(address addr, uint oldFlag, uint newFlag);
/// @dev Set governance authority
/// @param addr Destination address
/// @param flag Weight. 0 means to delete the governance permission of the target address. Weight is not
/// implemented in the current system, only the difference between authorized and unauthorized.
/// Here, a uint96 is used to represent the weight, which is only reserved for expansion
function setGovernance(address addr, uint flag) external;
/// @dev Get governance rights
/// @param addr Destination address
/// @return Weight. 0 means to delete the governance permission of the target address. Weight is not
/// implemented in the current system, only the difference between authorized and unauthorized.
/// Here, a uint96 is used to represent the weight, which is only reserved for expansion
function getGovernance(address addr) external view returns (uint);
/// @dev Check whether the target address has governance rights for the given target
/// @param addr Destination address
/// @param flag Permission weight. The permission of the target address must be greater than this weight
/// to pass the check
/// @return True indicates permission
function checkGovernance(address addr, uint flag) external view returns (bool);
}
// File contracts/FortBase.sol
// GPL-3.0-or-later
pragma solidity ^0.8.6;
/// @dev Base contract of Fort
contract FortBase {
/// @dev Governance address changed event
/// @param oldGovernance Old governance address
/// @param newGovernance New governance address
event GovernanceChanged(address oldGovernance, address newGovernance);
/// @dev IFortGovernance implementation contract address
address public _governance;
/// @dev To support open-zeppelin/upgrades
/// @param governance IFortGovernance implementation contract address
function initialize(address governance) public virtual {
require(_governance == address(0), "Fort:!initialize");
emit GovernanceChanged(address(0), governance);
_governance = governance;
}
/// @dev Rewritten in the implementation contract, for load other contract addresses. Call
/// super.update(newGovernance) when overriding, and override method without onlyGovernance
/// @param newGovernance IFortGovernance implementation contract address
function update(address newGovernance) public virtual {
address governance = _governance;
require(governance == msg.sender || IFortGovernance(governance).checkGovernance(msg.sender, 0), "Fort:!gov");
emit GovernanceChanged(governance, newGovernance);
_governance = newGovernance;
}
//---------modifier------------
modifier onlyGovernance() {
require(IFortGovernance(_governance).checkGovernance(msg.sender, 0), "Fort:!gov");
_;
}
}
// File contracts/FortMapping.sol
// GPL-3.0-or-later
pragma solidity ^0.8.6;
/// @dev The contract is for Fort builtin contract address mapping
abstract contract FortMapping is FortBase, IFortMapping {
/// @dev Address of dcu token contract
address _dcuToken;
/// @dev IFortDAO implementation contract address
address _fortDAO;
/// @dev IFortOptions implementation contract address
address _fortOptions;
/// @dev IFortFutures implementation contract address
address _fortFutures;
/// @dev IFortVaultForStaking implementation contract address
address _fortVaultForStaking;
/// @dev INestPriceFacade implementation contract address
address _nestPriceFacade;
/// @dev Address registered in the system
mapping(string=>address) _registeredAddress;
/// @dev Set the built-in contract address of the system
/// @param dcuToken Address of dcu token contract
/// @param fortDAO IFortDAO implementation contract address
/// @param fortOptions IFortOptions implementation contract address for Fort
/// @param fortFutures IFortFutures implementation contract address
/// @param fortVaultForStaking IFortVaultForStaking implementation contract address
/// @param nestPriceFacade INestPriceFacade implementation contract address
function setBuiltinAddress(
address dcuToken,
address fortDAO,
address fortOptions,
address fortFutures,
address fortVaultForStaking,
address nestPriceFacade
) external override onlyGovernance {
if (dcuToken != address(0)) {
emit AddressUpdated("dcuToken", _dcuToken, dcuToken);
_dcuToken = dcuToken;
}
if (fortDAO != address(0)) {
emit AddressUpdated("fortDAO", _fortDAO, fortDAO);
_fortDAO = fortDAO;
}
if (fortOptions != address(0)) {
emit AddressUpdated("fortOptions", _fortOptions, fortOptions);
_fortOptions = fortOptions;
}
if (fortFutures != address(0)) {
emit AddressUpdated("fortFutures", _fortFutures, fortFutures);
_fortFutures = fortFutures;
}
if (fortVaultForStaking != address(0)) {
emit AddressUpdated("fortVaultForStaking", _fortVaultForStaking, fortVaultForStaking);
_fortVaultForStaking = fortVaultForStaking;
}
if (nestPriceFacade != address(0)) {
emit AddressUpdated("nestPriceFacade", _nestPriceFacade, nestPriceFacade);
_nestPriceFacade = nestPriceFacade;
}
}
/// @dev Get the built-in contract address of the system
/// @return dcuToken Address of dcu token contract
/// @return fortDAO IFortDAO implementation contract address
/// @return fortOptions IFortOptions implementation contract address
/// @return fortFutures IFortFutures implementation contract address
/// @return fortVaultForStaking IFortVaultForStaking implementation contract address
/// @return nestPriceFacade INestPriceFacade implementation contract address
function getBuiltinAddress() external view override returns (
address dcuToken,
address fortDAO,
address fortOptions,
address fortFutures,
address fortVaultForStaking,
address nestPriceFacade
) {
return (
_dcuToken,
_fortDAO,
_fortOptions,
_fortFutures,
_fortVaultForStaking,
_nestPriceFacade
);
}
/// @dev Get address of dcu token contract
/// @return Address of dcu token contract
function getDCUTokenAddress() external view override returns (address) { return _dcuToken; }
/// @dev Get IFortDAO implementation contract address
/// @return IFortDAO implementation contract address
function getFortDAOAddress() external view override returns (address) { return _fortDAO; }
/// @dev Get IFortOptions implementation contract address
/// @return IFortOptions implementation contract address
function getFortOptionsAddress() external view override returns (address) { return _fortOptions; }
/// @dev Get IFortFutures implementation contract address
/// @return IFortFutures implementation contract address
function getFortFuturesAddress() external view override returns (address) { return _fortFutures; }
/// @dev Get IFortVaultForStaking implementation contract address
/// @return IFortVaultForStaking implementation contract address
function getFortVaultForStakingAddress() external view override returns (address) { return _fortVaultForStaking; }
/// @dev Get INestPriceFacade implementation contract address
/// @return INestPriceFacade implementation contract address
function getNestPriceFacade() external view override returns (address) { return _nestPriceFacade; }
/// @dev Registered address. The address registered here is the address accepted by Fort system
/// @param key The key
/// @param addr Destination address. 0 means to delete the registration information
function registerAddress(string calldata key, address addr) external override onlyGovernance {
emit AddressUpdated(key, _registeredAddress[key], addr);
_registeredAddress[key] = addr;
}
/// @dev Get registered address
/// @param key The key
/// @return Destination address. 0 means empty
function checkAddress(string calldata key) external view override returns (address) {
return _registeredAddress[key];
}
}
// File contracts/FortGovernance.sol
// GPL-3.0-or-later
pragma solidity ^0.8.6;
/// @dev Fort governance contract
contract FortGovernance is FortMapping, IFortGovernance {
/// @dev Structure of governance address information
struct GovernanceInfo {
address addr;
uint96 flag;
}
/// @dev Governance address information
mapping(address=>GovernanceInfo) _governanceMapping;
/// @dev To support open-zeppelin/upgrades
/// @param governance IFortGovernance implementation contract address
function initialize(address governance) public override {
// While initialize FortGovernance, newGovernance is address(this),
// So must let newGovernance to 0
require(governance == address(0), "FortGovernance:!address");
// newGovernance is address(this)
super.initialize(address(this));
// Add msg.sender to governance
_governanceMapping[msg.sender] = GovernanceInfo(msg.sender, uint96(0xFFFFFFFFFFFFFFFFFFFFFFFF));
}
/// @dev Set governance authority
/// @param addr Destination address
/// @param flag Weight. 0 means to delete the governance permission of the target address. Weight is not
/// implemented in the current system, only the difference between authorized and unauthorized.
/// Here, a uint96 is used to represent the weight, which is only reserved for expansion
function setGovernance(address addr, uint flag) external override onlyGovernance {
emit FlagChanged(addr, _governanceMapping[addr].flag, flag);
if (flag > 0) {
_governanceMapping[addr] = GovernanceInfo(addr, uint96(flag));
} else {
_governanceMapping[addr] = GovernanceInfo(address(0), uint96(0));
}
}
/// @dev Get governance rights
/// @param addr Destination address
/// @return Weight. 0 means to delete the governance permission of the target address. Weight is not
/// implemented in the current system, only the difference between authorized and unauthorized.
/// Here, a uint96 is used to represent the weight, which is only reserved for expansion
function getGovernance(address addr) external view override returns (uint) {
return _governanceMapping[addr].flag;
}
/// @dev Check whether the target address has governance rights for the given target
/// @param addr Destination address
/// @param flag Permission weight. The permission of the target address must be greater than this
/// weight to pass the check
/// @return True indicates permission
function checkGovernance(address addr, uint flag) external view override returns (bool) {
return _governanceMapping[addr].flag > flag;
}
}
Contract ABI
[{"type":"event","name":"AddressUpdated","inputs":[{"type":"string","name":"name","internalType":"string","indexed":false},{"type":"address","name":"oldAddress","internalType":"address","indexed":false},{"type":"address","name":"newAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"FlagChanged","inputs":[{"type":"address","name":"addr","internalType":"address","indexed":false},{"type":"uint256","name":"oldFlag","internalType":"uint256","indexed":false},{"type":"uint256","name":"newFlag","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceChanged","inputs":[{"type":"address","name":"oldGovernance","internalType":"address","indexed":false},{"type":"address","name":"newGovernance","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_governance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"checkAddress","inputs":[{"type":"string","name":"key","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkGovernance","inputs":[{"type":"address","name":"addr","internalType":"address"},{"type":"uint256","name":"flag","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"dcuToken","internalType":"address"},{"type":"address","name":"fortDAO","internalType":"address"},{"type":"address","name":"fortOptions","internalType":"address"},{"type":"address","name":"fortFutures","internalType":"address"},{"type":"address","name":"fortVaultForStaking","internalType":"address"},{"type":"address","name":"nestPriceFacade","internalType":"address"}],"name":"getBuiltinAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getDCUTokenAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getFortDAOAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getFortFuturesAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getFortOptionsAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getFortVaultForStakingAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getGovernance","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getNestPriceFacade","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"governance","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerAddress","inputs":[{"type":"string","name":"key","internalType":"string"},{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuiltinAddress","inputs":[{"type":"address","name":"dcuToken","internalType":"address"},{"type":"address","name":"fortDAO","internalType":"address"},{"type":"address","name":"fortOptions","internalType":"address"},{"type":"address","name":"fortFutures","internalType":"address"},{"type":"address","name":"fortVaultForStaking","internalType":"address"},{"type":"address","name":"nestPriceFacade","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGovernance","inputs":[{"type":"address","name":"addr","internalType":"address"},{"type":"uint256","name":"flag","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"update","inputs":[{"type":"address","name":"newGovernance","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50611503806100206000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638fe77e8611610097578063c4d66de811610066578063c4d66de814610342578063dc6fa1ff14610355578063deaea6dd14610373578063ff5127261461039157600080fd5b80638fe77e861461028e57806391e1472b146102a1578063b13f5f1914610311578063c47398bd1461032457600080fd5b8063783f5255116100d3578063783f5255146101e05780637917e5a8146101f35780637d88277b146102115780638f9560df1461022457600080fd5b806304837969146101055780631c1b8772146101495780631c2f3e3d1461015e578063746b56f91461017e575b600080fd5b60045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61015c61015736600461128a565b6103af565b005b60005461011f9073ffffffffffffffffffffffffffffffffffffffff1681565b6001546002546003546004546005546006546040805173ffffffffffffffffffffffffffffffffffffffff97881681529587166020870152938616938501939093529084166060840152831660808301529190911660a082015260c001610140565b61015c6101ee3660046112ac565b610569565b60065473ffffffffffffffffffffffffffffffffffffffff1661011f565b61015c61021f3660046112d6565b6107d7565b61028061023236600461128a565b73ffffffffffffffffffffffffffffffffffffffff166000908152600860205260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1690565b604051908152602001610140565b61011f61029c366004611393565b610e36565b6103016102af3660046112ac565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600860205260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff161190565b6040519015158152602001610140565b61015c61031f3660046113d5565b610e78565b60035473ffffffffffffffffffffffffffffffffffffffff1661011f565b61015c61035036600461128a565b611056565b60025473ffffffffffffffffffffffffffffffffffffffff1661011f565b60015473ffffffffffffffffffffffffffffffffffffffff1661011f565b60055473ffffffffffffffffffffffffffffffffffffffff1661011f565b60005473ffffffffffffffffffffffffffffffffffffffff163381148061046657506040517f91e1472b0000000000000000000000000000000000000000000000000000000081523360048201526000602482015273ffffffffffffffffffffffffffffffffffffffff8216906391e1472b90604401602060405180830381865afa158015610442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104669190611429565b6104d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f3aaaebeb4821d6a7e5c77ece53cff0afcc56c82add2c978dbbb7f73e84cbcfd2910160405180910390a150600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa1580156105de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106029190611429565b610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600860209081526040918290205482519384527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff169083015281018290527fc9086f0885976a8c13df9ddbbe29fa5b49520b84ab86e296f89212b3c3f728829060600160405180910390a180156107695760408051808201825273ffffffffffffffffffffffffffffffffffffffff9384168082526bffffffffffffffffffffffff93841660208084019182526000928352600890529290209051915191909316740100000000000000000000000000000000000000009190921602179055565b6040805180820182526000808252602080830182815273ffffffffffffffffffffffffffffffffffffffff8781168452600890925293909120915192516bffffffffffffffffffffffff16740100000000000000000000000000000000000000000292169190911790555050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190611429565b6108d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b73ffffffffffffffffffffffffffffffffffffffff8616156109ba576001546040805160608082526008908201527f646375546f6b656e000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291881682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b73ffffffffffffffffffffffffffffffffffffffff851615610a9e576002546040805160608082526007908201527f666f727444414f00000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291871682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87161790555b73ffffffffffffffffffffffffffffffffffffffff841615610b8257600354604080516060808252600b908201527f666f72744f7074696f6e73000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291861682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b73ffffffffffffffffffffffffffffffffffffffff831615610c6657600454604080516060808252600b908201527f666f727446757475726573000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291851682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b73ffffffffffffffffffffffffffffffffffffffff821615610d4a576005546040805160608082526013908201527f666f72745661756c74466f725374616b696e6700000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291841682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b73ffffffffffffffffffffffffffffffffffffffff811615610e2e57600654604080516060808252600f908201527f6e65737450726963654661636164650000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291831682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b505050505050565b600060078383604051610e4a92919061144b565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16905092915050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f119190611429565b610f77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b7f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f8189838360078686604051610fac92919061144b565b90815260405190819003602001812054610fe293929173ffffffffffffffffffffffffffffffffffffffff90911690869061145b565b60405180910390a18060078484604051610ffd92919061144b565b908152604051908190036020019020805473ffffffffffffffffffffffffffffffffffffffff929092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055505050565b73ffffffffffffffffffffffffffffffffffffffff8116156110d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466f7274476f7665726e616e63653a216164647265737300000000000000000060448201526064016104c8565b6110dd3061114b565b50604080518082018252338082526bffffffffffffffffffffffff602080840182815260009384526008909152939091209151925116740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16156111cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f466f72743a21696e697469616c697a650000000000000000000000000000000060448201526064016104c8565b604080516000815273ffffffffffffffffffffffffffffffffffffffff831660208201527f3aaaebeb4821d6a7e5c77ece53cff0afcc56c82add2c978dbbb7f73e84cbcfd2910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b803573ffffffffffffffffffffffffffffffffffffffff8116811461128557600080fd5b919050565b60006020828403121561129c57600080fd5b6112a582611261565b9392505050565b600080604083850312156112bf57600080fd5b6112c883611261565b946020939093013593505050565b60008060008060008060c087890312156112ef57600080fd5b6112f887611261565b955061130660208801611261565b945061131460408801611261565b935061132260608801611261565b925061133060808801611261565b915061133e60a08801611261565b90509295509295509295565b60008083601f84011261135c57600080fd5b50813567ffffffffffffffff81111561137457600080fd5b60208301915083602082850101111561138c57600080fd5b9250929050565b600080602083850312156113a657600080fd5b823567ffffffffffffffff8111156113bd57600080fd5b6113c98582860161134a565b90969095509350505050565b6000806000604084860312156113ea57600080fd5b833567ffffffffffffffff81111561140157600080fd5b61140d8682870161134a565b9094509250611420905060208501611261565b90509250925092565b60006020828403121561143b57600080fd5b815180151581146112a557600080fd5b8183823760009101908152919050565b60608152836060820152838560808301376000608085830181019190915273ffffffffffffffffffffffffffffffffffffffff9384166020830152919092166040830152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010191905056fea26469706673582212204eef1efbcfa0ed97d1929fe78b282c0d4e3724cedf41a8d128bfa4665abac2d264736f6c634300080d0033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c80638fe77e8611610097578063c4d66de811610066578063c4d66de814610342578063dc6fa1ff14610355578063deaea6dd14610373578063ff5127261461039157600080fd5b80638fe77e861461028e57806391e1472b146102a1578063b13f5f1914610311578063c47398bd1461032457600080fd5b8063783f5255116100d3578063783f5255146101e05780637917e5a8146101f35780637d88277b146102115780638f9560df1461022457600080fd5b806304837969146101055780631c1b8772146101495780631c2f3e3d1461015e578063746b56f91461017e575b600080fd5b60045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61015c61015736600461128a565b6103af565b005b60005461011f9073ffffffffffffffffffffffffffffffffffffffff1681565b6001546002546003546004546005546006546040805173ffffffffffffffffffffffffffffffffffffffff97881681529587166020870152938616938501939093529084166060840152831660808301529190911660a082015260c001610140565b61015c6101ee3660046112ac565b610569565b60065473ffffffffffffffffffffffffffffffffffffffff1661011f565b61015c61021f3660046112d6565b6107d7565b61028061023236600461128a565b73ffffffffffffffffffffffffffffffffffffffff166000908152600860205260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1690565b604051908152602001610140565b61011f61029c366004611393565b610e36565b6103016102af3660046112ac565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600860205260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff161190565b6040519015158152602001610140565b61015c61031f3660046113d5565b610e78565b60035473ffffffffffffffffffffffffffffffffffffffff1661011f565b61015c61035036600461128a565b611056565b60025473ffffffffffffffffffffffffffffffffffffffff1661011f565b60015473ffffffffffffffffffffffffffffffffffffffff1661011f565b60055473ffffffffffffffffffffffffffffffffffffffff1661011f565b60005473ffffffffffffffffffffffffffffffffffffffff163381148061046657506040517f91e1472b0000000000000000000000000000000000000000000000000000000081523360048201526000602482015273ffffffffffffffffffffffffffffffffffffffff8216906391e1472b90604401602060405180830381865afa158015610442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104669190611429565b6104d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f3aaaebeb4821d6a7e5c77ece53cff0afcc56c82add2c978dbbb7f73e84cbcfd2910160405180910390a150600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa1580156105de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106029190611429565b610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600860209081526040918290205482519384527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff169083015281018290527fc9086f0885976a8c13df9ddbbe29fa5b49520b84ab86e296f89212b3c3f728829060600160405180910390a180156107695760408051808201825273ffffffffffffffffffffffffffffffffffffffff9384168082526bffffffffffffffffffffffff93841660208084019182526000928352600890529290209051915191909316740100000000000000000000000000000000000000009190921602179055565b6040805180820182526000808252602080830182815273ffffffffffffffffffffffffffffffffffffffff8781168452600890925293909120915192516bffffffffffffffffffffffff16740100000000000000000000000000000000000000000292169190911790555050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190611429565b6108d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b73ffffffffffffffffffffffffffffffffffffffff8616156109ba576001546040805160608082526008908201527f646375546f6b656e000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291881682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b73ffffffffffffffffffffffffffffffffffffffff851615610a9e576002546040805160608082526007908201527f666f727444414f00000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291871682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87161790555b73ffffffffffffffffffffffffffffffffffffffff841615610b8257600354604080516060808252600b908201527f666f72744f7074696f6e73000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291861682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b73ffffffffffffffffffffffffffffffffffffffff831615610c6657600454604080516060808252600b908201527f666f727446757475726573000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291851682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b73ffffffffffffffffffffffffffffffffffffffff821615610d4a576005546040805160608082526013908201527f666f72745661756c74466f725374616b696e6700000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291841682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b73ffffffffffffffffffffffffffffffffffffffff811615610e2e57600654604080516060808252600f908201527f6e65737450726963654661636164650000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291831682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b505050505050565b600060078383604051610e4a92919061144b565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16905092915050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f119190611429565b610f77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b7f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f8189838360078686604051610fac92919061144b565b90815260405190819003602001812054610fe293929173ffffffffffffffffffffffffffffffffffffffff90911690869061145b565b60405180910390a18060078484604051610ffd92919061144b565b908152604051908190036020019020805473ffffffffffffffffffffffffffffffffffffffff929092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055505050565b73ffffffffffffffffffffffffffffffffffffffff8116156110d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466f7274476f7665726e616e63653a216164647265737300000000000000000060448201526064016104c8565b6110dd3061114b565b50604080518082018252338082526bffffffffffffffffffffffff602080840182815260009384526008909152939091209151925116740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16156111cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f466f72743a21696e697469616c697a650000000000000000000000000000000060448201526064016104c8565b604080516000815273ffffffffffffffffffffffffffffffffffffffff831660208201527f3aaaebeb4821d6a7e5c77ece53cff0afcc56c82add2c978dbbb7f73e84cbcfd2910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b803573ffffffffffffffffffffffffffffffffffffffff8116811461128557600080fd5b919050565b60006020828403121561129c57600080fd5b6112a582611261565b9392505050565b600080604083850312156112bf57600080fd5b6112c883611261565b946020939093013593505050565b60008060008060008060c087890312156112ef57600080fd5b6112f887611261565b955061130660208801611261565b945061131460408801611261565b935061132260608801611261565b925061133060808801611261565b915061133e60a08801611261565b90509295509295509295565b60008083601f84011261135c57600080fd5b50813567ffffffffffffffff81111561137457600080fd5b60208301915083602082850101111561138c57600080fd5b9250929050565b600080602083850312156113a657600080fd5b823567ffffffffffffffff8111156113bd57600080fd5b6113c98582860161134a565b90969095509350505050565b6000806000604084860312156113ea57600080fd5b833567ffffffffffffffff81111561140157600080fd5b61140d8682870161134a565b9094509250611420905060208501611261565b90509250925092565b60006020828403121561143b57600080fd5b815180151581146112a557600080fd5b8183823760009101908152919050565b60608152836060820152838560808301376000608085830181019190915273ffffffffffffffffffffffffffffffffffffffff9384166020830152919092166040830152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010191905056fea26469706673582212204eef1efbcfa0ed97d1929fe78b282c0d4e3724cedf41a8d128bfa4665abac2d264736f6c634300080d0033