Contrat
Contrat
0xb9a9f0f2a4…66631b7b8f
0xb9a9f0f2a4f0909f7c3be2eb7a2e0266631b7b8f
Solde WTG
20000 WTG
≈ 469 161,63 FCFA (@ 23,46 FCFA/WTG)
Avoirs en tokens
0 token
≈ 0,00 FCFA
Plus d'infos
Transactions envoyées2
Dernière activitéil y a 2 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
Aucun transfert de token.