false
false
- We're indexing this chain right now. Some of the counts may be inaccurate.

Contract Address Details

0xCb2158f97367596A68dd1670bC848dc6B2245111

Contract Name
AlgemAdapter
Creator
0x7ba30eā€“0452e1 at 0x3e6445ā€“84117c
Balance
0 ASTR ( )
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
3709686
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
AlgemAdapter




Optimization enabled
false
Compiler version
v0.8.3+commit.8d00100c




EVM Version
default




Verified at
2022-12-15T19:29:36.303695Z

Constructor Arguments

0x0000000000000000000000000000000000000000000000000000000000005001000000000000000000000000e511ed88575c57767bafb72bfd10775413e3f2b000000000000000000000000070d264472327b67898c919809a9dc4759b6c0f2700000000000000000000000088463254469c37b9cecb71a34746707e008fb5a9

Arg [0] (address) : <a href=/astar/address/0x0000000000000000000000000000000000005001>0x0000000000000000000000000000000000005001</a>
Arg [1] (address) : <a href=/astar/address/0xe511ed88575c57767bafb72bfd10775413e3f2b0>0xe511ed88575c57767bafb72bfd10775413e3f2b0</a>
Arg [2] (address) : <a href=/astar/address/0x70d264472327b67898c919809a9dc4759b6c0f27>0x70d264472327b67898c919809a9dc4759b6c0f27</a>
Arg [3] (address) : <a href=/astar/address/0x88463254469c37b9cecb71a34746707e008fb5a9>0x88463254469c37b9cecb71a34746707e008fb5a9</a>

              

Contract source code

Sol2uml
new
// SPDX-License-Identifier: BSD-3-Clause

pragma solidity >=0.7.0;

/// Interface to the precompiled contract on Shibuya/Shiden/Astar
/// Predeployed at the address 0x0000000000000000000000000000000000005001
/// For better understanding check the source code:
/// repo: https://github.com/AstarNetwork/astar-frame
/// code: frame/dapps-staking/src/pallet
interface DappsStaking {

    // Storage getters

    /// @notice Read current era.
    /// @return era: The current era
    function read_current_era() external view returns (uint256);

    /// @notice Read unbonding period constant.
    /// @return period: The unbonding period in eras
    function read_unbonding_period() external view returns (uint256);

    /// @notice Read Total network reward for the given era
    /// @return reward: Total network reward for the given era
    function read_era_reward(uint32 era) external view returns (uint128);

    /// @notice Read Total staked amount for the given era
    /// @return staked: Total staked amount for the given era
    function read_era_staked(uint32 era) external view returns (uint128);

    /// @notice Read Staked amount for the staker
    /// @param staker: The staker address in form of 20 or 32 hex bytes
    /// @return amount: Staked amount by the staker
    function read_staked_amount(bytes calldata staker) external view returns (uint128);

    /// @notice Read Staked amount on a given contract for the staker
    /// @param contract_id: The smart contract address used for staking
    /// @param staker: The staker address in form of 20 or 32 hex bytes
    /// @return amount: Staked amount by the staker
    function read_staked_amount_on_contract(address contract_id, bytes calldata staker) external view returns (uint128);

    /// @notice Read the staked amount from the era when the amount was last staked/unstaked
    /// @return total: The most recent total staked amount on contract
    function read_contract_stake(address contract_id) external view returns (uint128);


    // Extrinsic calls

    /// @notice Register is root origin only and not allowed via evm precompile.
    ///         This should always fail.
    function register(address) external;

    /// @notice Stake provided amount on the contract.
    function bond_and_stake(address, uint128) external;

    /// @notice Start unbonding process and unstake balance from the contract.
    function unbond_and_unstake(address, uint128) external;

    /// @notice Withdraw all funds that have completed the unbonding process.
    function withdraw_unbonded() external;

    /// @notice Claim earned staker rewards for the oldest unclaimed era.
    ///         In order to claim multiple eras, this call has to be called multiple times.
    ///         Staker account is derived from the caller address.
    /// @param smart_contract: The smart contract address used for staking
    function claim_staker(address smart_contract) external;

    /// @notice Claim one era of unclaimed dapp rewards for the specified contract and era.
    /// @param smart_contract: The smart contract address used for staking
    /// @param era: The era to be claimed
    function claim_dapp(address smart_contract, uint128 era) external;

    /// Instruction how to handle reward payout for staker.
    /// `FreeBalance` - Reward will be paid out to the staker (free balance).
    /// `StakeBalance` - Reward will be paid out to the staker and is immediately restaked (locked balance)
    enum RewardDestination {FreeBalance, StakeBalance}

