Contrat

Contrat
0xb9a9f0f2a4…66631b7b8f

Solde WTG

20000 WTG

521 175,42 FCFA (@ 26,06 FCFA/WTG)

Avoirs en tokens

0 token

≈ 0,00 FCFA

Plus d'infos

Transactions envoyées2
Dernière activitéil y a 13 min
Première activitéil y a 1 j
Financé par

Code du contrat

✓ Vérifié

StakeManager · Solidity v0.8.20+commit.a1b79de6 · optimiseur activé (200 runs) · licence MIT

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.20;

import { Ownable2Step, Ownable } from "@openzeppelin/contracts/access/Ownable2Step.sol";
import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import { ValidatorShare } from "./ValidatorShare.sol";
import { IStakeManagerCallback, IValidatorShare } from "./interfaces.sol";

interface IStakingInfoManager {
    function registerShare(uint256 validatorId, address share) external;
    function logStaked(
        address signer,
        uint256 validatorId,
        uint256 activationEpoch,
        uint256 amount,
        uint256 total,
        address share
    ) external;
    function logUnstakeInit(
        address signer,
        uint256 validatorId,
        uint256 deactivationEpoch,
        uint256 amount
    ) external;
    function logUnstaked(address signer, uint256 validatorId, uint256 amount, uint256 total)
        external;
    function logCommissionUpdated(uint256 validatorId, uint256 oldBps, uint256 newBps) external;
    function logSlashed(uint256 validatorId, uint256 amount, string calldata reason) external;
    function logValidatorReward(uint256 validatorId, uint256 amount) external;
}