    /// @notice Set reward destination for staker rewards
    /// @param reward_destination: The instruction on how the reward payout should be handled
    function set_reward_destination(RewardDestination reward_destination) external;
    
    /// @notice Withdraw staked funds from an unregistered contract.
    /// @param smart_contract: The smart contract address used for staking
    function withdraw_from_unregistered(address smart_contract) external;

    /// @notice Transfer part or entire nomination from origin smart contract to target smart contract
    /// @param origin_smart_contract: The origin smart contract address
    /// @param amount: The amount to transfer from origin to target
    /// @param target_smart_contract: The target smart contract address
    function nomination_transfer(address origin_smart_contract, uint128 amount, address target_smart_contract) external;
}

interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

interface DIAOracleV2 {
    function getValue(string memory key) external view returns (uint128, uint128);
}

contract AlgemAdapter {
    mapping (string => uint256) public values;
    address admin;
    address dappsStakingContractAddress;
    address nAstrContractAddress;
    address diaOracleContractAddress;
    address stakingArgument;

    DappsStaking dsInstance;
    IERC20 nAstrInstance;
    DIAOracleV2 diaOracleInstance;
    
    event OracleUpdate(string key, uint128 value, uint128 timestamp);
    event AdminAddressChange(address newUpdater);
    event DappsStakingContractAddressChange(address newAddress);
    event NAstrContractAddressChange(address newAddress);
    event DiaOracleContractAddressChange(address newAddress);
    event StakingArgumentAddressChange(address newAddress);
    
    constructor(address newDappsStakingContractAddress, address newNAstrContractAddress, address newStakingArgumentAddress, address newDiaOracleContractAddress) {
        admin = msg.sender;
        updateDappsStakingContractAddress(newDappsStakingContractAddress);
        updateNAstrContractAddress(newNAstrContractAddress);
        updateDIAOracleContractAddress(newDiaOracleContractAddress);
        updateStakingArgumentAddress(newStakingArgumentAddress);
    }

    function getNAstrPriceFromCollateralRatio() external view returns (uint256, uint128) {
        uint128 astrPrice;
        uint128 timestamp;
        (astrPrice, timestamp) = diaOracleInstance.getValue("ASTR/USD");
        uint256 nAstrPrice = (astrPrice * getAstrInStakingContract()) / getNAstrTotalSupply();
        return (nAstrPrice, timestamp);
    }

    function getAstrInStakingContract() public view returns (uint256) {
        return dsInstance.read_staked_amount_on_contract(stakingArgument, abi.encodePacked(stakingArgument));
    }

    function getNAstrTotalSupply() public view returns (uint256) {
        return nAstrInstance.totalSupply();
    }
    
    function updateAdminAddress(address newAdminAddress) public {
        require(msg.sender == admin);
        admin = newAdminAddress;
        emit AdminAddressChange(newAdminAddress);
    }

    function updateDappsStakingContractAddress(address newDappsStakingContractAddress) public {
        require(msg.sender == admin);
        dappsStakingContractAddress = newDappsStakingContractAddress;
        dsInstance = DappsStaking(newDappsStakingContractAddress);
        emit DappsStakingContractAddressChange(newDappsStakingContractAddress);
    }

    function updateNAstrContractAddress(address newNAstrContractAddress) public {
        require(msg.sender == admin);
        nAstrContractAddress = newNAstrContractAddress;
        nAstrInstance = IERC20(newNAstrContractAddress);
        emit NAstrContractAddressChange(newNAstrContractAddress);
    }

    function updateDIAOracleContractAddress(address newDiaOracleContractAddress) public {
        require(msg.sender == admin);
        diaOracleContractAddress = newDiaOracleContractAddress;
        diaOracleInstance = DIAOracleV2(diaOracleContractAddress);
        emit DiaOracleContractAddressChange(newDiaOracleContractAddress);
    }

    function updateStakingArgumentAddress(address newStakingArgumentAddress) public {
        require(msg.sender == admin);
        stakingArgument = newStakingArgumentAddress;
        emit StakingArgumentAddressChange(newStakingArgumentAddress);
    }
}
        

Contract ABI