contract StakeManager is Ownable2Step, ReentrancyGuard, IStakeManagerCallback {
    uint16 public constant BPS = 10_000;
    address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;

    enum Status {
        None,
        Active,
        Inactive,
        Unbonding,
        Unstaked,
        Jailed
    }

    struct Validator {
        address signer;
        uint256 selfStake;
        uint256 delegatedStake;
        address shareContract;
        uint16 commissionBps;
        uint64 activationEpoch;
        uint64 deactivationEpoch;
        Status status;
        uint256 withdrawableRewards;
        uint256 selfUnbondAmount;
        uint64 selfUnbondAt;
        uint64 activeSince;
    }

    uint256 public minSelfStake;
    uint16 public maxValidators = 30;
    uint16 public maxCommissionBps = 3_000;
    uint64 public withdrawalDelay;

    uint64 public activationDelay = 1 days;

    uint256 public minDelegation = 10 ether;

    address public slasher;
    uint16 public maxSlashBps = 1_000;
    uint16 public downtimeSlashBps = 100;
    uint64 public downtimeGracePeriod = 7 days;
    mapping(uint256 => uint64) public downtimeStartedAt;
    mapping(uint256 => uint32) public offenseCount;

    IStakingInfoManager public immutable stakingInfo;
    address public rewardDistributor;

    uint256 public validatorCount;
    uint64 public currentEpoch = 1;
    mapping(uint256 => Validator) public validators;
    mapping(address => uint256) public validatorIdBySigner;
    mapping(address => uint256) public validatorIdByShare;
    uint256[] public activeValidators;

    event ValidatorStaked(uint256 indexed id, address indexed signer, uint256 selfStake, address share);
    event SelfStakeAdded(uint256 indexed id, uint256 amount, uint256 newSelfStake);
    event UnstakeInitiated(uint256 indexed id, uint256 amount, uint64 withdrawableAt);
    event SelfStakeWithdrawn(uint256 indexed id, uint256 amount);
    event RewardsDistributed(uint256 total, uint256 activeCount);
    event RewardsClaimed(uint256 indexed id, address indexed signer, uint256 amount);
    event ValidatorEvicted(uint256 indexed id);
    event ValidatorActivated(uint256 indexed id);
    event Slashed(uint256 indexed id, uint256 amount, uint16 bps, string reason);
    event DowntimeReported(uint256 indexed id, uint64 since);
    event DowntimeResolved(uint256 indexed id);
    event RewardDistributorSet(address indexed distributor);
    event SlasherSet(address indexed slasher);

    error NotValidator();
    error AlreadyValidator();
    error BelowMinStake();
    error CommissionTooHigh();
    error OnlyRewardDistributor();
    error OnlyShare();
    error SetFull();
    error StillBonding();
    error NothingToClaim();
    error ZeroAddress();
    error NotSlasher();
    error NotOffline();
    error GraceNotElapsed();
    error BpsTooHigh();

    constructor(
        uint256 minSelfStake_,
        uint64 withdrawalDelay_,
        address stakingInfo_,
        address owner_
    ) Ownable(owner_) {
        if (stakingInfo_ == address(0)) revert ZeroAddress();
        minSelfStake = minSelfStake_;
        withdrawalDelay = withdrawalDelay_;
        stakingInfo = IStakingInfoManager(stakingInfo_);
        slasher = owner_;
    }

    function stakeFor(address signer, uint16 commissionBps)
        external
        payable
        nonReentrant
        returns (uint256 id)
    {
        if (signer == address(0)) revert ZeroAddress();
        if (validatorIdBySigner[signer] != 0) revert AlreadyValidator();
        if (msg.value < minSelfStake) revert BelowMinStake();
        if (commissionBps > maxCommissionBps) revert CommissionTooHigh();

        id = ++validatorCount;
        ValidatorShare share = new ValidatorShare(id, address(this), address(stakingInfo), withdrawalDelay);

        validators[id] = Validator({
            signer: signer,
            selfStake: msg.value,
            delegatedStake: 0,
            shareContract: address(share),
            commissionBps: commissionBps,
            activationEpoch: currentEpoch,
            deactivationEpoch: 0,
            status: Status.Inactive,
            withdrawableRewards: 0,
            selfUnbondAmount: 0,
            selfUnbondAt: 0,
            activeSince: 0
        });
        validatorIdBySigner[signer] = id;
        validatorIdByShare[address(share)] = id;

        stakingInfo.registerShare(id, address(share));
        _tryActivate(id);

        stakingInfo.logStaked(signer, id, currentEpoch, msg.value, msg.value, address(share));
        emit ValidatorStaked(id, signer, msg.value, address(share));
    }

    function addSelfStake(uint256 id) external payable nonReentrant {
        Validator storage v = validators[id];
        if (v.signer == address(0)) revert NotValidator();
        require(msg.sender == v.signer, "StakeManager: not signer");
        require(msg.value > 0, "StakeManager: zero");
        v.selfStake += msg.value;
        if (v.status == Status.Inactive) _tryActivate(id);
        emit SelfStakeAdded(id, msg.value, v.selfStake);
    }

    function unstake(uint256 id) external nonReentrant {
        Validator storage v = validators[id];
        if (v.signer == address(0)) revert NotValidator();
        require(msg.sender == v.signer, "StakeManager: not signer");
        require(v.status != Status.Unbonding && v.status != Status.Unstaked, "already unbonding");

        _removeFromActive(id);
        v.status = Status.Unbonding;
        v.deactivationEpoch = currentEpoch;
        v.selfUnbondAmount = v.selfStake;
        v.selfUnbondAt = uint64(block.timestamp) + withdrawalDelay;
        uint256 amount = v.selfStake;
        v.selfStake = 0;

        stakingInfo.logUnstakeInit(v.signer, id, v.deactivationEpoch, amount);
        emit UnstakeInitiated(id, amount, v.selfUnbondAt);
    }

    function unstakeClaim(uint256 id) external nonReentrant {
        Validator storage v = validators[id];
        require(msg.sender == v.signer, "StakeManager: not signer");
        require(v.status == Status.Unbonding, "not unbonding");
        if (block.timestamp < v.selfUnbondAt) revert StillBonding();
        uint256 amount = v.selfUnbondAmount;
        v.selfUnbondAmount = 0;
        v.status = Status.Unstaked;
        (bool ok, ) = v.signer.call{ value: amount }("");
        require(ok, "StakeManager: withdraw failed");
        stakingInfo.logUnstaked(v.signer, id, amount, 0);
        emit SelfStakeWithdrawn(id, amount);
    }

    function setCommission(uint256 id, uint16 commissionBps) external {
        Validator storage v = validators[id];
        require(msg.sender == v.signer, "StakeManager: not signer");
        if (commissionBps > maxCommissionBps) revert CommissionTooHigh();
        uint16 old = v.commissionBps;
        v.commissionBps = commissionBps;
        stakingInfo.logCommissionUpdated(id, old, commissionBps);
    }

    function onDelegationChanged(uint256 validatorId, int256 delta) external override {
        if (validatorIdByShare[msg.sender] != validatorId || validatorId == 0) revert OnlyShare();
        Validator storage v = validators[validatorId];
        if (delta >= 0) {
            v.delegatedStake += uint256(delta);
        } else {
            uint256 dec = uint256(-delta);
            v.delegatedStake = dec > v.delegatedStake ? 0 : v.delegatedStake - dec;
        }
    }

    function distributeRewards() external payable nonReentrant {
        if (msg.sender != rewardDistributor) revert OnlyRewardDistributor();
        uint256 n = activeValidators.length;
        if (n == 0 || msg.value == 0) return;

        uint256 totalActiveStake;
        for (uint256 i = 0; i < n; i++) {
            totalActiveStake += _totalStake(activeValidators[i]);
        }
        if (totalActiveStake == 0) return;

        for (uint256 i = 0; i < n; i++) {
            uint256 id = activeValidators[i];
            Validator storage v = validators[id];
            uint256 vStake = _totalStake(id);
            uint256 rv = (msg.value * vStake) / totalActiveStake;
            if (rv == 0) continue;

            if (v.delegatedStake > 0 && v.shareContract != address(0)) {
                uint256 delegatorPortion = (rv * v.delegatedStake) / vStake;
                uint256 commission = (delegatorPortion * v.commissionBps) / BPS;
                uint256 delegatorReward = delegatorPortion - commission;
                uint256 validatorReward = rv - delegatorReward;
                v.withdrawableRewards += validatorReward;
                if (delegatorReward > 0) {
                    IValidatorShare(v.shareContract).addDelegationReward{ value: delegatorReward }();
                }
            } else {
                v.withdrawableRewards += rv;
            }
            stakingInfo.logValidatorReward(id, rv);
        }
        currentEpoch += 1;
        emit RewardsDistributed(msg.value, n);
    }

    function claimRewards(uint256 id) external nonReentrant {
        Validator storage v = validators[id];
        require(msg.sender == v.signer, "StakeManager: not signer");
        uint256 amount = v.withdrawableRewards;
        if (amount == 0) revert NothingToClaim();
        v.withdrawableRewards = 0;
        (bool ok, ) = v.signer.call{ value: amount }("");
        require(ok, "StakeManager: claim failed");
        emit RewardsClaimed(id, v.signer, amount);
    }

    modifier onlySlasher() {
        if (msg.sender != slasher && msg.sender != owner()) revert NotSlasher();
        _;
    }

    function reportDowntime(uint256 id) external onlySlasher {
        Validator storage v = validators[id];
        if (v.signer == address(0)) revert NotValidator();
        if (downtimeStartedAt[id] == 0) {
            downtimeStartedAt[id] = uint64(block.timestamp);
            emit DowntimeReported(id, uint64(block.timestamp));
        }
    }

    function resolveDowntime(uint256 id) external onlySlasher {
        downtimeStartedAt[id] = 0;
        emit DowntimeResolved(id);
    }

    function slashDowntime(uint256 id) external onlySlasher nonReentrant {
        Validator storage v = validators[id];
        if (v.signer == address(0)) revert NotValidator();
        uint64 since = downtimeStartedAt[id];
        if (since == 0) revert NotOffline();
        if (block.timestamp < since + downtimeGracePeriod) revert GraceNotElapsed();

        uint32 offence = offenseCount[id];
        uint256 exp = offence > 6 ? 6 : offence;
        uint256 bps = uint256(downtimeSlashBps) << exp;
        if (bps > maxSlashBps) bps = maxSlashBps;

        offenseCount[id] = offence + 1;
        downtimeStartedAt[id] = 0;
        _applySlash(id, uint16(bps), "downtime");
    }

    function slash(uint256 id, uint16 bps, string calldata reason)
        external
        onlyOwner
        nonReentrant
    {
        if (bps > maxSlashBps) revert BpsTooHigh();
        _applySlash(id, bps, reason);
    }

    function _applySlash(uint256 id, uint16 bps, string memory reason) internal {
        Validator storage v = validators[id];
        if (v.signer == address(0)) revert NotValidator();

        uint256 amount = (_totalStake(id) * bps) / BPS;

        uint256 fromSelf = amount > v.selfStake ? v.selfStake : amount;
        v.selfStake -= fromSelf;
        uint256 remaining = amount - fromSelf;

        uint256 fromDelegation;
        if (remaining > 0 && v.shareContract != address(0)) {
            fromDelegation = IValidatorShare(v.shareContract).slash(remaining);
            v.delegatedStake = fromDelegation > v.delegatedStake ? 0 : v.delegatedStake - fromDelegation;
        }

        uint256 total = fromSelf + fromDelegation;
        if (total > 0) {
            (bool ok, ) = BURN_ADDRESS.call{ value: total }("");
            require(ok, "StakeManager: slash burn failed");
        }

        if (v.selfStake < minSelfStake) _removeFromActive(id);
        stakingInfo.logSlashed(id, total, reason);
        emit Slashed(id, total, bps, reason);
    }

    function _totalStake(uint256 id) internal view returns (uint256) {
        Validator storage v = validators[id];
        return v.selfStake + v.delegatedStake;
    }

    function _isActive(uint256 id) internal view returns (bool) {
        return validators[id].status == Status.Active;
    }

    function _tryActivate(uint256 id) internal {
        if (validators[id].status == Status.Active) return;
        if (validators[id].selfStake < minSelfStake) return;

        if (activeValidators.length < maxValidators) {
            _activate(id);
            return;
        }

        (uint256 minId, uint256 minIdx, uint256 minStake) = _weakestActive();
        if (_totalStake(id) > minStake) {
            _deactivateAt(minIdx, minId);
            _activate(id);
        }
    }

    function _activate(uint256 id) internal {
        validators[id].status = Status.Active;
        validators[id].activationEpoch = currentEpoch;

        validators[id].activeSince = uint64(block.timestamp) + activationDelay;
        activeValidators.push(id);
        emit ValidatorActivated(id);
    }

    function _weakestActive() internal view returns (uint256 minId, uint256 minIdx, uint256 minStake) {
        minStake = type(uint256).max;
        for (uint256 i = 0; i < activeValidators.length; i++) {
            uint256 s = _totalStake(activeValidators[i]);
            if (s < minStake) {
                minStake = s;
                minId = activeValidators[i];
                minIdx = i;
            }
        }
    }

    function _removeFromActive(uint256 id) internal {
        for (uint256 i = 0; i < activeValidators.length; i++) {
            if (activeValidators[i] == id) {
                _deactivateAt(i, id);
                return;
            }
        }
    }

    function _deactivateAt(uint256 idx, uint256 id) internal {
        uint256 last = activeValidators.length - 1;
        if (idx != last) activeValidators[idx] = activeValidators[last];
        activeValidators.pop();
        if (validators[id].status == Status.Active) {
            validators[id].status = Status.Inactive;
            emit ValidatorEvicted(id);
        }
    }

    function getActiveValidatorSigners() external view returns (address[] memory signers) {
        uint256 n;
        for (uint256 i = 0; i < activeValidators.length; i++) {
            if (block.timestamp >= validators[activeValidators[i]].activeSince) n++;
        }
        signers = new address[](n);
        uint256 j;
        for (uint256 i = 0; i < activeValidators.length; i++) {
            uint256 id = activeValidators[i];
            if (block.timestamp >= validators[id].activeSince) {
                signers[j++] = validators[id].signer;
            }
        }
    }

    function isReadyToValidate(uint256 id) external view returns (bool) {
        return validators[id].status == Status.Active
            && block.timestamp >= validators[id].activeSince;
    }

    function getActiveValidators() external view returns (uint256[] memory) {
        return activeValidators;
    }

    function totalStakeOf(uint256 id) external view returns (uint256) {
        return _totalStake(id);
    }

    function getValidator(uint256 id) external view returns (Validator memory) {
        return validators[id];
    }

    function setRewardDistributor(address distributor) external onlyOwner {
        if (distributor == address(0)) revert ZeroAddress();
        rewardDistributor = distributor;
        emit RewardDistributorSet(distributor);
    }

    function setMinSelfStake(uint256 v) external onlyOwner {
        minSelfStake = v;
    }

    function setMaxValidators(uint16 v) external onlyOwner {
        require(v >= activeValidators.length, "below current active");
        maxValidators = v;
    }

    function setMaxCommissionBps(uint16 v) external onlyOwner {
        require(v <= BPS, "bad bps");
        maxCommissionBps = v;
    }

    function setWithdrawalDelay(uint64 v) external onlyOwner {
        withdrawalDelay = v;
    }

    function setActivationDelay(uint64 v) external onlyOwner {
        activationDelay = v;
    }

    function setMinDelegation(uint256 v) external onlyOwner {
        minDelegation = v;
    }

    function setSlasher(address s) external onlyOwner {
        slasher = s;
        emit SlasherSet(s);
    }

    function setSlashParams(uint16 maxBps, uint16 downtimeBps, uint64 gracePeriod)
        external
        onlyOwner
    {
        if (maxBps > BPS) revert BpsTooHigh();
        if (downtimeBps > maxBps) revert BpsTooHigh();
        maxSlashBps = maxBps;
        downtimeSlashBps = downtimeBps;
        downtimeGracePeriod = gracePeriod;
    }

    receive() external payable { }
}
[
    {
        "type": "constructor",
        "inputs": [
            {
                "name": "minSelfStake_",
                "type": "uint256",
                "internalType": "uint256"
            },
            {
                "name": "withdrawalDelay_",
                "type": "uint64",
                "internalType": "uint64"
            },
            {
                "name": "stakingInfo_",
                "type": "address",
                "internalType": "address"
            },
            {
                "name": "owner_",
                "type": "address",
                "internalType": "address"
            }
        ],
        "stateMutability": "nonpayable"
    },
    {
        "type": "receive",
        "stateMutability": "payable"
    },
    {
        "type": "function",
        "name": "BPS",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint16",
                "internalType": "uint16"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "BURN_ADDRESS",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "address",
                "internalType": "address"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "acceptOwnership",
        "inputs": [],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "activationDelay",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint64",
                "internalType": "uint64"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "activeValidators",
        "inputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "addSelfStake",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [],
        "stateMutability": "payable"
    },
    {
        "type": "function",
        "name": "claimRewards",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "currentEpoch",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint64",
                "internalType": "uint64"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "distributeRewards",
        "inputs": [],
        "outputs": [],
        "stateMutability": "payable"
    },
    {
        "type": "function",
        "name": "downtimeGracePeriod",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint64",
                "internalType": "uint64"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "downtimeSlashBps",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint16",
                "internalType": "uint16"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "downtimeStartedAt",
        "inputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [
            {
                "name": "",
                "type": "uint64",
                "internalType": "uint64"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "getActiveValidatorSigners",
        "inputs": [],
        "outputs": [
            {
                "name": "signers",
                "type": "address[]",
                "internalType": "address[]"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "getActiveValidators",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint256[]",
                "internalType": "uint256[]"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "getValidator",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [
            {
                "name": "",
                "type": "tuple",
                "internalType": "struct StakeManager.Validator",
                "components": [
                    {
                        "name": "signer",
                        "type": "address",
                        "internalType": "address"
                    },
                    {
                        "name": "selfStake",
                        "type": "uint256",
                        "internalType": "uint256"
                    },
                    {
                        "name": "delegatedStake",
                        "type": "uint256",
                        "internalType": "uint256"
                    },
                    {
                        "name": "shareContract",
                        "type": "address",
                        "internalType": "address"
                    },
                    {
                        "name": "commissionBps",
                        "type": "uint16",
                        "internalType": "uint16"
                    },
                    {
                        "name": "activationEpoch",
                        "type": "uint64",
                        "internalType": "uint64"
                    },
                    {
                        "name": "deactivationEpoch",
                        "type": "uint64",
                        "internalType": "uint64"
                    },
                    {
                        "name": "status",
                        "type": "uint8",
                        "internalType": "enum StakeManager.Status"
                    },
                    {
                        "name": "withdrawableRewards",
                        "type": "uint256",
                        "internalType": "uint256"
                    },
                    {
                        "name": "selfUnbondAmount",
                        "type": "uint256",
                        "internalType": "uint256"
                    },
                    {
                        "name": "selfUnbondAt",
                        "type": "uint64",
                        "internalType": "uint64"
                    },
                    {
                        "name": "activeSince",
                        "type": "uint64",
                        "internalType": "uint64"
                    }
                ]
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "isReadyToValidate",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [
            {
                "name": "",
                "type": "bool",
                "internalType": "bool"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "maxCommissionBps",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint16",
                "internalType": "uint16"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "maxSlashBps",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint16",
                "internalType": "uint16"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "maxValidators",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint16",
                "internalType": "uint16"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "minDelegation",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "minSelfStake",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "offenseCount",
        "inputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [
            {
                "name": "",
                "type": "uint32",
                "internalType": "uint32"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "onDelegationChanged",
        "inputs": [
            {
                "name": "validatorId",
                "type": "uint256",
                "internalType": "uint256"
            },
            {
                "name": "delta",
                "type": "int256",
                "internalType": "int256"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "owner",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "address",
                "internalType": "address"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "pendingOwner",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "address",
                "internalType": "address"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "renounceOwnership",
        "inputs": [],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "reportDowntime",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "resolveDowntime",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "rewardDistributor",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "address",
                "internalType": "address"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "setActivationDelay",
        "inputs": [
            {
                "name": "v",
                "type": "uint64",
                "internalType": "uint64"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "setCommission",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            },
            {
                "name": "commissionBps",
                "type": "uint16",
                "internalType": "uint16"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "setMaxCommissionBps",
        "inputs": [
            {
                "name": "v",
                "type": "uint16",
                "internalType": "uint16"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "setMaxValidators",
        "inputs": [
            {
                "name": "v",
                "type": "uint16",
                "internalType": "uint16"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "setMinDelegation",
        "inputs": [
            {
                "name": "v",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "setMinSelfStake",
        "inputs": [
            {
                "name": "v",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "setRewardDistributor",
        "inputs": [
            {
                "name": "distributor",
                "type": "address",
                "internalType": "address"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "setSlashParams",
        "inputs": [
            {
                "name": "maxBps",
                "type": "uint16",
                "internalType": "uint16"
            },
            {
                "name": "downtimeBps",
                "type": "uint16",
                "internalType": "uint16"
            },
            {
                "name": "gracePeriod",
                "type": "uint64",
                "internalType": "uint64"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "setSlasher",
        "inputs": [
            {
                "name": "s",
                "type": "address",
                "internalType": "address"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "setWithdrawalDelay",
        "inputs": [
            {
                "name": "v",
                "type": "uint64",
                "internalType": "uint64"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "slash",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            },
            {
                "name": "bps",
                "type": "uint16",
                "internalType": "uint16"
            },
            {
                "name": "reason",
                "type": "string",
                "internalType": "string"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "slashDowntime",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "slasher",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "address",
                "internalType": "address"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "stakeFor",
        "inputs": [
            {
                "name": "signer",
                "type": "address",
                "internalType": "address"
            },
            {
                "name": "commissionBps",
                "type": "uint16",
                "internalType": "uint16"
            }
        ],
        "outputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "stateMutability": "payable"
    },
    {
        "type": "function",
        "name": "stakingInfo",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "address",
                "internalType": "contract IStakingInfoManager"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "totalStakeOf",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "transferOwnership",
        "inputs": [
            {
                "name": "newOwner",
                "type": "address",
                "internalType": "address"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "unstake",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "unstakeClaim",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [],
        "stateMutability": "nonpayable"
    },
    {
        "type": "function",
        "name": "validatorCount",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "validatorIdByShare",
        "inputs": [
            {
                "name": "",
                "type": "address",
                "internalType": "address"
            }
        ],
        "outputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "validatorIdBySigner",
        "inputs": [
            {
                "name": "",
                "type": "address",
                "internalType": "address"
            }
        ],
        "outputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "validators",
        "inputs": [
            {
                "name": "",
                "type": "uint256",
                "internalType": "uint256"
            }
        ],
        "outputs": [
            {
                "name": "signer",
                "type": "address",
                "internalType": "address"
            },
            {
                "name": "selfStake",
                "type": "uint256",
                "internalType": "uint256"
            },
            {
                "name": "delegatedStake",
                "type": "uint256",
                "internalType": "uint256"
            },
            {
                "name": "shareContract",
                "type": "address",
                "internalType": "address"
            },
            {
                "name": "commissionBps",
                "type": "uint16",
                "internalType": "uint16"
            },
            {
                "name": "activationEpoch",
                "type": "uint64",
                "internalType": "uint64"
            },
            {
                "name": "deactivationEpoch",
                "type": "uint64",
                "internalType": "uint64"
            },
            {
                "name": "status",
                "type": "uint8",
                "internalType": "enum StakeManager.Status"
            },
            {
                "name": "withdrawableRewards",
                "type": "uint256",
                "internalType": "uint256"
            },
            {
                "name": "selfUnbondAmount",
                "type": "uint256",
                "internalType": "uint256"
            },
            {
                "name": "selfUnbondAt",
                "type": "uint64",
                "internalType": "uint64"
            },
            {
                "name": "activeSince",
                "type": "uint64",
                "internalType": "uint64"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "function",
        "name": "withdrawalDelay",
        "inputs": [],
        "outputs": [
            {
                "name": "",
                "type": "uint64",
                "internalType": "uint64"
            }
        ],
        "stateMutability": "view"
    },
    {
        "type": "event",
        "name": "DowntimeReported",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "indexed": true,
                "internalType": "uint256"
            },
            {
                "name": "since",
                "type": "uint64",
                "indexed": false,
                "internalType": "uint64"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "DowntimeResolved",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "indexed": true,
                "internalType": "uint256"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "OwnershipTransferStarted",
        "inputs": [
            {
                "name": "previousOwner",
                "type": "address",
                "indexed": true,
                "internalType": "address"
            },
            {
                "name": "newOwner",
                "type": "address",
                "indexed": true,
                "internalType": "address"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "OwnershipTransferred",
        "inputs": [
            {
                "name": "previousOwner",
                "type": "address",
                "indexed": true,
                "internalType": "address"
            },
            {
                "name": "newOwner",
                "type": "address",
                "indexed": true,
                "internalType": "address"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "RewardDistributorSet",
        "inputs": [
            {
                "name": "distributor",
                "type": "address",
                "indexed": true,
                "internalType": "address"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "RewardsClaimed",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "indexed": true,
                "internalType": "uint256"
            },
            {
                "name": "signer",
                "type": "address",
                "indexed": true,
                "internalType": "address"
            },
            {
                "name": "amount",
                "type": "uint256",
                "indexed": false,
                "internalType": "uint256"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "RewardsDistributed",
        "inputs": [
            {
                "name": "total",
                "type": "uint256",
                "indexed": false,
                "internalType": "uint256"
            },
            {
                "name": "activeCount",
                "type": "uint256",
                "indexed": false,
                "internalType": "uint256"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "SelfStakeAdded",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "indexed": true,
                "internalType": "uint256"
            },
            {
                "name": "amount",
                "type": "uint256",
                "indexed": false,
                "internalType": "uint256"
            },
            {
                "name": "newSelfStake",
                "type": "uint256",
                "indexed": false,
                "internalType": "uint256"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "SelfStakeWithdrawn",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "indexed": true,
                "internalType": "uint256"
            },
            {
                "name": "amount",
                "type": "uint256",
                "indexed": false,
                "internalType": "uint256"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "Slashed",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "indexed": true,
                "internalType": "uint256"
            },
            {
                "name": "amount",
                "type": "uint256",
                "indexed": false,
                "internalType": "uint256"
            },
            {
                "name": "bps",
                "type": "uint16",
                "indexed": false,
                "internalType": "uint16"
            },
            {
                "name": "reason",
                "type": "string",
                "indexed": false,
                "internalType": "string"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "SlasherSet",
        "inputs": [
            {
                "name": "slasher",
                "type": "address",
                "indexed": true,
                "internalType": "address"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "UnstakeInitiated",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "indexed": true,
                "internalType": "uint256"
            },
            {
                "name": "amount",
                "type": "uint256",
                "indexed": false,
                "internalType": "uint256"
            },
            {
                "name": "withdrawableAt",
                "type": "uint64",
                "indexed": false,
                "internalType": "uint64"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "ValidatorActivated",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "indexed": true,
                "internalType": "uint256"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "ValidatorEvicted",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "indexed": true,
                "internalType": "uint256"
            }
        ],
        "anonymous": false
    },
    {
        "type": "event",
        "name": "ValidatorStaked",
        "inputs": [
            {
                "name": "id",
                "type": "uint256",
                "indexed": true,
                "internalType": "uint256"
            },
            {
                "name": "signer",
                "type": "address",
                "indexed": true,
                "internalType": "address"
            },
            {
                "name": "selfStake",
                "type": "uint256",
                "indexed": false,
                "internalType": "uint256"
            },
            {
                "name": "share",
                "type": "address",
                "indexed": false,
                "internalType": "address"
            }
        ],
        "anonymous": false
    },
    {
        "type": "error",
        "name": "AlreadyValidator",
        "inputs": []
    },
    {
        "type": "error",
        "name": "BelowMinStake",
        "inputs": []
    },
    {
        "type": "error",
        "name": "BpsTooHigh",
        "inputs": []
    },
    {
        "type": "error",
        "name": "CommissionTooHigh",
        "inputs": []
    },
    {
        "type": "error",
        "name": "GraceNotElapsed",
        "inputs": []
    },
    {
        "type": "error",
        "name": "NotOffline",
        "inputs": []
    },
    {
        "type": "error",
        "name": "NotSlasher",
        "inputs": []
    },
    {
        "type": "error",
        "name": "NotValidator",
        "inputs": []
    },
    {
        "type": "error",
        "name": "NothingToClaim",
        "inputs": []
    },
    {
        "type": "error",
        "name": "OnlyRewardDistributor",
        "inputs": []
    },
    {
        "type": "error",
        "name": "OnlyShare",
        "inputs": []
    },
    {
        "type": "error",
        "name": "OwnableInvalidOwner",
        "inputs": [
            {
                "name": "owner",
                "type": "address",
                "internalType": "address"
            }
        ]
    },
    {
        "type": "error",
        "name": "OwnableUnauthorizedAccount",
        "inputs": [
            {
                "name": "account",
                "type": "address",
                "internalType": "address"
            }
        ]
    },
    {
        "type": "error",
        "name": "ReentrancyGuardReentrantCall",
        "inputs": []
    },
    {
        "type": "error",
        "name": "SetFull",
        "inputs": []
    },
    {
        "type": "error",
        "name": "StillBonding",
        "inputs": []
    },
    {
        "type": "error",
        "name": "ZeroAddress",
        "inputs": []
    }
]
0x60808060405260043610156200001e575b5036156200001c575f80fd5b005b5f90813560e01c9081630298599214620022ac575080630352a592146200228957806304b69fc4146200226257806308ac5256146200223e5780630962ef79146200213c5780630e588fa61462001c215780630f43a6771462001c0157806313c366671462001bda57806314f64c781462001b9c578063167c392e1462001b145780631d5987761462001a545780631df8eb651462001999578063249d39e9146200197a5780632e17de78146200175d57806335aa2e44146200168f5780633a8c078614620016635780633dfe129d146200162e5780633e17b6001462001607578063424fb86c146200155457806364b41a4714620013905780636f4a2cd01462001367578063703ec8c41462001320578063715018a614620012b757806373add0fd146200126357806376671808146200123a57806379ba509714620011b05780638da5cb5b146200118757806393f492b5146200110657806396b896eb14620010b05780639de702581462000ff4578063a1809b951462000f71578063a7ab69611462000f46578063aabc24961462000ed8578063ab6e48db1462000eb1578063acc2166a1462000e86578063ae0d033b1462000d78578063b13442711462000d4d578063b5d896271462000b4e578063c297e2781462000a89578063c2ca1b7814620008db578063c5f530af14620008bb578063c71ca3851462000889578063d1a2d208146200085e578063d75629cf1462000837578063d86d53e71462000615578063da9665a61462000587578063e30c3978146200055c578063e62fd8001462000433578063f2fde38b14620003c0578063f43f58701462000383578063f5f394fb1462000346578063faaf32be14620002c35763fccc281303620000105734620002c05780600319360112620002c057602060405161dead8152f35b80fd5b5034620002c0576020366003190112620002c057620002e1620022f3565b620002eb62002374565b61ffff600f5491169081106200030a5761ffff19600454161760045580f35b60405162461bcd60e51b815260206004820152601460248201527362656c6f772063757272656e742061637469766560601b6044820152606490fd5b5034620002c0576020366003190112620002c0576020906040906001600160a01b0362000372620022ca565b168152600d83522054604051908152f35b5034620002c0576020366003190112620002c0576020906040906001600160a01b03620003af620022ca565b168152600e83522054604051908152f35b5034620002c0576020366003190112620002c057620003de620022ca565b620003e862002374565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b506020366003190112620002c0576004356200044e620023fe565b808252600c6020526040822080546001600160a01b031680156200054a576200047990331462002420565b3415620005105760ff60046001830192620004963485546200246d565b8455015460401c166006811015620004fc577f1a42a5fa69c9be8ff3a201d9f67fa46a4b3b3a3ac992bbe29a06f3b6686987a691600260409214620004eb575b548151903482526020820152a2600160025580f35b620004f68462002b40565b620004d6565b634e487b7160e01b84526021600452602484fd5b60405162461bcd60e51b81526020600482015260126024820152715374616b654d616e616765723a207a65726f60701b6044820152606490fd5b604051632ec5b44960e01b8152600490fd5b5034620002c05780600319360112620002c0576001546040516001600160a01b039091168152602090f35b5034620002c0576020366003190112620002c057600435808252600c60205260ff600460408420015460401c1660068110156200060157916001602093149182620005d9575b50506040519015158152f35b6001600160401b0392508160409160079352600c855220015460401c164210155f80620005cd565b634e487b7160e01b83526021600452602483fd5b5034620002c0576020366003190112620002c05760043562000636620023fe565b808252600c6020526040822080546001600160a01b03908116916200065d33841462002420565b60048101805460ff8160401c1660068110156200082357600303620007ee576001600160401b036007840154164210620007dc578680809692819493829468040000000000000000600689019384549b8c955560ff60401b19161790555af1620006c6620024b3565b501562000797578185927f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a816915416813b156200078857829160848392604051948593849263ae2e26b160e01b845260048401528960248401528860448401528160648401525af180156200078c5762000770575b505060207f8cb2a9e699d3b80aa8f75ec62b8bec9bc055e8b85187c6e4f73f5ead396e070d91604051908152a2600160025580f35b6200077b90620023c8565b6200078857825f6200073b565b8280fd5b6040513d84823e3d90fd5b60405162461bcd60e51b815260206004820152601d60248201527f5374616b654d616e616765723a207769746864726177206661696c65640000006044820152606490fd5b60405163188acae760e11b8152600490fd5b60405162461bcd60e51b815260206004820152600d60248201526c6e6f7420756e626f6e64696e6760981b6044820152606490fd5b634e487b7160e01b88526021600452602488fd5b5034620002c0576020366003190112620002c0576200085562002374565b60043560035580f35b5034620002c0576020366003190112620002c05760206200088160043562002b1d565b604051908152f35b5034620002c0576020366003190112620002c05763ffffffff6040602092600435815260088452205416604051908152f35b5034620002c05780600319360112620002c0576020600354604051908152f35b5034620002c05780600319360112620002c057600f5481805b82811062000a235750620009256200090c8462002eca565b936200091c6040519586620023dc565b80855262002eca565b6020928484019291601f190136843781825b8281106200098b5750505060405193838594850191818652518092526040850193925b8281106200096a57505050500390f35b83516001600160a01b0316855286955093810193928101926001016200095a565b6200099b81979596949762002305565b90549060031b1c8752600c8452604087206001600160401b03600782015460401c16421015620009dd575b50620009d29062002388565b959294939562000937565b546001600160a01b0316620009f28362002388565b92865181101562000a0f5760051b8601850152620009d2620009c6565b634e487b7160e01b89526032600452602489fd5b62000a318194929462002305565b90549060031b1c8452600c6020526001600160401b03600760408620015460401c1642101562000a70575b62000a679062002388565b929092620008f4565b9062000a8062000a679162002388565b91905062000a5c565b5034620002c0576040366003190112620002c05760043560243590338352600e6020528060408420541480159062000b45575b62000b33578252600c6020526040822082821262000aea57600262000ae591019182546200246d565b905580f35b90600160ff1b811462000b1f5760029083039101908154908181115f1462000b1457505081905580f35b62000ae591620024e7565b634e487b7160e01b83526011600452602483fd5b60405163ef0db88b60e01b8152600490fd5b50801562000abc565b5034620002c0576020366003190112620002c05780604091610160835162000b7681620023ab565b82815282602082015282858201528260608201528260808201528260a08201528260c08201528260e082015282610100820152826101208201528261014082015201526004358152600c6020522060405162000bd281620023ab565b60018060a01b03825416815260018201546020820152600282015460408201526001600160401b03600383015460018060a01b038116606084015261ffff8160a01c16608084015260b01c1660a08201526004820154916001600160401b03831660c0830152600660ff8460401c16101562000d395760076001600160401b039160ff6101809560401c1660e085015260058101546101008501526006810154610120850152015481811661014084015260401c166101608201526001600160401b036101606040519260018060a01b038151168452602081015160208501526040810151604085015260018060a01b03606082015116606085015261ffff60808201511660808501528260a08201511660a08501528260c08201511660c085015262000d0860e082015160e08601906200234f565b6101008101516101008501526101208101516101208501528261014082015116610140850152015116610160820152f35b634e487b7160e01b5f52602160045260245ffd5b5034620002c05780600319360112620002c0576006546040516001600160a01b039091168152602090f35b5034620002c0576040366003190112620002c05760043562000d99620022e1565b90808352600c602052604083209060018060a01b0362000dbe81845416331462002420565b61ffff908160045460101c169382861694851162000e7457600301805461ffff60a01b19811660a097881b61ffff60a01b161790915586951c909116907f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a816803b1562000e70578492836064926040519687958694637b9faca560e11b86526004860152602485015260448401525af180156200078c5762000e5d5750f35b62000e6890620023c8565b620002c05780f35b8480fd5b604051636dcfdacf60e01b8152600490fd5b5034620002c05780600319360112620002c0576009546040516001600160a01b039091168152602090f35b5034620002c05780600319360112620002c057602061ffff60065460a01c16604051908152f35b5034620002c0576020366003190112620002c05762000ef6620022ca565b62000f0062002374565b600680546001600160a01b0319166001600160a01b039290921691821790557f93984378289228ac490c326f8dbcc3f9b2c703753c272e7c572949e115da985e8280a280f35b5034620002c05780600319360112620002c05760206004546001600160401b0360405191831c168152f35b5034620002c0576020366003190112620002c05762000f8f620022ca565b62000f9962002374565b6001600160a01b0316801562000fe257600980546001600160a01b031916821790557f075c02c513a415bd4ff5976f8aa6fc5767d2183daca9ec00ab71ce78e8bf81588280a280f35b60405163d92e233d60e01b8152600490fd5b5034620002c05780600319360112620002c0576040518091600f549081835260208093018092600f83527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80290835b8181106200109b57505050846200105b910385620023dc565b60405193838594850191818652518092526040850193925b8281106200108357505050500390f35b83518552869550938101939281019260010162001073565b82548452928601926001928301920162001042565b5034620002c0576020366003190112620002c057620010ce6200235d565b620010d862002374565b6004805467ffffffffffffffff60601b191660609290921b67ffffffffffffffff60601b1691909117905580f35b5034620002c0576020366003190112620002c05762001124620022f3565b6200112e62002374565b61271061ffff821611620011585763ffff00006004549160101b169063ffff000019161760045580f35b60405162461bcd60e51b81526020600482015260076024820152666261642062707360c81b6044820152606490fd5b5034620002c05780600319360112620002c057546040516001600160a01b039091168152602090f35b5034620002c05780600319360112620002c0576001546001600160a01b03338183160362001222576bffffffffffffffffffffffff60a01b8092166001555f549133908316175f553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a380f35b60405163118cdaa760e01b8152336004820152602490fd5b5034620002c05780600319360112620002c05760206001600160401b03600b5416604051908152f35b5034620002c0576020366003190112620002c057620012816200235d565b6200128b62002374565b6bffffffffffffffff000000006004549160201b16906bffffffffffffffff0000000019161760045580f35b5034620002c05780600319360112620002c057620012d462002374565b600180546001600160a01b03199081169091555f80549182168155906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034620002c05780600319360112620002c0576040517f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a86001600160a01b03168152602090f35b5080600319360112620002c0576200137e620023fe565b6200138862002528565b600160025580f35b5034620002c0576020806003193601126200155057600654600435906001600160a01b039081163314158062001542575b6200153057620013d0620023fe565b818452600c8352604084205416156200054a57808352600782526001600160401b03908160408520541680156200151e578262001415600654928360c01c906200247b565b1642106200150c578185526008845263ffffffff908160408720541691600683115f1462001505576006925b61ffff809483828660b01c1691161b9360a01c16808411620014fb575b5060010190808211620014e7578488526008875260408820911663ffffffff1982541617905560078552604086206001600160401b0319815416905560405193604085019085821090821117620014d357620013889567646f776e74696d6560c01b916040526008865285015216906200284a565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b88526011600452602488fd5b925060016200145e565b8262001441565b604051633937f51f60e01b8152600490fd5b604051639bf6a0a560e01b8152600490fd5b60405163dabc4ad960e01b8152600490fd5b5080845416331415620013c1565b5080fd5b5034620002c0576060366003190112620002c05762001572620022f3565b6200157c620022e1565b6044356001600160401b038116810362001603576200159a62002374565b61ffff808416906127108211620015f157831611620015f157600654906001600160401b0360c01b9060c01b169261ffff60a01b9060a01b169060018060a01b0316179061ffff60b01b9060b01b16171760065580f35b60405163bbf4268d60e01b8152600490fd5b5f80fd5b5034620002c05780600319360112620002c057602061ffff60045460101c16604051908152f35b5034620002c0576020366003190112620002c0576001600160401b036040602092600435815260078452205416604051908152f35b5034620002c05780600319360112620002c05760206001600160401b0360045460601c16604051908152f35b5034620002c0576020366003190112620002c0576040610180916004358152600c6020522060018060a01b03808254169160018101549060028101546200173c6003830154946004840154906005850154936007600687015496015496604051998a5260208a015260408901528616606088015261ffff8660a01c1660808801526001600160401b03809660b01c1660a088015285811660c088015260ff60e088019160401c166200234f565b61010085015261012084015281811661014084015260401c16610160820152f35b5034620002c0576020366003190112620002c0576004356200177e620023fe565b808252600c6020526040822080546001600160a01b0390811680156200054a57620017ab90331462002420565b600482019160ff835460401c16600681101562001966576003811415908162001959575b50156200192057620017e18462002d64565b8483549168030000000000000000948560ff60401b1985161781556001600160401b039586600b5416809568ffffffffffffffffff191617179055600181019283549485600684015583620018408860045460201c168942166200247b565b95886007860197166001600160401b031988541617875555807f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a81692541690823b156200191c5760848492836040519586948593635e04d48360e01b855260048501528c602485015260448401528960648401525af180156200078c5762001900575b5050907f7fd01ed64ec1212c4d7330a2aa5293c46d52b8a5ca21df6324039d410d1b486292604092541682519182526020820152a2600160025580f35b6200190e90939293620023c8565b62000e705790845f620018c3565b8380fd5b60405162461bcd60e51b8152602060048201526011602482015270616c726561647920756e626f6e64696e6760781b6044820152606490fd5b6004915014155f620017cf565b634e487b7160e01b86526021600452602486fd5b5034620002c05780600319360112620002c05760206040516127108152f35b5034620002c0576060366003190112620002c057620019b7620022e1565b6044356001600160401b03918282116200191c57366023830112156200191c5781600401359283116200191c5736602484840101116200191c57620019fb62002374565b62001a05620023fe565b61ffff8060065460a01c1690821611620015f1578360208480602462001a2f620013889862002497565b9662001a3f6040519889620023dc565b8288520183870137840101526004356200284a565b5034620002c0576020366003190112620002c057600654600435906001600160a01b039081163314158062001b06575b6200153057818352600c602052604083205416156200054a5780825260076020526040822080546001600160401b03908181161562001ac1578480f35b7f45c5b29ea2e91bcc45332a78abbbddfa0ed66eb04be35dfec742eedbb90210ed92602092421680926001600160401b031916179055604051908152a25f8080808480f35b508083541633141562001a84565b5034620002c0576020366003190112620002c05760065460043590336001600160a01b039182161415908162001b8d575b506200153057808252600760205260408220805467ffffffffffffffff191690557ffaf6e9ef95c172383a3974a920b603370f7f3607cd608463c0f68491dd05a80d8280a280f35b90508254163314155f62001b45565b5034620002c0576020366003190112620002c05760043590600f54821015620002c057602062001bcc8362002305565b90546040519160031b1c8152f35b5034620002c0576020366003190112620002c05762001bf862002374565b60043560055580f35b5034620002c05780600319360112620002c0576020600a54604051908152f35b506040366003190112620002c05762001c39620022ca565b9062001c44620022e1565b62001c4e620023fe565b6001600160a01b0383161562000fe2576001600160a01b0383168252600d60205260408220546200212a57600354341062002118576004549161ffff8360101c1661ffff83161162000e745762001ca7600a5462002388565b9283600a5560405190610f7790818301918383106001600160401b038411176200210457916001600160401b03849260809462002ee38539888352306020808501919091527f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a86001600160a01b031660408501521c16606082015203019082f08015620020f75760018060a01b0316916001600160401b03600b541661ffff6040519262001d5584620023ab565b6001600160a01b0388811685523460208087019182526040808801898152606089018b8152969095166080890190815260a08981019890985260c089018a9052600260e08a018190526101008a018b90526101208a018b90526101408a018b90526101608a018b90528c8b52600c909352908920885181546001600160a01b03191690861617815592516001840155935190820155925160038401805493516001600160b01b031990941691909216179190931b61ffff60a01b161782559062001e469060a0840151815467ffffffffffffffff60b01b191660b09190911b67ffffffffffffffff60b01b16179055565b600481016001600160401b0360c08401511681549060e08501516006811015620020e357936001600160401b03936101609360079360ff60401b62001eed999860401b169168ffffffffffffffffff1916171790556101008501516005820155610120850151600682015501928261014082015116831985541617845501511667ffffffffffffffff60401b82549160401b169067ffffffffffffffff60401b1916179055565b6001600160a01b038481168252600d60209081526040808420869055848452600e90915282208490557f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a8163b15620002c057604051637c1dda5160e11b8152600481018490526001600160a01b0383166024820152818180604481010381837f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a86001600160a01b03165af180156200078c57620020d1575b5062001fb18362002b40565b600b546001600160401b03167f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a86001600160a01b03163b1562001550576040519063151512f760e01b825260018060a01b038616600483015284602483015260448201523460648201523460848201528260a4820152818160c4818360018060a01b037f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a8165af180156200078c57620020b9575b5050604080513481526001600160a01b03928316602080830191909152949092169183917f6ce2a5665699b19ce7fcb824c18fdb1bcb4271f05bfc62d4f9c2d23ba252e2ff91a36001600255604051908152f35b620020c58291620023c8565b620002c0578062002065565b620020dc90620023c8565b5f62001fa5565b634e487b7160e01b87526021600452602487fd5b50604051903d90823e3d90fd5b634e487b7160e01b85526041600452602485fd5b60405163389f7e1160e01b8152600490fd5b6040516320e8cb6760e21b8152600490fd5b5034620002c0576020366003190112620002c0576004356200215d620023fe565b808252600c6020526040822080546001600160a01b0390811692916200218533851462002420565b6005810180549485156200222c57868087819493828095555af1620021a9620024b3565b5015620021e7577f3300bdb359cfb956935bca32e9db727413eab1ca84341f2e36caea85bb79696891602091541693604051908152a3600160025580f35b60405162461bcd60e51b815260206004820152601a60248201527f5374616b654d616e616765723a20636c61696d206661696c65640000000000006044820152606490fd5b6040516312d37ee560e31b8152600490fd5b5034620002c05780600319360112620002c057602061ffff60045416604051908152f35b5034620002c05780600319360112620002c057602061ffff60065460b01c16604051908152f35b5034620002c05780600319360112620002c057602060065460c01c604051908152f35b90503462001550578160031936011262001550576020906005548152f35b600435906001600160a01b03821682036200160357565b6024359061ffff821682036200160357565b6004359061ffff821682036200160357565b600f548110156200233b57600f5f527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201905f90565b634e487b7160e01b5f52603260045260245ffd5b90600682101562000d395752565b600435906001600160401b03821682036200160357565b5f546001600160a01b031633036200122257565b5f198114620023975760010190565b634e487b7160e01b5f52601160045260245ffd5b61018081019081106001600160401b03821117620014d357604052565b6001600160401b038111620014d357604052565b90601f801991011681019081106001600160401b03821117620014d357604052565b60028054146200240e5760028055565b604051633ee5aeb560e01b8152600490fd5b156200242857565b60405162461bcd60e51b815260206004820152601860248201527f5374616b654d616e616765723a206e6f74207369676e657200000000000000006044820152606490fd5b919082018092116200239757565b9190916001600160401b03808094169116019182116200239757565b6001600160401b038111620014d357601f01601f191660200190565b3d15620024e2573d90620024c78262002497565b91620024d76040519384620023dc565b82523d5f602084013e565b606090565b919082039182116200239757565b818102929181159184041417156200239757565b811562002514570490565b634e487b7160e01b5f52601260045260245ffd5b6009546001600160a01b039081163303620027f857600f549081158015620027ef575b620027eb575f805b838110620027b157508015620027ac577f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a882165f5b848110620025f25750505050600b546001600160401b03916001838316019183831162002397577f29e98ba00d07f171959c4ddcd2f3020debc7c52cf537a034d7e664340d098c6c9360409316906001600160401b03191617600b558151903482526020820152a1565b620025fd8162002305565b9054600391821b1c90815f52600c602052604090815f2087620026208562002b1d565b926200263889620026328634620024f5565b62002509565b9384156200279a576002840180541515806200278b575b156200276f576200268e91620026326200266b925488620024f5565b91840154916127106200268661ffff8560a01c1683620024f5565b0490620024e7565b92620026ac6005620026a18688620024e7565b92019182546200246d565b9055826200271f575b5050505b843b15620016035781519263757f42b960e01b8452600484015260248301525f8260448183885af190811562002716575090620026fe929162002704575b5062002388565b62002588565b6200270f90620023c8565b5f620026f7565b513d5f823e3d90fd5b16803b1562001603575f90600485518094819363a003eeaf60e01b83525af18015620027655762002753575b8781620026b5565b6200275e90620023c8565b5f6200274b565b83513d5f823e3d90fd5b50505050600501620027838282546200246d565b9055620026b9565b5083838601541615156200264f565b50505050505050620026fe9062002388565b505050565b90620027de620027e591620027d7620027ca8562002305565b90549060031b1c62002b1d565b906200246d565b9162002388565b62002553565b5050565b5034156200254b565b6040516301e803c360e01b8152600490fd5b91908251928382525f5b84811062002835575050825f602080949584010152601f8019910116010190565b60208183018101518483018201520162002814565b915f90838252602092600c84526040908184209360018060a01b03808654161562002b0c57816127106200288f61ffff620028858c62002b1d565b96168096620024f5565b0496620028b6620028be60018301998a54908181115f1462002b01578193848093620024e7565b8c55620024e7565b918a84938015158062002af1575b62002a3e575b505050620028e192506200246d565b9586620029e0575b5460035411620029cf575b7f000000000000000000000000b622771bddf7a730371b400364d18afe7c2587a81690813b15620002c05780845180936379a6eb7f60e11b82528a60048301528860248301526060604483015281838162002953606482018c6200280a565b03925af1908115620029c45750927f0ebd6d95d0e7981eb468b06a5fb79837d18c56bbf2a93787d854df7d562559f396959492606092620029ad95620029b2575b508151968796875286015284015260608301906200280a565b0390a2565b620029bd90620023c8565b5f62002994565b8451903d90823e3d90fd5b620029da8862002d64565b620028f4565b828080808a61dead5af1620029f4620024b3565b50620028e957845162461bcd60e51b815260048101899052601f60248201527f5374616b654d616e616765723a20736c617368206275726e206661696c6564006044820152606490fd5b90919350602486600386015416918a51968793849263045bc4d160e41b845260048401525af1801562002ae757859062002aad575b6002929092018054620028e19450838181111562002a9b57505085905b5584928a5f620028d2565b62002aa691620024e7565b9062002a90565b5090918981813d831162002adf575b62002ac88183620023dc565b8101031262000e705790620028e192915162002a73565b503d62002abc565b87513d87823e3d90fd5b50866003840154161515620028cc565b8093848093620024e7565b8351632ec5b44960e01b8152600490fd5b5f52600c60205262002b3d60405f2060026001820154910154906200246d565b90565b5f90808252600c60205260ff600460408420015460401c1660068110156200060157600114620027eb57808252600c6020526001604083200154600390815411620027ac57600f5461ffff600454161162002c3357600f5483915f199190835b82811062002bd95750505062002bb68362002b1d565b1162002bc157505050565b62002bd79262002bd19162002da2565b62002c3b565b565b62002bf462002be88262002305565b905490841b1c62002b1d565b84811062002c0f575b5062002c099062002388565b62002ba0565b9196509350915062002c218362002305565b905490861b1c948362002c0962002bfd565b5062002bd791505b5f818152600c6020526040812060048101805460ff60401b191668010000000000000000908117909155600b546003909201805467ffffffffffffffff60b01b191660b09390931b67ffffffffffffffff60b01b169290921790915562002cef62002cb86001600160401b038060045460601c169042166200247b565b848452600c602052600760408520019067ffffffffffffffff60401b82549160401b169067ffffffffffffffff60401b1916179055565b600f549081101562002d50579062002d4c8362002d348460017fe2a191ee805447bcf5adabadd39cb816b1b46de1364263aef69980bdafd8370f9601600f5562002305565b90919082549060031b91821b915f19901b1916179055565b80a2565b634e487b7160e01b82526041600452602482fd5b5f5b600f54811015620027eb578162002d7d8262002305565b90549060031b1c1462002d9b5762002d959062002388565b62002d66565b9062002bd7915b600f545f199190828101908111620023975780820362002e87575b5050600f54801562002e735781019062002dd78262002305565b909182549160031b1b19169055600f555f818152600c60205260ff600460408320015460401c16600681101562002e5f5760011462002e14575050565b818152600c60205260408120600401805460ff60401b1916680200000000000000001790557fdc9371d95109571e00941314e12af5eeb5e7de7545ac609530cdddc6f140cd989080a2565b634e487b7160e01b82526021600452602482fd5b634e487b7160e01b5f52603160045260245ffd5b62002ec29162002e9b62002ea59262002305565b9290549162002305565b91909260031b1c9082549060031b91821b915f19901b1916179055565b5f8062002dbd565b6001600160401b038111620014d35760051b6020019056fe610100346100f5576001600160401b0390601f610f7738819003918201601f1916830191848311848410176100f9578084926080946040528339810103126100f557805161004f6020830161010d565b90606061005e6040850161010d565b93015193841684036100f55760015f5560805260a0526001600160a01b031660c05260e052604051610e55908161012282396080518181816104590152818161066e0152610907015260a0518181816102400152818161029c015281816104830152818161071b015261085e015260c0518181816102e0015281816104ec015261095e015260e05181818161020d01526103b40152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100f55756fe60406080815260049081361015610014575f80fd5b5f91823560e01c80632e1a7d4d14610b205780633a98ef3914610b015780633ba0b9a914610add5780634144574c1461082957806345bc4d101461070557806357d079ba146106915780635c5f7dae146106565780636c7518971461030f578063703ec8c4146102cb5780637542ff9514610287578063a003eeaf14610231578063a7ab6961146101ec578063aaf5eb68146101c5578063bd49c35f146101a6578063cb09e7c01461014d578063ce7c2ac2146101115763d868ca9e146100d9575f80fd5b3461010d57602036600319011261010d5760209282916001600160a01b036100ff610c37565b168252845220549051908152f35b8280fd5b5050346101495760203660031901126101495760209181906001600160a01b03610139610c37565b1681526003845220549051908152f35b5080fd5b505034610149576020366003190112610149576020916b033b2e3c9fd0803ce80000009061019e9083906001600160a01b03610187610c37565b168152600386522054610198610cc3565b90610c7e565b049051908152f35b5050346101495781600319360112610149576020906002549051908152f35b505034610149578160031936011261014957602090516b033b2e3c9fd0803ce80000008152f35b5050346101495781600319360112610149576020905167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50908260031936011261010d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361027a5782610277610dcf565b80f35b5163fe907fb760e01b8152fd5b505034610149578160031936011261014957517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b505034610149578160031936011261014957517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50903461010d576020928360031936011261065357823561032e610d62565b80156106445733825260038552808383205410610635576b033b2e3c9fd0803ce800000061036361035d610cc3565b83610c7e565b04903383526003865283832061037a828254610d83565b905561038881600154610d83565b60015561039782600254610d83565b6002553383528486528383209485549567ffffffffffffffff90817f0000000000000000000000000000000000000000000000000000000000000000168242160191808311610622578751606081018181108382111761060f578952868152818b82019416845288810192888452600160401b8b10156105fc578a61042191600182018155610c51565b9190916105ea57518155925160019093018054925168ffffffffffffffffff199093169190931617901515871b60ff60401b161790557f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600160ff1b86146105d757803b156105d35786809160448a5180948193631852fc4f60e31b835289898401528b820360248401525af180156105c9579087916105b5575b50507f00000000000000000000000000000000000000000000000000000000000000001691823b156105b1578651631fe3f4ad60e21b8152918201908152336020820152604081018590529091859183919082908490829060600103925af180156105a757610593575b50906001929184519182528682015284848201527f01a288519a9e66262c46f0ddb882d679c2970212653008ab55804561ed1e5bfa60603392a25551908152f35b61059d8491610d0b565b61010d575f610552565b85513d86823e3d90fd5b8580fd5b6105be90610d0b565b6105b157855f6104e8565b88513d89823e3d90fd5b8680fd5b634e487b7160e01b875260118352602487fd5b634e487b7160e01b8952888652602489fd5b634e487b7160e01b895260418652602489fd5b604186634e487b7160e01b5f525260245ffd5b634e487b7160e01b875260118452602487fd5b505051633999656760e01b8152fd5b505051631f2a200560e01b8152fd5b80fd5b505034610149578160031936011261014957602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5091346106535781600319360112610653576106ab610c37565b6001600160a01b031681526020929092528082208054602435939084101561065357506060926106da91610c51565b509060ff60018354930154825193845267ffffffffffffffff81166020850152821c16151590820152f35b50829034610149576020366003190112610149577f000000000000000000000000000000000000000000000000000000000000000091813591906001600160a01b038416330361081a57600254938484111561080f576107658580610d83565b600255846107a6575b602085877f4f5f38ee30b01a960b4dfdcd520a3ca59c1a664a32dcfe5418ca79b0de6b7236818881519081528486820152a151908152f35b81808681935af16107b5610d90565b50156107c257808061076e565b608490602085519162461bcd60e51b8352820152602160248201527f56616c696461746f7253686172653a20736c6173682078666572206661696c656044820152601960fa1b6064820152fd5b610765848096610d83565b50835163fe907fb760e01b8152fd5b50906020928360031936011261065357610841610d62565b3415610acf57815163014c2cc960e11b81526001600160a01b03937f000000000000000000000000000000000000000000000000000000000000000085169186818381865afa9081156105a7578491610aa2575b503410610a94576108a4610cc3565b6b033b2e3c9fd0803ce80000008034029034820403610a8157906108c791610ca5565b9481358610610a3e57338452600387528484206108e5878254610d55565b90556108f386600154610d55565b60015561090234600254610d55565b6002557f000000000000000000000000000000000000000000000000000000000000000092803b15610a3a578480916044885180948193631852fc4f60e31b835289898401523460248401525af18015610a3057610a1d575b507f00000000000000000000000000000000000000000000000000000000000000001690813b15610a1957845163049d8b1560e51b8152908101928352336020840152346040840152918391839182908490829060600103925af18015610a0f576109fb575b50600190825134815284868201527f7494e309a68e673da9e1de3ae72425566aad3afb6b7ea7d70a590042a3a38649843392a25551908152f35b610a058291610d0b565b610653575f6109c1565b83513d84823e3d90fd5b8380fd5b610a2990949194610d0b565b925f61095b565b86513d87823e3d90fd5b8480fd5b845162461bcd60e51b8152808301889052601860248201527f56616c696461746f7253686172653a20736c69707061676500000000000000006044820152606490fd5b634e487b7160e01b855260118352602485fd5b83516336a143bb60e11b8152fd5b90508681813d8311610ac8575b610ab98183610d33565b81010312610a1957515f610895565b503d610aaf565b5051631f2a200560e01b8152fd5b505034610149578160031936011261014957602090610afa610cc3565b9051908152f35b5050346101495781600319360112610149576020906001549051908152f35b50903461010d57602036600319011261010d57813591610b3e610d62565b33845280602052610b5183838620610c51565b509060018201805460ff81861c16610c275767ffffffffffffffff81164210610c1757600160401b9060ff60401b1916179055848080808554335af1610b95610d90565b5015610bd45750907f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc69154815193845260208401523392a26001815580f35b606490602084519162461bcd60e51b8352820152601f60248201527f56616c696461746f7253686172653a207769746864726177206661696c6564006044820152fd5b845163188acae760e11b81528390fd5b8451630c8d9eab60e31b81528390fd5b600435906001600160a01b0382168203610c4d57565b5f80fd5b8054821015610c6a575f5260205f209060011b01905f90565b634e487b7160e01b5f52603260045260245ffd5b81810292918115918404141715610c9157565b634e487b7160e01b5f52601160045260245ffd5b8115610caf570490565b634e487b7160e01b5f52601260045260245ffd5b6001548015610cfa57600254906b033b2e3c9fd0803ce800000091828102928184041490151715610c9157610cf791610ca5565b90565b506b033b2e3c9fd0803ce800000090565b67ffffffffffffffff8111610d1f57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff821117610d1f57604052565b91908201809211610c9157565b60025f5414610d715760025f55565b604051633ee5aeb560e01b8152600490fd5b91908203918211610c9157565b3d15610dca573d9067ffffffffffffffff8211610d1f5760405191610dbf601f8201601f191660200184610d33565b82523d5f602084013e565b606090565b3415610e1d57610de134600254610d55565b6002557f6c07ee05dcf262f13abf9d87b846ee789d2f90fe991d495acd7d7fc109ee1f556040610e0f610cc3565b8151903482526020820152a1565b56fea26469706673582212206ed85c8cfc5f2295e27a4d6cdb179e9e3ef540d6ef42482df17945d5f46dc3d164736f6c63430008140033a2646970667358221220409797f46282fbbca8e8e9233c67a2c3c7ac950e6b4700c8fb54893720ad6cf464736f6c63430008140033
HashMéthodeBlocÂgeDeÀMontantFrais
0x4b3bb09e73… Récompenses 56 098 il y a 13 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00027782 WTG
0x82c90ea822… Récompenses 56 073 il y a 14 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00024582 WTG
0x6426c09989… Récompenses 56 053 il y a 15 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00033606 WTG
0xb6d8a1a020… Récompenses 56 034 il y a 16 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00031272 WTG
0xdd474e0963… Récompenses 56 011 il y a 18 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00025659 WTG
0x072fecec85… Récompenses 55 992 il y a 18 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00034482 WTG
0xf2e9ad7b60… Récompenses 55 969 il y a 20 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.0002825 WTG
0xd50567cf60… Récompenses 55 942 il y a 21 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00035379 WTG
0x86accdf46c… Récompenses 55 918 il y a 22 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00031024 WTG
0xffc54c9d46… Récompenses 55 888 il y a 24 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00026224 WTG
0x9ffe66ff01… Récompenses 55 860 il y a 25 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00026003 WTG
0x05fa0f3184… Récompenses 55 836 il y a 26 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00014479 WTG
0xc9693f48f5… Récompenses 55 817 il y a 27 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00008257 WTG
0x87995edf11… Récompenses 55 791 il y a 29 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.0000714 WTG
0x5869db3afd… Récompenses 55 769 il y a 30 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007035 WTG
0xe95a8e1015… Récompenses 55 744 il y a 31 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007019 WTG
0x7f372d49ef… Récompenses 55 719 il y a 32 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007014 WTG
0x9e0ac71fac… Récompenses 55 693 il y a 33 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007014 WTG
0xd3901a2317… Récompenses 55 672 il y a 35 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007013 WTG
0x7e42e70da9… Récompenses 55 644 il y a 36 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007013 WTG
0x5044618b55… Récompenses 55 600 il y a 38 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007013 WTG
0xd85e787f8c… Récompenses 55 581 il y a 39 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007013 WTG
0x1ca253b102… Récompenses 55 535 il y a 41 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007013 WTG
0x1d65651dd9… Récompenses 55 513 il y a 43 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007013 WTG
0x91e883d1c6… Récompenses 55 488 il y a 44 min 0xf0db2a…1e1550 ENTR. 0xb9a9f0…1b7b8f 0.00007013 WTG
Aucun transfert de token.
Tx parenteTypeDeÀValeur
0x4b3bb09e…b6db06 appel 0xb9a9f0…1b7b8f 0xf0db2a…1e1550 16.756437 WTG
≈ 436,65 FCFA
0x374d0e92…e07a7a appel 0xb9a9f0…1b7b8f 0xfade20…e42a15 19.670518 WTG
≈ 512,59 FCFA
0x374d0e92…e07a7a appel 0xa756f7…49c15b 0xb9a9f0…1b7b8f 36.426885 WTG
≈ 949,24 FCFA
0x82c90ea8…740b02 appel 0xb9a9f0…1b7b8f 0xf0db2a…1e1550 14.047948 WTG
≈ 366,07 FCFA
0x8daefe9d…5c6343 appel 0xb9a9f0…1b7b8f 0xfade20…e42a15 16.491047 WTG
≈ 429,74 FCFA
0x8daefe9d…5c6343 appel 0xa756f7…49c15b 0xb9a9f0…1b7b8f 30.538976 WTG
≈ 795,81 FCFA
0x6426c099…2d58b9 appel 0xb9a9f0…1b7b8f 0xf0db2a…1e1550 12.738961 WTG
≈ 331,96 FCFA
0x82f8b867…872b9b appel 0xb9a9f0…1b7b8f 0xfade20…e42a15 14.954327 WTG
≈ 389,69 FCFA
0x82f8b867…872b9b appel 0xa756f7…49c15b 0xb9a9f0…1b7b8f 27.693199 WTG
≈ 721,65 FCFA
0xb6d8a1a0…5b2cef appel 0xb9a9f0…1b7b8f 0xf0db2a…1e1550 14.753723 WTG
≈ 384,46 FCFA
0xcf70e66c…ff021d appel 0xb9a9f0…1b7b8f 0xfade20…e42a15 17.31944 WTG
≈ 451,32 FCFA
0xcf70e66c…ff021d appel 0xa756f7…49c15b 0xb9a9f0…1b7b8f 32.073037 WTG
≈ 835,78 FCFA
0xdd474e09…cb963f appel 0xb9a9f0…1b7b8f 0xf0db2a…1e1550 13.382821 WTG
≈ 348,74 FCFA
0x317089ff…09778b appel 0xb9a9f0…1b7b8f 0xfade20…e42a15 15.710169 WTG
≈ 409,39 FCFA
0x317089ff…09778b appel 0xa756f7…49c15b 0xb9a9f0…1b7b8f 29.092906 WTG
≈ 758,13 FCFA
0x072fecec…266151 appel 0xb9a9f0…1b7b8f 0xf0db2a…1e1550 15.405226 WTG
≈ 401,44 FCFA
0xe59e124c…781d1d appel 0xb9a9f0…1b7b8f 0xfade20…e42a15 18.084315 WTG
≈ 471,26 FCFA
0xe59e124c…781d1d appel 0xa756f7…49c15b 0xb9a9f0…1b7b8f 33.489473 WTG
≈ 872,69 FCFA
0xf2e9ad7b…0d9b66 appel 0xb9a9f0…1b7b8f 0xf0db2a…1e1550 18.080887 WTG
≈ 471,17 FCFA
0x40d50b24…56ada2 appel 0xb9a9f0…1b7b8f 0xfade20…e42a15 21.225366 WTG
≈ 553,11 FCFA
0x40d50b24…56ada2 appel 0xa756f7…49c15b 0xb9a9f0…1b7b8f 39.306235 WTG
≈ 1 024,27 FCFA
0xd50567cf…1574b0 appel 0xb9a9f0…1b7b8f 0xf0db2a…1e1550 16.780551 WTG
≈ 437,28 FCFA
0x40017116…871dfe appel 0xb9a9f0…1b7b8f 0xfade20…e42a15 19.698848 WTG
≈ 513,33 FCFA
0x40017116…871dfe appel 0xa756f7…49c15b 0xb9a9f0…1b7b8f 36.479349 WTG
≈ 950,61 FCFA
0x86accdf4…39e53d appel 0xb9a9f0…1b7b8f 0xf0db2a…1e1550 18.77803 WTG
≈ 489,33 FCFA