[{"type":"constructor","inputs":[{"type":"address","name":"newDappsStakingContractAddress","internalType":"address"},{"type":"address","name":"newNAstrContractAddress","internalType":"address"},{"type":"address","name":"newStakingArgumentAddress","internalType":"address"},{"type":"address","name":"newDiaOracleContractAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getAstrInStakingContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint128","name":"","internalType":"uint128"}],"name":"getNAstrPriceFromCollateralRatio","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getNAstrTotalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateAdminAddress","inputs":[{"type":"address","name":"newAdminAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateDIAOracleContractAddress","inputs":[{"type":"address","name":"newDiaOracleContractAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateDappsStakingContractAddress","inputs":[{"type":"address","name":"newDappsStakingContractAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateNAstrContractAddress","inputs":[{"type":"address","name":"newNAstrContractAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateStakingArgumentAddress","inputs":[{"type":"address","name":"newStakingArgumentAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"values","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"event","name":"AdminAddressChange","inputs":[{"type":"address","name":"newUpdater","indexed":false}],"anonymous":false},{"type":"event","name":"DappsStakingContractAddressChange","inputs":[{"type":"address","name":"newAddress","indexed":false}],"anonymous":false},{"type":"event","name":"DiaOracleContractAddressChange","inputs":[{"type":"address","name":"newAddress","indexed":false}],"anonymous":false},{"type":"event","name":"NAstrContractAddressChange","inputs":[{"type":"address","name":"newAddress","indexed":false}],"anonymous":false},{"type":"event","name":"OracleUpdate","inputs":[{"type":"string","name":"key","indexed":false},{"type":"uint128","name":"value","indexed":false},{"type":"uint128","name":"timestamp","indexed":false}],"anonymous":false},{"type":"event","name":"StakingArgumentAddressChange","inputs":[{"type":"address","name":"newAddress","indexed":false}],"anonymous":false}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b506040516200162838038062001628833981810160405281019062000037919062000522565b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200008984620000c660201b60201c565b6200009a83620001df60201b60201c565b620000ab81620002f860201b60201c565b620000bc826200043360201b60201c565b505050506200060a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200012157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fda6b386d29e15c2ba2c35e36b8e6abfb1dd02083278df68a65cba3130c5c425181604051620001d491906200059f565b60405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200023a57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5fbf63dda15b634077cd94eb7d6826dd9dd35579074cc9145d5219937d06223481604051620002ed91906200059f565b60405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200035357600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4f0ac3bab7dbccd5ecfb7109b27237b2607e4b270f17d2ef48d343307cc35a49816040516200042891906200059f565b60405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200048e57600080fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4ef6b24d44140c5d9489cb1ebbcf3ffe4c78d3ba8c1a4bbdb3bfbf3d0e709144816040516200050091906200059f565b60405180910390a150565b6000815190506200051c81620005f0565b92915050565b600080600080608085870312156200053957600080fd5b600062000549878288016200050b565b94505060206200055c878288016200050b565b93505060406200056f878288016200050b565b925050606062000582878288016200050b565b91505092959194509250565b6200059981620005bc565b82525050565b6000602082019050620005b660008301846200058e565b92915050565b6000620005c982620005d0565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620005fb81620005bc565b81146200060757600080fd5b50565b61100e806200061a6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063cff08b0411610066578063cff08b041461011c578063d48ce5a51461013b578063f25f974114610157578063f3cede3414610175578063f9660cf01461019357610093565b80633b1d4307146100985780635a9ade8b146100b457806385e2381c146100e4578063c830738b14610100575b600080fd5b6100b260048036038101906100ad9190610a60565b6101af565b005b6100ce60048036038101906100c99190610a89565b610284565b6040516100db9190610c7e565b60405180910390f35b6100fe60048036038101906100f99190610a60565b6102b2565b005b61011a60048036038101906101159190610a60565b610387565b005b61012461049d565b604051610132929190610c99565b60405180910390f35b61015560048036038101906101509190610a60565b61059b565b005b61015f6106b1565b60405161016c9190610c7e565b60405180910390f35b61017d6107da565b60405161018a9190610c7e565b60405180910390f35b6101ad60048036038101906101a89190610a60565b610881565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461020957600080fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4ef6b24d44140c5d9489cb1ebbcf3ffe4c78d3ba8c1a4bbdb3bfbf3d0e709144816040516102799190610c13565b60405180910390a150565b6000818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461030c57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75d8326a81519a727b7dbf8b04ac3117b7b428d302fd40ceb09bca3156fd8c048160405161037c9190610c13565b60405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e157600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5fbf63dda15b634077cd94eb7d6826dd9dd35579074cc9145d5219937d062234816040516104929190610c13565b60405180910390a150565b600080600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663960384a06040518163ffffffff1660e01b81526004016104fc90610c5e565b604080518083038186803b15801561051357600080fd5b505afa158015610527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054b9190610af3565b8092508193505050600061055d6107da565b6105656106b1565b846fffffffffffffffffffffffffffffffff166105829190610d76565b61058c9190610d45565b90508082945094505050509091565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105f557600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fda6b386d29e15c2ba2c35e36b8e6abfb1dd02083278df68a65cba3130c5c4251816040516106a69190610c13565b60405180910390a150565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd33172d600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516020016107479190610bf8565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610773929190610c2e565b60206040518083038186803b15801561078b57600080fd5b505afa15801561079f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c39190610aca565b6fffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561084457600080fd5b505afa158015610858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087c9190610b2f565b905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108db57600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4f0ac3bab7dbccd5ecfb7109b27237b2607e4b270f17d2ef48d343307cc35a49816040516109ae9190610c13565b60405180910390a150565b60006109cc6109c784610ce7565b610cc2565b9050828152602081018484840111156109e457600080fd5b6109ef848285610e28565b509392505050565b600081359050610a0681610f93565b92915050565b600082601f830112610a1d57600080fd5b8135610a2d8482602086016109b9565b91505092915050565b600081519050610a4581610faa565b92915050565b600081519050610a5a81610fc1565b92915050565b600060208284031215610a7257600080fd5b6000610a80848285016109f7565b91505092915050565b600060208284031215610a9b57600080fd5b600082013567ffffffffffffffff811115610ab557600080fd5b610ac184828501610a0c565b91505092915050565b600060208284031215610adc57600080fd5b6000610aea84828501610a36565b91505092915050565b60008060408385031215610b0657600080fd5b6000610b1485828601610a36565b9250506020610b2585828601610a36565b9150509250929050565b600060208284031215610b4157600080fd5b6000610b4f84828501610a4b565b91505092915050565b610b6181610dd0565b82525050565b610b78610b7382610dd0565b610e9b565b82525050565b6000610b8982610d18565b610b938185610d23565b9350610ba3818560208601610e37565b610bac81610f4c565b840191505092915050565b6000610bc4600883610d34565b9150610bcf82610f6a565b602082019050919050565b610be381610de2565b82525050565b610bf281610e1e565b82525050565b6000610c048284610b67565b60148201915081905092915050565b6000602082019050610c286000830184610b58565b92915050565b6000604082019050610c436000830185610b58565b8181036020830152610c558184610b7e565b90509392505050565b60006020820190508181036000830152610c7781610bb7565b9050919050565b6000602082019050610c936000830184610be9565b92915050565b6000604082019050610cae6000830185610be9565b610cbb6020830184610bda565b9392505050565b6000610ccc610cdd565b9050610cd88282610e6a565b919050565b6000604051905090565b600067ffffffffffffffff821115610d0257610d01610f1d565b5b610d0b82610f4c565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000610d5082610e1e565b9150610d5b83610e1e565b925082610d6b57610d6a610eee565b5b828204905092915050565b6000610d8182610e1e565b9150610d8c83610e1e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610dc557610dc4610ebf565b5b828202905092915050565b6000610ddb82610dfe565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015610e55578082015181840152602081019050610e3a565b83811115610e64576000848401525b50505050565b610e7382610f4c565b810181811067ffffffffffffffff82111715610e9257610e91610f1d565b5b80604052505050565b6000610ea682610ead565b9050919050565b6000610eb882610f5d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f415354522f555344000000000000000000000000000000000000000000000000600082015250565b610f9c81610dd0565b8114610fa757600080fd5b50565b610fb381610de2565b8114610fbe57600080fd5b50565b610fca81610e1e565b8114610fd557600080fd5b5056fea2646970667358221220f34e58c0b60d6fe0d957e6cff1933a5804e21be9aa40c3066e20b0a41723367764736f6c634300080300330000000000000000000000000000000000000000000000000000000000005001000000000000000000000000e511ed88575c57767bafb72bfd10775413e3f2b000000000000000000000000070d264472327b67898c919809a9dc4759b6c0f2700000000000000000000000088463254469c37b9cecb71a34746707e008fb5a9

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063cff08b0411610066578063cff08b041461011c578063d48ce5a51461013b578063f25f974114610157578063f3cede3414610175578063f9660cf01461019357610093565b80633b1d4307146100985780635a9ade8b146100b457806385e2381c146100e4578063c830738b14610100575b600080fd5b6100b260048036038101906100ad9190610a60565b6101af565b005b6100ce60048036038101906100c99190610a89565b610284565b6040516100db9190610c7e565b60405180910390f35b6100fe60048036038101906100f99190610a60565b6102b2565b005b61011a60048036038101906101159190610a60565b610387565b005b61012461049d565b604051610132929190610c99565b60405180910390f35b61015560048036038101906101509190610a60565b61059b565b005b61015f6106b1565b60405161016c9190610c7e565b60405180910390f35b61017d6107da565b60405161018a9190610c7e565b60405180910390f35b6101ad60048036038101906101a89190610a60565b610881565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461020957600080fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4ef6b24d44140c5d9489cb1ebbcf3ffe4c78d3ba8c1a4bbdb3bfbf3d0e709144816040516102799190610c13565b60405180910390a150565b6000818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461030c57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75d8326a81519a727b7dbf8b04ac3117b7b428d302fd40ceb09bca3156fd8c048160405161037c9190610c13565b60405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e157600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5fbf63dda15b634077cd94eb7d6826dd9dd35579074cc9145d5219937d062234816040516104929190610c13565b60405180910390a150565b600080600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663960384a06040518163ffffffff1660e01b81526004016104fc90610c5e565b604080518083038186803b15801561051357600080fd5b505afa158015610527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054b9190610af3565b8092508193505050600061055d6107da565b6105656106b1565b846fffffffffffffffffffffffffffffffff166105829190610d76565b61058c9190610d45565b90508082945094505050509091565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105f557600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fda6b386d29e15c2ba2c35e36b8e6abfb1dd02083278df68a65cba3130c5c4251816040516106a69190610c13565b60405180910390a150565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd33172d600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516020016107479190610bf8565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610773929190610c2e565b60206040518083038186803b15801561078b57600080fd5b505afa15801561079f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c39190610aca565b6fffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561084457600080fd5b505afa158015610858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087c9190610b2f565b905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108db57600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4f0ac3bab7dbccd5ecfb7109b27237b2607e4b270f17d2ef48d343307cc35a49816040516109ae9190610c13565b60405180910390a150565b60006109cc6109c784610ce7565b610cc2565b9050828152602081018484840111156109e457600080fd5b6109ef848285610e28565b509392505050565b600081359050610a0681610f93565b92915050565b600082601f830112610a1d57600080fd5b8135610a2d8482602086016109b9565b91505092915050565b600081519050610a4581610faa565b92915050565b600081519050610a5a81610fc1565b92915050565b600060208284031215610a7257600080fd5b6000610a80848285016109f7565b91505092915050565b600060208284031215610a9b57600080fd5b600082013567ffffffffffffffff811115610ab557600080fd5b610ac184828501610a0c565b91505092915050565b600060208284031215610adc57600080fd5b6000610aea84828501610a36565b91505092915050565b60008060408385031215610b0657600080fd5b6000610b1485828601610a36565b9250506020610b2585828601610a36565b9150509250929050565b600060208284031215610b4157600080fd5b6000610b4f84828501610a4b565b91505092915050565b610b6181610dd0565b82525050565b610b78610b7382610dd0565b610e9b565b82525050565b6000610b8982610d18565b610b938185610d23565b9350610ba3818560208601610e37565b610bac81610f4c565b840191505092915050565b6000610bc4600883610d34565b9150610bcf82610f6a565b602082019050919050565b610be381610de2565b82525050565b610bf281610e1e565b82525050565b6000610c048284610b67565b60148201915081905092915050565b6000602082019050610c286000830184610b58565b92915050565b6000604082019050610c436000830185610b58565b8181036020830152610c558184610b7e565b90509392505050565b60006020820190508181036000830152610c7781610bb7565b9050919050565b6000602082019050610c936000830184610be9565b92915050565b6000604082019050610cae6000830185610be9565b610cbb6020830184610bda565b9392505050565b6000610ccc610cdd565b9050610cd88282610e6a565b919050565b6000604051905090565b600067ffffffffffffffff821115610d0257610d01610f1d565b5b610d0b82610f4c565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000610d5082610e1e565b9150610d5b83610e1e565b925082610d6b57610d6a610eee565b5b828204905092915050565b6000610d8182610e1e565b9150610d8c83610e1e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610dc557610dc4610ebf565b5b828202905092915050565b6000610ddb82610dfe565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015610e55578082015181840152602081019050610e3a565b83811115610e64576000848401525b50505050565b610e7382610f4c565b810181811067ffffffffffffffff82111715610e9257610e91610f1d565b5b80604052505050565b6000610ea682610ead565b9050919050565b6000610eb882610f5d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f415354522f555344000000000000000000000000000000000000000000000000600082015250565b610f9c81610dd0565b8114610fa757600080fd5b50565b610fb381610de2565b8114610fbe57600080fd5b50565b610fca81610e1e565b8114610fd557600080fd5b5056fea2646970667358221220f34e58c0b60d6fe0d957e6cff1933a5804e21be9aa40c3066e20b0a41723367764736f6c63430008030033