From dae2413c4c810f42b721886b8a537d9971696264 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 26 Feb 2024 11:44:43 +0400 Subject: [PATCH 001/144] Update XDCValidator.sol --- contracts/validator/contract/XDCValidator.sol | 234 ++++++++++++------ 1 file changed, 163 insertions(+), 71 deletions(-) diff --git a/contracts/validator/contract/XDCValidator.sol b/contracts/validator/contract/XDCValidator.sol index 0e67746a177a..0dd2c1e5d6d4 100644 --- a/contracts/validator/contract/XDCValidator.sol +++ b/contracts/validator/contract/XDCValidator.sol @@ -1,9 +1,7 @@ - pragma solidity ^0.4.21; import "./libs/SafeMath.sol"; - contract XDCValidator { using SafeMath for uint256; @@ -12,7 +10,7 @@ contract XDCValidator { event Propose(address _owner, address _candidate, uint256 _cap); event Resign(address _owner, address _candidate); event Withdraw(address _owner, uint256 _blockNumber, uint256 _cap); - event UploadedKYC(address _owner,string kycHash); + event UploadedKYC(address _owner, string kycHash); event InvalidatedNode(address _masternodeOwner, address[] _masternodes); struct ValidatorState { @@ -23,8 +21,8 @@ contract XDCValidator { } struct WithdrawState { - mapping(uint256 => uint256) caps; - uint256[] blockNumbers; + mapping(uint256 => uint256) caps; + uint256[] blockNumbers; } mapping(address => WithdrawState) withdrawsState; @@ -42,28 +40,30 @@ contract XDCValidator { address[] public candidates; uint256 public candidateCount = 0; - uint256 public ownerCount =0; + uint256 public ownerCount = 0; uint256 public minCandidateCap; uint256 public minVoterCap; uint256 public maxValidatorNumber; uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - modifier onlyValidCandidateCap { + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); _; } - modifier onlyValidVoterCap { - + modifier onlyValidVoterCap() { require(msg.value >= minVoterCap); _; } - modifier onlyKYCWhitelisted { - require(KYCString[msg.sender].length!=0 || ownerToCandidate[msg.sender].length>0); - _; + modifier onlyKYCWhitelisted() { + require( + KYCString[msg.sender].length != 0 || + ownerToCandidate[msg.sender].length > 0 + ); + _; } modifier onlyOwner(address _candidate) { @@ -76,33 +76,38 @@ contract XDCValidator { _; } - modifier onlyValidCandidate (address _candidate) { + modifier onlyValidCandidate(address _candidate) { require(validatorsState[_candidate].isCandidate); _; } - modifier onlyNotCandidate (address _candidate) { + modifier onlyNotCandidate(address _candidate) { require(!validatorsState[_candidate].isCandidate); _; } - modifier onlyValidVote (address _candidate, uint256 _cap) { + modifier onlyValidVote(address _candidate, uint256 _cap) { require(validatorsState[_candidate].voters[msg.sender] >= _cap); if (validatorsState[_candidate].owner == msg.sender) { - require(validatorsState[_candidate].voters[msg.sender].sub(_cap) >= minCandidateCap); + require( + validatorsState[_candidate].voters[msg.sender].sub(_cap) >= + minCandidateCap + ); } _; } - modifier onlyValidWithdraw (uint256 _blockNumber, uint _index) { + modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); - require(withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber); + require( + withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber + ); _; } - function XDCValidator ( + function XDCValidator( address[] _candidates, uint256[] _caps, address _firstOwner, @@ -129,19 +134,28 @@ contract XDCValidator { }); voters[_candidates[i]].push(_firstOwner); ownerToCandidate[_firstOwner].push(_candidates[i]); - validatorsState[_candidates[i]].voters[_firstOwner] = minCandidateCap; + validatorsState[_candidates[i]].voters[ + _firstOwner + ] = minCandidateCap; } } - // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. function uploadKYC(string kychash) external { KYCString[msg.sender].push(kychash); - emit UploadedKYC(msg.sender,kychash); + emit UploadedKYC(msg.sender, kychash); } // propose : any non-candidate who has uploaded its KYC can become an owner by proposing a candidate. - function propose(address _candidate) external payable onlyValidCandidateCap onlyKYCWhitelisted onlyNotCandidate(_candidate) { + function propose( + address _candidate + ) + external + payable + onlyValidCandidateCap + onlyKYCWhitelisted + onlyNotCandidate(_candidate) + { uint256 cap = validatorsState[_candidate].cap.add(msg.value); candidates.push(_candidate); validatorsState[_candidate] = ValidatorState({ @@ -149,9 +163,11 @@ contract XDCValidator { isCandidate: true, cap: cap }); - validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].add(msg.value); + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].add(msg.value); candidateCount = candidateCount.add(1); - if (ownerToCandidate[msg.sender].length ==0){ + if (ownerToCandidate[msg.sender].length == 0) { owners.push(msg.sender); ownerCount++; } @@ -160,144 +176,220 @@ contract XDCValidator { emit Propose(msg.sender, _candidate, msg.value); } - function vote(address _candidate) external payable onlyValidVoterCap onlyValidCandidate(_candidate) { - validatorsState[_candidate].cap = validatorsState[_candidate].cap.add(msg.value); + function vote( + address _candidate + ) external payable onlyValidVoterCap onlyValidCandidate(_candidate) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.add( + msg.value + ); if (validatorsState[_candidate].voters[msg.sender] == 0) { voters[_candidate].push(msg.sender); } - validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].add(msg.value); + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].add(msg.value); emit Vote(msg.sender, _candidate, msg.value); } - function getCandidates() public view returns(address[]) { + function getCandidates() public view returns (address[]) { return candidates; } - function getCandidateCap(address _candidate) public view returns(uint256) { + function getCandidateCap(address _candidate) public view returns (uint256) { return validatorsState[_candidate].cap; } - function getCandidateOwner(address _candidate) public view returns(address) { + function getCandidateOwner( + address _candidate + ) public view returns (address) { return validatorsState[_candidate].owner; } - function getVoterCap(address _candidate, address _voter) public view returns(uint256) { + function getVoterCap( + address _candidate, + address _voter + ) public view returns (uint256) { return validatorsState[_candidate].voters[_voter]; } - function getVoters(address _candidate) public view returns(address[]) { + function getVoters(address _candidate) public view returns (address[]) { return voters[_candidate]; } - function isCandidate(address _candidate) public view returns(bool) { + function isCandidate(address _candidate) public view returns (bool) { return validatorsState[_candidate].isCandidate; } - function getWithdrawBlockNumbers() public view returns(uint256[]) { + function getWithdrawBlockNumbers() public view returns (uint256[]) { return withdrawsState[msg.sender].blockNumbers; } - function getWithdrawCap(uint256 _blockNumber) public view returns(uint256) { + function getWithdrawCap( + uint256 _blockNumber + ) public view returns (uint256) { return withdrawsState[msg.sender].caps[_blockNumber]; } - function unvote(address _candidate, uint256 _cap) public onlyValidVote(_candidate, _cap) { - validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub(_cap); - validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].sub(_cap); + function unvote( + address _candidate, + uint256 _cap + ) public onlyValidVote(_candidate, _cap) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( + _cap + ); + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].sub(_cap); // refund after delay X blocks uint256 withdrawBlockNumber = voterWithdrawDelay.add(block.number); - withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[msg.sender].caps[withdrawBlockNumber].add(_cap); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ + msg.sender + ].caps[withdrawBlockNumber].add(_cap); withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); emit Unvote(msg.sender, _candidate, _cap); } - function resign(address _candidate) public onlyOwner(_candidate) onlyCandidate(_candidate) { + function resign( + address _candidate + ) public onlyOwner(_candidate) onlyCandidate(_candidate) { validatorsState[_candidate].isCandidate = false; candidateCount = candidateCount.sub(1); for (uint256 i = 0; i < candidates.length; i++) { if (candidates[i] == _candidate) { + address[] memory cacheArray = ownerToCandidate[msg.sender]; + uint256 cacheArrayLength = cacheArray.length; + for (uint256 j = 0; j < cacheArrayLength; j++) { + if (cacheArray[j] == _candidate) { + delete cacheArray[j]; + } + } + ownerToCandidate[msg.sender] = removeZeroAddresses(cacheArray); + if (ownerToCandidate[msg.sender].length == 0) { + ownerCount--; + } delete candidates[i]; break; } } + candidates = removeZeroAddresses(candidates); uint256 cap = validatorsState[_candidate].voters[msg.sender]; - validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub(cap); + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( + cap + ); validatorsState[_candidate].voters[msg.sender] = 0; // refunding after resigning X blocks uint256 withdrawBlockNumber = candidateWithdrawDelay.add(block.number); - withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[msg.sender].caps[withdrawBlockNumber].add(cap); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ + msg.sender + ].caps[withdrawBlockNumber].add(cap); withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); emit Resign(msg.sender, _candidate); } // voteInvalidKYC : any candidate can vote for invalid KYC i.e. a particular candidate's owner has uploaded a bad KYC. // On securing 75% votes against an owner ( not candidate ), owner & all its candidates will lose their funds. - function voteInvalidKYC(address _invalidCandidate) onlyValidCandidate(msg.sender) onlyValidCandidate(_invalidCandidate) public { + function voteInvalidKYC( + address _invalidCandidate + ) + public + onlyValidCandidate(msg.sender) + onlyValidCandidate(_invalidCandidate) + { address candidateOwner = getCandidateOwner(msg.sender); address _invalidMasternode = getCandidateOwner(_invalidCandidate); require(!hasVotedInvalid[candidateOwner][_invalidMasternode]); hasVotedInvalid[candidateOwner][_invalidMasternode] = true; invalidKYCCount[_invalidMasternode] += 1; - if( invalidKYCCount[_invalidMasternode]*100/getOwnerCount() >= 75 ){ + if ( + (invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount() >= 75 + ) { // 75% owners say that the KYC is invalid - address[] memory allMasternodes = new address[](candidates.length-1) ; - uint count=0; - for (uint i=0;i Date: Mon, 4 Mar 2024 07:53:29 +0400 Subject: [PATCH 002/144] update --- contracts/validator/contract/XDCValidator.sol | 236 ++++------- .../validator/contract/XDCValidatorV2.sol | 395 ++++++++++++++++++ 2 files changed, 467 insertions(+), 164 deletions(-) create mode 100644 contracts/validator/contract/XDCValidatorV2.sol diff --git a/contracts/validator/contract/XDCValidator.sol b/contracts/validator/contract/XDCValidator.sol index 0dd2c1e5d6d4..732c6904201f 100644 --- a/contracts/validator/contract/XDCValidator.sol +++ b/contracts/validator/contract/XDCValidator.sol @@ -1,7 +1,9 @@ + pragma solidity ^0.4.21; import "./libs/SafeMath.sol"; + contract XDCValidator { using SafeMath for uint256; @@ -10,7 +12,7 @@ contract XDCValidator { event Propose(address _owner, address _candidate, uint256 _cap); event Resign(address _owner, address _candidate); event Withdraw(address _owner, uint256 _blockNumber, uint256 _cap); - event UploadedKYC(address _owner, string kycHash); + event UploadedKYC(address _owner,string kycHash); event InvalidatedNode(address _masternodeOwner, address[] _masternodes); struct ValidatorState { @@ -21,8 +23,8 @@ contract XDCValidator { } struct WithdrawState { - mapping(uint256 => uint256) caps; - uint256[] blockNumbers; + mapping(uint256 => uint256) caps; + uint256[] blockNumbers; } mapping(address => WithdrawState) withdrawsState; @@ -40,30 +42,28 @@ contract XDCValidator { address[] public candidates; uint256 public candidateCount = 0; - uint256 public ownerCount = 0; + uint256 public ownerCount =0; uint256 public minCandidateCap; uint256 public minVoterCap; uint256 public maxValidatorNumber; uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - modifier onlyValidCandidateCap() { + modifier onlyValidCandidateCap { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); _; } - modifier onlyValidVoterCap() { + modifier onlyValidVoterCap { + require(msg.value >= minVoterCap); _; } - modifier onlyKYCWhitelisted() { - require( - KYCString[msg.sender].length != 0 || - ownerToCandidate[msg.sender].length > 0 - ); - _; + modifier onlyKYCWhitelisted { + require(KYCString[msg.sender].length!=0 || ownerToCandidate[msg.sender].length>0); + _; } modifier onlyOwner(address _candidate) { @@ -76,38 +76,33 @@ contract XDCValidator { _; } - modifier onlyValidCandidate(address _candidate) { + modifier onlyValidCandidate (address _candidate) { require(validatorsState[_candidate].isCandidate); _; } - modifier onlyNotCandidate(address _candidate) { + modifier onlyNotCandidate (address _candidate) { require(!validatorsState[_candidate].isCandidate); _; } - modifier onlyValidVote(address _candidate, uint256 _cap) { + modifier onlyValidVote (address _candidate, uint256 _cap) { require(validatorsState[_candidate].voters[msg.sender] >= _cap); if (validatorsState[_candidate].owner == msg.sender) { - require( - validatorsState[_candidate].voters[msg.sender].sub(_cap) >= - minCandidateCap - ); + require(validatorsState[_candidate].voters[msg.sender].sub(_cap) >= minCandidateCap); } _; } - modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { + modifier onlyValidWithdraw (uint256 _blockNumber, uint _index) { require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); - require( - withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber - ); + require(withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber); _; } - function XDCValidator( + function XDCValidator ( address[] _candidates, uint256[] _caps, address _firstOwner, @@ -134,28 +129,19 @@ contract XDCValidator { }); voters[_candidates[i]].push(_firstOwner); ownerToCandidate[_firstOwner].push(_candidates[i]); - validatorsState[_candidates[i]].voters[ - _firstOwner - ] = minCandidateCap; + validatorsState[_candidates[i]].voters[_firstOwner] = minCandidateCap; } } + // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. function uploadKYC(string kychash) external { KYCString[msg.sender].push(kychash); - emit UploadedKYC(msg.sender, kychash); + emit UploadedKYC(msg.sender,kychash); } // propose : any non-candidate who has uploaded its KYC can become an owner by proposing a candidate. - function propose( - address _candidate - ) - external - payable - onlyValidCandidateCap - onlyKYCWhitelisted - onlyNotCandidate(_candidate) - { + function propose(address _candidate) external payable onlyValidCandidateCap onlyKYCWhitelisted onlyNotCandidate(_candidate) { uint256 cap = validatorsState[_candidate].cap.add(msg.value); candidates.push(_candidate); validatorsState[_candidate] = ValidatorState({ @@ -163,11 +149,9 @@ contract XDCValidator { isCandidate: true, cap: cap }); - validatorsState[_candidate].voters[msg.sender] = validatorsState[ - _candidate - ].voters[msg.sender].add(msg.value); + validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].add(msg.value); candidateCount = candidateCount.add(1); - if (ownerToCandidate[msg.sender].length == 0) { + if (ownerToCandidate[msg.sender].length ==0){ owners.push(msg.sender); ownerCount++; } @@ -176,220 +160,144 @@ contract XDCValidator { emit Propose(msg.sender, _candidate, msg.value); } - function vote( - address _candidate - ) external payable onlyValidVoterCap onlyValidCandidate(_candidate) { - validatorsState[_candidate].cap = validatorsState[_candidate].cap.add( - msg.value - ); + function vote(address _candidate) external payable onlyValidVoterCap onlyValidCandidate(_candidate) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.add(msg.value); if (validatorsState[_candidate].voters[msg.sender] == 0) { voters[_candidate].push(msg.sender); } - validatorsState[_candidate].voters[msg.sender] = validatorsState[ - _candidate - ].voters[msg.sender].add(msg.value); + validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].add(msg.value); emit Vote(msg.sender, _candidate, msg.value); } - function getCandidates() public view returns (address[]) { + function getCandidates() public view returns(address[]) { return candidates; } - function getCandidateCap(address _candidate) public view returns (uint256) { + function getCandidateCap(address _candidate) public view returns(uint256) { return validatorsState[_candidate].cap; } - function getCandidateOwner( - address _candidate - ) public view returns (address) { + function getCandidateOwner(address _candidate) public view returns(address) { return validatorsState[_candidate].owner; } - function getVoterCap( - address _candidate, - address _voter - ) public view returns (uint256) { + function getVoterCap(address _candidate, address _voter) public view returns(uint256) { return validatorsState[_candidate].voters[_voter]; } - function getVoters(address _candidate) public view returns (address[]) { + function getVoters(address _candidate) public view returns(address[]) { return voters[_candidate]; } - function isCandidate(address _candidate) public view returns (bool) { + function isCandidate(address _candidate) public view returns(bool) { return validatorsState[_candidate].isCandidate; } - function getWithdrawBlockNumbers() public view returns (uint256[]) { + function getWithdrawBlockNumbers() public view returns(uint256[]) { return withdrawsState[msg.sender].blockNumbers; } - function getWithdrawCap( - uint256 _blockNumber - ) public view returns (uint256) { + function getWithdrawCap(uint256 _blockNumber) public view returns(uint256) { return withdrawsState[msg.sender].caps[_blockNumber]; } - function unvote( - address _candidate, - uint256 _cap - ) public onlyValidVote(_candidate, _cap) { - validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( - _cap - ); - validatorsState[_candidate].voters[msg.sender] = validatorsState[ - _candidate - ].voters[msg.sender].sub(_cap); + function unvote(address _candidate, uint256 _cap) public onlyValidVote(_candidate, _cap) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub(_cap); + validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].sub(_cap); // refund after delay X blocks uint256 withdrawBlockNumber = voterWithdrawDelay.add(block.number); - withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ - msg.sender - ].caps[withdrawBlockNumber].add(_cap); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[msg.sender].caps[withdrawBlockNumber].add(_cap); withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); emit Unvote(msg.sender, _candidate, _cap); } - function resign( - address _candidate - ) public onlyOwner(_candidate) onlyCandidate(_candidate) { + function resign(address _candidate) public onlyOwner(_candidate) onlyCandidate(_candidate) { validatorsState[_candidate].isCandidate = false; candidateCount = candidateCount.sub(1); for (uint256 i = 0; i < candidates.length; i++) { if (candidates[i] == _candidate) { - address[] memory cacheArray = ownerToCandidate[msg.sender]; - uint256 cacheArrayLength = cacheArray.length; - for (uint256 j = 0; j < cacheArrayLength; j++) { - if (cacheArray[j] == _candidate) { - delete cacheArray[j]; - } - } - ownerToCandidate[msg.sender] = removeZeroAddresses(cacheArray); - if (ownerToCandidate[msg.sender].length == 0) { - ownerCount--; - } delete candidates[i]; break; } } - candidates = removeZeroAddresses(candidates); uint256 cap = validatorsState[_candidate].voters[msg.sender]; - validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( - cap - ); + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub(cap); validatorsState[_candidate].voters[msg.sender] = 0; // refunding after resigning X blocks uint256 withdrawBlockNumber = candidateWithdrawDelay.add(block.number); - withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ - msg.sender - ].caps[withdrawBlockNumber].add(cap); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[msg.sender].caps[withdrawBlockNumber].add(cap); withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); emit Resign(msg.sender, _candidate); } // voteInvalidKYC : any candidate can vote for invalid KYC i.e. a particular candidate's owner has uploaded a bad KYC. // On securing 75% votes against an owner ( not candidate ), owner & all its candidates will lose their funds. - function voteInvalidKYC( - address _invalidCandidate - ) - public - onlyValidCandidate(msg.sender) - onlyValidCandidate(_invalidCandidate) - { + function voteInvalidKYC(address _invalidCandidate) onlyValidCandidate(msg.sender) onlyValidCandidate(_invalidCandidate) public { address candidateOwner = getCandidateOwner(msg.sender); address _invalidMasternode = getCandidateOwner(_invalidCandidate); require(!hasVotedInvalid[candidateOwner][_invalidMasternode]); hasVotedInvalid[candidateOwner][_invalidMasternode] = true; invalidKYCCount[_invalidMasternode] += 1; - if ( - (invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount() >= 75 - ) { + if( invalidKYCCount[_invalidMasternode]*100/getOwnerCount() >= 75 ){ // 75% owners say that the KYC is invalid - address[] memory allMasternodes = new address[]( - candidates.length - 1 - ); - uint count = 0; - for (uint i = 0; i < candidates.length; i++) { - if (getCandidateOwner(candidates[i]) == _invalidMasternode) { + address[] memory allMasternodes = new address[](candidates.length-1) ; + uint count=0; + for (uint i=0;i uint256) voters; + } + + struct WithdrawState { + mapping(uint256 => uint256) caps; + uint256[] blockNumbers; + } + + mapping(address => WithdrawState) withdrawsState; + + mapping(address => ValidatorState) validatorsState; + mapping(address => address[]) voters; + + // Mapping structures added for KYC feature. + mapping(address => string[]) public KYCString; + mapping(address => uint) public invalidKYCCount; + mapping(address => mapping(address => bool)) public hasVotedInvalid; + mapping(address => address[]) public ownerToCandidate; + address[] public owners; + + address[] public candidates; + + uint256 public candidateCount = 0; + uint256 public ownerCount = 0; + uint256 public minCandidateCap; + uint256 public minVoterCap; + uint256 public maxValidatorNumber; + uint256 public candidateWithdrawDelay; + uint256 public voterWithdrawDelay; + + modifier onlyValidCandidateCap() { + // anyone can deposit X XDC to become a candidate + require(msg.value >= minCandidateCap); + _; + } + + modifier onlyValidVoterCap() { + require(msg.value >= minVoterCap); + _; + } + + modifier onlyKYCWhitelisted() { + require( + KYCString[msg.sender].length != 0 || + ownerToCandidate[msg.sender].length > 0 + ); + _; + } + + modifier onlyOwner(address _candidate) { + require(validatorsState[_candidate].owner == msg.sender); + _; + } + + modifier onlyCandidate(address _candidate) { + require(validatorsState[_candidate].isCandidate); + _; + } + + modifier onlyValidCandidate(address _candidate) { + require(validatorsState[_candidate].isCandidate); + _; + } + + modifier onlyNotCandidate(address _candidate) { + require(!validatorsState[_candidate].isCandidate); + _; + } + + modifier onlyValidVote(address _candidate, uint256 _cap) { + require(validatorsState[_candidate].voters[msg.sender] >= _cap); + if (validatorsState[_candidate].owner == msg.sender) { + require( + validatorsState[_candidate].voters[msg.sender].sub(_cap) >= + minCandidateCap + ); + } + _; + } + + modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { + require(_blockNumber > 0); + require(block.number >= _blockNumber); + require(withdrawsState[msg.sender].caps[_blockNumber] > 0); + require( + withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber + ); + _; + } + + function XDCValidator( + address[] _candidates, + uint256[] _caps, + address _firstOwner, + uint256 _minCandidateCap, + uint256 _minVoterCap, + uint256 _maxValidatorNumber, + uint256 _candidateWithdrawDelay, + uint256 _voterWithdrawDelay + ) public { + minCandidateCap = _minCandidateCap; + minVoterCap = _minVoterCap; + maxValidatorNumber = _maxValidatorNumber; + candidateWithdrawDelay = _candidateWithdrawDelay; + voterWithdrawDelay = _voterWithdrawDelay; + candidateCount = _candidates.length; + owners.push(_firstOwner); + ownerCount++; + for (uint256 i = 0; i < _candidates.length; i++) { + candidates.push(_candidates[i]); + validatorsState[_candidates[i]] = ValidatorState({ + owner: _firstOwner, + isCandidate: true, + cap: _caps[i] + }); + voters[_candidates[i]].push(_firstOwner); + ownerToCandidate[_firstOwner].push(_candidates[i]); + validatorsState[_candidates[i]].voters[ + _firstOwner + ] = minCandidateCap; + } + } + + // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. + function uploadKYC(string kychash) external { + KYCString[msg.sender].push(kychash); + emit UploadedKYC(msg.sender, kychash); + } + + // propose : any non-candidate who has uploaded its KYC can become an owner by proposing a candidate. + function propose( + address _candidate + ) + external + payable + onlyValidCandidateCap + onlyKYCWhitelisted + onlyNotCandidate(_candidate) + { + uint256 cap = validatorsState[_candidate].cap.add(msg.value); + candidates.push(_candidate); + validatorsState[_candidate] = ValidatorState({ + owner: msg.sender, + isCandidate: true, + cap: cap + }); + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].add(msg.value); + candidateCount = candidateCount.add(1); + if (ownerToCandidate[msg.sender].length == 0) { + owners.push(msg.sender); + ownerCount++; + } + ownerToCandidate[msg.sender].push(_candidate); + voters[_candidate].push(msg.sender); + emit Propose(msg.sender, _candidate, msg.value); + } + + function vote( + address _candidate + ) external payable onlyValidVoterCap onlyValidCandidate(_candidate) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.add( + msg.value + ); + if (validatorsState[_candidate].voters[msg.sender] == 0) { + voters[_candidate].push(msg.sender); + } + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].add(msg.value); + emit Vote(msg.sender, _candidate, msg.value); + } + + function getCandidates() public view returns (address[]) { + return candidates; + } + + function getCandidateCap(address _candidate) public view returns (uint256) { + return validatorsState[_candidate].cap; + } + + function getCandidateOwner( + address _candidate + ) public view returns (address) { + return validatorsState[_candidate].owner; + } + + function getVoterCap( + address _candidate, + address _voter + ) public view returns (uint256) { + return validatorsState[_candidate].voters[_voter]; + } + + function getVoters(address _candidate) public view returns (address[]) { + return voters[_candidate]; + } + + function isCandidate(address _candidate) public view returns (bool) { + return validatorsState[_candidate].isCandidate; + } + + function getWithdrawBlockNumbers() public view returns (uint256[]) { + return withdrawsState[msg.sender].blockNumbers; + } + + function getWithdrawCap( + uint256 _blockNumber + ) public view returns (uint256) { + return withdrawsState[msg.sender].caps[_blockNumber]; + } + + function unvote( + address _candidate, + uint256 _cap + ) public onlyValidVote(_candidate, _cap) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( + _cap + ); + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].sub(_cap); + + // refund after delay X blocks + uint256 withdrawBlockNumber = voterWithdrawDelay.add(block.number); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ + msg.sender + ].caps[withdrawBlockNumber].add(_cap); + withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); + + emit Unvote(msg.sender, _candidate, _cap); + } + + function resign( + address _candidate + ) public onlyOwner(_candidate) onlyCandidate(_candidate) { + validatorsState[_candidate].isCandidate = false; + candidateCount = candidateCount.sub(1); + for (uint256 i = 0; i < candidates.length; i++) { + if (candidates[i] == _candidate) { + address[] memory cacheArray = ownerToCandidate[msg.sender]; + uint256 cacheArrayLength = cacheArray.length; + for (uint256 j = 0; j < cacheArrayLength; j++) { + if (cacheArray[j] == _candidate) { + delete cacheArray[j]; + } + } + ownerToCandidate[msg.sender] = removeZeroAddresses(cacheArray); + if (ownerToCandidate[msg.sender].length == 0) { + ownerCount--; + } + delete candidates[i]; + break; + } + } + candidates = removeZeroAddresses(candidates); + uint256 cap = validatorsState[_candidate].voters[msg.sender]; + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( + cap + ); + validatorsState[_candidate].voters[msg.sender] = 0; + // refunding after resigning X blocks + uint256 withdrawBlockNumber = candidateWithdrawDelay.add(block.number); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ + msg.sender + ].caps[withdrawBlockNumber].add(cap); + withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); + emit Resign(msg.sender, _candidate); + } + + // voteInvalidKYC : any candidate can vote for invalid KYC i.e. a particular candidate's owner has uploaded a bad KYC. + // On securing 75% votes against an owner ( not candidate ), owner & all its candidates will lose their funds. + function voteInvalidKYC( + address _invalidCandidate + ) + public + onlyValidCandidate(msg.sender) + onlyValidCandidate(_invalidCandidate) + { + address candidateOwner = getCandidateOwner(msg.sender); + address _invalidMasternode = getCandidateOwner(_invalidCandidate); + require(!hasVotedInvalid[candidateOwner][_invalidMasternode]); + hasVotedInvalid[candidateOwner][_invalidMasternode] = true; + invalidKYCCount[_invalidMasternode] += 1; + if ( + (invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount() >= 75 + ) { + // 75% owners say that the KYC is invalid + address[] memory allMasternodes = new address[]( + candidates.length - 1 + ); + uint count = 0; + for (uint i = 0; i < candidates.length; i++) { + if (getCandidateOwner(candidates[i]) == _invalidMasternode) { + // logic to remove cap. + candidateCount = candidateCount.sub(1); + allMasternodes[count++] = candidates[i]; + delete validatorsState[candidates[i]]; + delete candidates[i]; + delete KYCString[_invalidMasternode]; + delete ownerToCandidate[_invalidMasternode]; + delete invalidKYCCount[_invalidMasternode]; + } + } + candidates = removeZeroAddresses(candidates); + for (uint k = 0; k < owners.length; k++) { + if (owners[k] == _invalidMasternode) { + delete owners[k]; + ownerCount--; + break; + } + } + owners = removeZeroAddresses(owners); + emit InvalidatedNode(_invalidMasternode, allMasternodes); + } + } + + // invalidPercent : get votes against an owner in percentage. + function invalidPercent( + address _invalidCandidate + ) public view onlyValidCandidate(_invalidCandidate) returns (uint) { + address _invalidMasternode = getCandidateOwner(_invalidCandidate); + return ((invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount()); + } + + // getOwnerCount : get count of total owners; accounts who own atleast one masternode. + function getOwnerCount() public view returns (uint) { + return ownerCount; + } + + // getKYC : get KYC uploaded of the owner of the given masternode or the owner themselves + function getLatestKYC(address _address) public view returns (string) { + if (isCandidate(_address)) { + return + KYCString[getCandidateOwner(_address)][ + KYCString[getCandidateOwner(_address)].length - 1 + ]; + } else { + return KYCString[_address][KYCString[_address].length - 1]; + } + } + + function getHashCount(address _address) public view returns (uint) { + return KYCString[_address].length; + } + + function withdraw( + uint256 _blockNumber, + uint _index + ) public onlyValidWithdraw(_blockNumber, _index) { + uint256 cap = withdrawsState[msg.sender].caps[_blockNumber]; + delete withdrawsState[msg.sender].caps[_blockNumber]; + delete withdrawsState[msg.sender].blockNumbers[_index]; + msg.sender.transfer(cap); + emit Withdraw(msg.sender, _blockNumber, cap); + } + + function removeZeroAddresses( + address[] memory addresses + ) private pure returns (address[] memory) { + address[] memory newAddresses = new address[](addresses.length); + uint256 j = 0; + for (uint256 i = 0; i < addresses.length; i++) { + if (addresses[i] != address(0)) { + newAddresses[j] = addresses[i]; + j++; + } + } + // Resize the array. + assembly { + mstore(newAddresses, j) + } + return newAddresses; + } +} From d6c92885a49b73900a886ed662b375c5c02dc84c Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 6 Mar 2024 20:39:10 +0400 Subject: [PATCH 003/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 0dd2c1e5d6d4..c5f1f283bc61 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,6 +47,8 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; + mapping(address => bool) public withdrawInvalid; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); @@ -98,6 +100,7 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { + require(!withdrawInvalid[msg.sender]); require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); @@ -309,6 +312,8 @@ contract XDCValidator { address[] memory allMasternodes = new address[]( candidates.length - 1 ); + //make the masternode invalid + withdrawInvalid[_invalidMasternode] = true; uint count = 0; for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _invalidMasternode) { From 4443e4cd9bb1b1fd356b660cb5adb3b42d4f218f Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:20:22 +0400 Subject: [PATCH 004/144] xdv-01 --- contracts/validator/contract/XDCValidatorV2.sol | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index c5f1f283bc61..3f15d6d4f5e4 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -320,6 +320,15 @@ contract XDCValidator { // logic to remove cap. candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; + + //delete voters[candidates[i]]; + for (uint256 y = 0; y < voters[candidates[i]].length; y++) { + //delete mapping + validatorsState[candidates[i]].voters[ + voters[candidates[i]][y] + ] = 0; + voters[candidates[i]][y] = address(0); + } delete validatorsState[candidates[i]]; delete candidates[i]; delete KYCString[_invalidMasternode]; From 72b56b06037a78a8bec59334c67c36c50191c184 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:29:34 +0400 Subject: [PATCH 005/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 3f15d6d4f5e4..0fa33ca24386 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -329,6 +329,9 @@ contract XDCValidator { ] = 0; voters[candidates[i]][y] = address(0); } + voters[candidates[i]] = removeZeroAddresses( + voters[candidates[i]] + ); delete validatorsState[candidates[i]]; delete candidates[i]; delete KYCString[_invalidMasternode]; From 72418e6e2f216b7240d2fad1f4f88bd663a24dac Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:37:32 +0400 Subject: [PATCH 006/144] xdv-06 --- .../validator/contract/XDCValidatorV2.sol | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 0fa33ca24386..044b632055b5 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -272,7 +272,8 @@ contract XDCValidator { if (ownerToCandidate[msg.sender].length == 0) { ownerCount--; } - delete candidates[i]; + deleteCandidateFromArrayBySwapWithLastElement(candidates[i]); + break; } } @@ -333,7 +334,9 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - delete candidates[i]; + deleteCandidateFromArrayBySwapWithLastElement( + candidates[i] + ); delete KYCString[_invalidMasternode]; delete ownerToCandidate[_invalidMasternode]; delete invalidKYCCount[_invalidMasternode]; @@ -409,4 +412,16 @@ contract XDCValidator { } return newAddresses; } + + function deleteCandidateFromArrayBySwapWithLastElement( + address addr + ) public { + for (uint256 i = 0; i < candidates.length; i++) { + if (candidates[i] == addr) { + candidates[i] = candidates[candidates.length - 1]; + candidates.length--; + break; + } + } + } } From e4ab783fe2dfc850b29ce37286245303dc3e1b41 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:55:29 +0400 Subject: [PATCH 007/144] xdv-06 xdv-06 --- contracts/validator/contract/XDCValidatorV2.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 044b632055b5..1de5bd502762 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -277,7 +277,7 @@ contract XDCValidator { break; } } - candidates = removeZeroAddresses(candidates); + uint256 cap = validatorsState[_candidate].voters[msg.sender]; validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( cap @@ -342,7 +342,7 @@ contract XDCValidator { delete invalidKYCCount[_invalidMasternode]; } } - candidates = removeZeroAddresses(candidates); + for (uint k = 0; k < owners.length; k++) { if (owners[k] == _invalidMasternode) { delete owners[k]; From 4e0b8907fec897b3dffe93d7cb487e2e1cad5993 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 14 Mar 2024 11:13:34 +0400 Subject: [PATCH 008/144] xdv-01 --- .../validator/contract/XDCValidatorV2.sol | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 1de5bd502762..cf09de87f649 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -272,12 +272,14 @@ contract XDCValidator { if (ownerToCandidate[msg.sender].length == 0) { ownerCount--; } - deleteCandidateFromArrayBySwapWithLastElement(candidates[i]); + delete candidates[i]; break; } } - + + candidates = removeZeroAddresses(candidates); + uint256 cap = validatorsState[_candidate].voters[msg.sender]; validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( cap @@ -334,15 +336,15 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - deleteCandidateFromArrayBySwapWithLastElement( - candidates[i] - ); + delete candidates[i]; delete KYCString[_invalidMasternode]; delete ownerToCandidate[_invalidMasternode]; delete invalidKYCCount[_invalidMasternode]; } } - + + candidates = removeZeroAddresses(candidates); + for (uint k = 0; k < owners.length; k++) { if (owners[k] == _invalidMasternode) { delete owners[k]; @@ -412,16 +414,4 @@ contract XDCValidator { } return newAddresses; } - - function deleteCandidateFromArrayBySwapWithLastElement( - address addr - ) public { - for (uint256 i = 0; i < candidates.length; i++) { - if (candidates[i] == addr) { - candidates[i] = candidates[candidates.length - 1]; - candidates.length--; - break; - } - } - } } From 434298483de210497ee308fa3eed2d48d1f40574 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 16 Mar 2024 18:33:13 +0400 Subject: [PATCH 009/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 61 +++++++++++++++++-- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index cf09de87f649..511e5c1dd969 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -272,14 +272,12 @@ contract XDCValidator { if (ownerToCandidate[msg.sender].length == 0) { ownerCount--; } - delete candidates[i]; + deleteCandidateFromArrayBySwapWithLastElement(candidates[i]); break; } } - candidates = removeZeroAddresses(candidates); - uint256 cap = validatorsState[_candidate].voters[msg.sender]; validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( cap @@ -347,12 +345,11 @@ contract XDCValidator { for (uint k = 0; k < owners.length; k++) { if (owners[k] == _invalidMasternode) { - delete owners[k]; + deleteOwnersFromArrayBySwapWithLastElement(owners[k]); ownerCount--; break; } } - owners = removeZeroAddresses(owners); emit InvalidatedNode(_invalidMasternode, allMasternodes); } } @@ -414,4 +411,58 @@ contract XDCValidator { } return newAddresses; } + + function removeCandidatesZeroAddresses() external { + address[] memory newAddresses = new address[](candidates.length); + uint256 j = 0; + for (uint256 i = 0; i < candidates.length; i++) { + if (candidates[i] != address(0)) { + newAddresses[j] = candidates[i]; + j++; + } + } + // Resize the array. + assembly { + mstore(newAddresses, j) + } + candidates = newAddresses; + } + + function removeOwnersZeroAddresses() external { + address[] memory newAddresses = new address[](owners.length); + uint256 j = 0; + for (uint256 i = 0; i < owners.length; i++) { + if (owners[i] != address(0)) { + newAddresses[j] = owners[i]; + j++; + } + } + // Resize the array. + assembly { + mstore(newAddresses, j) + } + owners = newAddresses; + } + + function deleteCandidateFromArrayBySwapWithLastElement( + address addr + ) public { + for (uint256 i = 0; i < candidates.length; i++) { + if (candidates[i] == addr) { + candidates[i] = candidates[candidates.length - 1]; + candidates.length--; + break; + } + } + } + + function deleteOwnersFromArrayBySwapWithLastElement(address addr) public { + for (uint256 i = 0; i < owners.length; i++) { + if (owners[i] == addr) { + owners[i] = owners[owners.length - 1]; + owners.length--; + break; + } + } + } } From 6edecf30ad0b4a5ec2a97571c9b0d656c2e97948 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 16 Mar 2024 18:35:55 +0400 Subject: [PATCH 010/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 511e5c1dd969..de4d99839192 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -412,38 +412,6 @@ contract XDCValidator { return newAddresses; } - function removeCandidatesZeroAddresses() external { - address[] memory newAddresses = new address[](candidates.length); - uint256 j = 0; - for (uint256 i = 0; i < candidates.length; i++) { - if (candidates[i] != address(0)) { - newAddresses[j] = candidates[i]; - j++; - } - } - // Resize the array. - assembly { - mstore(newAddresses, j) - } - candidates = newAddresses; - } - - function removeOwnersZeroAddresses() external { - address[] memory newAddresses = new address[](owners.length); - uint256 j = 0; - for (uint256 i = 0; i < owners.length; i++) { - if (owners[i] != address(0)) { - newAddresses[j] = owners[i]; - j++; - } - } - // Resize the array. - assembly { - mstore(newAddresses, j) - } - owners = newAddresses; - } - function deleteCandidateFromArrayBySwapWithLastElement( address addr ) public { From 1d51654556565616040e1b142c7344701aeed57c Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 16 Mar 2024 18:45:50 +0400 Subject: [PATCH 011/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index de4d99839192..54f0ae3b2514 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -334,15 +334,16 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - delete candidates[i]; + deleteCandidateFromArrayBySwapWithLastElement( + candidates[i] + ); delete KYCString[_invalidMasternode]; delete ownerToCandidate[_invalidMasternode]; delete invalidKYCCount[_invalidMasternode]; + break; } } - candidates = removeZeroAddresses(candidates); - for (uint k = 0; k < owners.length; k++) { if (owners[k] == _invalidMasternode) { deleteOwnersFromArrayBySwapWithLastElement(owners[k]); From 76036fd8f3c0cd3c844c3433b694abb2f32b7e81 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 16 Mar 2024 18:52:34 +0400 Subject: [PATCH 012/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 54f0ae3b2514..2d4329a39363 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -313,11 +313,11 @@ contract XDCValidator { address[] memory allMasternodes = new address[]( candidates.length - 1 ); - //make the masternode invalid - withdrawInvalid[_invalidMasternode] = true; uint count = 0; for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _invalidMasternode) { + //make the masternode invalid + withdrawInvalid[candidates[i]] = true; // logic to remove cap. candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; @@ -413,9 +413,41 @@ contract XDCValidator { return newAddresses; } + function removeCandidatesZeroAddresses() external { + address[] memory newAddresses = new address[](candidates.length); + uint256 j = 0; + for (uint256 i = 0; i < candidates.length; i++) { + if (candidates[i] != address(0)) { + newAddresses[j] = candidates[i]; + j++; + } + } + // Resize the array. + assembly { + mstore(newAddresses, j) + } + candidates = newAddresses; + } + + function removeOwnersZeroAddresses() external { + address[] memory newAddresses = new address[](owners.length); + uint256 j = 0; + for (uint256 i = 0; i < owners.length; i++) { + if (owners[i] != address(0)) { + newAddresses[j] = owners[i]; + j++; + } + } + // Resize the array. + assembly { + mstore(newAddresses, j) + } + owners = newAddresses; + } + function deleteCandidateFromArrayBySwapWithLastElement( address addr - ) public { + ) private { for (uint256 i = 0; i < candidates.length; i++) { if (candidates[i] == addr) { candidates[i] = candidates[candidates.length - 1]; @@ -425,7 +457,7 @@ contract XDCValidator { } } - function deleteOwnersFromArrayBySwapWithLastElement(address addr) public { + function deleteOwnersFromArrayBySwapWithLastElement(address addr) private { for (uint256 i = 0; i < owners.length; i++) { if (owners[i] == addr) { owners[i] = owners[owners.length - 1]; From 407cdf0355edde643ddd5c4839e46f59f32efba2 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 19 Mar 2024 10:27:11 +0400 Subject: [PATCH 013/144] xdv-06 --- .../validator/contract/XDCValidatorV2.sol | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 2d4329a39363..8cc09399edc6 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -259,25 +259,27 @@ contract XDCValidator { ) public onlyOwner(_candidate) onlyCandidate(_candidate) { validatorsState[_candidate].isCandidate = false; candidateCount = candidateCount.sub(1); - for (uint256 i = 0; i < candidates.length; i++) { - if (candidates[i] == _candidate) { - address[] memory cacheArray = ownerToCandidate[msg.sender]; - uint256 cacheArrayLength = cacheArray.length; - for (uint256 j = 0; j < cacheArrayLength; j++) { - if (cacheArray[j] == _candidate) { - delete cacheArray[j]; - } - } - ownerToCandidate[msg.sender] = removeZeroAddresses(cacheArray); - if (ownerToCandidate[msg.sender].length == 0) { - ownerCount--; - } - deleteCandidateFromArrayBySwapWithLastElement(candidates[i]); + deleteCandidate(_candidate); + + // Cleanup the ownerToCandidate mapping for the resigning candidate's owner + address[] storage ownedCandidates = ownerToCandidate[msg.sender]; + uint256 ownedCandidatesLength = ownedCandidates.length; + for (uint256 j = 0; j < ownedCandidatesLength; j++) { + if (ownedCandidates[j] == _candidate) { + ownedCandidates[j] = ownedCandidates[ownedCandidatesLength - 1]; + delete ownedCandidates[ownedCandidatesLength - 1]; + ownedCandidates.length--; // Manually decrease the array length break; } } + // Optionally, consider adjusting ownerCount if needed + if (ownedCandidates.length == 0) { + // If specific logic is needed to manage the owners array, implement here + ownerCount--; + } + uint256 cap = validatorsState[_candidate].voters[msg.sender]; validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( cap @@ -334,9 +336,9 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - deleteCandidateFromArrayBySwapWithLastElement( - candidates[i] - ); + + deleteCandidate(candidates[i]); + delete KYCString[_invalidMasternode]; delete ownerToCandidate[_invalidMasternode]; delete invalidKYCCount[_invalidMasternode]; @@ -344,13 +346,7 @@ contract XDCValidator { } } - for (uint k = 0; k < owners.length; k++) { - if (owners[k] == _invalidMasternode) { - deleteOwnersFromArrayBySwapWithLastElement(owners[k]); - ownerCount--; - break; - } - } + deleteOwner(_invalidMasternode); emit InvalidatedNode(_invalidMasternode, allMasternodes); } } @@ -445,23 +441,27 @@ contract XDCValidator { owners = newAddresses; } - function deleteCandidateFromArrayBySwapWithLastElement( - address addr - ) private { - for (uint256 i = 0; i < candidates.length; i++) { - if (candidates[i] == addr) { - candidates[i] = candidates[candidates.length - 1]; - candidates.length--; + // Efficiently remove _candidate from the candidates array + function deleteCandidate(address candidate) private { + uint256 candidatesLength = candidates.length; + for (uint256 i = 0; i < candidatesLength; i++) { + if (candidates[i] == candidate) { + candidates[i] = candidates[candidatesLength - 1]; + delete candidates[candidatesLength - 1]; + candidates.length--; // Manually decrease the array length break; } } } - function deleteOwnersFromArrayBySwapWithLastElement(address addr) private { - for (uint256 i = 0; i < owners.length; i++) { - if (owners[i] == addr) { - owners[i] = owners[owners.length - 1]; - owners.length--; + // Efficiently remove the invalid owner from the owners array + function deleteOwner(address owner) private { + uint256 ownersLength = owners.length; + for (uint k = 0; k < ownersLength; k++) { + if (owners[k] == owner) { + owners[k] = owners[ownersLength - 1]; // Swap with the last element + delete owners[ownersLength - 1]; // Delete the last element + owners.length--; // Decrease the array size break; } } From 2fc7af4f2dde25286c84cdf2a5ed71a14ae611c3 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 20 Mar 2024 17:24:45 +0400 Subject: [PATCH 014/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 39 +++++++------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 8cc09399edc6..a4bd40cf04f1 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,8 +47,6 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - mapping(address => bool) public withdrawInvalid; - modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); @@ -100,7 +98,6 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { - require(!withdrawInvalid[msg.sender]); require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); @@ -297,19 +294,15 @@ contract XDCValidator { // voteInvalidKYC : any candidate can vote for invalid KYC i.e. a particular candidate's owner has uploaded a bad KYC. // On securing 75% votes against an owner ( not candidate ), owner & all its candidates will lose their funds. function voteInvalidKYC( - address _invalidCandidate - ) - public - onlyValidCandidate(msg.sender) - onlyValidCandidate(_invalidCandidate) - { + address _owner + ) public onlyValidCandidate(msg.sender) { address candidateOwner = getCandidateOwner(msg.sender); - address _invalidMasternode = getCandidateOwner(_invalidCandidate); - require(!hasVotedInvalid[candidateOwner][_invalidMasternode]); - hasVotedInvalid[candidateOwner][_invalidMasternode] = true; - invalidKYCCount[_invalidMasternode] += 1; + + require(!hasVotedInvalid[candidateOwner][_owner]); + hasVotedInvalid[candidateOwner][_owner] = true; + invalidKYCCount[_owner] += 1; if ( - (invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount() >= 75 + (invalidKYCCount[_owner] * 100) / getOwnerCount() >= 75 ) { // 75% owners say that the KYC is invalid address[] memory allMasternodes = new address[]( @@ -317,9 +310,7 @@ contract XDCValidator { ); uint count = 0; for (uint i = 0; i < candidates.length; i++) { - if (getCandidateOwner(candidates[i]) == _invalidMasternode) { - //make the masternode invalid - withdrawInvalid[candidates[i]] = true; + if (getCandidateOwner(candidates[i]) == _owner) { // logic to remove cap. candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; @@ -339,15 +330,15 @@ contract XDCValidator { deleteCandidate(candidates[i]); - delete KYCString[_invalidMasternode]; - delete ownerToCandidate[_invalidMasternode]; - delete invalidKYCCount[_invalidMasternode]; + delete KYCString[_owner]; + delete ownerToCandidate[_owner]; + delete invalidKYCCount[_owner]; break; } } - deleteOwner(_invalidMasternode); - emit InvalidatedNode(_invalidMasternode, allMasternodes); + deleteOwner(_owner); + emit InvalidatedNode(_owner, allMasternodes); } } @@ -355,8 +346,8 @@ contract XDCValidator { function invalidPercent( address _invalidCandidate ) public view onlyValidCandidate(_invalidCandidate) returns (uint) { - address _invalidMasternode = getCandidateOwner(_invalidCandidate); - return ((invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount()); + address _owner = getCandidateOwner(_invalidCandidate); + return ((invalidKYCCount[_owner] * 100) / getOwnerCount()); } // getOwnerCount : get count of total owners; accounts who own atleast one masternode. From 7f2fe5038288574eb402de4ce142536931d8d230 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:19:39 +0400 Subject: [PATCH 015/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index a4bd40cf04f1..012d72a2dc62 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,6 +47,8 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; + mapping(address => bool) public invalidOwner; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); @@ -98,6 +100,7 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { + require(!invalidOwner[msg.sender]); require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); @@ -301,9 +304,7 @@ contract XDCValidator { require(!hasVotedInvalid[candidateOwner][_owner]); hasVotedInvalid[candidateOwner][_owner] = true; invalidKYCCount[_owner] += 1; - if ( - (invalidKYCCount[_owner] * 100) / getOwnerCount() >= 75 - ) { + if ((invalidKYCCount[_owner] * 100) / getOwnerCount() >= 75) { // 75% owners say that the KYC is invalid address[] memory allMasternodes = new address[]( candidates.length - 1 @@ -311,6 +312,8 @@ contract XDCValidator { uint count = 0; for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { + //set owner is invalid + invalidOwner[_owner] = true; // logic to remove cap. candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; From 6efc12ba0d1fa20997193cb411adbac43550bdb4 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:20:45 +0400 Subject: [PATCH 016/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 012d72a2dc62..2b7288d315f6 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -310,10 +310,10 @@ contract XDCValidator { candidates.length - 1 ); uint count = 0; + //set owner is invalid + invalidOwner[_owner] = true; for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { - //set owner is invalid - invalidOwner[_owner] = true; // logic to remove cap. candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; From b52721f3b16b10585e7c8a20bd320cb15e969c4b Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:24:27 +0400 Subject: [PATCH 017/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 2b7288d315f6..4125a2ea4a85 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,7 +47,7 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - mapping(address => bool) public invalidOwner; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate @@ -100,7 +100,7 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { - require(!invalidOwner[msg.sender]); + require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); @@ -310,8 +310,7 @@ contract XDCValidator { candidates.length - 1 ); uint count = 0; - //set owner is invalid - invalidOwner[_owner] = true; + for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { // logic to remove cap. From 881b4d0a35048185541b0e40a5282ebfb89cba52 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:27:01 +0400 Subject: [PATCH 018/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 4125a2ea4a85..44d21b028ac0 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,8 +47,6 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - - modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); @@ -100,7 +98,6 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { - require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); @@ -310,7 +307,7 @@ contract XDCValidator { candidates.length - 1 ); uint count = 0; - + for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { // logic to remove cap. @@ -346,9 +343,8 @@ contract XDCValidator { // invalidPercent : get votes against an owner in percentage. function invalidPercent( - address _invalidCandidate - ) public view onlyValidCandidate(_invalidCandidate) returns (uint) { - address _owner = getCandidateOwner(_invalidCandidate); + address _owner + ) public view onlyValidCandidate(_owner) returns (uint) { return ((invalidKYCCount[_owner] * 100) / getOwnerCount()); } From cd8901de7fda2ad73b45c28b823b211b929160a3 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:38:06 +0400 Subject: [PATCH 019/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 44d21b028ac0..bd253abefee6 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -307,7 +307,8 @@ contract XDCValidator { candidates.length - 1 ); uint count = 0; - + uint j = 0; + address[] memory newCandidates = new address[](candidates.length); for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { // logic to remove cap. @@ -326,15 +327,16 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - - deleteCandidate(candidates[i]); - + delete KYCString[_owner]; delete ownerToCandidate[_owner]; delete invalidKYCCount[_owner]; - break; + } else { + newCandidates[j++] = candidates[i]; } } + candidates = newCandidates; + candidates.length = j; deleteOwner(_owner); emit InvalidatedNode(_owner, allMasternodes); From ae5a5e479782cd860d3f2cd45ea43ceb0cb6d771 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 22 Mar 2024 08:31:52 +0400 Subject: [PATCH 020/144] upgrade solidity version to 0.4.26 and add revert mssage --- .../validator/contract/XDCValidatorV2.sol | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index bd253abefee6..901e3cdf3c79 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.21; +pragma solidity ^0.4.26; import "./libs/SafeMath.sol"; @@ -49,60 +49,81 @@ contract XDCValidator { modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate - require(msg.value >= minCandidateCap); + require(msg.value >= minCandidateCap, "Invalid Candidate Cap"); _; } modifier onlyValidVoterCap() { - require(msg.value >= minVoterCap); + require(msg.value >= minVoterCap, "Invalid Voter Cap"); _; } modifier onlyKYCWhitelisted() { require( KYCString[msg.sender].length != 0 || - ownerToCandidate[msg.sender].length > 0 + ownerToCandidate[msg.sender].length > 0, + "KYC not uploaded" ); _; } modifier onlyOwner(address _candidate) { - require(validatorsState[_candidate].owner == msg.sender); + require( + validatorsState[_candidate].owner == msg.sender, + "Only owner can call this function" + ); _; } modifier onlyCandidate(address _candidate) { - require(validatorsState[_candidate].isCandidate); + require( + validatorsState[_candidate].isCandidate, + "Only candidate can call this function" + ); _; } modifier onlyValidCandidate(address _candidate) { - require(validatorsState[_candidate].isCandidate); + require(validatorsState[_candidate].isCandidate, "Invalid Candidate"); _; } modifier onlyNotCandidate(address _candidate) { - require(!validatorsState[_candidate].isCandidate); + require( + !validatorsState[_candidate].isCandidate, + "Already a candidate" + ); _; } modifier onlyValidVote(address _candidate, uint256 _cap) { - require(validatorsState[_candidate].voters[msg.sender] >= _cap); + require( + validatorsState[_candidate].voters[msg.sender] >= _cap, + "Invalid Vote" + ); if (validatorsState[_candidate].owner == msg.sender) { require( validatorsState[_candidate].voters[msg.sender].sub(_cap) >= - minCandidateCap + minCandidateCap, + "Minimum cap should be maintained" ); } _; } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { - require(_blockNumber > 0); - require(block.number >= _blockNumber); - require(withdrawsState[msg.sender].caps[_blockNumber] > 0); + require(_blockNumber > 0, "Invalid block number"); + require( + block.number >= _blockNumber, + "Block number should be less than current block number" + ); require( - withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber + withdrawsState[msg.sender].caps[_blockNumber] > 0, + "No cap to withdraw" + ); + require( + withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber, + "Invalid index" ); _; } @@ -298,7 +319,7 @@ contract XDCValidator { ) public onlyValidCandidate(msg.sender) { address candidateOwner = getCandidateOwner(msg.sender); - require(!hasVotedInvalid[candidateOwner][_owner]); + require(!hasVotedInvalid[candidateOwner][_owner], "Already voted"); hasVotedInvalid[candidateOwner][_owner] = true; invalidKYCCount[_owner] += 1; if ((invalidKYCCount[_owner] * 100) / getOwnerCount() >= 75) { @@ -327,7 +348,7 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - + delete KYCString[_owner]; delete ownerToCandidate[_owner]; delete invalidKYCCount[_owner]; From 118abf6f117a5dee52e3194cf87ded1184ea6854 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:26:00 +0400 Subject: [PATCH 021/144] change constructor --- contracts/validator/contract/XDCValidatorV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 901e3cdf3c79..0553e14af76a 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -128,7 +128,7 @@ contract XDCValidator { _; } - function XDCValidator( + constructor( address[] _candidates, uint256[] _caps, address _firstOwner, From ab456e7a5560fb485e8dcb8a44851ac1edb88d05 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:54:54 +0400 Subject: [PATCH 022/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 0553e14af76a..5f2a43545ae2 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -356,6 +356,7 @@ contract XDCValidator { newCandidates[j++] = candidates[i]; } } + newCandidates = removeZeroAddresses(newCandidates); candidates = newCandidates; candidates.length = j; From 38fa42df1cef55f1d6d7abec5889cdc60cc4aa62 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:57:25 +0400 Subject: [PATCH 023/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 5f2a43545ae2..89254eacc8fe 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,6 +47,8 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; + mapping(address => bool) public invalidOwner; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap, "Invalid Candidate Cap"); @@ -112,6 +114,7 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { + require(!invalidOwner[msg.sender], "Invalid Owner"); require(_blockNumber > 0, "Invalid block number"); require( block.number >= _blockNumber, @@ -330,6 +333,7 @@ contract XDCValidator { uint count = 0; uint j = 0; address[] memory newCandidates = new address[](candidates.length); + invalidOwner[_owner] = true; for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { // logic to remove cap. From 2d586d89a6d2ee44a228a60553509b1fc791b75a Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:00:24 +0400 Subject: [PATCH 024/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 89254eacc8fe..8ae61deb92fb 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -360,6 +360,7 @@ contract XDCValidator { newCandidates[j++] = candidates[i]; } } + newCandidates = removeZeroAddresses(newCandidates); candidates = newCandidates; candidates.length = j; @@ -479,6 +480,7 @@ contract XDCValidator { owners[k] = owners[ownersLength - 1]; // Swap with the last element delete owners[ownersLength - 1]; // Delete the last element owners.length--; // Decrease the array size + ownerCount--; // Decrease the owner count break; } } From a0f4cf4bb360d13de5dbd7a7a90bfd1cebb7efc9 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:03:40 +0400 Subject: [PATCH 025/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 8ae61deb92fb..256068139fea 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -340,17 +340,18 @@ contract XDCValidator { candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; - //delete voters[candidates[i]]; - for (uint256 y = 0; y < voters[candidates[i]].length; y++) { - //delete mapping - validatorsState[candidates[i]].voters[ - voters[candidates[i]][y] - ] = 0; - voters[candidates[i]][y] = address(0); - } - voters[candidates[i]] = removeZeroAddresses( - voters[candidates[i]] - ); + //delete voters[candidates[i]]; in blacklist no need use in the future + // for (uint256 y = 0; y < voters[candidates[i]].length; y++) { + // //delete mapping + // validatorsState[candidates[i]].voters[ + // voters[candidates[i]][y] + // ] = 0; + // voters[candidates[i]][y] = address(0); + // } + // voters[candidates[i]] = removeZeroAddresses( + // voters[candidates[i]] + // ); + delete validatorsState[candidates[i]]; delete KYCString[_owner]; From 19562cc8ec44473f6b32f478b9df1fbe12c449ed Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:11:33 +0400 Subject: [PATCH 026/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 256068139fea..bd14655a3566 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -49,6 +49,8 @@ contract XDCValidator { mapping(address => bool) public invalidOwner; + mapping(address => bool) public invalidCandidate; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap, "Invalid Candidate Cap"); @@ -91,6 +93,7 @@ contract XDCValidator { } modifier onlyNotCandidate(address _candidate) { + require(!invalidCandidate[_candidate], "Invalid Candidate"); require( !validatorsState[_candidate].isCandidate, "Already a candidate" @@ -340,6 +343,7 @@ contract XDCValidator { candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; + invalidCandidate[candidates[i]] = true; //delete voters[candidates[i]]; in blacklist no need use in the future // for (uint256 y = 0; y < voters[candidates[i]].length; y++) { // //delete mapping @@ -351,7 +355,7 @@ contract XDCValidator { // voters[candidates[i]] = removeZeroAddresses( // voters[candidates[i]] // ); - + delete validatorsState[candidates[i]]; delete KYCString[_owner]; From 1bbf4d2f5ad0fcccf7f7bdac08974f0afa37ed62 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:20:54 +0400 Subject: [PATCH 027/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index bd14655a3566..b5e4547ea386 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -366,7 +366,10 @@ contract XDCValidator { } } - newCandidates = removeZeroAddresses(newCandidates); + // Resize the array. + assembly { + mstore(newCandidates, j) + } candidates = newCandidates; candidates.length = j; From ca802186065f980fc56b01557ed5fb2eda198197 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 26 Mar 2024 09:16:34 +0400 Subject: [PATCH 028/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index b5e4547ea386..8ee9ec9d414b 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -301,7 +301,7 @@ contract XDCValidator { // Optionally, consider adjusting ownerCount if needed if (ownedCandidates.length == 0) { // If specific logic is needed to manage the owners array, implement here - ownerCount--; + deleteOwner(msg.sender); } uint256 cap = validatorsState[_candidate].voters[msg.sender]; @@ -371,7 +371,6 @@ contract XDCValidator { mstore(newCandidates, j) } candidates = newCandidates; - candidates.length = j; deleteOwner(_owner); emit InvalidatedNode(_owner, allMasternodes); From 21fce80513e3032f2c29b1e92be97831f6150f50 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 17 Apr 2024 11:41:06 +0400 Subject: [PATCH 029/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 8ee9ec9d414b..961bc6f04e92 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -51,6 +51,8 @@ contract XDCValidator { mapping(address => bool) public invalidCandidate; + mapping(string => uint256) public validKYCCount; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap, "Invalid Candidate Cap"); @@ -168,9 +170,20 @@ contract XDCValidator { } // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. - function uploadKYC(string kychash) external { - KYCString[msg.sender].push(kychash); - emit UploadedKYC(msg.sender, kychash); + function uploadKYC(address owner, string kychash) private { + KYCString[owner].push(kychash); + emit UploadedKYC(owner, kychash); + } + + // voteValidKYC : any candidate can vote for valid KYC i.e. a particular candidate's owner has uploaded a valid KYC. + function voteValidKYC( + address owner, + string kychash + ) public onlyValidCandidate(msg.sender) { + validKYCCount[kychash]++; + if ((validKYCCount[kychash] * 100) / getOwnerCount() >= 75) { + uploadKYC(owner, kychash); + } } // propose : any non-candidate who has uploaded its KYC can become an owner by proposing a candidate. From 45fc919c79b1c539a2eabd58900bfc2f6ff1ee6c Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 18 Apr 2024 12:23:36 +0400 Subject: [PATCH 030/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 961bc6f04e92..df6780e147eb 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -51,7 +51,9 @@ contract XDCValidator { mapping(address => bool) public invalidCandidate; - mapping(string => uint256) public validKYCCount; + mapping(address => mapping(string => uint256)) public validKYCCount; + + mapping(address => mapping(address => bool)) public hasVotedValid; modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate @@ -180,8 +182,11 @@ contract XDCValidator { address owner, string kychash ) public onlyValidCandidate(msg.sender) { - validKYCCount[kychash]++; - if ((validKYCCount[kychash] * 100) / getOwnerCount() >= 75) { + address candidateOwner = getCandidateOwner(msg.sender); + require(!hasVotedValid[candidateOwner][owner], "Already voted"); + hasVotedValid[candidateOwner][owner] = true; + validKYCCount[owner][kychash]++; + if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { uploadKYC(owner, kychash); } } From 492c16c895cf1c739641e31bf37c960d8e12e3cc Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 18 Apr 2024 12:24:34 +0400 Subject: [PATCH 031/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index df6780e147eb..fafe76b3efca 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -53,7 +53,8 @@ contract XDCValidator { mapping(address => mapping(string => uint256)) public validKYCCount; - mapping(address => mapping(address => bool)) public hasVotedValid; + mapping(address => mapping(address => mapping(string => bool))) + public hasVotedValid; modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate @@ -183,8 +184,11 @@ contract XDCValidator { string kychash ) public onlyValidCandidate(msg.sender) { address candidateOwner = getCandidateOwner(msg.sender); - require(!hasVotedValid[candidateOwner][owner], "Already voted"); - hasVotedValid[candidateOwner][owner] = true; + require( + !hasVotedValid[candidateOwner][owner][kychash], + "Already voted" + ); + hasVotedValid[candidateOwner][owner][kychash] = true; validKYCCount[owner][kychash]++; if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { uploadKYC(owner, kychash); From 16b826092d6f738ac5ed2085198a6cf04812e004 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:12:04 +0400 Subject: [PATCH 032/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index fafe76b3efca..b771532059fa 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -93,6 +93,7 @@ contract XDCValidator { } modifier onlyValidCandidate(address _candidate) { + require(!invalidCandidate[_candidate], "Invalid Candidate"); require(validatorsState[_candidate].isCandidate, "Invalid Candidate"); _; } From 50b646578f592492632bc685fa661b0bd1c7468d Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 24 Apr 2024 11:01:58 +0400 Subject: [PATCH 033/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index b771532059fa..104fc7464a98 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -189,6 +189,7 @@ contract XDCValidator { !hasVotedValid[candidateOwner][owner][kychash], "Already voted" ); + require(!invalidCandidate[owner], "Invalid owner"); hasVotedValid[candidateOwner][owner][kychash] = true; validKYCCount[owner][kychash]++; if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { From e31cda2871d10be2470c593f29c90e584d354a45 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 26 Apr 2024 13:22:30 +0400 Subject: [PATCH 034/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 104fc7464a98..329f5c3e74ad 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -51,10 +51,9 @@ contract XDCValidator { mapping(address => bool) public invalidCandidate; - mapping(address => mapping(string => uint256)) public validKYCCount; + mapping(address => mapping(string => uint256)) validKYCCount; - mapping(address => mapping(address => mapping(string => bool))) - public hasVotedValid; + mapping(address => mapping(address => mapping(string => bool))) hasVotedValid; modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate @@ -93,6 +92,7 @@ contract XDCValidator { } modifier onlyValidCandidate(address _candidate) { + require(!invalidOwner[_candidate], "Invalid Owner"); require(!invalidCandidate[_candidate], "Invalid Candidate"); require(validatorsState[_candidate].isCandidate, "Invalid Candidate"); _; @@ -183,13 +183,13 @@ contract XDCValidator { function voteValidKYC( address owner, string kychash - ) public onlyValidCandidate(msg.sender) { + ) public onlyValidCandidate(msg.sender) onlyValidCandidate(owner) { address candidateOwner = getCandidateOwner(msg.sender); require( !hasVotedValid[candidateOwner][owner][kychash], "Already voted" ); - require(!invalidCandidate[owner], "Invalid owner"); + hasVotedValid[candidateOwner][owner][kychash] = true; validKYCCount[owner][kychash]++; if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { From b110f27789ec01ef6aa4b38112217a8003f0c93e Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sun, 28 Apr 2024 16:39:54 +0400 Subject: [PATCH 035/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 329f5c3e74ad..0be1a89d8048 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -92,7 +92,6 @@ contract XDCValidator { } modifier onlyValidCandidate(address _candidate) { - require(!invalidOwner[_candidate], "Invalid Owner"); require(!invalidCandidate[_candidate], "Invalid Candidate"); require(validatorsState[_candidate].isCandidate, "Invalid Candidate"); _; @@ -183,8 +182,11 @@ contract XDCValidator { function voteValidKYC( address owner, string kychash - ) public onlyValidCandidate(msg.sender) onlyValidCandidate(owner) { + ) public onlyValidCandidate(msg.sender) { + require(!invalidOwner[owner], "Invalid Owner"); + require(!invalidCandidate[owner], "Invalid Candidate"); address candidateOwner = getCandidateOwner(msg.sender); + require( !hasVotedValid[candidateOwner][owner][kychash], "Already voted" From 951555225594b075454d77c685e967acb769ccbb Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 6 May 2024 15:49:34 +0400 Subject: [PATCH 036/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 0be1a89d8048..513634437050 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -518,4 +518,14 @@ contract XDCValidator { } } } + + // isOwner : check if the given address is an owner or not. + function isOwner(address owner) public view returns (bool) { + for (uint i = 0; i < owners.length; i++) { + if (owners[i] == owner) { + return true; + } + } + return false; + } } From 7f95cb4d12f5696ab566b99c9ae1cb443bcd685a Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sun, 12 May 2024 09:54:58 +0400 Subject: [PATCH 037/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 513634437050..bf733ca08626 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -173,7 +173,7 @@ contract XDCValidator { } // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. - function uploadKYC(address owner, string kychash) private { + function approveKYC(address owner, string kychash) private { KYCString[owner].push(kychash); emit UploadedKYC(owner, kychash); } @@ -195,7 +195,7 @@ contract XDCValidator { hasVotedValid[candidateOwner][owner][kychash] = true; validKYCCount[owner][kychash]++; if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { - uploadKYC(owner, kychash); + approveKYC(owner, kychash); } } From 8b5d7e103abb6bc1c59b9844c1070f5a47e6105f Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 14 May 2024 15:52:08 +0400 Subject: [PATCH 038/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index bf733ca08626..701f416de522 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -166,9 +166,7 @@ contract XDCValidator { }); voters[_candidates[i]].push(_firstOwner); ownerToCandidate[_firstOwner].push(_candidates[i]); - validatorsState[_candidates[i]].voters[ - _firstOwner - ] = minCandidateCap; + validatorsState[_candidates[i]].voters[_firstOwner] = _caps[i]; } } From 6177cce7210bf24e163677cf61e28e3cf8f190b9 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 14 May 2024 15:52:34 +0400 Subject: [PATCH 039/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 701f416de522..e981cc4f9017 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -368,17 +368,6 @@ contract XDCValidator { allMasternodes[count++] = candidates[i]; invalidCandidate[candidates[i]] = true; - //delete voters[candidates[i]]; in blacklist no need use in the future - // for (uint256 y = 0; y < voters[candidates[i]].length; y++) { - // //delete mapping - // validatorsState[candidates[i]].voters[ - // voters[candidates[i]][y] - // ] = 0; - // voters[candidates[i]][y] = address(0); - // } - // voters[candidates[i]] = removeZeroAddresses( - // voters[candidates[i]] - // ); delete validatorsState[candidates[i]]; From e11d75551a7450e367ed742939d17b0808d9676a Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 17 May 2024 08:33:17 +0400 Subject: [PATCH 040/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index e981cc4f9017..b76ce6cf5f85 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -362,20 +362,21 @@ contract XDCValidator { address[] memory newCandidates = new address[](candidates.length); invalidOwner[_owner] = true; for (uint i = 0; i < candidates.length; i++) { - if (getCandidateOwner(candidates[i]) == _owner) { + address candidate = candidates[i]; + if (getCandidateOwner(candidate) == _owner) { // logic to remove cap. candidateCount = candidateCount.sub(1); - allMasternodes[count++] = candidates[i]; + allMasternodes[count++] = candidate; - invalidCandidate[candidates[i]] = true; + invalidCandidate[candidate] = true; - delete validatorsState[candidates[i]]; + delete validatorsState[candidate]; delete KYCString[_owner]; delete ownerToCandidate[_owner]; delete invalidKYCCount[_owner]; } else { - newCandidates[j++] = candidates[i]; + newCandidates[j++] = candidate; } } From c569a2e7d863953b3fba242e7ad52f341583d5ec Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 17 May 2024 08:35:50 +0400 Subject: [PATCH 041/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index b76ce6cf5f85..a366a35eced1 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -46,13 +46,13 @@ contract XDCValidator { uint256 public maxValidatorNumber; uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - + // owner => invalid mapping(address => bool) public invalidOwner; - + // candaite => invalid mapping(address => bool) public invalidCandidate; - + // candidate => kyc => voted count mapping(address => mapping(string => uint256)) validKYCCount; - + // voter owner => kyc owner => kyc => voted mapping(address => mapping(address => mapping(string => bool))) hasVotedValid; modifier onlyValidCandidateCap() { From a730b036d3303e5b8cea7715c5eaf420496821f1 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 11 Jun 2024 15:58:19 +0400 Subject: [PATCH 042/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index a366a35eced1..fcac4da280ea 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -50,10 +50,13 @@ contract XDCValidator { mapping(address => bool) public invalidOwner; // candaite => invalid mapping(address => bool) public invalidCandidate; - // candidate => kyc => voted count - mapping(address => mapping(string => uint256)) validKYCCount; - // voter owner => kyc owner => kyc => voted - mapping(address => mapping(address => mapping(string => bool))) hasVotedValid; + + struct PendingKYCState { + uint256 blockNumber; + string kycHash; + } + + mapping(address => PendingKYCState) public pendingKYC; modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate @@ -170,31 +173,23 @@ contract XDCValidator { } } - // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. - function approveKYC(address owner, string kychash) private { - KYCString[owner].push(kychash); - emit UploadedKYC(owner, kychash); + function uplodaKYC(string kychash) external { + pendingKYC[msg.sender] = PendingKYCState({ + blockNumber: block.number, + kycHash: kychash + }); } - // voteValidKYC : any candidate can vote for valid KYC i.e. a particular candidate's owner has uploaded a valid KYC. - function voteValidKYC( - address owner, - string kychash - ) public onlyValidCandidate(msg.sender) { - require(!invalidOwner[owner], "Invalid Owner"); - require(!invalidCandidate[owner], "Invalid Candidate"); - address candidateOwner = getCandidateOwner(msg.sender); + function claimKYC() external { + string memory kychash = pendingKYC[msg.sender].kycHash; + uint256 blockNumber = pendingKYC[msg.sender].blockNumber; + require(bytes(kychash).length > 0, "No KYC uploaded"); + require(block.number > blockNumber + 10 * 43200, "No KYC uploaded"); - require( - !hasVotedValid[candidateOwner][owner][kychash], - "Already voted" - ); + pendingKYC[msg.sender].blockNumber = 0; + pendingKYC[msg.sender].kycHash = ""; - hasVotedValid[candidateOwner][owner][kychash] = true; - validKYCCount[owner][kychash]++; - if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { - approveKYC(owner, kychash); - } + emit UploadedKYC(msg.sender, kychash); } // propose : any non-candidate who has uploaded its KYC can become an owner by proposing a candidate. From aabf014d0f87d9fa3617a20a8c7983f6dfd7adfe Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 11 Jun 2024 18:39:46 +0400 Subject: [PATCH 043/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index fcac4da280ea..a9efd0b92f45 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -184,7 +184,10 @@ contract XDCValidator { string memory kychash = pendingKYC[msg.sender].kycHash; uint256 blockNumber = pendingKYC[msg.sender].blockNumber; require(bytes(kychash).length > 0, "No KYC uploaded"); - require(block.number > blockNumber + 10 * 43200, "No KYC uploaded"); + require( + block.number > blockNumber + 10 * 43200, + "KYC not verified yet" + ); pendingKYC[msg.sender].blockNumber = 0; pendingKYC[msg.sender].kycHash = ""; From ca6fad3719ecabf63a01c28e1d768356df2e33f7 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 22 Jun 2024 09:45:07 +0400 Subject: [PATCH 044/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index a9efd0b92f45..808b0314ddb0 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -359,6 +359,9 @@ contract XDCValidator { uint j = 0; address[] memory newCandidates = new address[](candidates.length); invalidOwner[_owner] = true; + pendingKYC[_owner].blockNumber = 0; + pendingKYC[_owner].kycHash = ""; + for (uint i = 0; i < candidates.length; i++) { address candidate = candidates[i]; if (getCandidateOwner(candidate) == _owner) { From fcdf572eb9a7dd8148fb56b6f1850b53ac25718b Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:24:36 +0400 Subject: [PATCH 045/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 808b0314ddb0..2c1ee575929f 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -174,6 +174,7 @@ contract XDCValidator { } function uplodaKYC(string kychash) external { + require(!invalidOwner[msg.sender], "Invalid Owner"); pendingKYC[msg.sender] = PendingKYCState({ blockNumber: block.number, kycHash: kychash @@ -361,7 +362,7 @@ contract XDCValidator { invalidOwner[_owner] = true; pendingKYC[_owner].blockNumber = 0; pendingKYC[_owner].kycHash = ""; - + for (uint i = 0; i < candidates.length; i++) { address candidate = candidates[i]; if (getCandidateOwner(candidate) == _owner) { From 1ccd176ef72f459989cdaf3745c8cc223f6c022f Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:59:18 +0400 Subject: [PATCH 046/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 2c1ee575929f..b26dcca47e6b 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -173,7 +173,7 @@ contract XDCValidator { } } - function uplodaKYC(string kychash) external { + function uploadKYC(string kychash) external { require(!invalidOwner[msg.sender], "Invalid Owner"); pendingKYC[msg.sender] = PendingKYCState({ blockNumber: block.number, From 271750d7cd025f6355ae175c01f63a785406eced Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 25 Jun 2024 09:30:54 +0400 Subject: [PATCH 047/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index b26dcca47e6b..6b830b434538 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -192,6 +192,7 @@ contract XDCValidator { pendingKYC[msg.sender].blockNumber = 0; pendingKYC[msg.sender].kycHash = ""; + KYCString[msg.sender].push(kychash); emit UploadedKYC(msg.sender, kychash); } From 6f108fb649ab124167431db278fbcfab09135216 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 27 Jun 2024 11:20:25 +0400 Subject: [PATCH 048/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 6b830b434538..444c53821051 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -182,6 +182,7 @@ contract XDCValidator { } function claimKYC() external { + require(!invalidOwner[msg.sender], "Invalid Owner"); string memory kychash = pendingKYC[msg.sender].kycHash; uint256 blockNumber = pendingKYC[msg.sender].blockNumber; require(bytes(kychash).length > 0, "No KYC uploaded"); From 6c4641a517177470f71718a6a185067b5c592559 Mon Sep 17 00:00:00 2001 From: Daniel Liu Date: Mon, 1 Jul 2024 12:16:17 +0800 Subject: [PATCH 049/144] refactor function voteInvalidKYC --- .../validator/contract/XDCValidatorV2.sol | 73 +++++++++++-------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 444c53821051..56842a1efc36 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -355,43 +355,43 @@ contract XDCValidator { invalidKYCCount[_owner] += 1; if ((invalidKYCCount[_owner] * 100) / getOwnerCount() >= 75) { // 75% owners say that the KYC is invalid - address[] memory allMasternodes = new address[]( - candidates.length - 1 - ); - uint count = 0; - uint j = 0; - address[] memory newCandidates = new address[](candidates.length); invalidOwner[_owner] = true; pendingKYC[_owner].blockNumber = 0; pendingKYC[_owner].kycHash = ""; - for (uint i = 0; i < candidates.length; i++) { - address candidate = candidates[i]; - if (getCandidateOwner(candidate) == _owner) { - // logic to remove cap. - candidateCount = candidateCount.sub(1); - allMasternodes[count++] = candidate; - - invalidCandidate[candidate] = true; - - delete validatorsState[candidate]; + isOwnerNow, ownerIndex = isOwner(_owner); + if (isOwnerNow) { + uint j = 0; + uint count = 0; + address[] memory allMasternodes = new address[](candidates.length); + address[] memory newCandidates = new address[](candidates.length); + + for (uint i = 0; i < candidates.length; i++) { + address candidate = candidates[i]; + if (getCandidateOwner(candidate) == _owner) { + // logic to remove cap. + candidateCount = candidateCount.sub(1); + allMasternodes[count++] = candidate; + invalidCandidate[candidate] = true; + delete validatorsState[candidate]; + delete KYCString[_owner]; + delete ownerToCandidate[_owner]; + delete invalidKYCCount[_owner]; + } else { + newCandidates[j++] = candidate; + } + } - delete KYCString[_owner]; - delete ownerToCandidate[_owner]; - delete invalidKYCCount[_owner]; - } else { - newCandidates[j++] = candidate; + // Resize the array. + assembly { + mstore(newCandidates, j) + mstore(allMasternodes, count) } - } + candidates = newCandidates; - // Resize the array. - assembly { - mstore(newCandidates, j) + removeOwnerByIndex(ownerIndex); + emit InvalidatedNode(_owner, allMasternodes); } - candidates = newCandidates; - - deleteOwner(_owner); - emit InvalidatedNode(_owner, allMasternodes); } } @@ -512,12 +512,21 @@ contract XDCValidator { } // isOwner : check if the given address is an owner or not. - function isOwner(address owner) public view returns (bool) { + function isOwner(address owner) public view returns (bool, uint256) { for (uint i = 0; i < owners.length; i++) { if (owners[i] == owner) { - return true; + return (true, i); } } - return false; + return (false, 0); + } + + function removeOwnerByIndex(uint256 index) private { + // no need to check: index <= lastIndex + uint256 lastIndex = owners.length - 1; + owners[index] = owners[lastIndex]; + delete owners[lastIndex]; + owners.length--; + ownerCount--; } } From 2a7beeb4ff6cbaefb9a30d17f18cbe66a3e44225 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 1 Jul 2024 10:12:25 +0400 Subject: [PATCH 050/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 56842a1efc36..f9f1d85c30b3 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -359,12 +359,16 @@ contract XDCValidator { pendingKYC[_owner].blockNumber = 0; pendingKYC[_owner].kycHash = ""; - isOwnerNow, ownerIndex = isOwner(_owner); + (bool isOwnerNow, uint ownerIndex) = isOwner(_owner); if (isOwnerNow) { uint j = 0; uint count = 0; - address[] memory allMasternodes = new address[](candidates.length); - address[] memory newCandidates = new address[](candidates.length); + address[] memory allMasternodes = new address[]( + candidates.length + ); + address[] memory newCandidates = new address[]( + candidates.length + ); for (uint i = 0; i < candidates.length; i++) { address candidate = candidates[i]; From 4c9b1f5db8cac91b8f19c99f443f5675fb5d187d Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:27:51 +0400 Subject: [PATCH 051/144] add test script --- contracts/validator/src/.env.sample | 1 + contracts/validator/src/.gitignore | 7 + contracts/validator/src/.prettierignore | 5 + contracts/validator/src/.prettierrc | 1 + contracts/validator/src/.solhint.json | 7 + contracts/validator/src/.solhintignore | 1 + contracts/validator/src/README.md | 94 ++ contracts/validator/src/abi | 856 ++++++++++++++++++ contracts/validator/src/bytecode | 1 + .../contracts/XDCValidator.sol} | 2 +- .../src/contracts/libraries/SafeMath.sol | 46 + contracts/validator/src/deployment.json | 15 + contracts/validator/src/hardhat.config.js | 34 + contracts/validator/src/image.png | Bin 0 -> 99557 bytes contracts/validator/src/package.json | 25 + .../@ethersproject+address+5.7.0.patch | 33 + .../@ethersproject+providers+5.7.2.patch | 25 + .../validator/src/scripts/deployToGenesis.js | 20 + contracts/validator/src/scripts/deployment.js | 36 + contracts/validator/src/test/xdcValidator.js | 235 +++++ 20 files changed, 1443 insertions(+), 1 deletion(-) create mode 100644 contracts/validator/src/.env.sample create mode 100644 contracts/validator/src/.gitignore create mode 100644 contracts/validator/src/.prettierignore create mode 100644 contracts/validator/src/.prettierrc create mode 100644 contracts/validator/src/.solhint.json create mode 100644 contracts/validator/src/.solhintignore create mode 100644 contracts/validator/src/README.md create mode 100644 contracts/validator/src/abi create mode 100644 contracts/validator/src/bytecode rename contracts/validator/{contract/XDCValidatorV2.sol => src/contracts/XDCValidator.sol} (99%) create mode 100644 contracts/validator/src/contracts/libraries/SafeMath.sol create mode 100644 contracts/validator/src/deployment.json create mode 100644 contracts/validator/src/hardhat.config.js create mode 100644 contracts/validator/src/image.png create mode 100644 contracts/validator/src/package.json create mode 100644 contracts/validator/src/patches/@ethersproject+address+5.7.0.patch create mode 100644 contracts/validator/src/patches/@ethersproject+providers+5.7.2.patch create mode 100644 contracts/validator/src/scripts/deployToGenesis.js create mode 100644 contracts/validator/src/scripts/deployment.js create mode 100644 contracts/validator/src/test/xdcValidator.js diff --git a/contracts/validator/src/.env.sample b/contracts/validator/src/.env.sample new file mode 100644 index 000000000000..c46db5d4065b --- /dev/null +++ b/contracts/validator/src/.env.sample @@ -0,0 +1 @@ +PRIVATE_KEY=1234567890123456789012345678901234567890123456789012345678901234 \ No newline at end of file diff --git a/contracts/validator/src/.gitignore b/contracts/validator/src/.gitignore new file mode 100644 index 000000000000..1ee02f4ea0d2 --- /dev/null +++ b/contracts/validator/src/.gitignore @@ -0,0 +1,7 @@ +.env +cache/ +artifacts/ +node_modules/ +.vscode/ +abigen +yarn.lock \ No newline at end of file diff --git a/contracts/validator/src/.prettierignore b/contracts/validator/src/.prettierignore new file mode 100644 index 000000000000..f268596e5e48 --- /dev/null +++ b/contracts/validator/src/.prettierignore @@ -0,0 +1,5 @@ +node_modules +artifacts +cache +coverage* +gasReporterOutput.json diff --git a/contracts/validator/src/.prettierrc b/contracts/validator/src/.prettierrc new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/contracts/validator/src/.prettierrc @@ -0,0 +1 @@ +{} diff --git a/contracts/validator/src/.solhint.json b/contracts/validator/src/.solhint.json new file mode 100644 index 000000000000..c2100cefc881 --- /dev/null +++ b/contracts/validator/src/.solhint.json @@ -0,0 +1,7 @@ +{ + "extends": "solhint:recommended", + "rules": { + "compiler-version": ["error", "0.4.26"], + "func-visibility": ["warn", { "ignoreConstructors": true }] + } +} diff --git a/contracts/validator/src/.solhintignore b/contracts/validator/src/.solhintignore new file mode 100644 index 000000000000..3c3629e647f5 --- /dev/null +++ b/contracts/validator/src/.solhintignore @@ -0,0 +1 @@ +node_modules diff --git a/contracts/validator/src/README.md b/contracts/validator/src/README.md new file mode 100644 index 000000000000..d11bd8c46c12 --- /dev/null +++ b/contracts/validator/src/README.md @@ -0,0 +1,94 @@ +# XDC Validator Contract + +This folder has provided scripts for: + +- Contract Building and Testing +- Contract Deployment + +## Contract Building and Testing: + +Environmental preparation + +###### Nodejs 16 or higher version + +Install dependencies + +```shell +yarn +``` + +Test + +```shell +npx hardhat compile +npx hardhat test +``` + +## Deploy contract to node genesis block + +1. run generate script to genera + +```shell +node scripts/deployToGenesis.js +``` + +2. run + +```shell +./abigen --abi abi --bin bytecode --pkg contract --type XDCValidator --out ../contract/validator.go +``` + +If you don't have `abigen`, compile it. It's in `cmd/abigen/main.go` in XDC main repo (or Geth repo). + +3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDC-Subnet"` + +## Deploy contract to node any block + +### Contract Setup: + +This step is recommended to complete in python virtual environment because it is going to use the web3 library adapted for XDC. And before running the process, it is required to performed two operations: + +1. Fill in the fields in `deployment.json` + + - `candidates`: Initial candidates + - `caps`: Initial caps, one cap for one candidate + - `firstOwner`: Owner of initial candidates + - `minCandidateCap`: Minimal value for a transaction to call propose() + - `minVoterCap`: Minimal value for a transaction to call vote() + - `maxValidatorNumber`: Never used, I don't know why XDC people write this... + - `candidateWithdrawDelay`: When you call resign() at block number x, you can only withdraw the cap at block x+candidateWithdrawDelay + - `voterWithdrawDelay`: When you call unvote() at block number x, you can only withdraw the cap at block x+voterWithdrawDelay + - `grandMasters`: List of grand masters + - `minCandidateNum`: min candidate num + - `xdcdevnet`: Targeted XDC public chain devnet, testnet or mainnet node RPC link + - `xdcsubnet`: Targeted XDC private subnet chain devnet, testnet or mainnet node RPC link + +2. Create a `.env` file which contain a valid account privatekey, check `.env.sample` for example + +### Contract Deployment: + +And get the deployed contract address + +```shell +npx hardhat run scripts/deployment.js --network xdcdevnet +``` + +## Other command + +```shell +npx hardhat accounts +npx hardhat compile +npx hardhat clean +npx hardhat test +npx hardhat node +npx hardhat help +REPORT_GAS=true npx hardhat test +npx prettier '**/*.{js,json,sol,md}' --check +npx prettier '**/*.{js,json,sol,md}' --write +npx solhint 'contracts/**/*.sol' +npx solhint 'contracts/**/*.sol' --fix +``` + +## Gas report + +![Alt text](image.png) diff --git a/contracts/validator/src/abi b/contracts/validator/src/abi new file mode 100644 index 000000000000..ecd07cc0e4bc --- /dev/null +++ b/contracts/validator/src/abi @@ -0,0 +1,856 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "propose", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "owners", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + }, + { + "name": "_cap", + "type": "uint256" + } + ], + "name": "unvote", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCandidates", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "address" + } + ], + "name": "hasVotedInvalid", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_blockNumber", + "type": "uint256" + } + ], + "name": "getWithdrawCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "uint256" + } + ], + "name": "kycString", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "uint256" + } + ], + "name": "ownerToCandidate", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "getVoters", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getWithdrawBlockNumbers", + "outputs": [ + { + "name": "", + "type": "uint256[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + }, + { + "name": "_voter", + "type": "address" + } + ], + "name": "getVoterCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "name": "getLatestKYC", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "candidates", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "validatorsState", + "outputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "isCandidate", + "type": "bool" + }, + { + "name": "cap", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_blockNumber", + "type": "uint256" + }, + { + "name": "_index", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "minCandidateNum", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getGrandMasters", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "getCandidateCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "grandMasterMap", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_invalidCandidate", + "type": "address" + } + ], + "name": "invalidPercent", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "uint256" + } + ], + "name": "voters", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "grandMasters", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "name": "getOwnerToCandidateLength", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "vote", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidKYCCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "candidateCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "voterWithdrawDelay", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "resign", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "getCandidateOwner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "name": "getHashCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "maxValidatorNumber", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "candidateWithdrawDelay", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "isCandidate", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "minCandidateCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwnerCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_invalidCandidate", + "type": "address" + } + ], + "name": "voteInvalidKYC", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "kychash", + "type": "string" + } + ], + "name": "uploadKYC", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "minVoterCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "name": "_candidates", + "type": "address[]" + }, + { + "name": "_caps", + "type": "uint256[]" + }, + { + "name": "_firstOwner", + "type": "address" + }, + { + "name": "_minCandidateCap", + "type": "uint256" + }, + { + "name": "_minVoterCap", + "type": "uint256" + }, + { + "name": "_maxValidatorNumber", + "type": "uint256" + }, + { + "name": "_candidateWithdrawDelay", + "type": "uint256" + }, + { + "name": "_voterWithdrawDelay", + "type": "uint256" + }, + { + "name": "_grandMasters", + "type": "address[]" + }, + { + "name": "_minCandidateNum", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_voter", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Vote", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_voter", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Unvote", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Propose", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + } + ], + "name": "Resign", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "_blockNumber", + "type": "uint256" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "kycHash", + "type": "string" + } + ], + "name": "UploadedKYC", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_masternodeOwner", + "type": "address" + }, + { + "indexed": false, + "name": "_masternodes", + "type": "address[]" + } + ], + "name": "InvalidatedNode", + "type": "event" + } +] \ No newline at end of file diff --git a/contracts/validator/src/bytecode b/contracts/validator/src/bytecode new file mode 100644 index 000000000000..814d09efc0be --- /dev/null +++ b/contracts/validator/src/bytecode @@ -0,0 +1 @@ +0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029 \ No newline at end of file diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/src/contracts/XDCValidator.sol similarity index 99% rename from contracts/validator/contract/XDCValidatorV2.sol rename to contracts/validator/src/contracts/XDCValidator.sol index f9f1d85c30b3..249b74872094 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/src/contracts/XDCValidator.sol @@ -1,6 +1,6 @@ pragma solidity ^0.4.26; -import "./libs/SafeMath.sol"; +import "./libraries/SafeMath.sol"; contract XDCValidator { using SafeMath for uint256; diff --git a/contracts/validator/src/contracts/libraries/SafeMath.sol b/contracts/validator/src/contracts/libraries/SafeMath.sol new file mode 100644 index 000000000000..8c205f939a49 --- /dev/null +++ b/contracts/validator/src/contracts/libraries/SafeMath.sol @@ -0,0 +1,46 @@ +pragma solidity =0.4.26; + +/** + * @title SafeMath + * @dev Math operations with safety checks that throw on error + */ +library SafeMath { + /** + * @dev Multiplies two numbers, throws on overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + if (a == 0) { + return 0; + } + uint256 c = a * b; + assert(c / a == b); + return c; + } + + /** + * @dev Integer division of two numbers, truncating the quotient. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + // assert(b > 0); // Solidity automatically throws when dividing by 0 + // uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + return a / b; + } + + /** + * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + assert(b <= a); + return a - b; + } + + /** + * @dev Adds two numbers, throws on overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + assert(c >= a); + return c; + } +} diff --git a/contracts/validator/src/deployment.json b/contracts/validator/src/deployment.json new file mode 100644 index 000000000000..f06716fbcad7 --- /dev/null +++ b/contracts/validator/src/deployment.json @@ -0,0 +1,15 @@ +{ + "candidates": [ + "0xf0AbABbb043792D8cDAf1961c96758932189965D", + "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd" + ], + "caps": ["10000000000000000000000000", "10000000000000000000000000"], + "firstOwner": "0x662696e1f7925b68b4f6f440977d1da2b1b8d3f6", + "minCandidateCap": "10000000000000000000000000", + "minVoterCap": "25000000000000000000000", + "maxValidatorNumber": 18, + "candidateWithdrawDelay": 1296000, + "voterWithdrawDelay": 432000, + "xdcdevnet": "https://devnetstats.apothem.network/devnet", + "xdcsubnet": "https://devnetstats.apothem.network/subnet" +} diff --git a/contracts/validator/src/hardhat.config.js b/contracts/validator/src/hardhat.config.js new file mode 100644 index 000000000000..69f02229ffcf --- /dev/null +++ b/contracts/validator/src/hardhat.config.js @@ -0,0 +1,34 @@ +require("@nomiclabs/hardhat-waffle"); +require("hardhat-gas-reporter"); +require("dotenv").config(); +const deploy = require("./deployment.json"); +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: { + version: "0.4.26", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + networks: { + xdcdevnet: { + url: deploy["xdcdevnet"], + accounts: [ + process.env.PRIVATE_KEY || + "1234567890123456789012345678901234567890123456789012345678901234", + ], + }, + xdcsubnet: { + url: deploy["xdcsubnet"], + accounts: [ + process.env.PRIVATE_KEY || + "1234567890123456789012345678901234567890123456789012345678901234", + ], + }, + }, +}; diff --git a/contracts/validator/src/image.png b/contracts/validator/src/image.png new file mode 100644 index 0000000000000000000000000000000000000000..a4958a8b9ba22353b0931eec365eec50f05945aa GIT binary patch literal 99557 zcmeFZXIN9+);5X=N)ZtdkS=uY1f+{p>Am+V9YRw9kq**HLX{G# z)BpiI;d!3D-}l>R>#uYEoa=C1$y!;ND{IU#$GFFwW89NS4K)Qk9C92qG&DTLm$F)D zX!l;Cp`iz3-9uf;Xw?0MhK5saDk*1-}D?PX+g>U|w;IN{r0ev=do z*aY!}zC=Ytl1f{aC>I45tS3kx0QD$sNpH-1>J+ zI~JeA2irfv%Ydie0Z+ao3RFe z`3~`gc@RllF74}xurM@P#$AbZ(EYdadsI6U#=mZ^y5EB((>~uv!;ulxjQ^}Ib538t zdCu*_h*sA5ZplWo#36}-pk(O7J%TQQ!2%cRC+od0RjsL2Kpb!i%*{8 zwhdm*4}5q*l*JI6!}po2oZxff3(8_Z4VL~HXVSfMm6=oheKGd6_Urd;gH7oJAA$xu zj~S7qO7n?AJQm5F*r8nki7zwQht*OQK1Y(35VWtFYD=RDOhI8B>&q_B=M# zn8UdH@a26%+4Z;B((!>^Xm4;xtz&_qi5y1HNTU*X(j9(;W2YN4FIkaKF3v38c{_m= zz7g)QjE2d)b9w!}WrGoodR9SRepKZ$I1x=SfDCQb%f;$GnueU63F{{74}-O?y7tgJ zvUxaLlDJ!U=*%8g1&KM|+y6vy9`y7P&NC^>H2m|YWJR>uoajTJ?Beg^d}92Fm-JT5 zOhOPNHh3+MBnvb3lddyS<6F<4kKBVye-b_jMwmSbeo84DWD`$Pgr6>{7cbTuEJ`cE zgn<*WnuqZcLy;D<@qyu8V#zQK>_+^Gw*et)GO2kx8m#U#+u@h_0^`F zOq!Dnhli}Z^rmJDCjBz+%+Ya&BYbF?&Kb`iy9>Le$KUfF@43r7$7W@ z5TNXmlvm;Xi6ySb(GS1ktc9;wSiE>P{7i+q1k3G_8;%?1WGuX|qu-+LK^55yCdIp$ zo)WWEi`my+=9P7%b=7m!yN@15Onxy~5p~WNq~;(>jerD+1h>Dn?>Su+Usd!5b%-s} z(8Q&#y8VRp{=l7=xNXwJwqHQIR#zy}__(lH99ci%@{`^!f6`ki91Y++#^gdp- zvv^VW-aG94-Fb@aGqMC@#Rf%-?<`s`;7{P><(VguDhx&mLO-e zou8)F!F-scGI&o3bDet~d%X}xwNE~*@|lJ~xmJZ%;rEgwrQ|%jfsUuKs8OQ|bzO1ez1KVEvAZt74@Cv7VbYq*so%Tvq6 zcps0v`oedT}T3kAgyQKghIg!Gv2rrax{Av-S72`&3^5Ah#(r3$; zPbkRx$*7{owB1WTmSUAwWoq#iI}Y9-DbHBUkRI_Lu^aIm88cL2m#EgM9x-e(jBA=$ zNLgrTBDFo3=_(N8N*136u>{)POs#3tY<&_=5nd5i_Bh*tekc1rJ&8A-4BsE`tP;uV zA3vT^o`6(%nbrbwOAg98XO=1grG8;*hYVOLrS%QVZ{!8VO63K8G0T-|`1~Sl;>m!|opbMkWXblV3tnHdxr?$+DXg|cU}C9*5CI~je}8`ZO@G|{V`e8Nx5FT~%(Ut2<<9+%tY<2!lc)U4J_2)WygzgOldglx0zISm}eC9>P^zh~(E7dlosfeKv4waY4qFaH`h`Zs=)bh#ne4oL-@jCRtVmD#A zezG`G&N{4arlF?I!Wd+%56C0`i4MRhpqBeCmPNyK>jFv&;?QxEu)y!$kyN~KlKOnP?EC>LPW&D6TWM`;<+;P zCG(jL0q(Ph3LSALkT!W%Y1k;bI$;AY~&n{)6om9+K^mk9@*6Re;8rOPVJPupW zx6VTjW!$bd95N?GW^I9s&{!X zp}pCWA^r~oMSc~3GWw`H&Ux~P1P7TQnt+p-6D2BZBzrwzIv_W2*CMu6_DYz6%Tj$X zVrqQqXo^5Fx=0u=HznTFP${`YiDL5fJ85alVAUI+`kF8xZVNkQ()}TPD@n3r?rm=P zH#2u-^O|$TiR|@s-HcNg&65J6sA*DV(j`NSwl}bZE{9*cfYgH2qf~x2o>$Gj1_;-) zBM@sIaU?6b9(nb!$$UGD*>wJN?{s-(;8@)V^RQ0~qm?SC2Do1V&B;X%s2J8BNZj;&z^ZdU}C zziyb_kO|ukn-3E+vI3UR4?;7#PhriNkQ!1UlD&B~XwBTBE~S=nOOJPd2^ByoL3u$L zq*Up(y=&ZZ+{5v?rWv-_UU{~)&pdbRQ|o=u3A%%{8&ny3fA$(-y%*^D^ip!NwhF-d z(2j;p@Vv>`aM6S5O5=5yvRt2eb`J&Xijth=uMceshOw8_)s^)%3;H8v9D?^^nPWT8 z*;iU(*FN`CsC`t^$>tSmJAS;U6M(1FP-OLyzpc5Fqo(H6eHvY8P}?bT2P8m+I*ms!KiK9|bye5&Ew$=>Doq&74yut?@Ay z@q_JM!YQgKngp_)W}vQMk8Q8gC3QX#fmx_$o5}3zg4U97;i-S7KBQQr%d2K_eX(<1 zyt1>2u42t}6FOSs7wk87puFE55PxcRzEYu(rf?BAO-(8`;iGjH(ML0FGHS932DLkh z#du$Sj95B88jF_bKG_g26lL9>JgD>r{GdrrkQLA>d zca5n2JokBV_Gp&QX{LMH*XU;S(4$o8xI>PHi8{N3dWqkm z`1iT|9VWE9e_cmMLyNFQ!}zC-8tQoa7ms?~-t+enJrDg~E$+R{yZf(m^x)g3wc2+1f-f2whz{{jx-NG3&zo+zoRe7%<@QSi{ZPyw6yO5ZD;3LAaE4Q zoQ6N?w5l1ey>o7ts7weYs~s@4;qxD!BzX_J{|_3&n#w{WqvvZGnm7A{ zAv_HUefJni)TVqm_ zm|3ixnh|&&5y&-6O5ekNBm4|74yJC#CuJqLs^(2K+jTow>mqEdXuKZ1dHo9$ zvj8brV-I2Q-D$vIza->c6~*zL>r!&7I~+x%9@8@E*&?&A`)_b@WDzdLYg&Wu3pS47 z&*DwG-r4D-9VQL^{QvG#3%FnA`0Wc#*1cA6ve&CM&GxM1 zHHmmg^*t6p?p34B2Z47N!Q8DFVh%JMde6?Il*fC{RxB8TyOTEvqe1&1sD7|sa`V!B z;BI%Gq&rQ&hhw{}6X-187!WL*HA zMlmzv!IFCNi})5Gc?--3G3 zd(!0_jl=eMyq6kpk7=b;NW%V!2yz5ACP~Hh8h?O($-HRHZ%>)mvSp_J6chzf@$7Mb za`Cg@dxRtzF3Q-yibRyr{-Kcz%GjA>S(W8}A8&%VNl@+=?e$Po<`0clZ(WO0Kjr;D zef@7S(vl5@CS(Vc1>t{a)JK4NnqUpvZ~X`*#NaDb0OVd2lEwRt%iQ|+d%E#v!6?h} zza`OW`LsLVpeiF1V$fiv>fyxnH%i5)q9GzWTGLtwF$HNV{O>pT{L?(>?*Z5SNacY3 z_kjPm9^DCI)-HK+t(wU{g2at3D&4>=v#8v_zk~Ms!7CHHoklq2HuU|sAN>2;REK0= zlN7hl(HkDy@AS2!2>aU3<_)hr-0?Oy>jujq5-$x4Sb4?V@Pq;l%)#e)V}$3R<5;a> zSqYG>Zo zPZQWN;Wm18aXgYG6Gx8&?Y74igHxzW{w}>&__yMoA{R8`}ouj3oT9u{m%WdRPyObJXXU$Bjh}` z1ceTJiALVuxvP@OVREI&@3iP(8hGt-ykK8@(X&-XeTRYRp!?U&qPP=Ei4%wQzNdD_ zKN8h5Ja%S?EoD5YnR*QZ{?@7HCwrUx2ujy?D1^>Nq^jRj6cX#+y7U{Dy6@wsnohT# zAf@%q$4Dl^tk0<;hcr&~=-VgHU0C}pt8<-s&%Fk-&*;aCeg~LeCld|w#y1;U$Esa6 zhdTJ0_?p#o#W!{v#(>QezAdmu+eCwQ&+3aEz^`qOi03S&NF_la@YkoHyCXsOskiVl z`0Vwnta-eA=D~@s%%{f&S*OXzAnkN9F#qZ9{G=aEGg9^74tP}J`ec#}ccHJdiz_$z z;mubMY>qH-j7Lmil6{u(N$ACdGx?cEVWg%{TH*8FtaqdYsPga?a_d zp$313>2u6m$u_KLDv=rgRia!h*;4!2nvJ)2A9DFhweB@T(AN_7g?6eMqGzl_xNQ=! zWWpaDa+?;U6b}ZF^%YCPZ zcKaUP)^kST8%=j{9~$K)qQ~o zcV4k-w!T_!P&avT7G{Mqj-bP}eq=fwq}lN}HaUXY_uFu`$Sh=BrC(WDDe2Nz zZ~L^V$dSD^b2HU&5$WJ39E5VLZ+>1H@@EBdQCHS?l8f~6aijy#FT`{EK)@IgK!B09 zpEj$E#=-ZBOATET2;#otRwb(?H8=?QzH(wJJ4v}bcTB0Xi?MFigBi3nBCvGQMLz3S z_&uUA8^>{>F|uQ{A7z68cVQXh)Kw~CHnKYy_1N^)5DMmX5F%K&8yEoIYgR zgGvCH)$-EvRhh&dWzhnj zztF0kjyj@Dv#=vZQ@**vcTzbacmX(`s#cMr2_WCzVacXjf2;%&V?Dhb9LQ)zA>AGh z(~DP;m%#Hu{jOEr`ATb?mG#CF0u#$3jL4)HNMKvK+#Du?8)>gQG<`KRKvyey5oUbc zrC?hDAatuwwfKxDtOs8LsvHVvc1TYZtYsN*tY#6)<0R)5z4B>JDTVXaZeva3!q4^~ zowCl!Cu)eNH4z!k(?W(R%|6$cr`swNN3a9CIrT#=MV4uUitVhV)(Y=hgNCmVuZ3on z&%XBLmTL66dztNOx)eou3CjF#ve&MzklpbYgaLQHyN88Ns!PCzLgPQgl4k2G-V=)8 zk%FyPo|N+GHTmwh74c_2{y{xT>5?ktb&A#6-!Y1rDP+;2F-x1>gCk4>eL(1kr(2M| zp`G0(6Y=o0#+GSh^Ee^7E-hEM{&a>U|-O~!UqFutIiMP0;_Dz&^$>BwBLp(BMzjh(e zmqbIC5v;zwSPe>7rob9}q$i&jtKO8Kx28SD3BE^4_hZdsw)VlxZ2JX0G5al)J6?Yu zwXcP5bAAOij34VA4kFqV5Omq?!U8a4V@h$}PFw|WS`Z;VBiMWxn0388s_tcVN4HqS zWmVScnaM2dK|(9CHhw4c8R4eTJml?Ew?(c(nCRagn#;E$;1#5A>eDy&biyU=%{K&S z*u*R0U=pkjr_zx+$Pq3vV)=pe*W2FwOuwI5&wl2?47r(X_#TQ))G=`KV9zSP_trrR zeFd{=Ym}QoX^tH^wbND&ITB5Qr&s02Mq`fEhD}G8$yTf3(m6x8ZR+hVc@#mew~IH* zGwB=`XXUaTOh%Ru5|ht7UVA!?X6U7pC|%81_f}M}W?`k+`m{w)MkNEkHuJV;D;&=H zo)Vr-X{*nFt_wKLD+(py(+WHu5m4ZeVYrSH-ez(#ZvBx(?VmJPtwKVPWp8(aCxz4wx#UI9c^bO?rrr8;d6 zB{7p&ceBPGX#|In`=>Y$3ew=v+CZRZt_AqN|mpL4gi7ozL6R6lA&sn0-k_v42qo zcc+@*G7f2pvm<9sJU3(BI{Y_;y)UJ}3mPfX?R```k{gj%OLTUcDS)yG91i(92;{6IGP1=u3% ziSISKFwHo%N#HZOEU`uGBy_ocl$!pz@Cb4F#b58^p+R2>Pp^lqpCEFga8)@^khkMeY%_i^qPnFiPH)8Ys(?H-o-^u$QWGjR2`<;*AVm=R zvFS0&3I1&|RY;XJHX=-D>6~7uliLnQ$O+c^;}W_ynyBsty^bFfPHWcuBtBctx$SH6 zPP=P1QaUFQH_|%ccmbK80vFG1LnQj=7_E(_{@~Z$sfT*;ipgw&&j!>3zAr(GaL9>| z#8XhFxA;NlqlOe>+1Z>hut#~0VDn;FzV`80h~lDvV~6r}+bx zC^hSMJ6hjf%y_;#wYP9tIv}8x$3~O&Q-()pBA?nH2-MGSnE# zCNV9;x5A6=eSmT5Gy;*XWj>CK@4=_*L4+S+d9o4+Wm>PSlBP-4Lv=@uH@J$sUb=p( zdIp8HJnmUc6FS8rx|sUP813p!z|2Q163FFW!#rb8rtegEZ*!J&q1K#EK1yiz<=d4> z^Z5}(n2zn4dHJ&P6iH;I$HVt59}m3j&#y36+U^_U=q3r!b$oX%Yr>g2S*p$%HPTFm z`94~V<_p2(3;U1~{J`ma7x33IO$7>fs@YjDrO+9Vv*J|KBY8NuQUa68E!EgHa<;mH zNcY;P`O&6tiRHGOA%JX4xZE!R{^OLN3Ms9HD6T*Zux3nbU-ZJgABKNXMF+PXI=zXv z7153F7q7J!PUcq?{^6F*^g~Dp?%i)-TJq2OEQ;tC{bqUSu@rz)9>iQhcxHE(Yde6r zzbqc{!Y_d2QoLGLhd4t^R=sUW%4A)x;hpN3 z8V>S#-&u6-h9YzRg2M^;0~eF;yMtNxc9aP)iQisK*9NSQ6$ZR*C{cO@mz32pFXEOE+cUx+=O&m&B}Q@H{JiCV2ks<^gi2unTDK9CS;0x)k)r!#D+ za(MYHWQc=x2_PUf7ob=iUPj!w^aH3oxR9`TQ9~!%sl*DA# zJ1a;59VWn=ba{Osq#23j*`;;8fJ`0rp@QJ-lk)gpXk)d6tm3IG=R$Wq25nnWVKH~a#}t*_yPnMscH8N(W!1{S68bM8sY=2eP zLiN}9Avg7`z1Vh|)hgBjpTX0cWniIFf8YjB?qL^B$H{l)kv>wuF6pz2yp-9poe^~MCCAJ+n zuQK+4K3GYEdCMxRTv*aQ z=hmS1k%Wtls{5%gn)eYFeY)uuXI**2iXf@g|26#bRGe*48V789lUi7`7=@QnUe6f> zpi5xQ)3e8Q%~Gd;&;^0CY~JmxG8V~!q>4kW{SMSg`?a6~lhq=lKaF$!R@p@M1Ku^% z7-sg1>FqV|fQ4UweQ;p!F2Yv6^q` zcqd~1`&q^Nmk34%(QTOFraWzaJfe<%u~fILKL-I;u&yA;kKbcE?O?waO&dE)xdaz& zJ}ZWA`RGQ@3&);zRMleZ^aMj5%0YK1tzvF=;GYXkU) z_E$80yQ}lbr`9jZ@Nr8T4m<;DjyD?0uQHR91nLRQ8_! z`Q1S18(T=b&*`-OwWrkXVO8jqbO48qC8zGzvzuG4 zRrZR2wrhK3jY_+z`kmHsY`P&2fF{S#vCTcb`B2cQLJa=%Gswm6PX{tK&r6FNFye70 z+3LfF^a4e_O6wMdS^G@pDrBWmL_>B7!#=Ag?Ba@%KpjC&*|h)jS_(mL$=!}9DZ6mE z6ZTUOv9J;A1_}Bu6u)ylXA-^_yJL~-vwLWrY8?m@Trk({?(1@rujbkRD4o@SIs|-c zHvTF=GBwdwv`Lm}Q?XNA@k7U>Q!xT%3yPx8TY7zxhK|$iKaAaGpb{2Sr&~o$GGUyT z$>s$JEZx^t*36*vve(?O>*u6Ih@8~@ITZvo@PK{aO^sv6y|iw#Eqs2xZH=`F!iUQ3 znNc>lBgIGS>qiQC@daQqfQ<@OU6Y;Z@G`rBj{v}JUM2T%as+ytFPJ~G1s|Se#U5Xg zA=*SEk?!CrGmTB+9P;FdFw$U~7`u0WR+V~^=p~s=1dewQsw$vwu+$zowuchCd z5Mmz3&`BSrY{5h~de8E$EjdGum9W+B2`W0BYi#6xxjfyO44^&$GlkHzY=vpKG>dCa zapU7VOB8Aos9lW zs4w%|#b(#z?I&ZK0lREpccOPJYK!5qW9}~awcQDqxGtm3*)9l~=5-Q3|F%UM=$_sk zR>b_LW|=Z+J>Uw9SB^Az?;?AQTj?|_OFfHQm16UPEq7B7(Z-Q`!QI#Pc#UPn|K(;L zOS)q_Ef~=rIRf8M6o4)wc*U0x&VEjc2>%pd_R30yodVgI($j8Kf(V^YHMF!k>Bb!a zQHl&?UMuG%oUX~+CMMQddsprFSAw!&l57>+D@N_G(&D}uf{dm#RiGVPPxj1x=p=HD z6^g1mVMpmmbt?tH8I19@fzoM47E;Bmg@mKKLpJ&NW+|Ei_mf|_teN){@8~nEB?}d( z+=qOtRQ;wmZMgDXLg`I2HUwDUn{{ppz6eb%4W%`z{;<&agwHN%wkC|)@U(O|k)Hdd zp+$E@OHEg6DuzJ)=YBQX@n1H%`4Qj>DbS#CR zw|_SwTRiu4-bV+N-7(EiE$}^UBmDQU26f!}@wok7o-Q zrfL=|%+F^6-T{L?)W-w_{U+RH8k2t=OTybNx~(JwFu?(1rj8oJ=TC=sw@j<4pO{ zHQL88aGGpq;Mv~T<$sV_4Cb(`|9DWb@A+5O?RCDfPy4~5iwXB$i^>{wCn~2H#wp8} z%Pm(ZO*pph*|uPHO-v^?R1*Tgc+Wl#o?|t;7{J{sHo|ML#%W%(5_k>)o!3ocv<+!c zFg9ZZG_#-}R*jV~_W8pTyBhcj>2{h6wO2;2GjVCwG<@};JWsD;DqN$I1T3KmiJ z>twn-{%8m3lp6TTa>}TFrmChCHhMEVt5?VMcMjMr-M)_vk2dszwN1pRaCgO#wFOoA z3TW=0I&>!@+;w{&6BWP%O13W54vHv?e(X0~A|k$b)h62A>tWF0U1t&#={qX?BVOj} z5H76bvgAH%QgJ-97*|k(r>Xb;HS~HJNCRubEi39~=gQ|Ng+8+W)pq=RK6}W`wS2Tt z@LywF1gd5q0!28-wSSc1KqN~q_9q17dUiKTY-YKA$xM6|$iWd=T@{M^-fxL*+Jl*> zZ?5k3^#ssY{dR^XSBlDR9eSzdPywsy_S^@MHn~Ean6a*uU;&S1mtd1It&Fdwt!3;LR99F88bjmFI}r zl)UDhCV&dF)WnQHrOV~;%-$H^+Bc5Wr6ZD$WW5!H%Clt1;&{T2U73a&&Xr+VuS$37 z`3Jmsv!`SCbSL6DS|jc8@bKV_m1Qe-lSAZ#!=1Gyka*NGt|&^mWTiN^)Q?6SRmr`! zZ(1$eB+nf9z&uJ`TI-WEZq~CY@yiD?UuE|+u(vDLI0vu_W|CTBq~EdBnYE@k8D9T7 z|By3cNh_=6%>ETD4*G@3_5EOPsxtIi<6%iMd4#~CcTW^JC)Xo(0c8{OK5JJgM?yks zSG?-9{}=_S7lpm0cxT*pwo0Hc{$wh#Z*KG0G)q>a^U9Y-$~LGzjt`CUCCG5>#lDDi z9k-&Zi(-`F1|7->qh)SWE(f@@#3~-${X&S&p}-tizhANJI+# z66y&9c$QfQ7FWCIW`W{2NQCv^P|`dPA-Nu6^^cme8Mk1Qo7;ANWx82 zF-73AK?=XSS?ycVS-Xj6+cirNU~i=Cl8|BB)OCO%h-v$3+~rlI6u!{Di#bH{-2w^d z^D3}(`_XJv4)yycNIT$cL1Smb%^;oXWmz@WP=(`sigF?KF)wTgQ5n@;2rYf z-aDOW;QlD;E|?Z<1#`z(hcUWl5BN2wL_3p;|5*OorPew_K|E zcf0&ko6a`!Jw>WNSeZ!d#|tjaA>n5hC+SX%?bBy+0S71baqm)TCnbX>(0A&8Yn8U z(f&4v;$*$4X2o}O_P9_QdYy{Q2+{ruQhUfz+zR?v2?yZ9z!C^YRj&9hqi}p9&U5Rk(j_6Cy6yfX0ch0L=TDE-mU~dkgZ{ z#kfibF1Z7ICjSN_#g?&pyg*bm>KuNw7bxa5Z_P1MTHEGe&gmuew_z>7^uPq)un8Y9+3-6v>evJGTBR&#w;SJSRZ z+CXKExyU9;fijF`RONR!(4)Y`uylk{({{)i`<~ZLD~$W2RJtUM|IeU3$FoX7sOu2B zJcGN#6|sVSA=w*ilYii6jty3rY=#m znbA+pw+8emYabK0=9>($#H5;mZ;)#a*x;A z&o+#S?=*G3uDrxiSw89Q%&{fV><2g41a^p+Ku_C-oM#F4AFAtbqhgbI+gX2%wYT47 zHK%CywnWR=(+mZK1ZHOk{Jh=~8oGJRsC1nv;FRNquiNeCU!n2I#0zHmeCRxL=vdj9 zG+P2+>?FRMs`+Qgs2E-gE$l3;_5xngFr>IDkbBJE(Pg|=y3LsM)EYIoqLqCeIT`F+=os8?+Z_` zbU@F}x5lcn)BeB8`6cJmtF0VYS{XK#7kMi-V~6g`BzwK4G`$I z6#Am~#6*$|>7CA17IkyXy{}v~21=D&x|?!Fyw5d?vq*56)|b3I(L|~Xu?An`#Mh-C%URyz!IEfRvlp`ZH`_Hu6;~0^tHK9$>o=}(PP87eNcLr(qN;Qu=pwA z6R#VUp@(r%4Zo&F-`BMJhQAy9_@K5>?^0LGXiNfJ!*rKE_mQ>4j|Tse5e|)SH$z<~ z%a7SlvnZqG4w0+kEnl;1&y9M?T?v?efT{==OWj_WWvpUvkty3gs4!LJyH{4xt8#E> zCGD@-yWi0K1kvpRwf2swJm<_uHP)I~QR&Vvd!rbPMJU?wgP2CQN59)tK+KrudEtAq zWj>V?f1`t0?Rc!8S+Ko#Tdl=`uoOf|+TM~Us|D=;W-8{fVLIGRIcs5~Q!M%q(f#i< z@f4ozPw8bYOf;p_*(qz`HA$eVF*l9wC>BTKE%|9UM-0Nt%j+GZBIiUX^A8*NDIh2l z2xeX~NTdEgsfT%(m^0Nzq&DsyUI&Y&;flEOk-BsmF6hLwFa7$kiOm1N`D7BgLvG92 zZXzA}A42}`k9l*qlux6y^*`~O=dpE+Dd;Vqzx?}`?6k~|ehgTBFH$tkd^L+Ae5;aw zocN1jID*+K!7E_?au3H@d}_bTdg$-&l|4pr6Im?P3Dj@J4XP)6BIesjChp%_UR%pq z=}kcP*X0!A<(u*Po2t$Z3_+Sf`@lyOx0g}su;Gv-HX2cV68xKSza3Ux4pgQo`M``H z|NqqA|3NLyKv7q}Lqlo*lJ&p8X{_H?-Yy_BrEy;#{Q+ulp{-nx;JqxEOUl=}l`abAN~lh#&pRhWxOMvA0<6RwWVy@B3H zqLCuS#12qB2zi#p^D>R|lItrb>1bieYZTRf;LF~ZzGgrda z+P<1FfV&hjU8#;`)a$T9tWD= z6J4=*Z#M*yVWYT4|Dogm`IxtW$x`vY8pXF9b>E$vfIP3%uO0PS;sWpzqf|l7M|C#~ zUzG$%%26Y~0`r!qSPjNS{JSR=k4XhaFWmJ9&j`l0I^QcdDns+V<%dw39aC2AN9{^T z41yoGy7YimH&}RclQ((9jC~E`|fm~(O!x!#RwE)og$1=^;@vZlgDJ?2zhg|HDPuBbETxK ztBcLk02u%q!T#l@_>{xxmsN?u;knVx$H*2_+l5A_H3X;swh7PXtor$Nn5R4C_kKWc zvmBfPcVDnIj?D8r?M>sJu$RrmgM{l*;V+GQbBj@9qwJ7xPY)3fsD9hQK9aK52MHD- zKiaQms37TTo$Z)b6rKxDBtnXiv@$BQ;GCdCSoVXMPw$?H72fPWnB;;x2aaxb`NbIs z*yk*%-~WSa@RH`?C2TNa;=|pRB?HOsstbNQD7pI|Blo{Q4&M67v)u^(JxDqS-A)I? zELCS9!OW*;zaK-%yhnE`=2&Dodphnur*zmDHdw6kt#)ro3<|k2&rGcum>YeGyb&AD z)5hmJRS-xsfp})D*ZSL#EF$YA0$XJcDZRgZE}6Y^S^{cOv%2mewi*$M8maH@pw5{( z(5GOQ854vu)rjyr@CZ9OV5Ccv0#na_5imWD0%_SK2Za2x80U)1d3 zT{R!fOk}xFE}i2Q+rRlG6OkUY_K=J7X3gpDWW{D)clMhziJfnse&*0!X0AMsdja7{ zH_N%+Fkytg^v_j~=3VOo)!0s#z+V@G>+q~x2A>-V!ehJnvXP!~Sq|SqHLZ^2`ZJ$* zyTAV7eed@m5wDoXJS{w_6Fp>Lc73J0*a(X_;geyEJ==sdI&?1Wc}8Ei;AU9Hwyq`5 zyZ+EE&AfRY>w5qBcbL~nyyV6^ld^Cx3HP$S(*S(rOlc;n9g+L)d|#G(Pby5R#4%27 zgj-=3Bcz|^aT`$Nh6v?h3&R8=F}CYo6G6X)Qb|*Ef7He@{j*5@j>`}5>n^k9HrCcv(_c_*)O?J3cLi$>XfQb4Knu`q2 zaee2590@aZDxI2TlhK;CYcrp(YBSZM;VoLAs#^*1%MsYI8foY>2((sdTg;J^^JA`5?zqgguYKRD=Cqzm)-#%vZg!Y4PbYFkZXY?g@_q z?=H+Jx3MtedjBQJWi6cJu5a4p0rI}vmcST)r&i1WTzK@Ouz&C0@o&FfKky z1Mc}LUvD?@W_De2<<~0lcF44hULJ-lkPkferN8Ryz4T$7tf|r6Dd}j470X<0TU#?L zi6Qy80qZj*Ht{rvX&*wRr%>pvo)3I=M zyhT>+ji#Ob)Bedn_=z~WYWecTa9<-CrugM?rPT;hxuaW7y*txo!C$`Ft?S!2>n``n z{rNgpSlOqaGmZ=A*C=~DX?N@&9f6>f2Fcf-mF)IC+g+ISf5lQrXOecx>6MvW-mF;= z%xyYlHCT?gGMTao|NTTHUN^7&UEqvj`cwTNkJ@1#&Z3)oOc1ttcfH2lJ>^NAKFidG z)!O+~+fvmduh}yyQwkiF*<(mz{@{tpS@C?Uo4!DLtod#1GweXEI93kC%pgZlZC*D z(aPz;LUWIeZx}~@`0VtuKZiL470S*yX#^TZ))s%^2tK$Q?T+H3+<1DIZQOk%uNTTR=$XJ1hz%vV~)>W^u1>dTK>S z4q~?jx52oo-I0YEF&V#>0e5>0TO2EHSh<3!e{b8|SSZHQy)273-_5TI!+9=r*A*p~ zvD6l$zCSaqb{67Ba;8#g?I>XZK_56cC^qj?7#@H=NxEH{==8Fu)xhR0= z-NNn<@KcMj*zOnj5Q}e=Z zQkG0QUHboG?>*z1?zXK_MNkA0Y0`^IuY&ZBNbg;`joxeM5s}^$0tg5J=^#XU4Jar` zmkyzc^e#2Dgu8h5KIiPcf9LVu5BL4{enb3+By+7b*PLUHIVQOK(k||>u@RehM1+Q^ z@hKl4(EEWZEKpNNj(5X`kB84V$=+r>?2S`{Bme zT|?=enh9_(%p&4INaPE^3MflTmU^o6wVMKMn&MxF>Ba6o`G7FEE%~FW*(|w3@b5pJ zGKj1m#)lxk;B8EkIg)*i^9tYgS~5ON8S9PdhS~{pn>n#L9X8I-ms-#DK+=e6uUK1P zX!i!5yS#G(KG-sD+^yX>mG)Zf?0U>z!R#1GruT^6b{boAki!e>7y-?h#%15Vsgc@H z%IDU=tvjk$-}@CdUBstlafC%GQqu`41wCoX=)-ocr@G8od6yDee;(gC z`(s>SU~X=H-%5OF*y_IX+HjHe+0l;m>EY%Qz;C%is90!2`%a1OPt#tdvZ8V{um0j_ zS~Iipc;t-m?TfLr^FcrQ={Lo@#U;k)Skg)-o%>gq?d_cWAwq$1R8MQT%^ifroDh#R z)^9q%?Wd4KpFvTenE%w!$&|LbzJeu5tiq$WW9xDt=b;gSrk$KL^Ve{IDiE^wWZzZW|^pF&q2X`j2rK=>e`Z`@R_us6pCj63Ylys@X%V1MeIA8X1UpUU?RAezg zsEX|&75sPr=px7ezJX89^!eE65<}(Pm$Dic1PQ&y^jL)~D_q5R2B$D$MrY91Zpw=D zks|mmzN;DKj8ec8i@2TmxNpF1INE^iU+g8(5xNv;6%rX42LKD+(K$VdDMML!{u{R9kyg z|6@1&>p!#J;{w3604ZnoufP3|eUinDlrxD8`hP`q#}UP{2sY)*9r@uFxnc)76ohuXC45q9l=QAs##107`^eN0cASL7)v z%~ahO6u7{vcc`6StNGSF>bQHVeP~%l!ke^7N`JZ`Ke0WaSf^j3=DATxY}KMfJEuFr zJ5b&)4Z|=vflqtf)S~2I#n|O`8@$}9;gO4we2EUInHIYtDm4CJ(KkB4f5u40{0T0x zCoe4Itod)v0-28%NbzONmw*BNx}UmHd+a7+r`mD-z#3g`EaJC;HO@c$yEXDE%s)Jb z1M^A!hxuGPmoZW%T;S!E;N|v1EPf@_Cb9oGgNE~A<=~TROXKJjXbJ(^hDh;)gA3OP zk02q#CAjsoj`vc$afv2?zt+4tX!T!$J$>1y$HWWgJ+VQp+C&xs>Cdy0tPBNx64@+; zizar3W8*&^*Q(cGm-1xyiT^1nR{+qFolcNp+#ehm&jpyJR#>U|ha+LD19q|r44(9N z4j8PNtQx?e21(aGlKsIEn&^WCyuE0%_=iRQK?=@R)obzfKdtg@3V@vb|6?Ll%?j$m z)Wfg;RiHq_k&o7x7Kd)Ex*QH<*MJ*y_jp!}x&=H>ET+eBiS_gGn{+b0JK8rc_q9AL ztWd|jRjBw6jI6}1ZJhP*tQm~D{SH*;2WG46hMHPXqfge`aP-S5Zf7(8!ED7Az-+~{ z-yE6#;J{zwah4G!{I^r4HUmz1Zj+-M%OK_Vj)+zmW;GQ7a8_9D%QD6>Gmlut&Wm0| z$={!^1VM`=ns;Jd-dQ01d`rxMz(_szWL=FOZ`9~v@a05et9l^zo(q-CiF z|8qrrB{`ZwH`@SB5(=?(Nb_FC_cmKeSYX^Ep+|BWuoHS*@}|P zZim6M4$yM-L{oC-5#O3i(@xm&JmdM}$aJ~)B)|Uyikq2@a906MC*qLqvz%P^;C^gO>!A6-i$jd*e3Y4KCW>ILB&G=ksH zjyhy+K9XBr1dXqIrE}(2i)6i{}MYSxS>LM^8&%_sO!A55r26uZW(qG0i*=st>_VgZ~ zENdC(Wn?3xzvKLae$d<2`f8OCYdC|U*2HHLhz6ujl-TzGIyYSX-9vDHp z5^!3q=jZ#z9OZ6+LXmPX^f(2|f58lD=do;-bWc;I_37d7@X?VzS;;{aD?LBH|w6HlJg*)7yxRA}60{U%#2u&G`KKq7*g3Zb5qi_>8Pl#4njw3n0- zm}@>E`=-R>Cpd0v^oW zjxmatf(33-N&0+Zj84=P?*y1=uqwq0^z3qQAw;}Tdb{WC@q-!RlgTDmjVH$YOxkuh zD({JtYI?s?2CL&pg^2{Jl&zl7H(KU*QilU&rt!7s)o(B4ENVuq;|f_L0LiD~Sq=1C z6vdJj^d#{dz0<+COpdPGTdZY}PB>qgTw?8F^ZZhm(9q&$0<;*AXqwqh;m}H>HoBAnZTAHtcwIOP1;BWrG5* zmF(~|k=cMDI`{8)uJdJlyQA$F{DqC~N%HipKK-M>V)3MawpIyvH{^D{5-7_ifWo1B z8}JAGxPIc)E9uD}_nMiDBpSYOA5W|CC%1Fs>({(o8>rp%DpYk0)zcLFHd_d^Hjby0 z2HoakMNV|2R!rDZ+Lyp;H#qYBa!_~qMZbB-XxEg!PY&fsgQ619bO)NV$1JF zOKH1jECH3sf+92tY4Ek#@S>z)+i&SLVi3#%vGPED zaz?P9h5@96LBIfE2lOD2(FF|BMrCGp*t2CBTA>vf$9IiQh8QaT*2eNe@|ZQprtRj_ zo(s*3ev_5MW5N$P)_D58$$f0-%dBK!0{X0)?`=V4rRlk8Y;u3PNdMU!G4wuX=wcXi zyjDhdF{Rkh@m86{?0WQ))X$e!n!@R=u*D=|fe-z+k?4l#yhe3A;T}sn@q=||@q<-s z6w!v2H?LDbIYK7?OY}~K@t!(HCw6*H!`5i5&2s`#p2iEA%15W9O*?#0V>+a&ZLyoo zL!y&9Ys9$JYwv}p&V=6(HotZ#OiNkH&y{)ndE+M`c}n6IDFL~=bQS%Nwtewu?^cC# zYgfk`OD2$kDHC;1k|qS9NykUkp}jR9)=A_w!iPPr5&RCBKD84*L@S=I$kq4ad=#US z3{tTo2~d1;ohP5mW6>{59fVUuix9X}S*29i| zE-IA=S8vM_<6I|PK~|a8I?w28No)#2SN(#<{3~XzJ3a<_2qKOLYais9NuQ~9P#(>(k?HXgit)o{8WAZ%mp$!x=870Ly>UOSk`!bC;&_<)GF4|O?_IxJY zgax5>LqoB$^%teWADKEhMYNs+lb`M!xo3q9b|i4!>-0PwSULn<02* zYDv7LsxsW#sj&-P@2Nyxvu0f@6jxevukoSvnnBgI-$if+?rRyI{PcmCpt2?M;(`zE z?2|bUkO@(^2m7)Ec&r@vV}E7W&}{f6<$NT3A!>UHyHpa+X8yGW1Oczvc23UMTd-Vj z+;V~&uCMG#3E>_Ls_~_+mo@gK*ZkPryWQH7My?$OSCwLKoBLSVw@b9)3Vk`0EiT*< zOS^o7U$LXQ?;g){peZv0&tNK=*P|{JnR1mM-J32Gx!Cg(2g7=?D3$WORYCPJ`V5cP zUAG<|{tCAq?+kx;xd@?rdv-5j)qUm3P=27q-p=lUH9)}{nYV5qs9HJGdCsv-$yuOH zTl@w;`g?m<&e6F3{??ItI4z#a(%&zf!E0;JZZUsCC;1~r)G5Xn1H>fSjid*eaBx^C zBRr&Uoc{88u<^CMmC^b2wOj#p^3i_Nr!yy=@ZK4XNz6d0-tzd0n&$75&|->G9pKV|F*IRD59>$^WzLWLJ06Qy>gUKdZx4xwO?lo& zQi67|K#s*Yy%RIh5N1t3L((nI6^9Ulhc*PqncF9=z0=MVGdFDBsAo!w-PgF#V!A#i*N8O z0QO{?m3fWu=472|&E|3c`B}ep>b)(=1|JLv$Ar5MG${8!XRigf%C)s!ubZxW(AHE z4#&Hwzc<-+od4~~KfOP&rmxs>ZDw}2Who__f2Hn93{AUX>rRtQ%Tq&S<#)^8!oWxu z>?QGA?AfyK_p;4X;w)~|x{N~VUMqx z-FyIty0wg{d4pcnO~d}YCS#i{rrUK;S=L2r+ljX0N>cMn&Jf<(CQ+iBGm^=(;x}(*B z$HxyV*{a zKtN+^UKc)u;ww*(ls+hG=;N?@Jbofg!H5os_YbV!sOZL_ZZ_EhMC@&IzWq?DY@MvB z_;vcCn42t$UMm9=Rg42;!+ENBTpxq5@_G>WJ>8vHQ!Cw(0&XD>G|MHxW#3Gh)Dgq< z1+EBHE}UB&7EGUo&c~8QC4CxoTey_NS%*KurX9N+LK>HnCqORJG5{MWkgAFU`^a%w(W?h0}(>gM^0-BPGSe!3KZxx*0Z`^Cs10gIM7 z{!0Jp+g_x_+F4Wm;aH{ZG(k$zgHyWJ;%bN*BKIeFVpq zM})f7X4B!qw-+j?Uwh-Vu?aOV7jhzun)!Qg3ac^rPR5+}6Q0G;Kym2}*tE-*LuTp? zR81_U0L|##oo0tI-b(A3Y{N#TGNc#evh*GsI@T^Z<0g861#Y zS|o!e-j?A~=;OBrS04@cVz?}iRWHq>Th5W^mv(`y)?kUAzNIgFA#Q}UuYswA3In{s zd*%J0*zaDKprQD9|7OrwT4*mVq7Kv#SG4A!*kx!8iun$e-t~@y1WM`s;#zU;B;}I9 zR{IDMbBVhu8+u9j-VcG&%&aI|D}>rD&%g|w=MjL)o*8K)d$pXY$&>opQ~^xo6Y<8us$ z4PxDa`y;0U%7U_+s!qxVLn~nh+uXt!MPkiBB7s5fI*c&{wz@8O)a*Vx7M=Flq4C9R z3TI_Tj7RKb^|KJ;{b7F#gEwnz`Uu(jOyXJ07DURkHj0sgQ~$t-26BtuH0;} zlEB>N$RUnc=EjU=TX(!ibBSzz@lvhaYJhOaqwPayko?`K{*pg19%RsKHN>rt7bKmU zCcd0xQS{Sr%qpdq4=3pY>c{ctIHNYxFWM^{sblFCngO|Dp;;Qznl`-9ux{K%B(#OhE?Z&Wc_P#pS~0_YXQP(*ya` zwn9;*AJiXAD((%JdNZ}A-lHkI#)Bcb#jY>A+z*JY$oU~&wav*oVjAx{fy>iboCm|r z5kx0x-9&STkyCDN4byw(9WCi{zcRPo5PUV{8Nc!qm@dS-x-Ol7?4wZgAs&9An`iZT zb~}n9S#t96fmZp4<~s)?s-ks72Q^xOy$@xx@^F7;5^w4{MS4ynT2|k6{dAZ`CfbcO z7(5|Ed9B`BG3wt+qU|+p3FxBpUhGsfaHDq{v6~T0zl{)z-tudn*uNp0rH^xw$Zw(z z7;9UL6bE`2XkB}PdIgk|a|Is2 z{w>8jI-A57S?7Q-dmSFv^y+FEPjGS&yarXDYcpXtk8P-~v8A5q3l?2IT^lJu?#r5D znoQR(#C_-@P5|bzfexQPERex;G8SwF2q^38Mf5W5P(HkdL&18nHxPtk}(kX#Gem3;uQysFZ8l4;@PZnE;BVCEpDG_LOoP08*^IU|L4nUf=$*`BWL z7JL57;tInb4-gvK`Yi-fMOD@5-wQ~W(q@ElOILrremLVY-=x(M`8<2C@I})gm!r0q z1duG!Pr4-garp{UPYbL>TU>vJV9J!a;W9#qSWA^?prV&hqOctGJbiC8Fy? z5+e7$jv7<(>SU4bz3!s;5fUDV-{sv?wP08bd+ij#JsF}Vy)$g2rxIq?j}{%Htc~LR zCT4GbEXmGNKfPGzxTsj8VAvQQaoT;e=V@jUgo@y+z2fvM@%|5FC@7Qz%m8~{RFJ& zSjunt4@l{HlD=y4NC_<=Z=)_Z^uI zr9c=Y4KoovYksqS>NJJ6gPgXGK$Y?&>V_t_MEA@AL}nrW-9~zknom9#2+#&UdR%&1 zVu>j>azdCBw|paGAKT+ALffH{f>WbPJNkR3?sdZCBah$mhUC84Gw;^7jwx06^+TRm z$Oazh%~S#OZk4kvSMh4zdQ(^=XBVFsX}4|FT=IC5FDT`#sIG6VmNr2ZBWnywvk5=8 zv@`s-C>e|_1FHutMa_H{la?r3jzUEq6O~P>-!gxr7)wK;>{tyyM_CnimFB*3R(1Y< zaHlte%@iW)W+S8AJsRN6kd5hAq`CeRK~`e z+q5eM*MfENS5ik=H5*2LmYLNLI!@N~*0sU3ZA-q?M23Za9SCgiJGe-|>}ZWn>0C~g zVyK?Fs~AN{zzHH7oNi->WH5=T_n*EpN4ib=>|7hv(Zg|@E!aG^EuTWE4&V0`yJ|2m zAH@V3sKaM4{-dxm&?KP)+C8-?ynsU z+nf+f{(hMu_}esU{y_lp`@zXC>t~#U7x5jY4!RRwB91ubtgMqGuxSgWdsz=;uF|d#z)08!Wd||2qoe zmVphe5nGO`?a|IE+F^a3@C>(3kJ!-at91N5Hza*w^p2z3v|Gf=ULXBE-p)!a^vGkJ zC;9iuX>4n6pCxNP=}i+_aFizb-;1OgHziAMJ{2`~LPG#-Im4#oIOXC#~O!R70AMens~J%rVW# zz(@7ewPZa_0#eraxPhdQ>T)wc&y7}F(IU`2k>J<5=4Zo9skBpC1_l+sKszs5#(c=e zj#&CAOJ|kzv?x8pD3wbk%=N(X%C(zuFMd zI83z2SZ={=y2R43>UG|rpFKQ+#hl`WC2@Y+p+=wVcF14{0v5R}%XJP^eTy{pkUe$8 z(pX&3A`;ia>YZo=4A+Q>h*tIM_&ow*_E_!z~*;5Nag0l4ooN3~F? zp$&_X$Gtx`))|G6E_Gkke5B9T3sNc1SDh>U&D|#PRB2TdhjV2wDo>N8?c+nC29-;x z*>J~?G-WQu#r0O`bD{gIy9GAsPuUoMSzSV{8aCB1-H+XzNVRXY0Yp3vc*r$B0}m&y z40*Nl-F$v0lXMI(%`%+L+b@WOJ@2Jyg^7?Hd*OZ+QJ1ocILL8%76MW2=aFog_yKrj z5He&67r!CY4|=>`AmhY_hVEr(;XN`?cq5PwtN$Pq$nn7O@$XFPB<*zsEH3R<#Hlnr z@1;UMUgzfHr6w9OKA}$niU*6)81Y92MtOvxncKx({pKl+nLr(WYV)8WsmOOwh3$Bi zMs@ZgwM^4Uar&&IL{IT<0o29t_lH7c^Y8^J-j=|qQrsjB9-2~C2fPwsnR@?>MKVvvUjPFyMB&mx~5U{SrGbnN|SkmoD)D^E>Su#2vn1B z_DYmSoa-a|ds)XtvdAY>oTqOfoG&BqPiSdvCa*P(ur*8hA99z>KLAJ@HS=8if@hx{ zZJR;J#O89XIBrA1+IzU`>0+=J~RE1U}ED1+@u9-p7lRq~85H9njk zpR+zYNO|`hasCQ&^M+QEU+sMBq3N5lQtBvWT)PHPH!<9cJA5-+e| zF)SNgq~rXzN70`B>xrs5ejOD2-A!Co_N<3d!sCZ>QwUB_V#2sNEq9|u`c9qhY!3+s z0m<-YH?@t)Ilr1Qe`o__y>4$c&^+(Nz`RaC-LZPY1Y!T}Lg3z!{HRnX_#rsycti?? z^Wz$NTq2_v_4W7!0)<9P@1uLV^eXSSb;fun3Yon1>p*?|-sb)cVoxaLr}ZcM%-<>8 z^#I1W#eVGq#+V}XTS)~h0bk(0@A9!W++USzBWlntvgj-9A<#Hq$%*%~%&*&fO~%oN z*{Vuy7*UMk9WB0hzbU4WR(<%BdbbhlH=yxGZI?|58NW++E$OPZkiy(olSa){sl)N- zHMJ8i&68t}mv0oB1ph9llRn%CYaFVd_WLw8_H<6McQfF`V3kPd2SZuQm}cVo4t1Pq z-7GKPnh03w?t$g%8o>&z`17KJt5iCJJhJ(=FTmJMERD>*;Tnz-LmBtCdkiiR+bT?aA>fo@lS%d*`v zjkTLb=1}jAw8yk<0;(=CR61wEklpP#WLBs~W-!p!QV;6<>8p7qHPuVmhajzS4h&DZV;J(J(3!be$s8N2j>lo7Q`K+)lVcjS#uIm>tfs~RHHR|CA-uMeYGD(_xx^+gbV=Lfagxhss}4%=7Bmnend`J z{L62*tK&1XXL*MWE55k|j!dYyFPLdfeuDu2m96bs2 z^wj1`IA6nTQDC0l_BuI|wrIE|=sJEb8PLM^8!psQgmU`Omici_i<`I~#Y4}YBi8J{ z$x#dGY#!9@IIQlOuO`@E8xP|#t$EiUbXZw4c8=U?SZ_jn6O^6Iv%Y5d@$pVM}h39;PY|25z9Td%`s@@zj(WNf&mvivVrQZ>t8V-VI$ zYfm-<3-hl9>WmJ8bjbPs1)D`n>Hvmbj35w%2kdrQ|N0u44~AX@?d$)PD2{z*P>{#j zM?UQQ7DdFn41fc%?TqAjQ$2cW9!AP%7Xj_Rur#&t{=!MF1-dmEAB{@{3;X(Mi2mrO zGu~I%OENe3)cIdiPkM1-JHLOo5d-q?g^Jrb9J%+hwz%%_oXJ2(To-m1|F-NW%3I~n zu9rWFWJ!DcK}B7Nlb=(E>;P`NzgX1yfWMz0`DkPME0sbll8_zeuCh^-F77dW_9qIm z)qMKiqrZMR)4OGTPizBe)8CVM+&43oYFs%A3w`wnZ~8@|MnJuQakX+iSqdOYaOlQ; zZ_}#hQu?*HOoQWw!>;`6QC-+2T&7Ex@ntXJ+f)|6))S?PK=SE~6HzcsVv4lq z(0STy^XucJF#Ugiv_aAz7Hx~n=ox>61RyY&AuNz)V9biy-tg>NwZm9L5|>c}AR9E& zI@f(c?sjoSDkK}k1mWWrgJ~Qb%K4fZYk-Bc49CJ@IUR7<%ydau&YwQh;tcV)W|KpYRL8qEdvO~ac{B8g3H$u05o|c3e=H9&ZQkEaA3&&Nf%*(;7 znomGz{3$#WY9%*RK7~H~H_EWp$Fs$_*~0y(f_WuO0rsKKt_3YseoTxD?E)l%>Ej;`9B@ z9p{DbZ=1hIQ}TI(F=QW&c2rVguJgKbv_oL(V*c#gHUjtRVAoO>bYBqXVG^jn1@KL^b!) z>!pe~6nRY4Km+h%rCq`eN(@I#OReE$~C;ucMVqKZ_atqH6iaSlL!nXS;w4m z7Z@nz4+c`R@=)OoJk&->rIMKaOz1w6N;N#xo~Z!eu ze@p3`C+cPs-2IF;l8aT)0oyu(^z%1Em7P7;|MXq|zVB4!z#--++*AL5c}x{N_J9A{ z|6Dl#pY4{VpaSn}0}H|`_XNaFWtJ^L&VU=H@u6A2!tTQD(QK;otY55Y(EErHL9mp9 zvEKQ~2lqaswPiHFzPj*@rw+gqUI(uJUa<9aBgE1umLlg*JN-x1bvjTM)NHv<#(HEq zlrOhAkLy}a!PYADXBTIn1y*@PgrDN|A3ZvgX4bDmCLr_l4?o`h1o-it6IXLp3g%?hb|XlT3%ObkXi*J-gbdTDyija(4j~eD1(&YsdWUlxk%*@fV_;Q08W02O zfB;n6W<@uz<^jJk7_9|}zx_?SN*Tuh%J}STC3%s-I+v8zxNlC@LO=|-?>6?)cz&rb zW8K1Ul|{t=(6JVbx@rLGO(V1Ef_4c**5<2^q>oK%oi{-Oyagh~GS7iEin7ZZfF!f_ z6$6N_?z(RxW`AVM2TF4qNfRX0I88Q`*3O`o?<^{3Q!vvgtL)ONAAdc&0!)$>dCRu? zIJs$I_Na%;n+cAIX*ZzMs%d4@}?(U*9JJT#Qe{7?o}y)83dz5d`wwJq|gr^7)- z|J2zS+zURnm%`4y`eN^S&`N`IZMZ}ETs!vA$YHFmf4R^70b|`j>AMp@-30cJ%WrM! zZep%B)=c{=JXMuAUG<+%IG3aj&6BX3DN3jH={mO1L5OZ+w|YEv9731V%M4k~U_!yz zO;kNbWP8p{-D%Dkn-arD z8=2H~?8yv_9g&;Jcmvf=v^~>X?R4OE&OaiPUhP=l=+1=o8z+0>aj&%D+-!?eM( zs1dB_6sXX>hxLSeZB0#N077X{PvuU#&}>LMx0dA2>qZcplMXGVmEAc|-h20XyH`FNv;UT<`vM&&cMG0atwa7Ie3hO*3(OEoQsCgCSCE3k;TXPSgS@8v zs@3eX^J_&cpZT}QvvYRF5qYZw(wyvFFdDFa84i^`p}5;0mR!U?Sh5)>gY`M56?mci zT=JFV9pJYZyPc+TYPE7aX+6K6iOdM}h-Bm~ zKc2z8nt!{_Of0|%@&s-HJ``s)jOF>M%N*-gZS6WKyXHqlHpl8bT2!?M&tk-um+f>{ zV2+Cmqyu|ew?$i1zA{kmz^RVDxq|e~r5otIU4$oNTII6Li?ULJoV~>Aoc+#SR-|p9 zMNf36i0H?$$CVMQjNDV%RT+EZ&YBebX_t*DdgnqolW%MARjIZoPxn4x#*Xp5Bivp! zvjbJ2A>}Vm(Wce*i#3zZ5+L6`Z5epR(OB@jB?vPG`o$@seEJ{1ubC142>Knucq9;N zw_z6j17;XK^ALR8bw9u_DKD&!JI?K{4XS47!NX;GLwUKkd%Q`bA!iBq)?XKJp*oI` zngeI$nU&7k1qSC-{_VDf9KYlEee}sXLc%!mony^}wZ%@hgKR5Z6#ZqJ*KplX0T7&YAj^AiuDb$PbbqOMP1k4Bj*ICTnS z5)WbxHB#T*?I_z5<2A1MdXatT3}$$vI!y;2T|SUBE`O%*LMNwz>94p-yAwA}Ary{A zRXR`XL#Cr(EQ;OU^k#@F&5J1KhE$`Mj$SAq^vpJt{9ARRRb@eAsEhQnVbA$^DJG!a zLF7rqy11iOt!?r`M6D^rZy=E%uphL-`%dtkw6`a>;t-mn+GY2vlE)^LM<%fxxAd9*Tt z7q!_G?=TA~$u*^J+toYJliE2U_!-PkE_ptT9wt$-VNN`eh*9&1V8uI)k0DD+9d;Q+1^d(;w;^eNr-}(3wFs zh7BI!PRrXIzc;_Z8^Ub@7Nn1#g-%x5Kp@K77T6h`BAb@`F2U)^CUT5j25pe|!DeA- zw*MWgBnkgxO6MWipjA9fNc9xv&iX%lu00 zq8t|YVx%?P`puYw- z7#L1}CS_c`0k-WHz-=Q2Rejx$7gLn%di^Zzsq3M$QKjghl*4aIJ zeh3W#QEdA9*+E}3xx2Ln`E+lO4}p&0V=fsEkr(yZ6gsRPOFcVLG#r+L$0JFn0%SzI zT`Gc)<^Ia7vUab3!~_(b9;IHJo?_c}U)L=wS2xVpoC!Rbb^eVggV1_!EtT?^c&=}b z_LNY&Ht+Ar^Z0q19e+u8#@?%~$J&@}l&T4Dz)a+tR+pSLRD+)lmZ4AZE;$$>+!@W# zT!h{p%Kwjqhl)rU<(Vjy#^{Qh#VzBJ}($ruI zmfGA#e8PQ$8hg0R@hys6_8=)>Xha11D=G8yAfHj=H9dl;M(Lv;JSrMZuXnfW_omJ_ zgr>aIG`0>^I8^KyNY3{@p|8Re>c|bTpeD~Q>tNnOHJ(VM7cwX2|>cWniX0OC06x}rLFh3xqluH z*F*b`zZOKFC%QBQbW=m6$CBh_{UP6DM}e67`ZR7hOA9#t$Wu!W`WLBu=th*$k4FTt zb&|kMNUs2e_4Ha^u+w4_t0AI&1HS|#xu>k=f43>^4(cs=-kQ_&Xfh9T#AoqE+ zyb9wznWy*0<_YRdFjtTdV42{_=<|ec}Q>hbIcWiT*9t+#IkFT>8 zngRo01Eh7$Iw{g-XiJm3nJe@Y8ZV950oc)EF0Z0Q-JUX31`zU6D}Gu;eTKB0nzww= zHZ-qj76-c?Q=6Y8=T~r!MYq^YP3bxRu1e6ka%_|7+ivRADV1r+$w?gOVPx)QKtD?J zPVKFIbM=VDN%MvNsJI)&k00(!Cz4#RXRM6NSEa^8__{@rIj9cyL_TK?!HB%6V~$ep zE2pDKja8->%w8?jn?(geD~@_8|)z~dHrdEE#j@V7-@T__ssHFkER5x zfkwVY3PL?+vGpP*u&_0|t}RXY-`(#GS=>Pl&HEQ2A2PdlP;e>>j4Z&50%dcV-tMbm z7@Y|cW;m=OJ4*;DC+s`}#Pb&J`+P4VxuDPBs2Oe*Q@Uh_b2xZrfOws|o}x%}C4=GYPSDwpSG7Xq%f zj7qWH56gGn-7e`&$Zbw=X;42dD6z~JoC^7$RORtS`f_;|SA#0kwe@-s%fRJpbU#bQ zUqtb|jb<<9?oz0F*s1@xE!*iOSeVFa#+vWONsKU&EclNH;lG?|U~*iuDe+koEu)OK@kGfP<8v|+}eWMrt;guB%H3w%x{m?JLlX) z7@YvG$mMa@fIRr8gR6rFyYK1nLxRM`qHkoZjCje+=46LLtGDZLP2Qu(Cm+#vPFioF zgGAe2RWj^pq_~Jx-j2Yh&|sSCcilvtKuPAB<4``+j|dahtEiZHO=i4uqXG8L;9+VXT(n{%Dz`YqNJ3`P}VFt6{-U{6jI!prXWI?wwenzMVyGtLoBK zmh1U?gq10pFA}9;$Y`&I5$xo{i-b9+KI$T`E_yU-|qC&a-3H=0Ehx=l$e=yX}f$ z907xrEtPgIMgwCYsa2{&gKn>78-qgb;ls83xy1WD2lLOLjEPhSH$Li$ph$E$Y|$Ox z)so)jZCtQdORqzi>sP`J(8CPOtkD+!?V5W2F^)7DQ0y1lvduTsW*u^k4L411dY7bd zdv{xFdF-8g!A%?MYIGl{!o;b4TKh4JJurtdgmg)xiA)S_=5ji3PsrXH)BQTVj>5a! z0n_JEID_wRtc?%Q%ebmRAsTDvJ9T;Adti7GX5O8lNy2XM#)mhzM!UZhNhzym9_KDi zk22h2b;<84U(YwkxVSEBYDU5Aijdk{aQ>lQ!d>07fFTYi=|z3EN4*O3QF`jU>vE{lTqTW z8AjY-ne}|iu(PLr5Z$pzgLBK4>N3XC?V?aFc9rMV$dS$r<1a#W+Cy^PzqX}p`E`I+ z-*@vG9w|?Tn%2uEe6Loo6X!@#>M~E*EpLJuCKj^J5wH_>d&0hbiIdn`p%6){x*;Mt z_O;+qS#XuyQ}#5vBtoW1b?GLNfFoCz)ocO#B%c7LTkXAzX8prjcT)@s-n*-gF1Q=9 z=-4cRqEW;z2fW6QZmpebE7ohw@RP{!da1-$E1-8}-&j?}+WK_vL92%oihW?Aa!NF` zN$7LJFZslQG|~PS$9JtFQ0ri3%E!e5<8&F;dN#st?T;Sy5E?P}T29?kLa zi<`=_+nree7k+sn%e$G>3pNgj22Wcy4Ks4c-<=pPTHM*!D3yAd>v;d|pxTEo$B3W< zE`)Zq|Cl)>!)RgEJRwv?oYJr!_F#57R`qyX_$~48qb_A+%1Qn&_oY;u6Q&WZD3;?b z;kOTegYhW)QAr@jO6mKB!l+6ZcKMsznHgAYidC#0u1_nMJr?XQ#dtn_CWN{JeA3YpgXV!?cz zuh)DG(_2;L2q2DCvb_D#1a?=)a<=`tG}Dn%pq+75F*F|=#j~busWBg-5N*#@!dJgQ zI;*5JYnohUGM@X5SJ%3bu`nq1knW9y0a&{*#uqA`?n9le1sf@ zgJ{K#yD6T@iXCR_l=(b|Vzct)k$X+;tXX)Utex_YiDMhB>{#;(C1qiWzcERA4%)W? zvNd)6BcoK3KL^*xfH~ZvCM3au16ZqWo9J*o+Y-rX%O z3GR<}+6*2al<#V%wco0562OZPMiMI!;2YcJCO#Y0GQ3M8sv`J_FzFtF|F6h2BBP;t zDm_UuqVZo&`N0_+F5DJHacPbz2wO}K7}3*}uv+gnI{-bKXG9Ll+r6NEtMNjL;{0%= z`JxYB1wH;ezHoX(ST{G6R9YtSn<|yo>QGYUo&KR2QPv%IPBYcUBL&d4clFV zS1`Z5tJp=-nTKee+fp+Qc};5a$~K;K@f^xwWD4~=HAk=X7)uvtViL1M%vTz?W<9&^ z!`;KI07-dPeqKlB{4A}7cn7O}q|c#SrL0i)QbX)6O9vjM*-r)lmEA9v8C%=F80>AD zz%EOcsrz-j?qOh438J~dP<+wpgT_=+%ZYT?>>=rJ+grOT| zC?%v3hHgZ?rjGmNU10y zUjCP{wzZn~p)J$|H*l=Hx)W?#O3+slw#OvVOAJq%Co8|j^~V2PZa65k?5_=(`~>Q5 znZ?5O8OA4eqqR)LCB;Vl{rRJp_znX=CP;%aTgt(k(#jkDYAxWnzj`gj$tOv8m5^^` zQ&hTl{G&je%P$JKN@XR~mldRIkJ28pg+>)F3(UrAEDyQKE*(}!d&{L4@yZEyL7 zI4%9Wjpv+&d1TIJx*xp)LZCxv<=MsJx=lDn(S2vyT&1(dZh^+{{jp=>jp5yBMHDf# zncXFfW!$z`02*-L{b#8NO37=7I46yE)m21(l+PvHNUZ9&(T`w` zBq)$lFKX>}kqBv(HgJkd$<(At)$l<)cSj@(&s_qRDm+=E14wY}`hAP0&Jjs9m5029 z7Ne~~Fi&yKx!otoM=Y<-#Qk6D_?ryZWmHuj;BWb@>?C~PP8O?mdYlERLc`oojEN^R zpKrhFfi(^AralkiWRkJMqV^JvgYz!Bs=n{w@jJNLFCu1|;uw3eN-==&o$_g=^U%*t z4s0*CM81)DX2|_CNNlvfy_T|WbL%Cm#|mBb_tMEHZ;wuk$dkS3+1wB8CsVgAw+3X% z9+dQW%oZhFlun06Kf+X7USF)fg%wv+Jzeq`rCYMFET6lMB(*oKRZRij>nLRj- z=4y+66uVkByoW_(5@)$_E?I;=IkD-|X2ma20HVu?Zk7vm?Nb3@2C_elE6a z^Xetk+A&i^AqjI^RW-3PTQyytB%cSe9rTH(8OJ-2yK=1LB)rl*N*F^F74sw{7IfTK z$0a(;$rk;-HZ-~T%8dTrGK)d=s|OhnU8KXnV!fso#HwZ6in#M-s-H;p@G6&`5)t$p zW_RsSDaM@8>SuM-9SRHJ63f@&-){R8Kz$s%auS5J{M;gar7zLX`c{717AFFUEm zET5o@e9k#F-xzM z2ihlBg||Y_(A#!x2a`0a;jD^Gz$OY{M_Y$}R05-v0VBOCP4rWylIZ<BqVU%?ZFu-BHLXLqy5%%f)4D&w1dt()8HNLd0yk6`p0hZq)VN zD$#{y)S@0b&+#fj(-O0ij0%-t^I{+4fsBPDyy`&v6OJ`9GlJ+Daekuqu!Z^AK+%0A zW`FvpY@$qb^3B6*M?a6!JqatsW#3(fh5{iu2duOhIGbs-p7MSv8df=$pdeQZ|JoAl z%7&KIt91yBZ%s@2HjzEHkEa!y7ZSx9-2Ik1`7m@;dUUnWByv8MS-xOzkHr)x2InPz z3*^E9McB$G^)jB9|icyBboxVuCY$eMQt&1A(Tj^{nM!p-fYk$zNTEn_HbT`tZ z(>y0dQ|?(tjOwzM&Pj%PoqDso9+UN_PB3})vUG9UuSoHiYgE0Rbw3JB8@A9m{f*St z?t39Sl$UmRlD_b8@1`pB<;T_R+;gT6l2F*kO6B5mNzcs%vMOG4-dwD;8KcKNXZ=JCjVKd> zL~=ChKg~2vTufr0g-_VaIWD?0-giZAhp*oYY!e4G5yP1T%PnrUi~+-9TdXG)85f{0 zl@i}X@66pMlk?+7yZOs&RiEf|#mJat;1KfVB!|>uFNj_6-8Qtc{De?}`qk!bkHZVe zJd{!I(#aE|`*;xQ=~;bKu|zmNX!zcjga+A0kRA)O^zi~S+*1gNbYx8E&3!zd_f(EE1~8cthsZZm!Z6K zP4tyY&m^SSAIgK)7lmMvBR958?PYuRCDyOIg|<7po&en=2>m*aOTYwacJsZE?u^04 z@;N3LGn-7w6c(yr=%|ak_$boJ)y65+TKfXOWSNPafj+zblck`|uS(UHVnAdCFFYn|yw(qlGj}~fEVwY(D3Y=Y#bPT$v=&$Qsi{5{~>3vj5LqF>fOVy5||D-m` z-cLz6LA)4{CoFQ0IXm}|`BSkqDI*6AK_49Tb-)iTa+_@3L9U!{G}}NY)T6PsZHIr> z;VAYA>ywojx$nRp6>{(^JYz0E^z`LB7Nek`PqQ{;KTx`!Nwl1JQNL0(KO`Y2@H%%i zi4Gp^Dwy`79OUy2vJWvePh1J=`-780axdZZlwmt< zUNYR=m_8Vyc`Y{9XzoUbII25?O^bFS=io@t&+ed4-ct&y7H#FU8^<8M3rWIfkC z8bpJZGK~VFY0A6<4n)ip^DitxsoJBF_L#VY<(-nDlKYNVL6paJYBV z9td>qg?$FN$-5?$q5GL)ihp#^eqt(3V#Ik*tcjBnqd&a9Rvai{pO6U|qt#M^xmJKi zP#tKk9QIt{@v$g~sc;iyhdY|M9;^l8BAMtLwQ_&$Ui+xC9*ZNbxB(rYocCl^Ot;a?HaS7 zBgnhof7=!A*B3nq$xGQ6iUKl>Zz-;?LMT!#OBzOOhWSUTLC!QYtYxs_X|?W-FNIQ0 zy4tta)wgm058aZiq)CgA2pzQ)#XY|+n1s9n(xO418JVL z?H`h(ugcGDT8f+tcP(d-ZSc(Yxg2CV`Rq?Vhtcex^b`&nmFPJ#og$Si$V}@=e^SA9ElQ$!mo9=i{vSDE`TC?Bv2eUE2 zRKeTt+sivB&0HR0D8qiZrsHQAEU~D%l4w~RXk%_gVna*Co~nlM7+BJ2%2me5tzC)l zfXX2TzI0}&#g_486|?|>;%b40ZVeT~GVQ)qG`rO`Z~I$u=7XXRx02SqYr+w%iV_~g zwB?|C*Ey$st9VZ*fswR+Ktk3Jbc5d*W9aduwqz}bw9y@04-~?*ZaKu!dr^W7K~4}T-2l~G^)WG9DrNF zuJX!4E#t+-d8k~5(1TdWd~c(|&RxTFNUieO<-+fV zDcXVr2sxSRP&`{;+!NHBvhyUOi)C_bx>@85eZ^+=wmZ_P;d+fiHPxIqJZIRjC4?<# z@SLv8z@5H!`6?EY;7(toCn8+AcI$djh>J*A_hH9bue(~tcc&tqqg&I~YUm%&ZFjr} zv+JDIHlYf}{hTk?xEYq->zb#Ow?yYK&;yM|zu zdcOB#6LZii4Y}ZXkwdFMcPE<=@#lQM1w7CF<`DBY%s8QAvo}a7wox7TB!aFG@6T4m zKZw_YCmOHWZ)EU7hvDIe7=Wk>#brxMsQmIJ?ex+OS-B;LaXvkWkTv!shVa%{Tkb5 z{ndqnjOIhtHti!)8x$cEY-p8lwl-a9_OYi+F+?q9oR$4&>hQDCxz8P&IfDN02#~kS zzXZ;&r^f$)z6_w#|0X`Pg#jF0VcnpLupYEQS`l40%IBJ(mcNfME9gad)KjkBAxuqp z6CHkVt|Q3Uih&9#iX1I=2dX)@IP<9)dybZol%B!&QYTLes)pR3dYv9tKo?=(Jkl7l zUgmxcS8Z#Ac&_7%o_-qqF2cTpWa)a0yj0<=wqGv5+&B-kAIGFe+k3ivbXeOT$qe)i5OI z4HFaEU{}9L<&7^YA}r1Iv18K#0%}NaaNXZM(|09d;D`PlKB3;&(32&lkLLywYr;43 zcbA)`Y+$l?BNP`Y*PTI;(kAuzSqh`G;z^(0{;|%t1KfxVTJ_LV`w=VWdC|1uD8OKWjtNkv|JyTu0e|>oJO$If>qHf%3Lv-M}_zH@O1+`N8IEPz#1_Qe|AV6DF z60<2;uqS_M;fm-R^V*z3zI+VIMxa}*{OoFC7AsbBspdGj=TwcImtU9w66hD%PIk!3 z-|U33;NhQbk6iV5c%bk;&Y(Bkotnv@SAT?AS5fBi4LFz^2cNwmiAUG~74M+>9=^OI z#1ha*1$`@%#}Zr)E^Ob)RMp9ND4d7E@-fpT6Vj+f_QyJuQvqTESZsA@C$RHwl#vGklR~EQ{h0jDk`p_NtX6fLwiaN{lifwI$9yrx zuUArmO*gxX*q5x(f3w#9TliH_ z##6!RpiA|FEk3B;WVLwaq7B7}R$_a^(}7vVkU&ONh-3kY6v@%bQf4uP&=e8mU2EyM|EKNgAMXovo#1E+zGA_$1v$LqgUhbLWNi5r8EX2V*V29C zJ}4iVXl5+VtIP67$tf}ZhohsS#9FNf^i%IJk^YBQ{ON#+kp#Axm?2m+>3{ene>gFG z-V%WGN$|n=kLB_|*)zoG2y<(MWtef;O@Nzds!08;tlpjQYYY~XQFrVck& zBL(iB{EWMKl0HB)PjZ8HT#OnY%ftJRGuuZCB4P8$9>uJO%DPzZuHAwINSvdv+aBZQ zJJ)+x??qhNa(vWGw;qI%+1n{R_o0XYW{Q9LO~Lz1vj(I*^cuiPbuZ=;d(}Nsj)eby zX_Z4k-6YzmK$-q`O7^c#i+^$sfw#kreBLUz{GU$8ADWivN8nCb8e@*e`R}LrIo+GL z2$k(fP&EAGCiwSnyCehdDE=y3lehnn%>0{=_)!I?!fa>?FZn3^p~Ms*1b7zz%;ZGj-mgr9Ya2F23r97K6E~s3!rj(-LS8TB#+zq ztv$u8a6UmaeOYqk)d2PRoWmYtC!(C>cAIng$LeQ>b(LB18JAff^=S2LgHa%lD>F~U zP}!|NeYs{coUdViHf9ZmTyFv~^}%-I;XIx*Ag|QuIgPjGiO_>#D2_nWpP+S)A*gu% z`f}ZgWx)=D`PBY8yhUg%d*1iUiIALbKcZN19v=fyxg?Tx_WwK17v{bGr(b( z%)2hju+uqO>u6c+aRhe;;+U*p%@SM3!;`&LHHJ+9L5hibD|zaF`@!0-3UWs!yux~N z#2P62Mev!Vaf_%|$4WDMPe2#FNX-C?T3H6`xcGVK{nhdz_YZFo;SQa6f9@SV@Q0tK zohFfkih@01_UhRfuQ3KS4GoS{ss)5eK{m1eF%v+32u)2dZ3pn5xwHq^UY-MW&aVLj zeTAP5*RtR6tPf_?knqH`w!BwFkaF6}* zuUxAM=4c$_NK{!&J6&W@T#x~An3)h3h8X6WcZ+x2n3xKXEJ{u?>4!GL^6AU~B3MmY zC*#}U6?~!Zr1VarUP7n8TBctmS(D)(JlN~uo1I$m2DvyAn5?CHBO|F(-b%7$fuReF zyTI*Zp5kGD>kwSxsoh>tD!RcpVkm?Kapfc+=Wi8cJ)s_S$z`_GEW0=zZynZ0z*f!v)6ooYxW`U1a$=y zh6KDhzv$;H-@jW3X zYk6Y@ngXICE0nQkIjEz-A}eI08O4PaV_Bi|`hdyBxC|QD(Q$8$!K{G@sgSj|Vjr1^ z!?9zS=6;SvyDB^XwNK^;eBScDa4&h$QThBRJBsvtDb9d0M5P7*xmI;C)Y zfo3T{7cHyrxv%lswS+U7Orf*ZASkkny{eH`ThCfbLzy-k?6!w2`*Qy+=j{9k*IxP=(tzZYO1I57Pp#EN!GywAEiWhF-l zCsyXceG~@Qtm%}%7dFnR4CQD%%)rxovH@zG5hrXZ?WD9^XS_@ASru&Rx7%Pxo#K+Q z6kzm6aPvxc!U8GJT1}T5okyxvz?Eb^PMV!-}xF)Neo0tBI!^HLp z!^_0VY^DX8e#w)q22i@0jRY+xDYDmhH=m80rtPC5f4u~vxeE&Y<6TSOhj|(3Zw)cvXS@Jz>z%27AI4wa0dPT(6{i(yr5>)3rWg=abY zm3DQcC@G5JawqVBQM%&F1j*gGO5JCRrHYVUWY!JVA!mav8khS2aql={V)Ktq$v~h# zs87vR9lig&H&r-=gb4QuRaF@)L{*lS^!Mb8MyE;(NXp`uch~ExXT1c21Ps5v{~?qz zAeFMD-1#so5L(uuDtQw1wKbZ(E0!&I7QWL}FsvMusaVIVS`n$|WyABBu>zybZ&))H z^gMQG(vnM|c=o2y)Oa|P%aWP~JL;DFTeC_<`=YdH^?S)O%^D_#6#DCpya+A#uTod| zk8W%JtGv_{>aI=H?Ch4Pp!z!v@cJ-MlUkxxYMtC4%az?2e~HB zz>ELb2I)rao@RZw$w?8#Dt` zu|Hwo>H9`L&rBjD81?dd33bD;5nkw67^*#ZQ6wgSne?F1Zd13hoJLKq0*i}uNCPg9W;zr3@(;t)#V2|X~iBXG8U;3udA$9|>CN*;W|T{BEA zZ2q0qFXYsK0YZ=6iRloCkGe8v&X6O6F&$!0Cm0Uta{7fc;**-*BANKo6BW0Z-Q}d$ z%V%7S_y4+FjCU^Y$LvIS3_#Ohy+HfZzIHa&XJQu_6F@c{Z^o(aDdou(1&AFJ=0%xp zY-{DH=I1Bb$$&6kxoHm!%p|FA4*aG5ybPFD%!^42HG4<@%31@>N3$n0Xx-iAo-<-f zFi$5rjrO8?jaJT_&}JDF{Y-L&rQw7{wxg(Dhi!(aOz(?x6;0J_Uqg!XBK?L57UPNu zJsPPuBm`BEBTPes-m(v=nLqipklwPzN2d0}(zotHV|7g?H+3gJzo@UHC_d1xgv z3i^A#NpQ)HVs};fA9u^n`<=}j3)w;*nD`lQRn1h>t}_Q)wi{d=kM_HB$lZa`=UKtF zjZuWbNe&gxa`)Axp=}T*<_PSYxHYsEzJG;q%1l=aUuW$k4i_G~u8npzYkBe@$0F&x z8i_&|%9dW9DYwd1*L)-U*+HXibOQtze+AqhUt%yE9}H54);dsFVj|{CSP+^xL9X_0 z=|y(Pk+wccBC3);k)T(~*zRMX3X=_Y0)>rBF%B${UUj86&45KmVIDOdYE4fyb01i5 z4I+xUELvS9t`WR!bjvQXi0jG+qiN{sQ(SCVDvV3*ft_5^u3}BEV7>*i`R@eRWVO6_ zX+|rs29AE(qgh}Tg4Hj5lL^9CNVF^yj#>(ierQnw%FdrgBsKNO5hZ6oZ z5s##grDg26?dHF>dFZ~|8M&l6n>@wR@wQ9S{V1L%zWJNbuDrJ#3!1(5M+R&&+t`Oj zbV${~ER7(z;A-acke$`NFb}16E#~}&{bKsSd6);XR(2=gLH3~F3t0lD*@{}_&1G8E z@Y7A_Cb@zSIJ*&932SB<3KGNFsxVa0^C%nz73S3jo1hJelwdi)D5$A-g}D-c2e6QX zz&OQ)hs4M`F>)G%0w2_9rIlBeR1id(~V`YNqJy&OT5xK^+u z?Y*wCrybWl&U%6MOlS7`p!lcb+ADa20@7ADX&`G_;oh?>HAG^HN|+bD2#(Y zpH1QT5*Nr?M3Aiwk(?ibd zH8MdlHSsY4&6T+b5%~GhigbTuG!?Mrsa1^1)DW=Bs{1o|;G2vwlH_$_kP%!83Q}N) zz#{nk7IBGS0s57pvQkvqqbbZK(P1?4;|IB1R!A*X7?pmPMyTff&IyUA>Q}W7nB|&p zd&g_8z^03FyqL_58wkjg4#NV-7X&H_A!Xme5INZjW)?lyAeE**DcHdBK^gAA%%ieb zeb;6ZBx5fF6)acQlD;0+e1c7sLogd2Co%F_xRf6g%}+Bj1E69>wnqX5`N2qp+4q8& z_ZY5K6Z@WMde?hIkHkgH#EZuc3*mbnXWoS5Nvz5)xxWJ27l6Z}BjwG(LEe^RB0SD< z4QiSabMj8+vJWmbDBfKTQOB10aFNEs^4+#Xf=P5yQ+)@6j=XRvZXgd6+8 z@|*#0g6I}XeJ-7=^*BH_PSH4vCfGHw&9tO`M>ZvQc}9cs5~bUZbOAKZpUVh0@8vVS z4;LHVd-7~U(e1=nv6d7;1x6LhkW9j@z zXkPO7Nb1@lWZnnU?^iy2@f1k~^m4~HFGUWJ(sZv8m*MXAEQS`w@8jL|x4s*zu@y8i zG9g+|o@$wP6JdL`LRyKpwBZ#=$=0Y10asQ;j31K>f*?YNdE-jPnIm^;UfPVpEq@GE zSsuFN&>Kw-!%3ip#2Rk9jJw3sFs6oL{JWw+fEwO4+ph|?=vW9wONIg?E*MH4_g_rj+gdfv*nZD?W|CggYM!tNI%C0P zeP)~rk^Ap?KUUk#V)&p;f}4LX)AvH&EKhga%Vi4tet4*i1u#jtH}uFztCV~;@azuf z0#43EZa@8g34{*lrBm*~Zf4OaTaD_2ybg^D>GveG$4Uys_4jU$Azpjf+jZ$&xl(>R z!touw77u@u(*}%6>V#beo-nqJgL@dJFp`}_@QwQ^)2p)&nfdI&ezc`!{v+a$ZRTgs zXvnQJSNeL?R6S)Mka_8>qKLfgK{De~Yo_92W|w}7kz>|jxH@cAV>D~pX1`dm5$9=# zVBUdhxQ5SoiaTz#h}E>>gh90^=-#O4_`apUtBm>rRNoa!=CAIcPQ_frPKc zG_zDqK&8nRwBCPJ^V}}y-aZ6$fognJeW21Txqv43Ev<64-(OJIM+PgDQ2_xIb~<{OhEgLM5Bk$V!sA_dZwX>T=oAkS#J2p#8p5IRXU?NYB6fJRS4;~yHmA`RG| z8a?ZR;`zDOVuKo01?yyEsPP6NbKCsVh@*gI0-`1h*B!`QQ@moR_f>9~c@yqxodFjR z=Zb~7niA41+>Cf1lYw>a$fw-ARk&1MOJG9`&}EAi+h(=H4~{j%PjS=-+*7>SAW$nT zNP&N_p1((GJ31VnXTTU#5Hx)kT14T;$I@6(qn($VmHCR zlDyE;(&!yuG8LUm#n@jCa2#KMIThKvSG7ICBv?i6bAGHbbTALK+qgvMBECf}{8xj( z=2cQtpM)AbKil%=i^*5*rGNfLVFGXHds)Y0lh(J`c*%v_v@ob~)EMkRYOqa`5- zDBjS1e++Gi&S9!#y*T8&|1^sw3d%&wq%?nIr>BcGSAC~ewIhdQhvN_FTH-hgmk9#I zZAl(w1u@Uh^Awsd*_1xFJ|k3`(JEDK_$tOy1EZ?OTtv$2ry>J4Dh- z`9{jr#l+Gb2 zjR{Bugou{*F(4ewAU}hy{~;B#`)8?GG`~yaSldkE`|3_@$LyBShAcdWQxg$N@+Wv< zV3t=GN+N?)(~s=vCl4g?^Z^h(PZv9~N}h>pX+cm4zkJHZI3dhAx*Q3e8PV1=XqegGr}*4}deV_eV1EUu6X9J`x3 zn~Og+QH7D~Te4DXX%U6o!WcAvRe^agXZ5Y0uquCSV616)Y)}iS^W%A)+2hz*JgK0# z!``;UAZ8Ym>Cr~#Kd=UWq{3$)Ys#a_`A`Z5LT6vLO8bii@Ib+=X}gWWt7Yl2550Pi z#=vdCp9I#Q$lLmZvM|h^5HOwZf#Z*HAk@2Xn#WdPoMEPKWd0J|>3B5FRz0O^D&_$mT0!d{=3a=RYpPrmA9V{Z4IX{2I^5@9 zySRb85@lABJ_}Z>^M;|5Jg!9}SIx8)qJI>)A@dhiYSZjP&PO0zDcpB;~B73 zAz!xmA34ZUoU3brsGX4t3)Yd#f9*`1gXFlWxtV8E{ErlB=SE@mNl`sKP9bnVzz&c` z8--Z3ish%$B>2)?m+w~hik!G)1w`XwlF}jp->5|=iIa!9Evd$_MNd%+?;nNQPJDp= zmIO_dsN$mU%T%vcu<|c9b{^C!d-1Lo>?$MnB7!M}rT1gJb&H(J6h5}>KGqvRo|2*r zrO1fZWI8ItJB86x3ux>9eb5X`KI*GHal&K-gT0a`wNv1@=Q{w|dLT=o_rARF_18zn zhN~FKo4Gjb3M~|2*0P}tj82#N0PuoQ#(l`lBw=1Qp&W?Xj&E)C0Fk=MPLspx0OKu& zC5i8#I_&5T;MZs9M{*@V%*F$+d$CEP4uhKbWi)tH5N%^d-ic0+I+MUYfCZ2EC6Tw+ zlwCXjS>#tu!UZOdByb)Pz}O zrv*;k4Tw|{*bj4>aW!SY4xq=3O?Wn2f_LIjR+jeorT8IZlii7?j`b2dC>X%zoYMVX z#_7TX^^P-9lm{n(AFH#G~>g|lTR4+uQEN6@OzbO7V_I03t}l$ z)Fm?7TUO-Iuy~>K!v!bUN-pW#tJtCj*@2@PAdx9(o%Ht2MS0Baumq z`Yn;kj`=a?+c3}@&zY%+WD`T(VQFfX=ckbhzJ|9P#kc2UX}%z>Kwr@P%I+n)=yvVx z>$jamr#bJ}cR0r1vLG=)f0gW2t%1}h`{mApTJ#T6*bZT`b@}TJzK6Hl)J?dT-aqYt z(~5jAFAHdQ5pH%*UQwj>xc($7*1!}hX0GwE(r2dfm!5j^;j4AkHa}V7BJ~Pqz1coM zhSHS_d}(r{$r4Y_xdJVN-aqTg*-z%T&$xKBcOR+)Is_&vWXs3junHBODt;Z7HrCIt z{u8qF7F~EzS|s}g!T~Owe;xre`%!oW#EMV9*hoo3XBqbWhDO~$#e3?mX)+-|=^zfB zIJ^p9PaU@fuk-?jo3aa*N0^_fY$#?u4|?_yilTX;$4RN4Yx;qL?^|8^0BxqG;v=4` z6>AVOO4Vy-STnqy#ex05o(N0Wd_;KQTqnHMi~PlJhEbE4m9HI_F>0JG(krlssgF2l ziuy4~hWgP^$61uQMbb#TTcWLYnJeGZN9{*T()NSN*IRDr&5aWun2-^>UpYN3)?dA9sYfqT z`71gEZAf7i;=ewY(Y*;SDzi?U!pjcaZ%ftXXnO)LafRb5T%9zwg@33`&&oG2>rty# z_XXa*TOaoeO3Y@HY`2n*vn|c)f4Sd4*FNJPP%ir$UiuMs12d;pvFSMISYnLYEBua!>@HZp}UA;;_Oj5p|6Z&BQpf2uD0ORG~M z5Zv4fd6juApv;Q6foaaXe(DAa!h&au#C%h|k|JdsV6Y5*t1s$5Kqo)nc=61T_9^Cn zbGfi~e1riH&+L(_TBr;s@Uwt!R32?{WB$!2!+#N7|K<1uxyo3irq8$>*VJ=vMMxMN zlcG`$F)9T!bu87l$)I+Aeitw#9VYH$BuJZ}Z(}*M@*kA~%syh}o6~hA1-@@ppZ~q{ z{#DHWN8=2WAt^Ir)r>KdKz9E9=lU~=68mU~*;(VWGd})(-v9Lr{P{wXAhFhsXR5hD zQTX7!g|I;X!wxj$4&1MYP>D9W;4ec6%p?KXHRMKIAxkI_Yqav*#kP?IY4gAQrkDn3 zKs1Kp)vG1zYI93pTMOng`Z~nb7|K9HY&$EI{H1pqIa5eEh z(1$1#cji6*>tXu$rx%r7jLonJ`O!F|f-eud64-}o;NYflT6%_$$XCN&y+rK(yp}7XdtCU z$ay)={r_}4u(DWKX?ip>I_05SZB>tMr8t2k6A!pldJx zl7Ts5v{A*7Jmo7Gp6De?NCD=F8RlUk&8G&>2kDSD36O0uGF{fSiXjoj|L>&dk0cmX z(_4Yw|4s${h`_w;f8XuzXYl|1d4omotqOq%%8cmhKf%6-XxHTElCE8zSL6N!AmnDBqR(-o3FgSN=ZUJ{rN zbireNZ%9ND2>R@3bpJ0Bw|#Jx)jf&Tp8dCn=+f2s-_UPPqqZ8%)7@~hEsTn)1b@`z zIrUO=4@PV4D7z0-8?``NkfZ35{RV{DgR`kZu4Ou(UOdarHQ(9*t+`@Qci9B&INRNo zUL}e!ioZ`S=1~+Ir0pv;l1767oGfccugbvUYk(590iuq5G`&LN zVg*!7AVR4T3|6dL>WZra6+9Nb3OB!kmf0MoGy%IN5UC`S(9ZKY{7_B{L&b!>MOaT( z*?^e<2d*;ws%F@M*BB!WZ)Kmh9A3xTr+xh5^ChZXkXV+O;%5BSGr8n5Kr{y0eN(^* zx!lgr+N{o#?gzhnf=-3M`SW1FvMvyZP63wMRE7EA)X_>>8ZTgbZ$RmvZ8j+XW>*)c^}R&*j4troYFRdBi*GVLzI$QNVZxh9Rbqc>@7@l*%23-`7;x z6(ht^4Sf$rR1)(6hguHKAs89b0uE#E7=#3b%Q^+#@vi|O#a}ky>1FDnS0FYNeG*2UkulA}Cz(bW#-r(fu6K1SH%#CO)iJ&nuc0^mbI`<#!2TaqZ z5VdZOuH@csW+|yBl9~oL-P%o&jHJ7Y#*G$aJo$M4D*IKZ^1-yfY?7?2I+2Fpn>mA4 zN6iZGDsGeQV;BliToQPRnEFA93(k`!Fq9#4JCL;-TrZU-np29|L;uN_7?>s7&IC|V zP2q9W6VUIkxM>a?D)Jcs?5@Bzo7f*Z5uNIeHT|FmY&L@~7`F57f>>~Ykwn+s<<{TU z`pd2>eXr-5{k$5V?@~}$S43RcRJ!Z~k7756(Vz4}2&REcaQ-LlvMjVugdC&--qGdF z3ZPH$5cp8lSNI)z5VsrunRS^3ImIuHrYM{0lYJD$Z@=s!6%x&{dOD2qOn@Mv&&)o( z{nr(FSWXOu6{xFgK9|5cFjzEmo9RBNCiQ2LJnR+P{m|41?3_~o>9#QqHTRZeBa6Cz ziI`0>sssBMm?CQRWfN#=oXB-;pDkv)0Lxt{Kbk;Xv!TWmQ?EugsA5%Pwt$>LdoZj9w79f@Zz07(T6Iu~FUm$|W2 zux$NuP5!+fh%I2GBGkod+46Q1c#`b-#trEjvZ^wS-SQ>FU+`n76DZHX^WYj~gX|oj zn*2*BBFpusP-F>6t4fyEAhN{e#t~WX4;TW2ne-M5_}Ehfoe$ho7()d%U~E|pVig7` za95Cr&3v~kjpn!1%~nd=L|X&~1dNuYMreeg3Vq&_$j^x}ez06Yjws18A6<^k4UzxK zTd!I3r&dI4<5s!{q9&4syMYg;5DPKRqqW!ni{Pj}WmIx=h+Afuk15V#=TVWc-%zR{hxgz;^?-~}doT>3-n|Z(u4(E? zQ`S>N0fX(d@*Mwt({%~|o7=eByU-%jyqjQ0GmQ>Nktxk@2%v@Izbpgw{gblE%24l% zli4%p`~IuCjzhk_-EI4!C@jTy?=XAF%tc)5?jmS({TXW-(|p{HWNrT~8bLpufB%R} zDr|H7sq|`#SIQKu(=(mpZ?!cXsrBd&grWl*2BEl| zA@|a*GslZrXFv>+l2PMr%oH(iH56DD8XY6eqR4%>=yC-8_<}iW>I_T5tYr)2*0qJ? z3NA$xxx}Z{LQe&@YQ=B~8Z76;CdS6z=mx!2ewMMNy1J(i38Yy{44hDAImZkBPw{s@FsP20m$f3^>gey1JL zqCRVrY<0ffCi>PqhESi>z{1tSTDb}Kj`Wyx!G;CACF@0qC7&A zw%dBgxaeclBIHbrdw7%23PxC`Lbor+OywlNB~8@sYG^(gANKY5K~Jr(UpI0U$s`@E z`A*2vNX-eV8|ugK@ihQMRU)IE(j%XpT=z4?Rb|o?$NTg+lu2Ey2(|xRIch=eka~Uu|N-hQrn{>|A~xeLM@xB?%%+k4M;} z3mm}s>m&n!A7ra`Stnt8-znYQS~dWiRax<4%-I37VV`E=8{`TWQ@+0!WU(beZP61A z*CqBzqJl>Sp_RI;9oUhQ?B>nG5G0BI1J@-ZSEeH5mjPrn7xF#*PcU9Vx}+uof5x`O z9%&ls0YW3kZgHM30O((p;BnXu?4u_Tw-}XzF1%7?-OlI}YeTIocae-JdI0H*X#EDF zG6JbllylLsQVw@Vj@Nv8nj~%pX69y^9E9w4x5ta0R7n0vvrqKs=jnHgr+6US59yMk z1$dbrbTu2G5@j~_!9zB(W5gOK3)$?9+%fz4xM+X^1L^xfzrvuHJT?}_YH?on757Zh zQcYnP8bknn*?}D=IU+PctDd3owB=bzv++hcT85}PoXaF3`cc#Ia0!i6;k>@{w4**# zZiQ+_N2CJHw>FrpL~B%sknX!f`QKQ+Nw?HBGFZ7xsq>s4dF`v7MC2b_zE`M{ds`YO z?s_5C&r|M&fh1+2lx_uuG1w&X;*oogW3h+eS*Zj~z00S{7AZS6OV@>W(lx%$Y^-KA zuKWZEHW>0A7<+b>jsda-j$paJ5xK+rhk;xIutMAMgIH%4}CbQoo>9N zb+=7UU{n?!2+jDRTM#YZJ^#75{DDMQc#V{w!Z-S(*_ew-+NJlYIXx(O?otEh2s%F| zv5HksMpdy6BDxfka<4Tph!1`LX9mzhXLV>Y9(jnX#BlFZ>!kdHCu%bYIjurlYcr&FRQHHN}0_wQ}$G?^eM3Xw_9aor@|fb=_K9qp5M5KoFQQ34~_SdyTmYJ+eJC zy1>8Yv^L!(Medp^<7z}^saoX=t5S&_~pF$P# zIKPCWvtKr28)sAZUt1^I*P)k>|8AvgLRO}!ioAzWc|VdPViH8;ezI!?>ai^li&_Nh zuje*?Y`e3@VcrDUN6Rm!%Hf%=u>jeq7YWbLS?CK1l({R(Ne5clYF?;h>?*et7o?i6 zaGK*FVyoo0QimGg;6G8D`;G)FSy+099(qyjdlm{z+u_8}LC_1^EtW<8k?TxQcQg2) zW@!K_(jkao$%us(gxve$x>oa|l=>gm0gB%E%fo8Ps{g4eNkk~_aNdvAyV4*}M*mXx z8=jKbteS3f$Z(~(JEN+X`8(%Z-AitBAP)LqvsE#uc&;nk`-|e{>^SY{?R(KIA)3Pe zTbj{!p$zGkI7rvN&-x=YM1qM@NyVhn#kGL8|8eeWg|mu>iG8-NNs1dVSDOSi3*S&@ zz1$cOWL+CcBBbtSwsm_0FR#?6P}B=B&ri7g+}(Wrh73uN^IU)$HW~zI;`@#Wp@`P{ zdEbnXnW(n=Ab6=hIqLP^9JIhjJ55?^nfl1ZhkXMY6I923+#g~Sp`fm6kQ~u~8)hdBVPuxvemETwUc*u6 zjN6q!cVc{a@iXOmGTHF(1&8Kmc1Aqj&;Hbm+MlRtR8*qx&>bXdh1@$yx}y_qMzl{g z6FsWLS`x?;#91{)YW4mOp7s@*JA@PsdFm?Xy<3q_+|$NgCpODZDz=V1oJ_$C6`e-s zSI*0+?%zt|)-iJ{%TBC+3?2YCgMy&xb=6$RGeZ+?H>0YTo+)Yt4EBMA#>(M~8DCv* zEJ}-AP~jel!ek42PTeHgZ*Zqx>Xld+AD)ky6HI8d3>8>o40{%=)*UoO25)U5mFLfJ zU=jvRE8>Usz@v~d6XFCGaA$DUksyU*5{LtNNGG|z%NI;(ViPlKxVK=;#t!d$ZurnQ z0CHaLuGO}?6;&u5-Bh}9bKQ^%T)W$sk*Za%=~{097k*rj+T$!>v&1o*=^-PDc2zT{ zyoyT$bm!E%<4?LWn%}bO=)MPSqp7-ffnT4mOoOI-WWyWZ^6Uf+SNgepM};6V<{&~E z?7;Kf)wEiyz;Q%w0;0W3UH9fmZl7_Xu7EjwM$-`bd0U*`Y2J~0e~dn}Qk4~A%pV1T zm3gwW{Dp7+_lO6dWb=d@V$gM_X zRoU$*8Gd&#I66*laA4xgZk+$ScQk~*^)KBy9rE@cj&$WHZ&c8N3b+)a=nfuldQpso zDveodB-W{UOr;lYLU-TS+!%%|Ur3F3K4*b6DO#KbvB&w5R1>!Sf~A-At1vrk+J<-v zm$Jya!VZMVLJf3bORr=u-wT1(Z_1DGvQ0PjSx6dT>z)?&rL`-tmq5`NlWK_um?8;Bu`wk9iz>{Pu0b!NZ+MuLP%#L-AX$o63vJ%1 z&Ykgiwfs?Eg-va7c+8P{>wISG<_eeGx3cie9zqg{jlmBRT!%icpS+ev5(!+>2);P+ zcHMk}Qd*tS-mZ?Ah)~jPl<-Aw5L?f&M-+$;QZ(CoKBiRoMb#hqXmzG!Tal91J#BNP z(|GfF7-lUd+p|BgFYi-mUCZ~yU_Qt*(aKjl;}L?Vlruq}5ptrD?0p!4)3u23CjtyM zCb+5!Z8ZJ9Li(#{g~vo> z;-Wf}9Ex*jL};-U!AtY(iPM)RG+(#v&Olwt{C=z&{fl`}LNAFaVWSPbAACvgboucNu@oMM3`dW2UgbozrqTVkzUQ$e`Ic9ctkC_evO>ipBU3={A^6@xr28 z15O_A^GYtS2BDy!v(?0T3JMp7D{QS{u*Mou>**56$Wge&>*m5$8Ja~)YmInr`Pt&q z+?|-)43m}gJ@jqBd5xu#8p9cDG3oGv_htJiz&=AT2u2dCz`3wX&D0Vo(Vb~No4%XV zvs8l4(~`;|B@ug@4I*ycr(xoh$4~qrj3a73GeDT-&VKb$gGu$1jTLqnM;Y~k^4sTE zrj(c7w|7!EX*H}CnBGQ{r8bZs5hPN_C&=KN1%JN4K>w;W(CpeFn;a0^^8XNb+Wp+V zOaQ4fyRADCwsrJtR5_J{Qxw(hYH){2I@k^zj)(GZj9B!s*ZbJFjND05#CMRYAYUSC zvIAgvMSI9jKI@wNwR$^F3Hy?6)$L;CFs+a1%rxWq(QQe%?X+k*-E6qsdowsZ-)2VU zrrFS~mIy*6W!m>aJiF7=FW(&BUkP%z`Q|6Tq(h1Q;t*IQhsh`5Io4KH$?}s<4Uri< zlPn!$8Bl~7Ju{5B4Ii&)=~38k7&#x#VPhyG%$e->8JRDW;2VAL_~hBZ+{if^$HaD* zyZa4s2h=Q_KknvvjNXi=3K5pqH-an?WgGf#9E&t8Q_TI#w=5DAorGU4LrRjiLGzNl z6wm7D`lKHvU8sPr0b3ZQeX2pbsEzXL7g~aSUTDMbnRS}3ZAlQ$@lTn^u(qbVqFi+% za-F(0cN%&!u~;_FY>oHT2W?m}`V*kSQj~(V8YZB!yJ@LvLpK_yS8X%}`rRYWoChzc zbN$C|2?MgV5H2=Aq^~^sRH#v4iXWwLlv30w6ig>mOGMqX0TmAp%qe#1fJ?5APogq+FBZAF-}66bWN{6 zk#VklHJfKDle-Rm2Yl=2md3yLETne#&Q*9mC+opSt<2eS8Ff>;YtAa)LUi?mCXq2m zcf0v*kVmovx~}kOk5r6(rb&A*6#xyz&RwL_fb|bNV;c^ z;hNVNy9BG#pnqS1!LoSydKlvAw?t1b)3rAWF7VTckj>EuUUj5#ViODwb}h>s#btO) zd>u=>@p#t1p;LNL;%m|yC{STBiVP|aGE{GC#rKBUr4clvL7)8wT3fN#8dm=s&&C1T zL3{Og;nwgrH2jNBfpT*6Qw}v>ZmWsLfK-W>w>qLOQ|8?3%}%xzOEGDu}o5mPn3Bx)C+I3f=7*jpypol1>>5JP)hJ4jCwsdVR*s+y2cY? z;{tip5`u*YGuL(?gda??n7+qSEkA<{F(z+LzkHFwkQ(!0P&weR3Mu#>7c+~YEAj3j z8m0N1eCvX2aR*QBhdX{H%a0k|s)!r*9?qDoT_?5wqrmG%V8zmUGSeT5Ti#n~q9yw! zZE~vn6*uDXjVPP-MR~+hoETBZKN_1Cs3dgtwkbZy1t0F8~1?o<(QwpqDW5Zn7v2&$r(5Y$(2 z^sLjTf-NiEXqc(vTx(@X-j5(WiojxN6jinqKiKB365SL#7EXf7Mz}q1B0Wmp%$3OB5S6 z(VdPJ@^~?MsEA`Yh8?(FtZG)C+U5La_5xyKMJiLtZ<-rT3Gx$;PUHTK6<3~jgu@+^5;JNPZH+m9|~W; zZ^D>3_b69 z_~-5U_4WSo`S+h&oc*_7`WNSL-x`C4;e<%rvvb5x_z2EjVAgqhnbqKV5HYLC=hrmT z=hYuQvL5Oi!aSEj^>*$4Cr|EE%Utl82}pj$jk8JG-ihIGs1ki^0~(Iuh{i)|;FX0Z ze3<8_JCc3ohRO@)KIdy=7DuP?lX9Xh&ds~rQdPxpxN2nlX2#SGo$GA>jzvicd}epA zL)YLc+1oWmjqy9iP>x$g$gfr6%PJ@S`m+D>8~IoeV`T9MD8k=gTlhH76qkl45q~yD z|Mg?r#UVst#Z&V8FDBM5NH=ISKT-Gh_lXq`5|TEI2(8~Q6>3d%<1q8COC{O*pWvg*VGW(%h4i@UnG-Yp7DdNDHxm>pVmosxInLW+;FK6ZrxN^U&tN-=N zeUWM00!C@*)eyoc$;7CII7=7-Od+qRSXyw2^Ikl%M6X#iQAC!x9qe*|GxKd5gB{j@ z2)+a?jIz9#V?km7*?hX&a~ef#gpL;HL-}^RGxIt;L$-HCeQ2H@`=p6^not6k87QL= zsZ!KQP5yoBCTgMn)_Y;`jGa=$v= z|JYpq{8xM^VERy)wzL25h@kNQf|OvxE-ZQ{_V(}ZJ~9-wMuRM|Q0GTU{;t@M5CDSM8j^8FVi9 zwmabfId~Y6|JcXb>;iaxv)%BS;@tw}%a?BV0xo=YH;Oq?6@;9LFHbf6ekI6p!!MWT z{a|zM_gmgA4?q7q%sP$dZUXB_((>T*>xV0c7HU6inE~VIO^`>(2Oxgj(A1E>$N6K>XQb)o|l}kLO&==+0 zXqbThr!5@z%gynKun3|>C#gHUxi~y%iWn~=uFb}|>rwuEF06EH)i357S2L{z|Gws>-sZZ62;Yl4*tsn`^ zsB6R&C+OD6=H0YCqdGEJ7F|FlQ`B zU?PMhSz2xULGw=vCLA(4I~Hdpsjxu)3U!A;4vDu*kf|(&D{2_FA09t*>n)6@IPn|+ zN42Rckuev2zgN@UwG@;*cF9rbSDojX@@`(o!bd{HX@;6dMUbLcYaSwO4~(u6 z^-xgUp~Mscv}qWw`Mm$$Y766d9ihuU+}JW?RH4IGrc*dd&NRuA6S#iY()IHjVErkt zN;D&N9&7sI(R-4^FJf;XQ;Ut0{u@7?P==9PHs&{dS)9W7yi&;Y#}8+zA;0&QTHZKd}ztmVQ`baK|xZk!wxx6ZXyNc7k;dK7|<1wGw#u#zID zw1c>NxdBF!WO((1dZAOV=mzR#vtJ*mm)(>ireHQ-je^u$zBL)DS4~S{PHXx`C@w|w z^M;RreGYH0j3>VYl*>37pIqhHLqfLM|3SU*k>YtE-K&mLnKUj@637V=ilsoe$w_il zNo3T%Vj7wt&?n|p#~wvz&0JO!&)ZPHJ-PXMw^F-PJ(h7G!4pM$)@jOW=F?A zPyd6vaMdm!fU!zMHsoNE(cRFB8~;bZM2{FD2ERb~88B)s2)zH&AD}i?8s!;E#JhSS z&2(e+N`+p?OfjG4}ulqzSAqbCZQmTQcG);;u5?esuVvNjA)${ zdOCm*ZjRw!6^kF+0y!>ZCyzr@t8~EHKA6H)Mz0(r0)dAZZ9*~k;m1aVu`x*~Y#~0F zW91HGfT7Q=hl-e0%%ln5K^PHgRqZ@~><2J!WPt0zdoUw)I=Ami8}L0}0y(~2ppv?h zqgraW>)d(4{>y1>DzxuUqe>VYkYryEq3G~Z%VU}(Is2xL6}`7tXKMhMi;9T)rch3k zx7|HE0i{Vj2o>?kLffe%A6oF=^2AgwC?S_q%in`==nju;7owh;I%L~mrt~>{5M;d1+$7Hd&Z6XsTW!FRjVpHr>LNhO#tig0Hn16=JsU`| zly(ZqDlOtS+W!Iw%?4w>69Wu`h4fuqj_3|%KHhbCs?I;=_O3TqA)%pH$RvF08^ z-{NONB6r;bnZoimcFODB5~bX_HCtKzN#|8A*8M6~Ljnhsz$h6^L0ky2p8D99b@5ph zLtbqYkkb?73FaRT5BBz4R(m}>$*Gu`k#yrbYvy;0+{)V)6il`wS3roVUDXx@G_F>k zh~N1mtg%%J6$J zJ1l=;HOA*m7f~sO8myi5S)T0&Nw{xU2`hSjD33G+s5>Gq>v5)@4-^VC7yjp4Oh5Zlghx)e!zLg0!qUEU&Xx!4|fB`oY+no1#JDW*3} z8fnhhSa|Dkyef&GP%{dj+)6uLUzyo#sEk#Icc)3}1Kn z0f~Z<>goE@you8koLBj5V8q!Lx=0UI?(+>ZR+OHE5c_b-{V@GY4b#Ke`9H%T4TR<@nqo?I`MR!q<}I zrB%Fh!&fXjXdLiRvi$jvp0q?VZqbs_ZNI=rli^c(z6$v~#hYxAJ(Xv91k$+5iaP$W zS_Dn8QOZpjIWp@R3!*sVSxRn$>}l>YWpt_~twf1)63R*P2K5ciigXe8CwSVzu3yrQ zTFs(c>8?szOZ3GQ(7K&&$T}tb(6RBF&$hD|p|S|J zxU7Yd2|sUp0S(jSQ=V#F@1(N36%9J-srvkPKBqol3U1*pzrU!U*m>DjrRN>>Rx-oZgGfzMx~of-1z$ho|<3u);Ar=7KRyYm)u z!qJCr@MM^mfl)7I7Hv)ndz8;H<;VJ~=kB-8g*20$hBY1Vh_J%&P$+51$3= znX(B^*6$IOLiWCKv+Z-t(6dsDknN3h-ZkwuvXdYrx+|Anr_te6phh-{Tb>nSK(>n% zBnymFtFkSbQKw;9uiPlrmpK<}(?dDNuRjGJ!}jTZ3s9Po@UsukPhN?Pr`QXP43);dn7EC)>^9YOF3`4!{X0hwafrlbRUbEm>ZV zEr^%!jG*wo5?C`OlNE_J2`C)*7B;wuTbl8@>5E0uaI+hl}tVSQTtae^Yr6;A{grfl&9|I#N z`s$@b6325hd#4`_upG=iL)hNUA>_2@Y41i{i2m}IQ=XI96`u$;5yC6T9O+}FvnzJR z0!RErh9d6}tGv(Gqwymv(@e-PRoHPtP5P|N!kK5c$Ah*kx$*rc06Ty7diuI58HLWa zxYr6l!mCr)EC`=ZH`YPJ4=j#lw8`+yaB_u^JJbYno5}Gwa#iwwJ&9DvTpB_}
~R??$f^C^gc{HG0U>`LkCpJFCBO3xv93v0B}4u}5U*3*fvp_$tQb!L(GykkqKGVCkqmur z04~eUi*QddY+TywIgilK*6#98il=E!sGPD5mB~rI;W22X`?DV9Q-v=4G?H3q`c$Et$z8Hg<IT-eLz`Xn-rXd?Cl6i9$p|oH9f9?hIZ# zNA<{)Trvf#p&;XR!bid%j%6!6h+5kg0H*kA6^459alYAn;;dMz83ytppc0athNXz< zQX=x%!NQVO)sm_8wm@i&3P)no4m1IK_46N%dyCI2_16sy&^Xl@3WI5xPDsRjyrrCK ztGCJ<_1@lg73w&lhVTT^U>x?jLWQ$oG1Nds99Q*7-}KIX%fF>^n@D9tXUu$DC4k6h z`63CRbkWb{%P3Lozq9}-C11YS;G*)sn=rIAH?|%kqZ0jSF-y&F<+VgqSkc3{h|g1w z23XC-iYGtaU3dnJJzdsm-)h;E7dIxoI%~^ZR3@t)yhEpoY>dLcQjzv*6{0;s(^I2N zq0Ql!ulQC!Jlvn+-8*n`W8187X=YHkddQ3KPd*t&>j4eZy`Gimt>E>A!BP{2mbLxx zId$3og-%2cq&1x?>f432@(8YT1|rDX6IQiE0HNWGtLBn*ln#VG8|f35(m4pozhbYF zmwxE2=5gH>h+tGH3e97M%h$rF!1MF+v7oi>ecl(HrcdfN{kB89aY|1AfDsNUTe|>_ z9xjg_qd30cV?VhE_R)N+e(liD1!O3JqTRRTf81ce^i{qfeC_!{>R@h=IsK!AF!u5x zV?*4}x4?+`lIe0Wou@VhI-c1oF!0;8qmR; z7iq?$^)a%ZJzT1Nd)`ETK)3RQwVgYq)vf!ETE%9|vvP5N%Np`v3g0-@ z&f9X}P#%ZDWNP$p9HjfsT^XKbr@m(ZqWnmP_&VldDJ2ivSEB-lm9fUD>}>Q_%*fbJ zMd7u&(6?SoXLB@u*G=z!VSRYE#QLkkorcg4=+4GuBb1IC`R61@25rB3xmVgP&~Xeb zLg}HyEtgo?Q5b)s>NBpSS_~$iQUjP-U$}a2uWnj%+6X1WfhQj^fJKiRGSHtY7HQDQ zrRGW)@y^W>OKFH0^+ymW(Pb=yHO%#a(%2izBX>>`>oj#Jyc?0237&a;>y4s3a18MW zvQpe^stOmUEoVd(Q5GhrhZP=Fm6FsmOqtx`RD9Un=w&t*`5FCnO@*qY%bMRPp^XaOU= zd;qI0@qMPQcSnxu&AvQMUi*n)q1zH~257ui#v6Q;531GFm7@^d-_TDj_b-xZmLh`` zoFKkMy14L#M)J*>JAQkc)gqEmN}|oYEHXYs2(#n z)cs2Ky1l&26X7NuGLovOYz4m_-pgm7X|rp-FR%&DlW9VVG2QHV&mI~WhUw&MJN6R> zy#*c937k;p6VKv5EXpHTLhDs$1y&7Eqja<>QOwg=d};mBH_#lkj173JwYORjJ;?Q& z(0|IgkV zt{&=I3+viRWek3ouU+JJDpF)H)O@MydR;dF6%%$fQfmXOfL!sL$aI&#yff_K0;q^# zoi_Ud8#eB%H!|OBpj3JC%}v1=hTax=wf+bN>XU-kmj{gV9PM!)T1>R#(rE;1dF(^~ zcw;ME<0)IUlSZFX@}X2FeoUIMuV&sjOiAzT32Y&&cg~$|bouN1gDR7TJ~iuSl|VBd ztkJX-K+4Byg+thjqP_9=TH6hDWISjLQ)MWP1g~5QAc%YPCfGzb`#DS}ji^-VVwZ2z z+cYUcvROSDisUEoB@_vd>5Ae}bO5?Sa@>fmj#r+EHsIU`LkOP*`7{R|1r)ncKk4+6HR zVe*lWTI)+tC)>iN-{I@kab%ZXHn+TyW|WK)`pyCzr;}A)anorQaxz1gv4}GGLwrWh z@T$KP#e|T@XJq~zs*rzb*a^467>ro~hPq{iO%ZY`V>1Cq|jS_Nc7eLWQtWJmMOp&bm6oxl5iV z{zkP{u+o)I>_J5R5QEiRYjizidoFq%sSM|D`lPs8N1%NS=#6w zqrfPVpLTYZ{H9CW@QGh7d3cVCCHb&%sv1hoM@Ja#I<;~TD5W>Q-TjmtJzAT0<763^ zW#iyu!dJ>KdomYTi68TYpZn3WC~8#YJ%z!KzH#`VR&J9v4L?D? z5uWwO$iDlC&-OfYLu{W>RsCL30&G60g;yU5fQS6=`s(ea5csgj)~)cO7YpK$L~QD#<_s`7Q$)R=#K*57(0KVQCu1`pxQKgCY| z{jb@C;4p4G%|Q$olP`G0opo9B+vKjA}%o)rc)c@G^VJ<-HY zx8wL8OE+*{8lE-(@eEv|<70!B2FB4a>HiGWF*6&F2RB0(tVYA)3Ia>0Zs zeE7V|S&v7@wrr0*9*#y3fVI+N$Iv17MEk?e7=ZxVM$wOf)K6RuZf&{|9H2>vh)U8E z|N1{srhjd;-~R(SR__Ee|K=C|I(=!3$_(g!cPWmc*CGAP3-~BxbnQQ1HLw7HKl|VO za>jBp#?UUC+1*-Nis3RJ;j)Kv%C{buT(No#qOzh7)?wlt_B31i&>Igs89AXaA*s6` za`9biK{tspfeucMp6E6{b(FDY}h2y!l40A2fciwP%*1KksN4wr;=WT(gK2M zkof4fL`>$8eyx~LC1S8J^qr!PvRaf|`~*+{>MTQ3PGfBIHpOqC07RqXS0^8oDpn8T z#A)ICD#Q2fri`4>2vvCoN+w5aAFQf|`Wi4L+skY>#gH5eO7TI2bEQh?h`f#(+`~_FAxoP$R=@GRtWd3@B#TI%LlU+Ad&^;*6eW^A> z=VHjY4eMI|W{OP)7SyGp|K7p}oeVB_0#+r~zv*QB|7IT>ZiC3m|39?Iw^oY8fI8@W0zkUKyMTi4}ramF=3FrJf8S=~wC zIJLabc2d3>R%~W4UlydJ;XR+3c7G=aQ!McX`bO5f7eQ#{=#}ZE^`9acKf2!kapm9t zE|PI@uItY4k0=nyfTIVoSproG7rMvLkg3~yZy9x7xZJ`TGBDN03W&FWS*;h=>CQrm zdC08~*8#;In(r?x)NOMxgZT*i9F=0Lr8jGVF>J;P^)4?T@g-uoL34J`c@FxtHn2Ns zBu47Dxg*1R2<7|?6vDWnIIp}$XtfF*nN3qSCc4yN>?HQO3G$H*wByE zZ!Qd0LQprMzC;;g(m8D&^M>}?k4e=ZCpYX->7+A%1HkGfi`RWarFi;tN(PL~05ZCG z@EH-xL8KCSMu8kaW)Y_Bpi-HB_`(Hhac1v4F*SCQBX|Cn0RX43qyL|@|K)C?4NoD$ z7O~x~Aj6@9pa47R;!z=Zfz7>zInHHD*timx*1NXvMr&mK^hsKY8n-*g>yE)=)eq@@~*${AXJpSESpMdZ8)3RL#V|Mh4YGyr6 zw*Kz=3?zdkYe%G81ICP7&9r%})01c?uOL7)cl;qJx9#OncC&rG*bH37()t)}hu8*m z%p*1g4?z^f9+VuEmApp#a1bs1#g-Z<-46lEmQ;~K-k3t#;YZ~vCk*XBu^Q9nJje(? z9Kb+ufM5Gbk1&xQ%1fmX;*Z!HuTOV4N<3G*e0(>Q7ma(|efvGhJ|=Jjd0i}ie~a;0 z;~pu;G>9n~=M<}fmBbLB4T}U9Wg;d*XmiWRcI{*}=&y?5((~_anW&M9zn9=?FSyWjG9FZ(V^jHtgRVw%6P$j6Y~qJ$gblP+~d<9(gCXper~W z3k}ta1RP)4kgAI}Ui%yWxQA^~UPzBv z3K@x>RenmI(_JDzfxsMHK??qJsk?xo+gkNskCd|vPW3^tAlfQale~NLEP1D-U1bJd zG)4<3P{_R0DXa#f)r#(Yo0q5hKHui z8rAdEwB?m+5$K)$41~JT(OjLU)lFu*UyU$pVxL3_r3kc>(W6-0;JWGwt|XHjQ18|^ zM@aYXLDgJ+-Bi1GZ`Z7gzZl`!o3MF8h0&NT#{{;(wPmpBlJa+}l~H48FXSAZ`6DlU z^=_^wg?aT(TIqV<&16EurkF>&8FPnoHHWls0$d>=JcV(FW8xg|l&n`0HTw5&)%+Z} zTBn;42}T`?BqH;=atGMgl0(AHRzKiLeKs4|gv`!9(Kzj3bCA)hCiS4qQ-E^lZ%hK6 zfKGV_7%xyCz-KJ`U8)iW2bSzl%uR@_hQvA#jJWo)mLPp-U}X&Zi+xZ0RUlHiW&t}K z`}8a__|S#O*-(|h&0}_i`>wyb3YbR=40g2JR1l3|1bDB0^cGE zMy9)8g@*F;8-DXw_=zzfjvYK{PZdaJC>+6n$_8u{YLc=MLz+z%lsfo^&~T)%GC?!d zkD5nBO?+k*S_E}c96NnIv*eQPP&s{LYDo`m-J3AOTnyk z%*Hh`OxfJC-u!!16yZEclRgonePHZm9%q=g(JCVEa3(!YUTvJcddDq`;JxrxQ2j0fN}&zCXRbX!>_DdaP8KdQ z)?Mptuwmes43pje@MuHzQx6meCls~ZU=VMlxmC?uS=nkOfy>FRhjHhimpilOJoX6^ zQKtH9bV0Bne+IySaX>~>g z5JjhF(qX2TAt7oIK>|;!bmx7md50f)U&)L`zM9a4FX*?!S=QO2WURa(Pj#Lay43x@D|o{Y5*G$2nF0b6(1?SR1>aV&q8P+=0W& z^k$o20ZJk%^c69^9#h8{Ej(t_3}|)#uw@zhJgck9m>%uYZL~&mwA~^8DM>FCUm29xn&pTd!G zgE1}vT~=Em+VKVLd%XnxTIovaR{DAh%tl%G+(wn1wIW(A=7aU?;K>5{+YXsc6-rEp zLdPZBW#{ghR7k&rtpv2QA8gWyaoH{z1hAsqg<5S@l%8zXeW;gcW*&YllQ82XYgd=| z^|Pa7h5q{iGWShY}+8$m#eDu zVr+$4GH;T~_~#XCcI9nG=MF>01h;&4>9=rq{P1s8=u@b0r|#Ou&-R~PVhN}3C`>0% z*bScU57oN2H3_lfv<}+!j)Q@2%Vo@!U$$~k&?Q~2T5|m~BLo&+bcUfH2wkS%jIw{5av2Mt-%2(z=*-67vR#9=P_R*BpC-UIA zm!KGzs-8)(Vzm-J5oiF>?KI0xs1v#4*~k1fH~#A}9|ZDhgj*ry0Ej#qmZsLkA~X?NE=>O2tvV&q4{+x6 zxu?vfETW-|DV(lCYmHUk@3!(4b$9}$6Qtr%EsU-PbLPR>ru-DaVO)9?=`93eA_pQW z4=GyCqheCTL&77+SP8VR6tGq*ONEcS4rddmS)9_j2H6qjnRFurU7zt$Tk3S8>fH0M zMx%ROKBBwsn(!IT5?Bql@zKpvesY$0&Aw(Yw)FL<;xA1M z-IcGD3Fd~|svp~E_#2ue26%q-Aq1{s@1wwI;v^Z@*-2*HqGUp><^7(qj4pkM6!I|? zjOV@8BBS_jd1R=u`$q5hwd%L>zoU~5lg)Z9p~H6nsaM1`OMh&MRk5Nm6a(|5q)Z^S zW*Igu32l%=f8Figlspt4tMp|*{B!*Zp2a#xIuu$Y47GMth5kVbWL@r>@ z!R(Aj;fSv8>z~;%YxtwXn!2NtdbHM{TQo8* zQo{A}F&_sqB{m`5{vm-9<8DVLdCs@e?c-m|)%FN4UzhXpqU|?LVp8Pz>ZmLud=0mx zOS~jp3eoA1(e%K1-*n(`l{j+MduSKDVFq9PEBBG-a8CFu#)Qh9(8Dp>)Th~`fJ?m1 zAl+*WBQaEt5*||!k^V+FB>hLC32wz$Xn|A`!84H%9aKb^lwtX7@!Yz-ARb0yLFY$r z)x!16Zp%}9wLBPpB7ezfXl=$6kUkfHqOmWw;m*0|dnyMnrd8(w`rg93?YFW8`Q5!m z3r2`Vse6;@eAmL4i8XLcfrx5uAH%0F>!^$(jMNQ992=wR3dY3hbA;vx0P1d{RatlE zckK-Ft#+SK=DUhkbm7d;`a0`Lw6@CrEf?!Bsi z9YV8rLm4S9)X?i_H8eBy_EP$=NSxB&Q!)TKY@v-owT!xpN~(8_6XCKedU^^le9r!) z!hN3sQS;xOdh2NtJsG(#J6A5tby-X{rfncIY@u|DKA!!;n)s)?*R~|LZ&Ila?zj+O$7F&>OYNSLiuRe4irc#>=p)g1i73(#c)`sK}J8AWZV;J zb^eeytVOszP=y>O?fjER_Fa2_KqDppQ$wSPH>N#e?-J^~PEI10Qq_aG^yf`~lq(jj z))Ea{u-R)X1ksp1Qn+XsA`@}l=@omZ8Kz~Be`}d(r)*a8dJsE98mVu3=|n!I&g7Y< z7j<(VbxgZD4{#J;8U}>Y`I~T=XmN}XaemaH*Pd#5m?iJDi@GU2bP8qNBr;ctx=qU(&Di@1OBX;(FSa~ zbx@~^%?4YU8DL5hapGMv<=^s#-gsN4;RU`j*d8fLq;~3QISRI7;43q!k(HavKtn0Q z5z=D9RdK6WJFCBqSivFp)!x?zzUlhr=F{UWO3@{C)A1W(le#kP(=W;QpEq?=7XBeB z6PHcnJt{$QL$CEk#;Kj$!^}VR(^VXuYCHUDaFDZvH70WhTo*I0|^Q)-eBk>lW;Hz^bKAwyY`GMC?(bId5 z^Oub}Q$)^Zi;wb`oD%A7vJ7Uf*9yxRg7PG19L1F7w!}4K2Wy-de19hWhdO_?XV}D{ zRvmmollCJ;^tQ|FtMnupB1VmQeCqpTS;ws35$HC)PR443mHRQiN6dDpN(uo_Bxz{W zt`WqQKI)2os%T;4tMTzYk!cHw(hg(-@4lh` zvlM(k3S&N&UUu%&t?>Ye@UEuWlcR`2+~zM!64A6*tir)UT>TP|#apgZB7mF_)tq*3 za?LMB?MvQ|gK?$NSYRG`Dn~dz!Ndw{r20dSo%y-Jy9{s1cL}RtYG<`Pfa_O<2U6N2 zB)2?OS__5aBrMZ%f8UeGBdy-6QNUmU6*k5Ng`9AqU)mbjR~_2#oD|HpL^PQ7Huj?T ziZh_dNfkh5(E#Le%BdQ`9EJkdq^~v-;g}bPr0mD9@KAnNm zv$*94(!4$9DdbK7-V)r5#x69i3jLC1GMA`Gs+)??vc?I&nMs(}FP z;&+{hd-!jLM)nBIR}e!KkUsF;O}0c>7Nk-4bmk3&;p;@VM_j&`^EpC`Pt+SqJ2!H^S%eHpHZIj@ykUtF z$qGPbc2Kv<@lX4qCCJ}>*y+<~*w?vo^nS+R7~PGuw- zkwtmFdN~Y{s@JN7h4ZzOf-cpW2CvWecSYrCa+(h!*~UzRfTg;LmNS%8D<=0Tm?m)3W6WF@1=7_{c90%mSIebOdesg$kr&KF=KHA1lk8ph#yoi-0 zl^$-92!|!yh1yORP|Z>3=GMnfOp74VaED@}Om72#s2Ay$GKac4+piOSQ>EX@NN`e(->+i<|B#ngZJN=EMq zcH8}jm%eHL7=~$%L>xS>#8^yjK{b~pf*op~`rmr|esC=g zct#*}A^sR~r}3U`BY&udseS}b;rh+91h;$LbeSiCY;l^osVJD3HzMwhv^hpRYXNTI znR^`g{_IK4c*DzXUXALIkyF=v^!1&UsStS+E5puK><$K26^aH;k(Rj$z0m#W@xb^4- zHFy=Dbmg_&sm3PR?5=3_SpV`3;(Lbsd{SWh3~ob$_a&89CXfl(eihKLvK5{Z00DMV zC_$yjwmKP+I@L=H&)C&Lm*ygzF~{NuRB>rhEqs7WkygVmTMmx8;G6z38&YPSNa=nsx@k7uky_d)=iKwj2)e@c{HrGjO#=^U z-9lzV%@?)G^9=&+Wd3w@=n+Z)_3*4I85i? z|K9FX@O#;q+im{KpuQ8_=~?C1KlEb$(?{|>LvqsV$0ct5enDgakDv0t_|=TNmm-cd zU}RDK=RJpc~TU=K}-Y|B)7eCj^Eu{jBoY?By@M%s>nKGY}is3BEe2v+#) zldv;v9#AF3`(kO>gDmxmYpHh$pk9#YdBQ&pHYN&0z$IiX-RjSl%fCMRqIVz*KxN2M z{r7cblE zdm_fjJxHKDB_7AsZ@Vzi(-zBFO1UdWW&9YpKGOh}s@5R5k!~*=FVce4`ujN0w7vF%}CGsm#_}iUN;5s!AOswh=p156$K7GK)NG<(m&-!d*Yx-EU zdq{@3>*?e3Nyi-}Cn(#U{OzREQsZ$0xIEvT`JWev)t3(jFNR?32GP~%N_YuvC9wDH zOuT!t53FQPOsdo(dB=BMm{n$u480jpdBx-cb;`YDFP?e{ zqXW6-qtzY#AePQqj(+$1;hw+_JEozBrFrqLQSP9$bA_a{*__7h@lW*kwcpbywC)W^ zltQ}mXUyKEX8}!T?O8+9jSSsmt8b^g_B-g z(|X+l6kp)KODIBwqmH|m_o|pa>lwZslf4A$%*yWmo4E%(!$U8bLg`)!mdY+Ua%4*N z(pzRlPLp%~ABTVk&2>`2rzjy1TbV>Wk}GUx#+)4o4AaAlJ;`lyD0Dx9wc`Emj&k@K z$*cI=Z}PEmQL4EWvzZy$-$o2)cB3nK!$3q1F8+7T2bLS|ds0%BjHBw4@r9$O(<@F_ zcJGx8?PMPxF2uqPu`S85wskgLVjn0;HtsUx-jWw>Vm^95v$z(#R6(#tlv-RMF(sik zJTjbA#HjJ&xy*+mE7dDyp>yr&{;FKoi7`xzql^AjqkgOS#zG78MW4=?B`@5rDDE{L zCv;)$YKvWtiaA^#G?b?vO{+A&oZ9AUuJVCgRD8jPqgr#;o;JQns{?myhPOVob91Eu zhthpfC0)rza>KZ3C~tV8=9z8Fl*>#BcfNbGYk$Pz9OJig5qH-n`W=UoPb7ylUg^1o zw~Kkr$I{K3rq+h_POe)K+t1A^&>hsbIgH=kYI>YEXG0!)W@e#x#G)rNdUN<@P-k(W zeDiSclR^IEG?)HhKZH1^(hb1A6bcH=4qBIo4d}Z@va5x zYD2d2&*Mab{B^%xR&__pgYCSdT}I7l{NsN49ZKGO*CgO}#SVdPz;{mTcod==f)IO) z)q9I#bl(8l3+(Juy6(D5$wh?|f~2jEs!rgiv1tiIr=r=LAk%_q2#OArKVu(g1PKmH z9@DW8zGk5k>?>-B3OIa_*%so@j3iRlGRJmdM(TYPz$Vfcy?fJf>1--vpCnA#F8si&C3E+S=cTfN}MaI z+H*Wvo_lg5aMeKnan3+xn=IZGci`OA$YG6sR~T{3=5YPSvY)qnWOkLCap}evp5S6X zeCF8A&%LJQnrF9W1?|(r2g4ql>7TV4yb^M?Ou`nmz1JDKTN%k%-Joo-+B29P-dkT+ z=v+P}ReddIS7LYRd2^xY#Uwl&S-(I`67is1)tv=<>3AEBW_zl<0DF`Hc|$;bl0>Y zKRHl3VWk!9{2%r>{9Ax0*$~kBIN2c}Yk%N=iFF6e5uW4P%@~j!Mgb(7v{ZB!KisqZ zs?&8>Zn9Jf>)ZwUUx>Xib901G z-nt$d*v|pJS=bO_%w(!^`M91b43Bq4?pthJNXxC(OHoyHiqa_&sPM6C|7eOFOEj+) zUZS4on=EyUPp)bH@JeTpdV!MD?!a_`t~Ba6<-iftV(txT`u zFP3y2RelsG{2HvUp$%etgwYIou?{0zot=+NL6SLM`x-ijy8NTep+WamXcWBakIT#- zC;Vf&{+hn0peX4M@rT-z)k>EVof#|B6nQEn?p$uYL(OJ&bN}G&>Mg(q?!$cWqv7B8s}p%kL6Id zsuoX3wVQ=#D8jRfL`N(t%}D(<7PSu_0?a?rL6J(Ds~~A|lc%3-T$`gqlvROs50jwP zRno)Bdu$ER{9VU9Cunw*3N6i&z(!LT9AVYQy!ldFIDgNlVy!FsQgPLHu>Ir~S@VfuS5es>%!(=!P>}G<+-Y3#;HU4Q5Ua z(0mElavC3E__>O!M_7At&3Z5hd(XYfw8Nq__pKldIeKP~p{f2&^EkwGiIcsM$wz8I zwa9fSSL3{4$IYt^9X12sDwp>~4sccP`jUBjq5wT?5{jZzkwbdh* zb8b0ZCt;4$V;{UurcZ0{G}osI++MF>iD;S?u07OB<2x)hnD9ZQEpX^W)1#j3;qQNI zE6rtjTywooNcojTqTLxOEb#qfme9!g7fDiel7magl(V+gBuLN1klWkZ5vtO;n$rl} z;JP|iGKK27x@)KNN!u&-n{^%~S_@Qa7cK7a!{e3T=S2kbVq(t=(oaDe0~6|KvOT&kA*P%UBB#@YPcy4TH&j$w8WD8$s}OOD5jm}*_fBCNuZo(D z>Jv&?q*V8UU38HvERt`G-K=sSa@jqEki*%OubtW7^4J)2fE$tC3?af*(B(1mUvux1 zkDav6eel(6to*W}+D$DI;SMY;EPhUD2{F~vVdduGQtP;488p*lI2-ANwlaGvl$?EQ zVFlHS$dyEoDLp;P>E5D04ef^Iww>Qd5Aa-Va<&Xc?;Lv79a3u&*X2cwIrL*&fJ&ns&`gMq%9bu~FH$Rd&@p%$AkuK@h~{)Lr1%@d8dRQi zNR-bE`xy=aQ2Ru^8TbW92xryne_5SA-e9L-J+cRKln5(We@G73*UrV8 z-SVs>kNHOFUr4t2#-no%qjGaeE9E;~3j?aIxzJWkm3d~r-6|c7;bYa`Xzv{$Wz2V! z5xbe-ekL-Rs&U-6xu$_?bF$w&*}H>~?hcC%(vNYEVP(iHI_4Cp-V*WIuFB{%+^yD_ zd@DJ3*w4;Z-%_L2{iW_Y_uPm4k`jfuJm!uEqudMXaw1ccnldXpBc-&VA1nW-U{CH= zI@av1H1~?A9;QmN1i;ovWXI{Gff4FNP$!6ZHMs#%@=3tQg36L1)opK|P#i6F|M1n%`AssZx zIh-^^CAZp585Mbqe9rN;| z)|V*fCYVV01^ZG5+PWj%@Lt^#K6_f=N{i-$Xs0RmR?^O=2gR`+X}$ZM6(oIzwGy@x zP0l9|o6}ZM@1xm@8BL?`ztD8U)=;I2N=K1ey8gK*o_`>8%}3b8J|}3f!#CJJcEZ;9 zRBNg(`nIl(l`7i;PwQaRX_7BsV>QZiA@+AdiK2c+;2BEyqhY_je1+Ib$%FJ9_3UHLQEIXnGIa%VZxk7Y5j5wQJI+;&KO2qZv9w zCAZV|$a_!6EX#&jI|50lEs<8MWEZUR_{P~9n@WWf6V%(K_M6FA9zPd1if2#e>+HN! zK9^$=(ouQG@|7=Jw0p5*tS28zu4#e)-e@uR_|$3W$z)ByIvMFO=R&YWq8snOc;l1` zZ`dEV5+CiYue}!+!+v93zry4Ml4wW_=b_0s@Io5Ki@zqi?~}sYqUkX_n`={z$fWzW z`p;c9ry4Uo*556t=R-m-WYjzdb^YvPYV4e^*EnNX%y0aFubah*+TySdaW=Q7I#EoF z?;ej{K}@fU*y>zZPmWzWX$}huUursYsp5)Lal0gPL!c&wSLGYj@p!Yv>MH{|ri`VY z=AK;=;b=#$bsw^Ft#+Kx)P?M=e&q6eMuKkk!ivMuseH?Dl;I+LC6*1T>nRakJSQfY z8+~g%(}2bMb4y2D@96+Xd?Gb!u1zY~Kq%upNr=f%0*)hDuXcQ_TT*nSL0H%ThfC`v zS-AWL

Y=nUch+OSA3dAVw_#-l=bvKLI%PwE^ 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 { + return hre.ethers.utils.parseUnits(item, 0); + }), + deploy["firstOwner"], + hre.ethers.utils.parseUnits(deploy["minCandidateCap"], 0), + hre.ethers.utils.parseUnits(deploy["minVoterCap"], 0), + deploy["maxValidatorNumber"], + deploy["candidateWithdrawDelay"], + deploy["voterWithdrawDelay"], + deploy["grandMasters"], + deploy["minCandidateNum"] + ); + + await xdcValidator.deployed(); + + console.log("xdcValidator deployed to:", xdcValidator.address); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/contracts/validator/src/test/xdcValidator.js b/contracts/validator/src/test/xdcValidator.js new file mode 100644 index 000000000000..43e8cbe21193 --- /dev/null +++ b/contracts/validator/src/test/xdcValidator.js @@ -0,0 +1,235 @@ +const { expect } = require("chai"); +const { ethers } = require("hardhat"); +const deploy = { + candidates: [ + "0xf0AbABbb043792D8cDAf1961c96758932189965D", + "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd", + "0xF5D476D1566e102d4591Fc11D93E2F0B1FB82C70", + ], + caps: ["10000000000000000000000000", "10000000000000000000000000", "100"], + minCandidateCap: "10000000000000000000000000", + minVoterCap: "25000000000000000000000", + maxValidatorNumber: 18, + candidateWithdrawDelay: 1296000, + voterWithdrawDelay: 432000, + minCandidateNum: 2, +}; +const { + loadFixture, + setBalance, + time, + mine, +} = require("@nomicfoundation/hardhat-toolbox/network-helpers"); + +describe("XDCValidator", () => { + let xdcValidator; + let master; + const fixture = async () => { + const factory = await ethers.getContractFactory("XDCValidator"); + const signer = await ethers.getSigner(); + const master = signer.address; + + const xdcValidator = await factory.deploy( + deploy["candidates"], + deploy["caps"].map((item) => { + return hre.ethers.utils.parseUnits(item, 0); + }), + master, + hre.ethers.utils.parseUnits(deploy["minCandidateCap"], 0), + hre.ethers.utils.parseUnits(deploy["minVoterCap"], 0), + deploy["maxValidatorNumber"], + deploy["candidateWithdrawDelay"], + deploy["voterWithdrawDelay"] + ); + + return { xdcValidator, master }; + }; + + beforeEach("deploy fixture", async () => { + ({ xdcValidator, master } = await loadFixture(fixture)); + }); + + describe("test xdc validator contract", () => { + it("propose", async () => { + await setBalance(master, 1e30); + const candidate = await ethers.Wallet.createRandom().getAddress(); + const minCandidateCap = hre.ethers.utils.parseUnits( + deploy["minCandidateCap"], + 0 + ); + await xdcValidator.propose(candidate, { + value: minCandidateCap, + }); + + const candidates = await xdcValidator.getCandidates(); + const voters = await xdcValidator.getVoters(candidate); + const ownerLength = await xdcValidator.getOwnerToCandidateLength(master); + const ownerToCandidates = []; + for (let i = 0; i < ownerLength; i++) { + const ownerToCandidate = await xdcValidator.ownerToCandidate(master, i); + ownerToCandidates.push(ownerToCandidate); + } + const validatorsState = await xdcValidator.validatorsState(candidate); + const voterCap = await xdcValidator.getVoterCap(candidate, master); + + expect(candidates).to.include(candidate); + expect(voters).to.include(master); + expect(ownerToCandidates).to.include(candidate); + expect(validatorsState["owner"]).to.eq(master); + expect(validatorsState["isCandidate"]).to.eq(true); + expect(validatorsState["cap"]).to.eq(minCandidateCap); + expect(voterCap).to.eq(minCandidateCap); + }); + it("resign", async () => { + await setBalance(master, 1e30); + const candidate = await ethers.Wallet.createRandom().getAddress(); + const minCandidateCap = hre.ethers.utils.parseUnits( + deploy["minCandidateCap"], + 0 + ); + await xdcValidator.propose(candidate, { + value: minCandidateCap, + }); + const candidatesBefore = await xdcValidator.getCandidates(); + + await xdcValidator.resign(candidate); + const candidates = await xdcValidator.getCandidates(); + const voters = await xdcValidator.getVoters(candidate); + const ownerLength = await xdcValidator.getOwnerToCandidateLength(master); + const ownerToCandidates = []; + for (let i = 0; i < ownerLength; i++) { + const ownerToCandidate = await xdcValidator.ownerToCandidate(master, i); + ownerToCandidates.push(ownerToCandidate); + } + const validatorsState = await xdcValidator.validatorsState(candidate); + const voterCap = await xdcValidator.getVoterCap(candidate, master); + + const before = [...deploy["candidates"]]; + before.push(candidate); + + expect(candidatesBefore).to.deep.eq(before); + expect(candidates).to.deep.eq(deploy["candidates"]); + expect(voters).to.include(master); + expect(ownerToCandidates).to.include(candidate); + expect(validatorsState["owner"]).to.eq(master); + expect(validatorsState["isCandidate"]).to.eq(false); + expect(validatorsState["cap"]).to.eq(0); + expect(voterCap).to.eq(0); + }); + it("vote", async () => { + await setBalance(master, 1e30); + const candidate = await ethers.Wallet.createRandom().getAddress(); + const minCandidateCap = hre.ethers.utils.parseUnits( + deploy["minCandidateCap"], + 0 + ); + await xdcValidator.propose(candidate, { + value: minCandidateCap, + }); + const minVoterCap = hre.ethers.utils.parseUnits(deploy["minVoterCap"], 0); + await xdcValidator.vote(candidate, { + value: minVoterCap, + }); + const candidates = await xdcValidator.getCandidates(); + const voters = await xdcValidator.getVoters(candidate); + const ownerLength = await xdcValidator.getOwnerToCandidateLength(master); + const ownerToCandidates = []; + for (let i = 0; i < ownerLength; i++) { + const ownerToCandidate = await xdcValidator.ownerToCandidate(master, i); + ownerToCandidates.push(ownerToCandidate); + } + const validatorsState = await xdcValidator.validatorsState(candidate); + const voterCap = await xdcValidator.getVoterCap(candidate, master); + + expect(candidates).to.include(candidate); + expect(voters).to.include(master); + expect(ownerToCandidates).to.include(candidate); + expect(validatorsState["owner"]).to.eq(master); + expect(validatorsState["isCandidate"]).to.eq(true); + expect(validatorsState["cap"]).to.eq(minCandidateCap.add(minVoterCap)); + expect(voterCap).to.eq(minCandidateCap.add(minVoterCap)); + }); + it("unvote", async () => { + await setBalance(master, 1e30); + const candidate = await ethers.Wallet.createRandom().getAddress(); + const minCandidateCap = hre.ethers.utils.parseUnits( + deploy["minCandidateCap"], + 0 + ); + await xdcValidator.propose(candidate, { + value: minCandidateCap, + }); + const minVoterCap = hre.ethers.utils.parseUnits(deploy["minVoterCap"], 0); + await xdcValidator.vote(candidate, { + value: minVoterCap, + }); + + const block = await time.latestBlock(); + await xdcValidator.unvote(candidate, minVoterCap); + + const candidates = await xdcValidator.getCandidates(); + const voters = await xdcValidator.getVoters(candidate); + const ownerLength = await xdcValidator.getOwnerToCandidateLength(master); + const ownerToCandidates = []; + for (let i = 0; i < ownerLength; i++) { + const ownerToCandidate = await xdcValidator.ownerToCandidate(master, i); + ownerToCandidates.push(ownerToCandidate); + } + const validatorsState = await xdcValidator.validatorsState(candidate); + const voterCap = await xdcValidator.getVoterCap(candidate, master); + const withdrawCap = await xdcValidator.getWithdrawCap( + block + deploy["voterWithdrawDelay"] + 1 + ); + expect(candidates).to.include(candidate); + expect(voters).to.include(master); + expect(ownerToCandidates).to.include(candidate); + expect(validatorsState["owner"]).to.eq(master); + expect(validatorsState["isCandidate"]).to.eq(true); + expect(validatorsState["cap"]).to.eq(minCandidateCap); + expect(voterCap).to.eq(minCandidateCap); + expect(withdrawCap).to.eq(minVoterCap); + }); + it("withdraw", async () => { + await setBalance(master, 1e30); + const candidate = await ethers.Wallet.createRandom().getAddress(); + const minCandidateCap = hre.ethers.utils.parseUnits( + deploy["minCandidateCap"], + 0 + ); + await xdcValidator.propose(candidate, { + value: minCandidateCap, + }); + const minVoterCap = hre.ethers.utils.parseUnits(deploy["minVoterCap"], 0); + await xdcValidator.vote(candidate, { + value: minVoterCap, + }); + + const block = await time.latestBlock(); + await xdcValidator.unvote(candidate, minVoterCap); + mine(deploy["voterWithdrawDelay"] + 1); + const beforeBalance = await ethers.provider.getBalance( + xdcValidator.address + ); + const withdrawCap = await xdcValidator.getWithdrawCap( + block + deploy["voterWithdrawDelay"] + 1 + ); + + await xdcValidator.withdraw(block + deploy["voterWithdrawDelay"] + 1, 0); + const afterBalance = await ethers.provider.getBalance( + xdcValidator.address + ); + expect(afterBalance).to.eq(beforeBalance.sub(withdrawCap)); + }); + it("directly resign one candidate", async () => { + const oldCandidates = await xdcValidator.getCandidates(); + + await xdcValidator.resign("0xF5D476D1566e102d4591Fc11D93E2F0B1FB82C70"); + const newCandidates = await xdcValidator.getCandidates(); + expect(oldCandidates).to.deep.eq(deploy["candidates"]); + expect(newCandidates).to.deep.eq([ + "0xf0AbABbb043792D8cDAf1961c96758932189965D", + "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd", + ]); + }); + }); +}); From 6f89036c29a60bda5fa52fb6470ea91f415ef78e Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 8 Jul 2024 19:54:04 +0400 Subject: [PATCH 052/144] update --- .../contract/{XDCValidator.sol => XDCValidatorLegacy.sol} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contracts/validator/contract/{XDCValidator.sol => XDCValidatorLegacy.sol} (100%) diff --git a/contracts/validator/contract/XDCValidator.sol b/contracts/validator/contract/XDCValidatorLegacy.sol similarity index 100% rename from contracts/validator/contract/XDCValidator.sol rename to contracts/validator/contract/XDCValidatorLegacy.sol From 9d226118b9e4ee0f16850cc1eb18cf8f47114051 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:32:12 +0400 Subject: [PATCH 053/144] update --- .../validator/src/contracts/XDCValidator.sol | 10 ++++++-- contracts/validator/src/test/xdcValidator.js | 23 ++++++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/contracts/validator/src/contracts/XDCValidator.sol b/contracts/validator/src/contracts/XDCValidator.sol index 249b74872094..893fba7e56dc 100644 --- a/contracts/validator/src/contracts/XDCValidator.sol +++ b/contracts/validator/src/contracts/XDCValidator.sol @@ -27,8 +27,8 @@ contract XDCValidator { mapping(address => WithdrawState) withdrawsState; - mapping(address => ValidatorState) validatorsState; - mapping(address => address[]) voters; + mapping(address => ValidatorState) public validatorsState; + mapping(address => address[]) public voters; // Mapping structures added for KYC feature. mapping(address => string[]) public KYCString; @@ -533,4 +533,10 @@ contract XDCValidator { owners.length--; ownerCount--; } + + function getOwnerToCandidateLength( + address _address + ) external view returns (uint256) { + return ownerToCandidate[_address].length; + } } diff --git a/contracts/validator/src/test/xdcValidator.js b/contracts/validator/src/test/xdcValidator.js index 43e8cbe21193..8db3284eb5fb 100644 --- a/contracts/validator/src/test/xdcValidator.js +++ b/contracts/validator/src/test/xdcValidator.js @@ -110,7 +110,7 @@ describe("XDCValidator", () => { expect(candidatesBefore).to.deep.eq(before); expect(candidates).to.deep.eq(deploy["candidates"]); expect(voters).to.include(master); - expect(ownerToCandidates).to.include(candidate); + expect(ownerToCandidates).to.not.include(candidate); expect(validatorsState["owner"]).to.eq(master); expect(validatorsState["isCandidate"]).to.eq(false); expect(validatorsState["cap"]).to.eq(0); @@ -231,5 +231,26 @@ describe("XDCValidator", () => { "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd", ]); }); + it("kyc upload and claim", async () => { + const kyc = "0x01"; + await xdcValidator.uploadKYC(kyc); + const pendingKYC = await xdcValidator.pendingKYC(master); + expect(pendingKYC?.kycHash).to.eq(kyc); + await mine(10 * 43200); + await xdcValidator.claimKYC(); + const kycString = await xdcValidator.KYCString(master, 0); + expect(kycString).to.eq(kyc); + }); + + it("kyc invalide vote", async () => { + const kyc = "0x01"; + await xdcValidator.uploadKYC(kyc); + const pendingKYC = await xdcValidator.pendingKYC(master); + expect(pendingKYC?.kycHash).to.eq(kyc); + await mine(10 * 43200); + await xdcValidator.claimKYC(); + const kycString = await xdcValidator.KYCString(master, 0); + expect(kycString).to.eq(kyc); + }); }); }); From 775b12040f49775774828badf203bd1e8a80d0a6 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:01:10 +0400 Subject: [PATCH 054/144] Update xdcValidator.js --- contracts/validator/src/test/xdcValidator.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/contracts/validator/src/test/xdcValidator.js b/contracts/validator/src/test/xdcValidator.js index 8db3284eb5fb..f8e837e8391d 100644 --- a/contracts/validator/src/test/xdcValidator.js +++ b/contracts/validator/src/test/xdcValidator.js @@ -4,7 +4,6 @@ const deploy = { candidates: [ "0xf0AbABbb043792D8cDAf1961c96758932189965D", "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd", - "0xF5D476D1566e102d4591Fc11D93E2F0B1FB82C70", ], caps: ["10000000000000000000000000", "10000000000000000000000000", "100"], minCandidateCap: "10000000000000000000000000", @@ -28,7 +27,7 @@ describe("XDCValidator", () => { const factory = await ethers.getContractFactory("XDCValidator"); const signer = await ethers.getSigner(); const master = signer.address; - + deploy["candidates"].push(master); const xdcValidator = await factory.deploy( deploy["candidates"], deploy["caps"].map((item) => { @@ -223,12 +222,12 @@ describe("XDCValidator", () => { it("directly resign one candidate", async () => { const oldCandidates = await xdcValidator.getCandidates(); - await xdcValidator.resign("0xF5D476D1566e102d4591Fc11D93E2F0B1FB82C70"); + await xdcValidator.resign("0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd"); const newCandidates = await xdcValidator.getCandidates(); expect(oldCandidates).to.deep.eq(deploy["candidates"]); expect(newCandidates).to.deep.eq([ "0xf0AbABbb043792D8cDAf1961c96758932189965D", - "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd", + master, ]); }); it("kyc upload and claim", async () => { @@ -242,15 +241,14 @@ describe("XDCValidator", () => { expect(kycString).to.eq(kyc); }); - it("kyc invalide vote", async () => { + it("kyc invalid vote", async () => { const kyc = "0x01"; await xdcValidator.uploadKYC(kyc); const pendingKYC = await xdcValidator.pendingKYC(master); expect(pendingKYC?.kycHash).to.eq(kyc); - await mine(10 * 43200); - await xdcValidator.claimKYC(); - const kycString = await xdcValidator.KYCString(master, 0); - expect(kycString).to.eq(kyc); + await xdcValidator.voteInvalidKYC(master); + const pendingKYCAfter = await xdcValidator.pendingKYC(master); + expect(pendingKYCAfter?.kycHash).to.eq(""); }); }); }); From 390abb116423092b4d7d950d81b847242bf264b6 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:04:42 +0400 Subject: [PATCH 055/144] Update image.png --- contracts/validator/src/image.png | Bin 99557 -> 287026 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/contracts/validator/src/image.png b/contracts/validator/src/image.png index a4958a8b9ba22353b0931eec365eec50f05945aa..f3ee5a907df8d46ed00b6a6c3cdd926dca6291fe 100644 GIT binary patch literal 287026 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ℑ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 RaV3NR9XCLtkw5(Ke*vrR-{JrO literal 99557 zcmeFZXIN9+);5X=N)ZtdkS=uY1f+{p>Am+V9YRw9kq**HLX{G# z)BpiI;d!3D-}l>R>#uYEoa=C1$y!;ND{IU#$GFFwW89NS4K)Qk9C92qG&DTLm$F)D zX!l;Cp`iz3-9uf;Xw?0MhK5saDk*1-}D?PX+g>U|w;IN{r0ev=do z*aY!}zC=Ytl1f{aC>I45tS3kx0QD$sNpH-1>J+ zI~JeA2irfv%Ydie0Z+ao3RFe z`3~`gc@RllF74}xurM@P#$AbZ(EYdadsI6U#=mZ^y5EB((>~uv!;ulxjQ^}Ib538t zdCu*_h*sA5ZplWo#36}-pk(O7J%TQQ!2%cRC+od0RjsL2Kpb!i%*{8 zwhdm*4}5q*l*JI6!}po2oZxff3(8_Z4VL~HXVSfMm6=oheKGd6_Urd;gH7oJAA$xu zj~S7qO7n?AJQm5F*r8nki7zwQht*OQK1Y(35VWtFYD=RDOhI8B>&q_B=M# zn8UdH@a26%+4Z;B((!>^Xm4;xtz&_qi5y1HNTU*X(j9(;W2YN4FIkaKF3v38c{_m= zz7g)QjE2d)b9w!}WrGoodR9SRepKZ$I1x=SfDCQb%f;$GnueU63F{{74}-O?y7tgJ zvUxaLlDJ!U=*%8g1&KM|+y6vy9`y7P&NC^>H2m|YWJR>uoajTJ?Beg^d}92Fm-JT5 zOhOPNHh3+MBnvb3lddyS<6F<4kKBVye-b_jMwmSbeo84DWD`$Pgr6>{7cbTuEJ`cE zgn<*WnuqZcLy;D<@qyu8V#zQK>_+^Gw*et)GO2kx8m#U#+u@h_0^`F zOq!Dnhli}Z^rmJDCjBz+%+Ya&BYbF?&Kb`iy9>Le$KUfF@43r7$7W@ z5TNXmlvm;Xi6ySb(GS1ktc9;wSiE>P{7i+q1k3G_8;%?1WGuX|qu-+LK^55yCdIp$ zo)WWEi`my+=9P7%b=7m!yN@15Onxy~5p~WNq~;(>jerD+1h>Dn?>Su+Usd!5b%-s} z(8Q&#y8VRp{=l7=xNXwJwqHQIR#zy}__(lH99ci%@{`^!f6`ki91Y++#^gdp- zvv^VW-aG94-Fb@aGqMC@#Rf%-?<`s`;7{P><(VguDhx&mLO-e zou8)F!F-scGI&o3bDet~d%X}xwNE~*@|lJ~xmJZ%;rEgwrQ|%jfsUuKs8OQ|bzO1ez1KVEvAZt74@Cv7VbYq*so%Tvq6 zcps0v`oedT}T3kAgyQKghIg!Gv2rrax{Av-S72`&3^5Ah#(r3$; zPbkRx$*7{owB1WTmSUAwWoq#iI}Y9-DbHBUkRI_Lu^aIm88cL2m#EgM9x-e(jBA=$ zNLgrTBDFo3=_(N8N*136u>{)POs#3tY<&_=5nd5i_Bh*tekc1rJ&8A-4BsE`tP;uV zA3vT^o`6(%nbrbwOAg98XO=1grG8;*hYVOLrS%QVZ{!8VO63K8G0T-|`1~Sl;>m!|opbMkWXblV3tnHdxr?$+DXg|cU}C9*5CI~je}8`ZO@G|{V`e8Nx5FT~%(Ut2<<9+%tY<2!lc)U4J_2)WygzgOldglx0zISm}eC9>P^zh~(E7dlosfeKv4waY4qFaH`h`Zs=)bh#ne4oL-@jCRtVmD#A zezG`G&N{4arlF?I!Wd+%56C0`i4MRhpqBeCmPNyK>jFv&;?QxEu)y!$kyN~KlKOnP?EC>LPW&D6TWM`;<+;P zCG(jL0q(Ph3LSALkT!W%Y1k;bI$;AY~&n{)6om9+K^mk9@*6Re;8rOPVJPupW zx6VTjW!$bd95N?GW^I9s&{!X zp}pCWA^r~oMSc~3GWw`H&Ux~P1P7TQnt+p-6D2BZBzrwzIv_W2*CMu6_DYz6%Tj$X zVrqQqXo^5Fx=0u=HznTFP${`YiDL5fJ85alVAUI+`kF8xZVNkQ()}TPD@n3r?rm=P zH#2u-^O|$TiR|@s-HcNg&65J6sA*DV(j`NSwl}bZE{9*cfYgH2qf~x2o>$Gj1_;-) zBM@sIaU?6b9(nb!$$UGD*>wJN?{s-(;8@)V^RQ0~qm?SC2Do1V&B;X%s2J8BNZj;&z^ZdU}C zziyb_kO|ukn-3E+vI3UR4?;7#PhriNkQ!1UlD&B~XwBTBE~S=nOOJPd2^ByoL3u$L zq*Up(y=&ZZ+{5v?rWv-_UU{~)&pdbRQ|o=u3A%%{8&ny3fA$(-y%*^D^ip!NwhF-d z(2j;p@Vv>`aM6S5O5=5yvRt2eb`J&Xijth=uMceshOw8_)s^)%3;H8v9D?^^nPWT8 z*;iU(*FN`CsC`t^$>tSmJAS;U6M(1FP-OLyzpc5Fqo(H6eHvY8P}?bT2P8m+I*ms!KiK9|bye5&Ew$=>Doq&74yut?@Ay z@q_JM!YQgKngp_)W}vQMk8Q8gC3QX#fmx_$o5}3zg4U97;i-S7KBQQr%d2K_eX(<1 zyt1>2u42t}6FOSs7wk87puFE55PxcRzEYu(rf?BAO-(8`;iGjH(ML0FGHS932DLkh z#du$Sj95B88jF_bKG_g26lL9>JgD>r{GdrrkQLA>d zca5n2JokBV_Gp&QX{LMH*XU;S(4$o8xI>PHi8{N3dWqkm z`1iT|9VWE9e_cmMLyNFQ!}zC-8tQoa7ms?~-t+enJrDg~E$+R{yZf(m^x)g3wc2+1f-f2whz{{jx-NG3&zo+zoRe7%<@QSi{ZPyw6yO5ZD;3LAaE4Q zoQ6N?w5l1ey>o7ts7weYs~s@4;qxD!BzX_J{|_3&n#w{WqvvZGnm7A{ zAv_HUefJni)TVqm_ zm|3ixnh|&&5y&-6O5ekNBm4|74yJC#CuJqLs^(2K+jTow>mqEdXuKZ1dHo9$ zvj8brV-I2Q-D$vIza->c6~*zL>r!&7I~+x%9@8@E*&?&A`)_b@WDzdLYg&Wu3pS47 z&*DwG-r4D-9VQL^{QvG#3%FnA`0Wc#*1cA6ve&CM&GxM1 zHHmmg^*t6p?p34B2Z47N!Q8DFVh%JMde6?Il*fC{RxB8TyOTEvqe1&1sD7|sa`V!B z;BI%Gq&rQ&hhw{}6X-187!WL*HA zMlmzv!IFCNi})5Gc?--3G3 zd(!0_jl=eMyq6kpk7=b;NW%V!2yz5ACP~Hh8h?O($-HRHZ%>)mvSp_J6chzf@$7Mb za`Cg@dxRtzF3Q-yibRyr{-Kcz%GjA>S(W8}A8&%VNl@+=?e$Po<`0clZ(WO0Kjr;D zef@7S(vl5@CS(Vc1>t{a)JK4NnqUpvZ~X`*#NaDb0OVd2lEwRt%iQ|+d%E#v!6?h} zza`OW`LsLVpeiF1V$fiv>fyxnH%i5)q9GzWTGLtwF$HNV{O>pT{L?(>?*Z5SNacY3 z_kjPm9^DCI)-HK+t(wU{g2at3D&4>=v#8v_zk~Ms!7CHHoklq2HuU|sAN>2;REK0= zlN7hl(HkDy@AS2!2>aU3<_)hr-0?Oy>jujq5-$x4Sb4?V@Pq;l%)#e)V}$3R<5;a> zSqYG>Zo zPZQWN;Wm18aXgYG6Gx8&?Y74igHxzW{w}>&__yMoA{R8`}ouj3oT9u{m%WdRPyObJXXU$Bjh}` z1ceTJiALVuxvP@OVREI&@3iP(8hGt-ykK8@(X&-XeTRYRp!?U&qPP=Ei4%wQzNdD_ zKN8h5Ja%S?EoD5YnR*QZ{?@7HCwrUx2ujy?D1^>Nq^jRj6cX#+y7U{Dy6@wsnohT# zAf@%q$4Dl^tk0<;hcr&~=-VgHU0C}pt8<-s&%Fk-&*;aCeg~LeCld|w#y1;U$Esa6 zhdTJ0_?p#o#W!{v#(>QezAdmu+eCwQ&+3aEz^`qOi03S&NF_la@YkoHyCXsOskiVl z`0Vwnta-eA=D~@s%%{f&S*OXzAnkN9F#qZ9{G=aEGg9^74tP}J`ec#}ccHJdiz_$z z;mubMY>qH-j7Lmil6{u(N$ACdGx?cEVWg%{TH*8FtaqdYsPga?a_d zp$313>2u6m$u_KLDv=rgRia!h*;4!2nvJ)2A9DFhweB@T(AN_7g?6eMqGzl_xNQ=! zWWpaDa+?;U6b}ZF^%YCPZ zcKaUP)^kST8%=j{9~$K)qQ~o zcV4k-w!T_!P&avT7G{Mqj-bP}eq=fwq}lN}HaUXY_uFu`$Sh=BrC(WDDe2Nz zZ~L^V$dSD^b2HU&5$WJ39E5VLZ+>1H@@EBdQCHS?l8f~6aijy#FT`{EK)@IgK!B09 zpEj$E#=-ZBOATET2;#otRwb(?H8=?QzH(wJJ4v}bcTB0Xi?MFigBi3nBCvGQMLz3S z_&uUA8^>{>F|uQ{A7z68cVQXh)Kw~CHnKYy_1N^)5DMmX5F%K&8yEoIYgR zgGvCH)$-EvRhh&dWzhnj zztF0kjyj@Dv#=vZQ@**vcTzbacmX(`s#cMr2_WCzVacXjf2;%&V?Dhb9LQ)zA>AGh z(~DP;m%#Hu{jOEr`ATb?mG#CF0u#$3jL4)HNMKvK+#Du?8)>gQG<`KRKvyey5oUbc zrC?hDAatuwwfKxDtOs8LsvHVvc1TYZtYsN*tY#6)<0R)5z4B>JDTVXaZeva3!q4^~ zowCl!Cu)eNH4z!k(?W(R%|6$cr`swNN3a9CIrT#=MV4uUitVhV)(Y=hgNCmVuZ3on z&%XBLmTL66dztNOx)eou3CjF#ve&MzklpbYgaLQHyN88Ns!PCzLgPQgl4k2G-V=)8 zk%FyPo|N+GHTmwh74c_2{y{xT>5?ktb&A#6-!Y1rDP+;2F-x1>gCk4>eL(1kr(2M| zp`G0(6Y=o0#+GSh^Ee^7E-hEM{&a>U|-O~!UqFutIiMP0;_Dz&^$>BwBLp(BMzjh(e zmqbIC5v;zwSPe>7rob9}q$i&jtKO8Kx28SD3BE^4_hZdsw)VlxZ2JX0G5al)J6?Yu zwXcP5bAAOij34VA4kFqV5Omq?!U8a4V@h$}PFw|WS`Z;VBiMWxn0388s_tcVN4HqS zWmVScnaM2dK|(9CHhw4c8R4eTJml?Ew?(c(nCRagn#;E$;1#5A>eDy&biyU=%{K&S z*u*R0U=pkjr_zx+$Pq3vV)=pe*W2FwOuwI5&wl2?47r(X_#TQ))G=`KV9zSP_trrR zeFd{=Ym}QoX^tH^wbND&ITB5Qr&s02Mq`fEhD}G8$yTf3(m6x8ZR+hVc@#mew~IH* zGwB=`XXUaTOh%Ru5|ht7UVA!?X6U7pC|%81_f}M}W?`k+`m{w)MkNEkHuJV;D;&=H zo)Vr-X{*nFt_wKLD+(py(+WHu5m4ZeVYrSH-ez(#ZvBx(?VmJPtwKVPWp8(aCxz4wx#UI9c^bO?rrr8;d6 zB{7p&ceBPGX#|In`=>Y$3ew=v+CZRZt_AqN|mpL4gi7ozL6R6lA&sn0-k_v42qo zcc+@*G7f2pvm<9sJU3(BI{Y_;y)UJ}3mPfX?R```k{gj%OLTUcDS)yG91i(92;{6IGP1=u3% ziSISKFwHo%N#HZOEU`uGBy_ocl$!pz@Cb4F#b58^p+R2>Pp^lqpCEFga8)@^khkMeY%_i^qPnFiPH)8Ys(?H-o-^u$QWGjR2`<;*AVm=R zvFS0&3I1&|RY;XJHX=-D>6~7uliLnQ$O+c^;}W_ynyBsty^bFfPHWcuBtBctx$SH6 zPP=P1QaUFQH_|%ccmbK80vFG1LnQj=7_E(_{@~Z$sfT*;ipgw&&j!>3zAr(GaL9>| z#8XhFxA;NlqlOe>+1Z>hut#~0VDn;FzV`80h~lDvV~6r}+bx zC^hSMJ6hjf%y_;#wYP9tIv}8x$3~O&Q-()pBA?nH2-MGSnE# zCNV9;x5A6=eSmT5Gy;*XWj>CK@4=_*L4+S+d9o4+Wm>PSlBP-4Lv=@uH@J$sUb=p( zdIp8HJnmUc6FS8rx|sUP813p!z|2Q163FFW!#rb8rtegEZ*!J&q1K#EK1yiz<=d4> z^Z5}(n2zn4dHJ&P6iH;I$HVt59}m3j&#y36+U^_U=q3r!b$oX%Yr>g2S*p$%HPTFm z`94~V<_p2(3;U1~{J`ma7x33IO$7>fs@YjDrO+9Vv*J|KBY8NuQUa68E!EgHa<;mH zNcY;P`O&6tiRHGOA%JX4xZE!R{^OLN3Ms9HD6T*Zux3nbU-ZJgABKNXMF+PXI=zXv z7153F7q7J!PUcq?{^6F*^g~Dp?%i)-TJq2OEQ;tC{bqUSu@rz)9>iQhcxHE(Yde6r zzbqc{!Y_d2QoLGLhd4t^R=sUW%4A)x;hpN3 z8V>S#-&u6-h9YzRg2M^;0~eF;yMtNxc9aP)iQisK*9NSQ6$ZR*C{cO@mz32pFXEOE+cUx+=O&m&B}Q@H{JiCV2ks<^gi2unTDK9CS;0x)k)r!#D+ za(MYHWQc=x2_PUf7ob=iUPj!w^aH3oxR9`TQ9~!%sl*DA# zJ1a;59VWn=ba{Osq#23j*`;;8fJ`0rp@QJ-lk)gpXk)d6tm3IG=R$Wq25nnWVKH~a#}t*_yPnMscH8N(W!1{S68bM8sY=2eP zLiN}9Avg7`z1Vh|)hgBjpTX0cWniIFf8YjB?qL^B$H{l)kv>wuF6pz2yp-9poe^~MCCAJ+n zuQK+4K3GYEdCMxRTv*aQ z=hmS1k%Wtls{5%gn)eYFeY)uuXI**2iXf@g|26#bRGe*48V789lUi7`7=@QnUe6f> zpi5xQ)3e8Q%~Gd;&;^0CY~JmxG8V~!q>4kW{SMSg`?a6~lhq=lKaF$!R@p@M1Ku^% z7-sg1>FqV|fQ4UweQ;p!F2Yv6^q` zcqd~1`&q^Nmk34%(QTOFraWzaJfe<%u~fILKL-I;u&yA;kKbcE?O?waO&dE)xdaz& zJ}ZWA`RGQ@3&);zRMleZ^aMj5%0YK1tzvF=;GYXkU) z_E$80yQ}lbr`9jZ@Nr8T4m<;DjyD?0uQHR91nLRQ8_! z`Q1S18(T=b&*`-OwWrkXVO8jqbO48qC8zGzvzuG4 zRrZR2wrhK3jY_+z`kmHsY`P&2fF{S#vCTcb`B2cQLJa=%Gswm6PX{tK&r6FNFye70 z+3LfF^a4e_O6wMdS^G@pDrBWmL_>B7!#=Ag?Ba@%KpjC&*|h)jS_(mL$=!}9DZ6mE z6ZTUOv9J;A1_}Bu6u)ylXA-^_yJL~-vwLWrY8?m@Trk({?(1@rujbkRD4o@SIs|-c zHvTF=GBwdwv`Lm}Q?XNA@k7U>Q!xT%3yPx8TY7zxhK|$iKaAaGpb{2Sr&~o$GGUyT z$>s$JEZx^t*36*vve(?O>*u6Ih@8~@ITZvo@PK{aO^sv6y|iw#Eqs2xZH=`F!iUQ3 znNc>lBgIGS>qiQC@daQqfQ<@OU6Y;Z@G`rBj{v}JUM2T%as+ytFPJ~G1s|Se#U5Xg zA=*SEk?!CrGmTB+9P;FdFw$U~7`u0WR+V~^=p~s=1dewQsw$vwu+$zowuchCd z5Mmz3&`BSrY{5h~de8E$EjdGum9W+B2`W0BYi#6xxjfyO44^&$GlkHzY=vpKG>dCa zapU7VOB8Aos9lW zs4w%|#b(#z?I&ZK0lREpccOPJYK!5qW9}~awcQDqxGtm3*)9l~=5-Q3|F%UM=$_sk zR>b_LW|=Z+J>Uw9SB^Az?;?AQTj?|_OFfHQm16UPEq7B7(Z-Q`!QI#Pc#UPn|K(;L zOS)q_Ef~=rIRf8M6o4)wc*U0x&VEjc2>%pd_R30yodVgI($j8Kf(V^YHMF!k>Bb!a zQHl&?UMuG%oUX~+CMMQddsprFSAw!&l57>+D@N_G(&D}uf{dm#RiGVPPxj1x=p=HD z6^g1mVMpmmbt?tH8I19@fzoM47E;Bmg@mKKLpJ&NW+|Ei_mf|_teN){@8~nEB?}d( z+=qOtRQ;wmZMgDXLg`I2HUwDUn{{ppz6eb%4W%`z{;<&agwHN%wkC|)@U(O|k)Hdd zp+$E@OHEg6DuzJ)=YBQX@n1H%`4Qj>DbS#CR zw|_SwTRiu4-bV+N-7(EiE$}^UBmDQU26f!}@wok7o-Q zrfL=|%+F^6-T{L?)W-w_{U+RH8k2t=OTybNx~(JwFu?(1rj8oJ=TC=sw@j<4pO{ zHQL88aGGpq;Mv~T<$sV_4Cb(`|9DWb@A+5O?RCDfPy4~5iwXB$i^>{wCn~2H#wp8} z%Pm(ZO*pph*|uPHO-v^?R1*Tgc+Wl#o?|t;7{J{sHo|ML#%W%(5_k>)o!3ocv<+!c zFg9ZZG_#-}R*jV~_W8pTyBhcj>2{h6wO2;2GjVCwG<@};JWsD;DqN$I1T3KmiJ z>twn-{%8m3lp6TTa>}TFrmChCHhMEVt5?VMcMjMr-M)_vk2dszwN1pRaCgO#wFOoA z3TW=0I&>!@+;w{&6BWP%O13W54vHv?e(X0~A|k$b)h62A>tWF0U1t&#={qX?BVOj} z5H76bvgAH%QgJ-97*|k(r>Xb;HS~HJNCRubEi39~=gQ|Ng+8+W)pq=RK6}W`wS2Tt z@LywF1gd5q0!28-wSSc1KqN~q_9q17dUiKTY-YKA$xM6|$iWd=T@{M^-fxL*+Jl*> zZ?5k3^#ssY{dR^XSBlDR9eSzdPywsy_S^@MHn~Ean6a*uU;&S1mtd1It&Fdwt!3;LR99F88bjmFI}r zl)UDhCV&dF)WnQHrOV~;%-$H^+Bc5Wr6ZD$WW5!H%Clt1;&{T2U73a&&Xr+VuS$37 z`3Jmsv!`SCbSL6DS|jc8@bKV_m1Qe-lSAZ#!=1Gyka*NGt|&^mWTiN^)Q?6SRmr`! zZ(1$eB+nf9z&uJ`TI-WEZq~CY@yiD?UuE|+u(vDLI0vu_W|CTBq~EdBnYE@k8D9T7 z|By3cNh_=6%>ETD4*G@3_5EOPsxtIi<6%iMd4#~CcTW^JC)Xo(0c8{OK5JJgM?yks zSG?-9{}=_S7lpm0cxT*pwo0Hc{$wh#Z*KG0G)q>a^U9Y-$~LGzjt`CUCCG5>#lDDi z9k-&Zi(-`F1|7->qh)SWE(f@@#3~-${X&S&p}-tizhANJI+# z66y&9c$QfQ7FWCIW`W{2NQCv^P|`dPA-Nu6^^cme8Mk1Qo7;ANWx82 zF-73AK?=XSS?ycVS-Xj6+cirNU~i=Cl8|BB)OCO%h-v$3+~rlI6u!{Di#bH{-2w^d z^D3}(`_XJv4)yycNIT$cL1Smb%^;oXWmz@WP=(`sigF?KF)wTgQ5n@;2rYf z-aDOW;QlD;E|?Z<1#`z(hcUWl5BN2wL_3p;|5*OorPew_K|E zcf0&ko6a`!Jw>WNSeZ!d#|tjaA>n5hC+SX%?bBy+0S71baqm)TCnbX>(0A&8Yn8U z(f&4v;$*$4X2o}O_P9_QdYy{Q2+{ruQhUfz+zR?v2?yZ9z!C^YRj&9hqi}p9&U5Rk(j_6Cy6yfX0ch0L=TDE-mU~dkgZ{ z#kfibF1Z7ICjSN_#g?&pyg*bm>KuNw7bxa5Z_P1MTHEGe&gmuew_z>7^uPq)un8Y9+3-6v>evJGTBR&#w;SJSRZ z+CXKExyU9;fijF`RONR!(4)Y`uylk{({{)i`<~ZLD~$W2RJtUM|IeU3$FoX7sOu2B zJcGN#6|sVSA=w*ilYii6jty3rY=#m znbA+pw+8emYabK0=9>($#H5;mZ;)#a*x;A z&o+#S?=*G3uDrxiSw89Q%&{fV><2g41a^p+Ku_C-oM#F4AFAtbqhgbI+gX2%wYT47 zHK%CywnWR=(+mZK1ZHOk{Jh=~8oGJRsC1nv;FRNquiNeCU!n2I#0zHmeCRxL=vdj9 zG+P2+>?FRMs`+Qgs2E-gE$l3;_5xngFr>IDkbBJE(Pg|=y3LsM)EYIoqLqCeIT`F+=os8?+Z_` zbU@F}x5lcn)BeB8`6cJmtF0VYS{XK#7kMi-V~6g`BzwK4G`$I z6#Am~#6*$|>7CA17IkyXy{}v~21=D&x|?!Fyw5d?vq*56)|b3I(L|~Xu?An`#Mh-C%URyz!IEfRvlp`ZH`_Hu6;~0^tHK9$>o=}(PP87eNcLr(qN;Qu=pwA z6R#VUp@(r%4Zo&F-`BMJhQAy9_@K5>?^0LGXiNfJ!*rKE_mQ>4j|Tse5e|)SH$z<~ z%a7SlvnZqG4w0+kEnl;1&y9M?T?v?efT{==OWj_WWvpUvkty3gs4!LJyH{4xt8#E> zCGD@-yWi0K1kvpRwf2swJm<_uHP)I~QR&Vvd!rbPMJU?wgP2CQN59)tK+KrudEtAq zWj>V?f1`t0?Rc!8S+Ko#Tdl=`uoOf|+TM~Us|D=;W-8{fVLIGRIcs5~Q!M%q(f#i< z@f4ozPw8bYOf;p_*(qz`HA$eVF*l9wC>BTKE%|9UM-0Nt%j+GZBIiUX^A8*NDIh2l z2xeX~NTdEgsfT%(m^0Nzq&DsyUI&Y&;flEOk-BsmF6hLwFa7$kiOm1N`D7BgLvG92 zZXzA}A42}`k9l*qlux6y^*`~O=dpE+Dd;Vqzx?}`?6k~|ehgTBFH$tkd^L+Ae5;aw zocN1jID*+K!7E_?au3H@d}_bTdg$-&l|4pr6Im?P3Dj@J4XP)6BIesjChp%_UR%pq z=}kcP*X0!A<(u*Po2t$Z3_+Sf`@lyOx0g}su;Gv-HX2cV68xKSza3Ux4pgQo`M``H z|NqqA|3NLyKv7q}Lqlo*lJ&p8X{_H?-Yy_BrEy;#{Q+ulp{-nx;JqxEOUl=}l`abAN~lh#&pRhWxOMvA0<6RwWVy@B3H zqLCuS#12qB2zi#p^D>R|lItrb>1bieYZTRf;LF~ZzGgrda z+P<1FfV&hjU8#;`)a$T9tWD= z6J4=*Z#M*yVWYT4|Dogm`IxtW$x`vY8pXF9b>E$vfIP3%uO0PS;sWpzqf|l7M|C#~ zUzG$%%26Y~0`r!qSPjNS{JSR=k4XhaFWmJ9&j`l0I^QcdDns+V<%dw39aC2AN9{^T z41yoGy7YimH&}RclQ((9jC~E`|fm~(O!x!#RwE)og$1=^;@vZlgDJ?2zhg|HDPuBbETxK ztBcLk02u%q!T#l@_>{xxmsN?u;knVx$H*2_+l5A_H3X;swh7PXtor$Nn5R4C_kKWc zvmBfPcVDnIj?D8r?M>sJu$RrmgM{l*;V+GQbBj@9qwJ7xPY)3fsD9hQK9aK52MHD- zKiaQms37TTo$Z)b6rKxDBtnXiv@$BQ;GCdCSoVXMPw$?H72fPWnB;;x2aaxb`NbIs z*yk*%-~WSa@RH`?C2TNa;=|pRB?HOsstbNQD7pI|Blo{Q4&M67v)u^(JxDqS-A)I? zELCS9!OW*;zaK-%yhnE`=2&Dodphnur*zmDHdw6kt#)ro3<|k2&rGcum>YeGyb&AD z)5hmJRS-xsfp})D*ZSL#EF$YA0$XJcDZRgZE}6Y^S^{cOv%2mewi*$M8maH@pw5{( z(5GOQ854vu)rjyr@CZ9OV5Ccv0#na_5imWD0%_SK2Za2x80U)1d3 zT{R!fOk}xFE}i2Q+rRlG6OkUY_K=J7X3gpDWW{D)clMhziJfnse&*0!X0AMsdja7{ zH_N%+Fkytg^v_j~=3VOo)!0s#z+V@G>+q~x2A>-V!ehJnvXP!~Sq|SqHLZ^2`ZJ$* zyTAV7eed@m5wDoXJS{w_6Fp>Lc73J0*a(X_;geyEJ==sdI&?1Wc}8Ei;AU9Hwyq`5 zyZ+EE&AfRY>w5qBcbL~nyyV6^ld^Cx3HP$S(*S(rOlc;n9g+L)d|#G(Pby5R#4%27 zgj-=3Bcz|^aT`$Nh6v?h3&R8=F}CYo6G6X)Qb|*Ef7He@{j*5@j>`}5>n^k9HrCcv(_c_*)O?J3cLi$>XfQb4Knu`q2 zaee2590@aZDxI2TlhK;CYcrp(YBSZM;VoLAs#^*1%MsYI8foY>2((sdTg;J^^JA`5?zqgguYKRD=Cqzm)-#%vZg!Y4PbYFkZXY?g@_q z?=H+Jx3MtedjBQJWi6cJu5a4p0rI}vmcST)r&i1WTzK@Ouz&C0@o&FfKky z1Mc}LUvD?@W_De2<<~0lcF44hULJ-lkPkferN8Ryz4T$7tf|r6Dd}j470X<0TU#?L zi6Qy80qZj*Ht{rvX&*wRr%>pvo)3I=M zyhT>+ji#Ob)Bedn_=z~WYWecTa9<-CrugM?rPT;hxuaW7y*txo!C$`Ft?S!2>n``n z{rNgpSlOqaGmZ=A*C=~DX?N@&9f6>f2Fcf-mF)IC+g+ISf5lQrXOecx>6MvW-mF;= z%xyYlHCT?gGMTao|NTTHUN^7&UEqvj`cwTNkJ@1#&Z3)oOc1ttcfH2lJ>^NAKFidG z)!O+~+fvmduh}yyQwkiF*<(mz{@{tpS@C?Uo4!DLtod#1GweXEI93kC%pgZlZC*D z(aPz;LUWIeZx}~@`0VtuKZiL470S*yX#^TZ))s%^2tK$Q?T+H3+<1DIZQOk%uNTTR=$XJ1hz%vV~)>W^u1>dTK>S z4q~?jx52oo-I0YEF&V#>0e5>0TO2EHSh<3!e{b8|SSZHQy)273-_5TI!+9=r*A*p~ zvD6l$zCSaqb{67Ba;8#g?I>XZK_56cC^qj?7#@H=NxEH{==8Fu)xhR0= z-NNn<@KcMj*zOnj5Q}e=Z zQkG0QUHboG?>*z1?zXK_MNkA0Y0`^IuY&ZBNbg;`joxeM5s}^$0tg5J=^#XU4Jar` zmkyzc^e#2Dgu8h5KIiPcf9LVu5BL4{enb3+By+7b*PLUHIVQOK(k||>u@RehM1+Q^ z@hKl4(EEWZEKpNNj(5X`kB84V$=+r>?2S`{Bme zT|?=enh9_(%p&4INaPE^3MflTmU^o6wVMKMn&MxF>Ba6o`G7FEE%~FW*(|w3@b5pJ zGKj1m#)lxk;B8EkIg)*i^9tYgS~5ON8S9PdhS~{pn>n#L9X8I-ms-#DK+=e6uUK1P zX!i!5yS#G(KG-sD+^yX>mG)Zf?0U>z!R#1GruT^6b{boAki!e>7y-?h#%15Vsgc@H z%IDU=tvjk$-}@CdUBstlafC%GQqu`41wCoX=)-ocr@G8od6yDee;(gC z`(s>SU~X=H-%5OF*y_IX+HjHe+0l;m>EY%Qz;C%is90!2`%a1OPt#tdvZ8V{um0j_ zS~Iipc;t-m?TfLr^FcrQ={Lo@#U;k)Skg)-o%>gq?d_cWAwq$1R8MQT%^ifroDh#R z)^9q%?Wd4KpFvTenE%w!$&|LbzJeu5tiq$WW9xDt=b;gSrk$KL^Ve{IDiE^wWZzZW|^pF&q2X`j2rK=>e`Z`@R_us6pCj63Ylys@X%V1MeIA8X1UpUU?RAezg zsEX|&75sPr=px7ezJX89^!eE65<}(Pm$Dic1PQ&y^jL)~D_q5R2B$D$MrY91Zpw=D zks|mmzN;DKj8ec8i@2TmxNpF1INE^iU+g8(5xNv;6%rX42LKD+(K$VdDMML!{u{R9kyg z|6@1&>p!#J;{w3604ZnoufP3|eUinDlrxD8`hP`q#}UP{2sY)*9r@uFxnc)76ohuXC45q9l=QAs##107`^eN0cASL7)v z%~ahO6u7{vcc`6StNGSF>bQHVeP~%l!ke^7N`JZ`Ke0WaSf^j3=DATxY}KMfJEuFr zJ5b&)4Z|=vflqtf)S~2I#n|O`8@$}9;gO4we2EUInHIYtDm4CJ(KkB4f5u40{0T0x zCoe4Itod)v0-28%NbzONmw*BNx}UmHd+a7+r`mD-z#3g`EaJC;HO@c$yEXDE%s)Jb z1M^A!hxuGPmoZW%T;S!E;N|v1EPf@_Cb9oGgNE~A<=~TROXKJjXbJ(^hDh;)gA3OP zk02q#CAjsoj`vc$afv2?zt+4tX!T!$J$>1y$HWWgJ+VQp+C&xs>Cdy0tPBNx64@+; zizar3W8*&^*Q(cGm-1xyiT^1nR{+qFolcNp+#ehm&jpyJR#>U|ha+LD19q|r44(9N z4j8PNtQx?e21(aGlKsIEn&^WCyuE0%_=iRQK?=@R)obzfKdtg@3V@vb|6?Ll%?j$m z)Wfg;RiHq_k&o7x7Kd)Ex*QH<*MJ*y_jp!}x&=H>ET+eBiS_gGn{+b0JK8rc_q9AL ztWd|jRjBw6jI6}1ZJhP*tQm~D{SH*;2WG46hMHPXqfge`aP-S5Zf7(8!ED7Az-+~{ z-yE6#;J{zwah4G!{I^r4HUmz1Zj+-M%OK_Vj)+zmW;GQ7a8_9D%QD6>Gmlut&Wm0| z$={!^1VM`=ns;Jd-dQ01d`rxMz(_szWL=FOZ`9~v@a05et9l^zo(q-CiF z|8qrrB{`ZwH`@SB5(=?(Nb_FC_cmKeSYX^Ep+|BWuoHS*@}|P zZim6M4$yM-L{oC-5#O3i(@xm&JmdM}$aJ~)B)|Uyikq2@a906MC*qLqvz%P^;C^gO>!A6-i$jd*e3Y4KCW>ILB&G=ksH zjyhy+K9XBr1dXqIrE}(2i)6i{}MYSxS>LM^8&%_sO!A55r26uZW(qG0i*=st>_VgZ~ zENdC(Wn?3xzvKLae$d<2`f8OCYdC|U*2HHLhz6ujl-TzGIyYSX-9vDHp z5^!3q=jZ#z9OZ6+LXmPX^f(2|f58lD=do;-bWc;I_37d7@X?VzS;;{aD?LBH|w6HlJg*)7yxRA}60{U%#2u&G`KKq7*g3Zb5qi_>8Pl#4njw3n0- zm}@>E`=-R>Cpd0v^oW zjxmatf(33-N&0+Zj84=P?*y1=uqwq0^z3qQAw;}Tdb{WC@q-!RlgTDmjVH$YOxkuh zD({JtYI?s?2CL&pg^2{Jl&zl7H(KU*QilU&rt!7s)o(B4ENVuq;|f_L0LiD~Sq=1C z6vdJj^d#{dz0<+COpdPGTdZY}PB>qgTw?8F^ZZhm(9q&$0<;*AXqwqh;m}H>HoBAnZTAHtcwIOP1;BWrG5* zmF(~|k=cMDI`{8)uJdJlyQA$F{DqC~N%HipKK-M>V)3MawpIyvH{^D{5-7_ifWo1B z8}JAGxPIc)E9uD}_nMiDBpSYOA5W|CC%1Fs>({(o8>rp%DpYk0)zcLFHd_d^Hjby0 z2HoakMNV|2R!rDZ+Lyp;H#qYBa!_~qMZbB-XxEg!PY&fsgQ619bO)NV$1JF zOKH1jECH3sf+92tY4Ek#@S>z)+i&SLVi3#%vGPED zaz?P9h5@96LBIfE2lOD2(FF|BMrCGp*t2CBTA>vf$9IiQh8QaT*2eNe@|ZQprtRj_ zo(s*3ev_5MW5N$P)_D58$$f0-%dBK!0{X0)?`=V4rRlk8Y;u3PNdMU!G4wuX=wcXi zyjDhdF{Rkh@m86{?0WQ))X$e!n!@R=u*D=|fe-z+k?4l#yhe3A;T}sn@q=||@q<-s z6w!v2H?LDbIYK7?OY}~K@t!(HCw6*H!`5i5&2s`#p2iEA%15W9O*?#0V>+a&ZLyoo zL!y&9Ys9$JYwv}p&V=6(HotZ#OiNkH&y{)ndE+M`c}n6IDFL~=bQS%Nwtewu?^cC# zYgfk`OD2$kDHC;1k|qS9NykUkp}jR9)=A_w!iPPr5&RCBKD84*L@S=I$kq4ad=#US z3{tTo2~d1;ohP5mW6>{59fVUuix9X}S*29i| zE-IA=S8vM_<6I|PK~|a8I?w28No)#2SN(#<{3~XzJ3a<_2qKOLYais9NuQ~9P#(>(k?HXgit)o{8WAZ%mp$!x=870Ly>UOSk`!bC;&_<)GF4|O?_IxJY zgax5>LqoB$^%teWADKEhMYNs+lb`M!xo3q9b|i4!>-0PwSULn<02* zYDv7LsxsW#sj&-P@2Nyxvu0f@6jxevukoSvnnBgI-$if+?rRyI{PcmCpt2?M;(`zE z?2|bUkO@(^2m7)Ec&r@vV}E7W&}{f6<$NT3A!>UHyHpa+X8yGW1Oczvc23UMTd-Vj z+;V~&uCMG#3E>_Ls_~_+mo@gK*ZkPryWQH7My?$OSCwLKoBLSVw@b9)3Vk`0EiT*< zOS^o7U$LXQ?;g){peZv0&tNK=*P|{JnR1mM-J32Gx!Cg(2g7=?D3$WORYCPJ`V5cP zUAG<|{tCAq?+kx;xd@?rdv-5j)qUm3P=27q-p=lUH9)}{nYV5qs9HJGdCsv-$yuOH zTl@w;`g?m<&e6F3{??ItI4z#a(%&zf!E0;JZZUsCC;1~r)G5Xn1H>fSjid*eaBx^C zBRr&Uoc{88u<^CMmC^b2wOj#p^3i_Nr!yy=@ZK4XNz6d0-tzd0n&$75&|->G9pKV|F*IRD59>$^WzLWLJ06Qy>gUKdZx4xwO?lo& zQi67|K#s*Yy%RIh5N1t3L((nI6^9Ulhc*PqncF9=z0=MVGdFDBsAo!w-PgF#V!A#i*N8O z0QO{?m3fWu=472|&E|3c`B}ep>b)(=1|JLv$Ar5MG${8!XRigf%C)s!ubZxW(AHE z4#&Hwzc<-+od4~~KfOP&rmxs>ZDw}2Who__f2Hn93{AUX>rRtQ%Tq&S<#)^8!oWxu z>?QGA?AfyK_p;4X;w)~|x{N~VUMqx z-FyIty0wg{d4pcnO~d}YCS#i{rrUK;S=L2r+ljX0N>cMn&Jf<(CQ+iBGm^=(;x}(*B z$HxyV*{a zKtN+^UKc)u;ww*(ls+hG=;N?@Jbofg!H5os_YbV!sOZL_ZZ_EhMC@&IzWq?DY@MvB z_;vcCn42t$UMm9=Rg42;!+ENBTpxq5@_G>WJ>8vHQ!Cw(0&XD>G|MHxW#3Gh)Dgq< z1+EBHE}UB&7EGUo&c~8QC4CxoTey_NS%*KurX9N+LK>HnCqORJG5{MWkgAFU`^a%w(W?h0}(>gM^0-BPGSe!3KZxx*0Z`^Cs10gIM7 z{!0Jp+g_x_+F4Wm;aH{ZG(k$zgHyWJ;%bN*BKIeFVpq zM})f7X4B!qw-+j?Uwh-Vu?aOV7jhzun)!Qg3ac^rPR5+}6Q0G;Kym2}*tE-*LuTp? zR81_U0L|##oo0tI-b(A3Y{N#TGNc#evh*GsI@T^Z<0g861#Y zS|o!e-j?A~=;OBrS04@cVz?}iRWHq>Th5W^mv(`y)?kUAzNIgFA#Q}UuYswA3In{s zd*%J0*zaDKprQD9|7OrwT4*mVq7Kv#SG4A!*kx!8iun$e-t~@y1WM`s;#zU;B;}I9 zR{IDMbBVhu8+u9j-VcG&%&aI|D}>rD&%g|w=MjL)o*8K)d$pXY$&>opQ~^xo6Y<8us$ z4PxDa`y;0U%7U_+s!qxVLn~nh+uXt!MPkiBB7s5fI*c&{wz@8O)a*Vx7M=Flq4C9R z3TI_Tj7RKb^|KJ;{b7F#gEwnz`Uu(jOyXJ07DURkHj0sgQ~$t-26BtuH0;} zlEB>N$RUnc=EjU=TX(!ibBSzz@lvhaYJhOaqwPayko?`K{*pg19%RsKHN>rt7bKmU zCcd0xQS{Sr%qpdq4=3pY>c{ctIHNYxFWM^{sblFCngO|Dp;;Qznl`-9ux{K%B(#OhE?Z&Wc_P#pS~0_YXQP(*ya` zwn9;*AJiXAD((%JdNZ}A-lHkI#)Bcb#jY>A+z*JY$oU~&wav*oVjAx{fy>iboCm|r z5kx0x-9&STkyCDN4byw(9WCi{zcRPo5PUV{8Nc!qm@dS-x-Ol7?4wZgAs&9An`iZT zb~}n9S#t96fmZp4<~s)?s-ks72Q^xOy$@xx@^F7;5^w4{MS4ynT2|k6{dAZ`CfbcO z7(5|Ed9B`BG3wt+qU|+p3FxBpUhGsfaHDq{v6~T0zl{)z-tudn*uNp0rH^xw$Zw(z z7;9UL6bE`2XkB}PdIgk|a|Is2 z{w>8jI-A57S?7Q-dmSFv^y+FEPjGS&yarXDYcpXtk8P-~v8A5q3l?2IT^lJu?#r5D znoQR(#C_-@P5|bzfexQPERex;G8SwF2q^38Mf5W5P(HkdL&18nHxPtk}(kX#Gem3;uQysFZ8l4;@PZnE;BVCEpDG_LOoP08*^IU|L4nUf=$*`BWL z7JL57;tInb4-gvK`Yi-fMOD@5-wQ~W(q@ElOILrremLVY-=x(M`8<2C@I})gm!r0q z1duG!Pr4-garp{UPYbL>TU>vJV9J!a;W9#qSWA^?prV&hqOctGJbiC8Fy? z5+e7$jv7<(>SU4bz3!s;5fUDV-{sv?wP08bd+ij#JsF}Vy)$g2rxIq?j}{%Htc~LR zCT4GbEXmGNKfPGzxTsj8VAvQQaoT;e=V@jUgo@y+z2fvM@%|5FC@7Qz%m8~{RFJ& zSjunt4@l{HlD=y4NC_<=Z=)_Z^uI zr9c=Y4KoovYksqS>NJJ6gPgXGK$Y?&>V_t_MEA@AL}nrW-9~zknom9#2+#&UdR%&1 zVu>j>azdCBw|paGAKT+ALffH{f>WbPJNkR3?sdZCBah$mhUC84Gw;^7jwx06^+TRm z$Oazh%~S#OZk4kvSMh4zdQ(^=XBVFsX}4|FT=IC5FDT`#sIG6VmNr2ZBWnywvk5=8 zv@`s-C>e|_1FHutMa_H{la?r3jzUEq6O~P>-!gxr7)wK;>{tyyM_CnimFB*3R(1Y< zaHlte%@iW)W+S8AJsRN6kd5hAq`CeRK~`e z+q5eM*MfENS5ik=H5*2LmYLNLI!@N~*0sU3ZA-q?M23Za9SCgiJGe-|>}ZWn>0C~g zVyK?Fs~AN{zzHH7oNi->WH5=T_n*EpN4ib=>|7hv(Zg|@E!aG^EuTWE4&V0`yJ|2m zAH@V3sKaM4{-dxm&?KP)+C8-?ynsU z+nf+f{(hMu_}esU{y_lp`@zXC>t~#U7x5jY4!RRwB91ubtgMqGuxSgWdsz=;uF|d#z)08!Wd||2qoe zmVphe5nGO`?a|IE+F^a3@C>(3kJ!-at91N5Hza*w^p2z3v|Gf=ULXBE-p)!a^vGkJ zC;9iuX>4n6pCxNP=}i+_aFizb-;1OgHziAMJ{2`~LPG#-Im4#oIOXC#~O!R70AMens~J%rVW# zz(@7ewPZa_0#eraxPhdQ>T)wc&y7}F(IU`2k>J<5=4Zo9skBpC1_l+sKszs5#(c=e zj#&CAOJ|kzv?x8pD3wbk%=N(X%C(zuFMd zI83z2SZ={=y2R43>UG|rpFKQ+#hl`WC2@Y+p+=wVcF14{0v5R}%XJP^eTy{pkUe$8 z(pX&3A`;ia>YZo=4A+Q>h*tIM_&ow*_E_!z~*;5Nag0l4ooN3~F? zp$&_X$Gtx`))|G6E_Gkke5B9T3sNc1SDh>U&D|#PRB2TdhjV2wDo>N8?c+nC29-;x z*>J~?G-WQu#r0O`bD{gIy9GAsPuUoMSzSV{8aCB1-H+XzNVRXY0Yp3vc*r$B0}m&y z40*Nl-F$v0lXMI(%`%+L+b@WOJ@2Jyg^7?Hd*OZ+QJ1ocILL8%76MW2=aFog_yKrj z5He&67r!CY4|=>`AmhY_hVEr(;XN`?cq5PwtN$Pq$nn7O@$XFPB<*zsEH3R<#Hlnr z@1;UMUgzfHr6w9OKA}$niU*6)81Y92MtOvxncKx({pKl+nLr(WYV)8WsmOOwh3$Bi zMs@ZgwM^4Uar&&IL{IT<0o29t_lH7c^Y8^J-j=|qQrsjB9-2~C2fPwsnR@?>MKVvvUjPFyMB&mx~5U{SrGbnN|SkmoD)D^E>Su#2vn1B z_DYmSoa-a|ds)XtvdAY>oTqOfoG&BqPiSdvCa*P(ur*8hA99z>KLAJ@HS=8if@hx{ zZJR;J#O89XIBrA1+IzU`>0+=J~RE1U}ED1+@u9-p7lRq~85H9njk zpR+zYNO|`hasCQ&^M+QEU+sMBq3N5lQtBvWT)PHPH!<9cJA5-+e| zF)SNgq~rXzN70`B>xrs5ejOD2-A!Co_N<3d!sCZ>QwUB_V#2sNEq9|u`c9qhY!3+s z0m<-YH?@t)Ilr1Qe`o__y>4$c&^+(Nz`RaC-LZPY1Y!T}Lg3z!{HRnX_#rsycti?? z^Wz$NTq2_v_4W7!0)<9P@1uLV^eXSSb;fun3Yon1>p*?|-sb)cVoxaLr}ZcM%-<>8 z^#I1W#eVGq#+V}XTS)~h0bk(0@A9!W++USzBWlntvgj-9A<#Hq$%*%~%&*&fO~%oN z*{Vuy7*UMk9WB0hzbU4WR(<%BdbbhlH=yxGZI?|58NW++E$OPZkiy(olSa){sl)N- zHMJ8i&68t}mv0oB1ph9llRn%CYaFVd_WLw8_H<6McQfF`V3kPd2SZuQm}cVo4t1Pq z-7GKPnh03w?t$g%8o>&z`17KJt5iCJJhJ(=FTmJMERD>*;Tnz-LmBtCdkiiR+bT?aA>fo@lS%d*`v zjkTLb=1}jAw8yk<0;(=CR61wEklpP#WLBs~W-!p!QV;6<>8p7qHPuVmhajzS4h&DZV;J(J(3!be$s8N2j>lo7Q`K+)lVcjS#uIm>tfs~RHHR|CA-uMeYGD(_xx^+gbV=Lfagxhss}4%=7Bmnend`J z{L62*tK&1XXL*MWE55k|j!dYyFPLdfeuDu2m96bs2 z^wj1`IA6nTQDC0l_BuI|wrIE|=sJEb8PLM^8!psQgmU`Omici_i<`I~#Y4}YBi8J{ z$x#dGY#!9@IIQlOuO`@E8xP|#t$EiUbXZw4c8=U?SZ_jn6O^6Iv%Y5d@$pVM}h39;PY|25z9Td%`s@@zj(WNf&mvivVrQZ>t8V-VI$ zYfm-<3-hl9>WmJ8bjbPs1)D`n>Hvmbj35w%2kdrQ|N0u44~AX@?d$)PD2{z*P>{#j zM?UQQ7DdFn41fc%?TqAjQ$2cW9!AP%7Xj_Rur#&t{=!MF1-dmEAB{@{3;X(Mi2mrO zGu~I%OENe3)cIdiPkM1-JHLOo5d-q?g^Jrb9J%+hwz%%_oXJ2(To-m1|F-NW%3I~n zu9rWFWJ!DcK}B7Nlb=(E>;P`NzgX1yfWMz0`DkPME0sbll8_zeuCh^-F77dW_9qIm z)qMKiqrZMR)4OGTPizBe)8CVM+&43oYFs%A3w`wnZ~8@|MnJuQakX+iSqdOYaOlQ; zZ_}#hQu?*HOoQWw!>;`6QC-+2T&7Ex@ntXJ+f)|6))S?PK=SE~6HzcsVv4lq z(0STy^XucJF#Ugiv_aAz7Hx~n=ox>61RyY&AuNz)V9biy-tg>NwZm9L5|>c}AR9E& zI@f(c?sjoSDkK}k1mWWrgJ~Qb%K4fZYk-Bc49CJ@IUR7<%ydau&YwQh;tcV)W|KpYRL8qEdvO~ac{B8g3H$u05o|c3e=H9&ZQkEaA3&&Nf%*(;7 znomGz{3$#WY9%*RK7~H~H_EWp$Fs$_*~0y(f_WuO0rsKKt_3YseoTxD?E)l%>Ej;`9B@ z9p{DbZ=1hIQ}TI(F=QW&c2rVguJgKbv_oL(V*c#gHUjtRVAoO>bYBqXVG^jn1@KL^b!) z>!pe~6nRY4Km+h%rCq`eN(@I#OReE$~C;ucMVqKZ_atqH6iaSlL!nXS;w4m z7Z@nz4+c`R@=)OoJk&->rIMKaOz1w6N;N#xo~Z!eu ze@p3`C+cPs-2IF;l8aT)0oyu(^z%1Em7P7;|MXq|zVB4!z#--++*AL5c}x{N_J9A{ z|6Dl#pY4{VpaSn}0}H|`_XNaFWtJ^L&VU=H@u6A2!tTQD(QK;otY55Y(EErHL9mp9 zvEKQ~2lqaswPiHFzPj*@rw+gqUI(uJUa<9aBgE1umLlg*JN-x1bvjTM)NHv<#(HEq zlrOhAkLy}a!PYADXBTIn1y*@PgrDN|A3ZvgX4bDmCLr_l4?o`h1o-it6IXLp3g%?hb|XlT3%ObkXi*J-gbdTDyija(4j~eD1(&YsdWUlxk%*@fV_;Q08W02O zfB;n6W<@uz<^jJk7_9|}zx_?SN*Tuh%J}STC3%s-I+v8zxNlC@LO=|-?>6?)cz&rb zW8K1Ul|{t=(6JVbx@rLGO(V1Ef_4c**5<2^q>oK%oi{-Oyagh~GS7iEin7ZZfF!f_ z6$6N_?z(RxW`AVM2TF4qNfRX0I88Q`*3O`o?<^{3Q!vvgtL)ONAAdc&0!)$>dCRu? zIJs$I_Na%;n+cAIX*ZzMs%d4@}?(U*9JJT#Qe{7?o}y)83dz5d`wwJq|gr^7)- z|J2zS+zURnm%`4y`eN^S&`N`IZMZ}ETs!vA$YHFmf4R^70b|`j>AMp@-30cJ%WrM! zZep%B)=c{=JXMuAUG<+%IG3aj&6BX3DN3jH={mO1L5OZ+w|YEv9731V%M4k~U_!yz zO;kNbWP8p{-D%Dkn-arD z8=2H~?8yv_9g&;Jcmvf=v^~>X?R4OE&OaiPUhP=l=+1=o8z+0>aj&%D+-!?eM( zs1dB_6sXX>hxLSeZB0#N077X{PvuU#&}>LMx0dA2>qZcplMXGVmEAc|-h20XyH`FNv;UT<`vM&&cMG0atwa7Ie3hO*3(OEoQsCgCSCE3k;TXPSgS@8v zs@3eX^J_&cpZT}QvvYRF5qYZw(wyvFFdDFa84i^`p}5;0mR!U?Sh5)>gY`M56?mci zT=JFV9pJYZyPc+TYPE7aX+6K6iOdM}h-Bm~ zKc2z8nt!{_Of0|%@&s-HJ``s)jOF>M%N*-gZS6WKyXHqlHpl8bT2!?M&tk-um+f>{ zV2+Cmqyu|ew?$i1zA{kmz^RVDxq|e~r5otIU4$oNTII6Li?ULJoV~>Aoc+#SR-|p9 zMNf36i0H?$$CVMQjNDV%RT+EZ&YBebX_t*DdgnqolW%MARjIZoPxn4x#*Xp5Bivp! zvjbJ2A>}Vm(Wce*i#3zZ5+L6`Z5epR(OB@jB?vPG`o$@seEJ{1ubC142>Knucq9;N zw_z6j17;XK^ALR8bw9u_DKD&!JI?K{4XS47!NX;GLwUKkd%Q`bA!iBq)?XKJp*oI` zngeI$nU&7k1qSC-{_VDf9KYlEee}sXLc%!mony^}wZ%@hgKR5Z6#ZqJ*KplX0T7&YAj^AiuDb$PbbqOMP1k4Bj*ICTnS z5)WbxHB#T*?I_z5<2A1MdXatT3}$$vI!y;2T|SUBE`O%*LMNwz>94p-yAwA}Ary{A zRXR`XL#Cr(EQ;OU^k#@F&5J1KhE$`Mj$SAq^vpJt{9ARRRb@eAsEhQnVbA$^DJG!a zLF7rqy11iOt!?r`M6D^rZy=E%uphL-`%dtkw6`a>;t-mn+GY2vlE)^LM<%fxxAd9*Tt z7q!_G?=TA~$u*^J+toYJliE2U_!-PkE_ptT9wt$-VNN`eh*9&1V8uI)k0DD+9d;Q+1^d(;w;^eNr-}(3wFs zh7BI!PRrXIzc;_Z8^Ub@7Nn1#g-%x5Kp@K77T6h`BAb@`F2U)^CUT5j25pe|!DeA- zw*MWgBnkgxO6MWipjA9fNc9xv&iX%lu00 zq8t|YVx%?P`puYw- z7#L1}CS_c`0k-WHz-=Q2Rejx$7gLn%di^Zzsq3M$QKjghl*4aIJ zeh3W#QEdA9*+E}3xx2Ln`E+lO4}p&0V=fsEkr(yZ6gsRPOFcVLG#r+L$0JFn0%SzI zT`Gc)<^Ia7vUab3!~_(b9;IHJo?_c}U)L=wS2xVpoC!Rbb^eVggV1_!EtT?^c&=}b z_LNY&Ht+Ar^Z0q19e+u8#@?%~$J&@}l&T4Dz)a+tR+pSLRD+)lmZ4AZE;$$>+!@W# zT!h{p%Kwjqhl)rU<(Vjy#^{Qh#VzBJ}($ruI zmfGA#e8PQ$8hg0R@hys6_8=)>Xha11D=G8yAfHj=H9dl;M(Lv;JSrMZuXnfW_omJ_ zgr>aIG`0>^I8^KyNY3{@p|8Re>c|bTpeD~Q>tNnOHJ(VM7cwX2|>cWniX0OC06x}rLFh3xqluH z*F*b`zZOKFC%QBQbW=m6$CBh_{UP6DM}e67`ZR7hOA9#t$Wu!W`WLBu=th*$k4FTt zb&|kMNUs2e_4Ha^u+w4_t0AI&1HS|#xu>k=f43>^4(cs=-kQ_&Xfh9T#AoqE+ zyb9wznWy*0<_YRdFjtTdV42{_=<|ec}Q>hbIcWiT*9t+#IkFT>8 zngRo01Eh7$Iw{g-XiJm3nJe@Y8ZV950oc)EF0Z0Q-JUX31`zU6D}Gu;eTKB0nzww= zHZ-qj76-c?Q=6Y8=T~r!MYq^YP3bxRu1e6ka%_|7+ivRADV1r+$w?gOVPx)QKtD?J zPVKFIbM=VDN%MvNsJI)&k00(!Cz4#RXRM6NSEa^8__{@rIj9cyL_TK?!HB%6V~$ep zE2pDKja8->%w8?jn?(geD~@_8|)z~dHrdEE#j@V7-@T__ssHFkER5x zfkwVY3PL?+vGpP*u&_0|t}RXY-`(#GS=>Pl&HEQ2A2PdlP;e>>j4Z&50%dcV-tMbm z7@Y|cW;m=OJ4*;DC+s`}#Pb&J`+P4VxuDPBs2Oe*Q@Uh_b2xZrfOws|o}x%}C4=GYPSDwpSG7Xq%f zj7qWH56gGn-7e`&$Zbw=X;42dD6z~JoC^7$RORtS`f_;|SA#0kwe@-s%fRJpbU#bQ zUqtb|jb<<9?oz0F*s1@xE!*iOSeVFa#+vWONsKU&EclNH;lG?|U~*iuDe+koEu)OK@kGfP<8v|+}eWMrt;guB%H3w%x{m?JLlX) z7@YvG$mMa@fIRr8gR6rFyYK1nLxRM`qHkoZjCje+=46LLtGDZLP2Qu(Cm+#vPFioF zgGAe2RWj^pq_~Jx-j2Yh&|sSCcilvtKuPAB<4``+j|dahtEiZHO=i4uqXG8L;9+VXT(n{%Dz`YqNJ3`P}VFt6{-U{6jI!prXWI?wwenzMVyGtLoBK zmh1U?gq10pFA}9;$Y`&I5$xo{i-b9+KI$T`E_yU-|qC&a-3H=0Ehx=l$e=yX}f$ z907xrEtPgIMgwCYsa2{&gKn>78-qgb;ls83xy1WD2lLOLjEPhSH$Li$ph$E$Y|$Ox z)so)jZCtQdORqzi>sP`J(8CPOtkD+!?V5W2F^)7DQ0y1lvduTsW*u^k4L411dY7bd zdv{xFdF-8g!A%?MYIGl{!o;b4TKh4JJurtdgmg)xiA)S_=5ji3PsrXH)BQTVj>5a! z0n_JEID_wRtc?%Q%ebmRAsTDvJ9T;Adti7GX5O8lNy2XM#)mhzM!UZhNhzym9_KDi zk22h2b;<84U(YwkxVSEBYDU5Aijdk{aQ>lQ!d>07fFTYi=|z3EN4*O3QF`jU>vE{lTqTW z8AjY-ne}|iu(PLr5Z$pzgLBK4>N3XC?V?aFc9rMV$dS$r<1a#W+Cy^PzqX}p`E`I+ z-*@vG9w|?Tn%2uEe6Loo6X!@#>M~E*EpLJuCKj^J5wH_>d&0hbiIdn`p%6){x*;Mt z_O;+qS#XuyQ}#5vBtoW1b?GLNfFoCz)ocO#B%c7LTkXAzX8prjcT)@s-n*-gF1Q=9 z=-4cRqEW;z2fW6QZmpebE7ohw@RP{!da1-$E1-8}-&j?}+WK_vL92%oihW?Aa!NF` zN$7LJFZslQG|~PS$9JtFQ0ri3%E!e5<8&F;dN#st?T;Sy5E?P}T29?kLa zi<`=_+nree7k+sn%e$G>3pNgj22Wcy4Ks4c-<=pPTHM*!D3yAd>v;d|pxTEo$B3W< zE`)Zq|Cl)>!)RgEJRwv?oYJr!_F#57R`qyX_$~48qb_A+%1Qn&_oY;u6Q&WZD3;?b z;kOTegYhW)QAr@jO6mKB!l+6ZcKMsznHgAYidC#0u1_nMJr?XQ#dtn_CWN{JeA3YpgXV!?cz zuh)DG(_2;L2q2DCvb_D#1a?=)a<=`tG}Dn%pq+75F*F|=#j~busWBg-5N*#@!dJgQ zI;*5JYnohUGM@X5SJ%3bu`nq1knW9y0a&{*#uqA`?n9le1sf@ zgJ{K#yD6T@iXCR_l=(b|Vzct)k$X+;tXX)Utex_YiDMhB>{#;(C1qiWzcERA4%)W? zvNd)6BcoK3KL^*xfH~ZvCM3au16ZqWo9J*o+Y-rX%O z3GR<}+6*2al<#V%wco0562OZPMiMI!;2YcJCO#Y0GQ3M8sv`J_FzFtF|F6h2BBP;t zDm_UuqVZo&`N0_+F5DJHacPbz2wO}K7}3*}uv+gnI{-bKXG9Ll+r6NEtMNjL;{0%= z`JxYB1wH;ezHoX(ST{G6R9YtSn<|yo>QGYUo&KR2QPv%IPBYcUBL&d4clFV zS1`Z5tJp=-nTKee+fp+Qc};5a$~K;K@f^xwWD4~=HAk=X7)uvtViL1M%vTz?W<9&^ z!`;KI07-dPeqKlB{4A}7cn7O}q|c#SrL0i)QbX)6O9vjM*-r)lmEA9v8C%=F80>AD zz%EOcsrz-j?qOh438J~dP<+wpgT_=+%ZYT?>>=rJ+grOT| zC?%v3hHgZ?rjGmNU10y zUjCP{wzZn~p)J$|H*l=Hx)W?#O3+slw#OvVOAJq%Co8|j^~V2PZa65k?5_=(`~>Q5 znZ?5O8OA4eqqR)LCB;Vl{rRJp_znX=CP;%aTgt(k(#jkDYAxWnzj`gj$tOv8m5^^` zQ&hTl{G&je%P$JKN@XR~mldRIkJ28pg+>)F3(UrAEDyQKE*(}!d&{L4@yZEyL7 zI4%9Wjpv+&d1TIJx*xp)LZCxv<=MsJx=lDn(S2vyT&1(dZh^+{{jp=>jp5yBMHDf# zncXFfW!$z`02*-L{b#8NO37=7I46yE)m21(l+PvHNUZ9&(T`w` zBq)$lFKX>}kqBv(HgJkd$<(At)$l<)cSj@(&s_qRDm+=E14wY}`hAP0&Jjs9m5029 z7Ne~~Fi&yKx!otoM=Y<-#Qk6D_?ryZWmHuj;BWb@>?C~PP8O?mdYlERLc`oojEN^R zpKrhFfi(^AralkiWRkJMqV^JvgYz!Bs=n{w@jJNLFCu1|;uw3eN-==&o$_g=^U%*t z4s0*CM81)DX2|_CNNlvfy_T|WbL%Cm#|mBb_tMEHZ;wuk$dkS3+1wB8CsVgAw+3X% z9+dQW%oZhFlun06Kf+X7USF)fg%wv+Jzeq`rCYMFET6lMB(*oKRZRij>nLRj- z=4y+66uVkByoW_(5@)$_E?I;=IkD-|X2ma20HVu?Zk7vm?Nb3@2C_elE6a z^Xetk+A&i^AqjI^RW-3PTQyytB%cSe9rTH(8OJ-2yK=1LB)rl*N*F^F74sw{7IfTK z$0a(;$rk;-HZ-~T%8dTrGK)d=s|OhnU8KXnV!fso#HwZ6in#M-s-H;p@G6&`5)t$p zW_RsSDaM@8>SuM-9SRHJ63f@&-){R8Kz$s%auS5J{M;gar7zLX`c{717AFFUEm zET5o@e9k#F-xzM z2ihlBg||Y_(A#!x2a`0a;jD^Gz$OY{M_Y$}R05-v0VBOCP4rWylIZ<BqVU%?ZFu-BHLXLqy5%%f)4D&w1dt()8HNLd0yk6`p0hZq)VN zD$#{y)S@0b&+#fj(-O0ij0%-t^I{+4fsBPDyy`&v6OJ`9GlJ+Daekuqu!Z^AK+%0A zW`FvpY@$qb^3B6*M?a6!JqatsW#3(fh5{iu2duOhIGbs-p7MSv8df=$pdeQZ|JoAl z%7&KIt91yBZ%s@2HjzEHkEa!y7ZSx9-2Ik1`7m@;dUUnWByv8MS-xOzkHr)x2InPz z3*^E9McB$G^)jB9|icyBboxVuCY$eMQt&1A(Tj^{nM!p-fYk$zNTEn_HbT`tZ z(>y0dQ|?(tjOwzM&Pj%PoqDso9+UN_PB3})vUG9UuSoHiYgE0Rbw3JB8@A9m{f*St z?t39Sl$UmRlD_b8@1`pB<;T_R+;gT6l2F*kO6B5mNzcs%vMOG4-dwD;8KcKNXZ=JCjVKd> zL~=ChKg~2vTufr0g-_VaIWD?0-giZAhp*oYY!e4G5yP1T%PnrUi~+-9TdXG)85f{0 zl@i}X@66pMlk?+7yZOs&RiEf|#mJat;1KfVB!|>uFNj_6-8Qtc{De?}`qk!bkHZVe zJd{!I(#aE|`*;xQ=~;bKu|zmNX!zcjga+A0kRA)O^zi~S+*1gNbYx8E&3!zd_f(EE1~8cthsZZm!Z6K zP4tyY&m^SSAIgK)7lmMvBR958?PYuRCDyOIg|<7po&en=2>m*aOTYwacJsZE?u^04 z@;N3LGn-7w6c(yr=%|ak_$boJ)y65+TKfXOWSNPafj+zblck`|uS(UHVnAdCFFYn|yw(qlGj}~fEVwY(D3Y=Y#bPT$v=&$Qsi{5{~>3vj5LqF>fOVy5||D-m` z-cLz6LA)4{CoFQ0IXm}|`BSkqDI*6AK_49Tb-)iTa+_@3L9U!{G}}NY)T6PsZHIr> z;VAYA>ywojx$nRp6>{(^JYz0E^z`LB7Nek`PqQ{;KTx`!Nwl1JQNL0(KO`Y2@H%%i zi4Gp^Dwy`79OUy2vJWvePh1J=`-780axdZZlwmt< zUNYR=m_8Vyc`Y{9XzoUbII25?O^bFS=io@t&+ed4-ct&y7H#FU8^<8M3rWIfkC z8bpJZGK~VFY0A6<4n)ip^DitxsoJBF_L#VY<(-nDlKYNVL6paJYBV z9td>qg?$FN$-5?$q5GL)ihp#^eqt(3V#Ik*tcjBnqd&a9Rvai{pO6U|qt#M^xmJKi zP#tKk9QIt{@v$g~sc;iyhdY|M9;^l8BAMtLwQ_&$Ui+xC9*ZNbxB(rYocCl^Ot;a?HaS7 zBgnhof7=!A*B3nq$xGQ6iUKl>Zz-;?LMT!#OBzOOhWSUTLC!QYtYxs_X|?W-FNIQ0 zy4tta)wgm058aZiq)CgA2pzQ)#XY|+n1s9n(xO418JVL z?H`h(ugcGDT8f+tcP(d-ZSc(Yxg2CV`Rq?Vhtcex^b`&nmFPJ#og$Si$V}@=e^SA9ElQ$!mo9=i{vSDE`TC?Bv2eUE2 zRKeTt+sivB&0HR0D8qiZrsHQAEU~D%l4w~RXk%_gVna*Co~nlM7+BJ2%2me5tzC)l zfXX2TzI0}&#g_486|?|>;%b40ZVeT~GVQ)qG`rO`Z~I$u=7XXRx02SqYr+w%iV_~g zwB?|C*Ey$st9VZ*fswR+Ktk3Jbc5d*W9aduwqz}bw9y@04-~?*ZaKu!dr^W7K~4}T-2l~G^)WG9DrNF zuJX!4E#t+-d8k~5(1TdWd~c(|&RxTFNUieO<-+fV zDcXVr2sxSRP&`{;+!NHBvhyUOi)C_bx>@85eZ^+=wmZ_P;d+fiHPxIqJZIRjC4?<# z@SLv8z@5H!`6?EY;7(toCn8+AcI$djh>J*A_hH9bue(~tcc&tqqg&I~YUm%&ZFjr} zv+JDIHlYf}{hTk?xEYq->zb#Ow?yYK&;yM|zu zdcOB#6LZii4Y}ZXkwdFMcPE<=@#lQM1w7CF<`DBY%s8QAvo}a7wox7TB!aFG@6T4m zKZw_YCmOHWZ)EU7hvDIe7=Wk>#brxMsQmIJ?ex+OS-B;LaXvkWkTv!shVa%{Tkb5 z{ndqnjOIhtHti!)8x$cEY-p8lwl-a9_OYi+F+?q9oR$4&>hQDCxz8P&IfDN02#~kS zzXZ;&r^f$)z6_w#|0X`Pg#jF0VcnpLupYEQS`l40%IBJ(mcNfME9gad)KjkBAxuqp z6CHkVt|Q3Uih&9#iX1I=2dX)@IP<9)dybZol%B!&QYTLes)pR3dYv9tKo?=(Jkl7l zUgmxcS8Z#Ac&_7%o_-qqF2cTpWa)a0yj0<=wqGv5+&B-kAIGFe+k3ivbXeOT$qe)i5OI z4HFaEU{}9L<&7^YA}r1Iv18K#0%}NaaNXZM(|09d;D`PlKB3;&(32&lkLLywYr;43 zcbA)`Y+$l?BNP`Y*PTI;(kAuzSqh`G;z^(0{;|%t1KfxVTJ_LV`w=VWdC|1uD8OKWjtNkv|JyTu0e|>oJO$If>qHf%3Lv-M}_zH@O1+`N8IEPz#1_Qe|AV6DF z60<2;uqS_M;fm-R^V*z3zI+VIMxa}*{OoFC7AsbBspdGj=TwcImtU9w66hD%PIk!3 z-|U33;NhQbk6iV5c%bk;&Y(Bkotnv@SAT?AS5fBi4LFz^2cNwmiAUG~74M+>9=^OI z#1ha*1$`@%#}Zr)E^Ob)RMp9ND4d7E@-fpT6Vj+f_QyJuQvqTESZsA@C$RHwl#vGklR~EQ{h0jDk`p_NtX6fLwiaN{lifwI$9yrx zuUArmO*gxX*q5x(f3w#9TliH_ z##6!RpiA|FEk3B;WVLwaq7B7}R$_a^(}7vVkU&ONh-3kY6v@%bQf4uP&=e8mU2EyM|EKNgAMXovo#1E+zGA_$1v$LqgUhbLWNi5r8EX2V*V29C zJ}4iVXl5+VtIP67$tf}ZhohsS#9FNf^i%IJk^YBQ{ON#+kp#Axm?2m+>3{ene>gFG z-V%WGN$|n=kLB_|*)zoG2y<(MWtef;O@Nzds!08;tlpjQYYY~XQFrVck& zBL(iB{EWMKl0HB)PjZ8HT#OnY%ftJRGuuZCB4P8$9>uJO%DPzZuHAwINSvdv+aBZQ zJJ)+x??qhNa(vWGw;qI%+1n{R_o0XYW{Q9LO~Lz1vj(I*^cuiPbuZ=;d(}Nsj)eby zX_Z4k-6YzmK$-q`O7^c#i+^$sfw#kreBLUz{GU$8ADWivN8nCb8e@*e`R}LrIo+GL z2$k(fP&EAGCiwSnyCehdDE=y3lehnn%>0{=_)!I?!fa>?FZn3^p~Ms*1b7zz%;ZGj-mgr9Ya2F23r97K6E~s3!rj(-LS8TB#+zq ztv$u8a6UmaeOYqk)d2PRoWmYtC!(C>cAIng$LeQ>b(LB18JAff^=S2LgHa%lD>F~U zP}!|NeYs{coUdViHf9ZmTyFv~^}%-I;XIx*Ag|QuIgPjGiO_>#D2_nWpP+S)A*gu% z`f}ZgWx)=D`PBY8yhUg%d*1iUiIALbKcZN19v=fyxg?Tx_WwK17v{bGr(b( z%)2hju+uqO>u6c+aRhe;;+U*p%@SM3!;`&LHHJ+9L5hibD|zaF`@!0-3UWs!yux~N z#2P62Mev!Vaf_%|$4WDMPe2#FNX-C?T3H6`xcGVK{nhdz_YZFo;SQa6f9@SV@Q0tK zohFfkih@01_UhRfuQ3KS4GoS{ss)5eK{m1eF%v+32u)2dZ3pn5xwHq^UY-MW&aVLj zeTAP5*RtR6tPf_?knqH`w!BwFkaF6}* zuUxAM=4c$_NK{!&J6&W@T#x~An3)h3h8X6WcZ+x2n3xKXEJ{u?>4!GL^6AU~B3MmY zC*#}U6?~!Zr1VarUP7n8TBctmS(D)(JlN~uo1I$m2DvyAn5?CHBO|F(-b%7$fuReF zyTI*Zp5kGD>kwSxsoh>tD!RcpVkm?Kapfc+=Wi8cJ)s_S$z`_GEW0=zZynZ0z*f!v)6ooYxW`U1a$=y zh6KDhzv$;H-@jW3X zYk6Y@ngXICE0nQkIjEz-A}eI08O4PaV_Bi|`hdyBxC|QD(Q$8$!K{G@sgSj|Vjr1^ z!?9zS=6;SvyDB^XwNK^;eBScDa4&h$QThBRJBsvtDb9d0M5P7*xmI;C)Y zfo3T{7cHyrxv%lswS+U7Orf*ZASkkny{eH`ThCfbLzy-k?6!w2`*Qy+=j{9k*IxP=(tzZYO1I57Pp#EN!GywAEiWhF-l zCsyXceG~@Qtm%}%7dFnR4CQD%%)rxovH@zG5hrXZ?WD9^XS_@ASru&Rx7%Pxo#K+Q z6kzm6aPvxc!U8GJT1}T5okyxvz?Eb^PMV!-}xF)Neo0tBI!^HLp z!^_0VY^DX8e#w)q22i@0jRY+xDYDmhH=m80rtPC5f4u~vxeE&Y<6TSOhj|(3Zw)cvXS@Jz>z%27AI4wa0dPT(6{i(yr5>)3rWg=abY zm3DQcC@G5JawqVBQM%&F1j*gGO5JCRrHYVUWY!JVA!mav8khS2aql={V)Ktq$v~h# zs87vR9lig&H&r-=gb4QuRaF@)L{*lS^!Mb8MyE;(NXp`uch~ExXT1c21Ps5v{~?qz zAeFMD-1#so5L(uuDtQw1wKbZ(E0!&I7QWL}FsvMusaVIVS`n$|WyABBu>zybZ&))H z^gMQG(vnM|c=o2y)Oa|P%aWP~JL;DFTeC_<`=YdH^?S)O%^D_#6#DCpya+A#uTod| zk8W%JtGv_{>aI=H?Ch4Pp!z!v@cJ-MlUkxxYMtC4%az?2e~HB zz>ELb2I)rao@RZw$w?8#Dt` zu|Hwo>H9`L&rBjD81?dd33bD;5nkw67^*#ZQ6wgSne?F1Zd13hoJLKq0*i}uNCPg9W;zr3@(;t)#V2|X~iBXG8U;3udA$9|>CN*;W|T{BEA zZ2q0qFXYsK0YZ=6iRloCkGe8v&X6O6F&$!0Cm0Uta{7fc;**-*BANKo6BW0Z-Q}d$ z%V%7S_y4+FjCU^Y$LvIS3_#Ohy+HfZzIHa&XJQu_6F@c{Z^o(aDdou(1&AFJ=0%xp zY-{DH=I1Bb$$&6kxoHm!%p|FA4*aG5ybPFD%!^42HG4<@%31@>N3$n0Xx-iAo-<-f zFi$5rjrO8?jaJT_&}JDF{Y-L&rQw7{wxg(Dhi!(aOz(?x6;0J_Uqg!XBK?L57UPNu zJsPPuBm`BEBTPes-m(v=nLqipklwPzN2d0}(zotHV|7g?H+3gJzo@UHC_d1xgv z3i^A#NpQ)HVs};fA9u^n`<=}j3)w;*nD`lQRn1h>t}_Q)wi{d=kM_HB$lZa`=UKtF zjZuWbNe&gxa`)Axp=}T*<_PSYxHYsEzJG;q%1l=aUuW$k4i_G~u8npzYkBe@$0F&x z8i_&|%9dW9DYwd1*L)-U*+HXibOQtze+AqhUt%yE9}H54);dsFVj|{CSP+^xL9X_0 z=|y(Pk+wccBC3);k)T(~*zRMX3X=_Y0)>rBF%B${UUj86&45KmVIDOdYE4fyb01i5 z4I+xUELvS9t`WR!bjvQXi0jG+qiN{sQ(SCVDvV3*ft_5^u3}BEV7>*i`R@eRWVO6_ zX+|rs29AE(qgh}Tg4Hj5lL^9CNVF^yj#>(ierQnw%FdrgBsKNO5hZ6oZ z5s##grDg26?dHF>dFZ~|8M&l6n>@wR@wQ9S{V1L%zWJNbuDrJ#3!1(5M+R&&+t`Oj zbV${~ER7(z;A-acke$`NFb}16E#~}&{bKsSd6);XR(2=gLH3~F3t0lD*@{}_&1G8E z@Y7A_Cb@zSIJ*&932SB<3KGNFsxVa0^C%nz73S3jo1hJelwdi)D5$A-g}D-c2e6QX zz&OQ)hs4M`F>)G%0w2_9rIlBeR1id(~V`YNqJy&OT5xK^+u z?Y*wCrybWl&U%6MOlS7`p!lcb+ADa20@7ADX&`G_;oh?>HAG^HN|+bD2#(Y zpH1QT5*Nr?M3Aiwk(?ibd zH8MdlHSsY4&6T+b5%~GhigbTuG!?Mrsa1^1)DW=Bs{1o|;G2vwlH_$_kP%!83Q}N) zz#{nk7IBGS0s57pvQkvqqbbZK(P1?4;|IB1R!A*X7?pmPMyTff&IyUA>Q}W7nB|&p zd&g_8z^03FyqL_58wkjg4#NV-7X&H_A!Xme5INZjW)?lyAeE**DcHdBK^gAA%%ieb zeb;6ZBx5fF6)acQlD;0+e1c7sLogd2Co%F_xRf6g%}+Bj1E69>wnqX5`N2qp+4q8& z_ZY5K6Z@WMde?hIkHkgH#EZuc3*mbnXWoS5Nvz5)xxWJ27l6Z}BjwG(LEe^RB0SD< z4QiSabMj8+vJWmbDBfKTQOB10aFNEs^4+#Xf=P5yQ+)@6j=XRvZXgd6+8 z@|*#0g6I}XeJ-7=^*BH_PSH4vCfGHw&9tO`M>ZvQc}9cs5~bUZbOAKZpUVh0@8vVS z4;LHVd-7~U(e1=nv6d7;1x6LhkW9j@z zXkPO7Nb1@lWZnnU?^iy2@f1k~^m4~HFGUWJ(sZv8m*MXAEQS`w@8jL|x4s*zu@y8i zG9g+|o@$wP6JdL`LRyKpwBZ#=$=0Y10asQ;j31K>f*?YNdE-jPnIm^;UfPVpEq@GE zSsuFN&>Kw-!%3ip#2Rk9jJw3sFs6oL{JWw+fEwO4+ph|?=vW9wONIg?E*MH4_g_rj+gdfv*nZD?W|CggYM!tNI%C0P zeP)~rk^Ap?KUUk#V)&p;f}4LX)AvH&EKhga%Vi4tet4*i1u#jtH}uFztCV~;@azuf z0#43EZa@8g34{*lrBm*~Zf4OaTaD_2ybg^D>GveG$4Uys_4jU$Azpjf+jZ$&xl(>R z!touw77u@u(*}%6>V#beo-nqJgL@dJFp`}_@QwQ^)2p)&nfdI&ezc`!{v+a$ZRTgs zXvnQJSNeL?R6S)Mka_8>qKLfgK{De~Yo_92W|w}7kz>|jxH@cAV>D~pX1`dm5$9=# zVBUdhxQ5SoiaTz#h}E>>gh90^=-#O4_`apUtBm>rRNoa!=CAIcPQ_frPKc zG_zDqK&8nRwBCPJ^V}}y-aZ6$fognJeW21Txqv43Ev<64-(OJIM+PgDQ2_xIb~<{OhEgLM5Bk$V!sA_dZwX>T=oAkS#J2p#8p5IRXU?NYB6fJRS4;~yHmA`RG| z8a?ZR;`zDOVuKo01?yyEsPP6NbKCsVh@*gI0-`1h*B!`QQ@moR_f>9~c@yqxodFjR z=Zb~7niA41+>Cf1lYw>a$fw-ARk&1MOJG9`&}EAi+h(=H4~{j%PjS=-+*7>SAW$nT zNP&N_p1((GJ31VnXTTU#5Hx)kT14T;$I@6(qn($VmHCR zlDyE;(&!yuG8LUm#n@jCa2#KMIThKvSG7ICBv?i6bAGHbbTALK+qgvMBECf}{8xj( z=2cQtpM)AbKil%=i^*5*rGNfLVFGXHds)Y0lh(J`c*%v_v@ob~)EMkRYOqa`5- zDBjS1e++Gi&S9!#y*T8&|1^sw3d%&wq%?nIr>BcGSAC~ewIhdQhvN_FTH-hgmk9#I zZAl(w1u@Uh^Awsd*_1xFJ|k3`(JEDK_$tOy1EZ?OTtv$2ry>J4Dh- z`9{jr#l+Gb2 zjR{Bugou{*F(4ewAU}hy{~;B#`)8?GG`~yaSldkE`|3_@$LyBShAcdWQxg$N@+Wv< zV3t=GN+N?)(~s=vCl4g?^Z^h(PZv9~N}h>pX+cm4zkJHZI3dhAx*Q3e8PV1=XqegGr}*4}deV_eV1EUu6X9J`x3 zn~Og+QH7D~Te4DXX%U6o!WcAvRe^agXZ5Y0uquCSV616)Y)}iS^W%A)+2hz*JgK0# z!``;UAZ8Ym>Cr~#Kd=UWq{3$)Ys#a_`A`Z5LT6vLO8bii@Ib+=X}gWWt7Yl2550Pi z#=vdCp9I#Q$lLmZvM|h^5HOwZf#Z*HAk@2Xn#WdPoMEPKWd0J|>3B5FRz0O^D&_$mT0!d{=3a=RYpPrmA9V{Z4IX{2I^5@9 zySRb85@lABJ_}Z>^M;|5Jg!9}SIx8)qJI>)A@dhiYSZjP&PO0zDcpB;~B73 zAz!xmA34ZUoU3brsGX4t3)Yd#f9*`1gXFlWxtV8E{ErlB=SE@mNl`sKP9bnVzz&c` z8--Z3ish%$B>2)?m+w~hik!G)1w`XwlF}jp->5|=iIa!9Evd$_MNd%+?;nNQPJDp= zmIO_dsN$mU%T%vcu<|c9b{^C!d-1Lo>?$MnB7!M}rT1gJb&H(J6h5}>KGqvRo|2*r zrO1fZWI8ItJB86x3ux>9eb5X`KI*GHal&K-gT0a`wNv1@=Q{w|dLT=o_rARF_18zn zhN~FKo4Gjb3M~|2*0P}tj82#N0PuoQ#(l`lBw=1Qp&W?Xj&E)C0Fk=MPLspx0OKu& zC5i8#I_&5T;MZs9M{*@V%*F$+d$CEP4uhKbWi)tH5N%^d-ic0+I+MUYfCZ2EC6Tw+ zlwCXjS>#tu!UZOdByb)Pz}O zrv*;k4Tw|{*bj4>aW!SY4xq=3O?Wn2f_LIjR+jeorT8IZlii7?j`b2dC>X%zoYMVX z#_7TX^^P-9lm{n(AFH#G~>g|lTR4+uQEN6@OzbO7V_I03t}l$ z)Fm?7TUO-Iuy~>K!v!bUN-pW#tJtCj*@2@PAdx9(o%Ht2MS0Baumq z`Yn;kj`=a?+c3}@&zY%+WD`T(VQFfX=ckbhzJ|9P#kc2UX}%z>Kwr@P%I+n)=yvVx z>$jamr#bJ}cR0r1vLG=)f0gW2t%1}h`{mApTJ#T6*bZT`b@}TJzK6Hl)J?dT-aqYt z(~5jAFAHdQ5pH%*UQwj>xc($7*1!}hX0GwE(r2dfm!5j^;j4AkHa}V7BJ~Pqz1coM zhSHS_d}(r{$r4Y_xdJVN-aqTg*-z%T&$xKBcOR+)Is_&vWXs3junHBODt;Z7HrCIt z{u8qF7F~EzS|s}g!T~Owe;xre`%!oW#EMV9*hoo3XBqbWhDO~$#e3?mX)+-|=^zfB zIJ^p9PaU@fuk-?jo3aa*N0^_fY$#?u4|?_yilTX;$4RN4Yx;qL?^|8^0BxqG;v=4` z6>AVOO4Vy-STnqy#ex05o(N0Wd_;KQTqnHMi~PlJhEbE4m9HI_F>0JG(krlssgF2l ziuy4~hWgP^$61uQMbb#TTcWLYnJeGZN9{*T()NSN*IRDr&5aWun2-^>UpYN3)?dA9sYfqT z`71gEZAf7i;=ewY(Y*;SDzi?U!pjcaZ%ftXXnO)LafRb5T%9zwg@33`&&oG2>rty# z_XXa*TOaoeO3Y@HY`2n*vn|c)f4Sd4*FNJPP%ir$UiuMs12d;pvFSMISYnLYEBua!>@HZp}UA;;_Oj5p|6Z&BQpf2uD0ORG~M z5Zv4fd6juApv;Q6foaaXe(DAa!h&au#C%h|k|JdsV6Y5*t1s$5Kqo)nc=61T_9^Cn zbGfi~e1riH&+L(_TBr;s@Uwt!R32?{WB$!2!+#N7|K<1uxyo3irq8$>*VJ=vMMxMN zlcG`$F)9T!bu87l$)I+Aeitw#9VYH$BuJZ}Z(}*M@*kA~%syh}o6~hA1-@@ppZ~q{ z{#DHWN8=2WAt^Ir)r>KdKz9E9=lU~=68mU~*;(VWGd})(-v9Lr{P{wXAhFhsXR5hD zQTX7!g|I;X!wxj$4&1MYP>D9W;4ec6%p?KXHRMKIAxkI_Yqav*#kP?IY4gAQrkDn3 zKs1Kp)vG1zYI93pTMOng`Z~nb7|K9HY&$EI{H1pqIa5eEh z(1$1#cji6*>tXu$rx%r7jLonJ`O!F|f-eud64-}o;NYflT6%_$$XCN&y+rK(yp}7XdtCU z$ay)={r_}4u(DWKX?ip>I_05SZB>tMr8t2k6A!pldJx zl7Ts5v{A*7Jmo7Gp6De?NCD=F8RlUk&8G&>2kDSD36O0uGF{fSiXjoj|L>&dk0cmX z(_4Yw|4s${h`_w;f8XuzXYl|1d4omotqOq%%8cmhKf%6-XxHTElCE8zSL6N!AmnDBqR(-o3FgSN=ZUJ{rN zbireNZ%9ND2>R@3bpJ0Bw|#Jx)jf&Tp8dCn=+f2s-_UPPqqZ8%)7@~hEsTn)1b@`z zIrUO=4@PV4D7z0-8?``NkfZ35{RV{DgR`kZu4Ou(UOdarHQ(9*t+`@Qci9B&INRNo zUL}e!ioZ`S=1~+Ir0pv;l1767oGfccugbvUYk(590iuq5G`&LN zVg*!7AVR4T3|6dL>WZra6+9Nb3OB!kmf0MoGy%IN5UC`S(9ZKY{7_B{L&b!>MOaT( z*?^e<2d*;ws%F@M*BB!WZ)Kmh9A3xTr+xh5^ChZXkXV+O;%5BSGr8n5Kr{y0eN(^* zx!lgr+N{o#?gzhnf=-3M`SW1FvMvyZP63wMRE7EA)X_>>8ZTgbZ$RmvZ8j+XW>*)c^}R&*j4troYFRdBi*GVLzI$QNVZxh9Rbqc>@7@l*%23-`7;x z6(ht^4Sf$rR1)(6hguHKAs89b0uE#E7=#3b%Q^+#@vi|O#a}ky>1FDnS0FYNeG*2UkulA}Cz(bW#-r(fu6K1SH%#CO)iJ&nuc0^mbI`<#!2TaqZ z5VdZOuH@csW+|yBl9~oL-P%o&jHJ7Y#*G$aJo$M4D*IKZ^1-yfY?7?2I+2Fpn>mA4 zN6iZGDsGeQV;BliToQPRnEFA93(k`!Fq9#4JCL;-TrZU-np29|L;uN_7?>s7&IC|V zP2q9W6VUIkxM>a?D)Jcs?5@Bzo7f*Z5uNIeHT|FmY&L@~7`F57f>>~Ykwn+s<<{TU z`pd2>eXr-5{k$5V?@~}$S43RcRJ!Z~k7756(Vz4}2&REcaQ-LlvMjVugdC&--qGdF z3ZPH$5cp8lSNI)z5VsrunRS^3ImIuHrYM{0lYJD$Z@=s!6%x&{dOD2qOn@Mv&&)o( z{nr(FSWXOu6{xFgK9|5cFjzEmo9RBNCiQ2LJnR+P{m|41?3_~o>9#QqHTRZeBa6Cz ziI`0>sssBMm?CQRWfN#=oXB-;pDkv)0Lxt{Kbk;Xv!TWmQ?EugsA5%Pwt$>LdoZj9w79f@Zz07(T6Iu~FUm$|W2 zux$NuP5!+fh%I2GBGkod+46Q1c#`b-#trEjvZ^wS-SQ>FU+`n76DZHX^WYj~gX|oj zn*2*BBFpusP-F>6t4fyEAhN{e#t~WX4;TW2ne-M5_}Ehfoe$ho7()d%U~E|pVig7` za95Cr&3v~kjpn!1%~nd=L|X&~1dNuYMreeg3Vq&_$j^x}ez06Yjws18A6<^k4UzxK zTd!I3r&dI4<5s!{q9&4syMYg;5DPKRqqW!ni{Pj}WmIx=h+Afuk15V#=TVWc-%zR{hxgz;^?-~}doT>3-n|Z(u4(E? zQ`S>N0fX(d@*Mwt({%~|o7=eByU-%jyqjQ0GmQ>Nktxk@2%v@Izbpgw{gblE%24l% zli4%p`~IuCjzhk_-EI4!C@jTy?=XAF%tc)5?jmS({TXW-(|p{HWNrT~8bLpufB%R} zDr|H7sq|`#SIQKu(=(mpZ?!cXsrBd&grWl*2BEl| zA@|a*GslZrXFv>+l2PMr%oH(iH56DD8XY6eqR4%>=yC-8_<}iW>I_T5tYr)2*0qJ? z3NA$xxx}Z{LQe&@YQ=B~8Z76;CdS6z=mx!2ewMMNy1J(i38Yy{44hDAImZkBPw{s@FsP20m$f3^>gey1JL zqCRVrY<0ffCi>PqhESi>z{1tSTDb}Kj`Wyx!G;CACF@0qC7&A zw%dBgxaeclBIHbrdw7%23PxC`Lbor+OywlNB~8@sYG^(gANKY5K~Jr(UpI0U$s`@E z`A*2vNX-eV8|ugK@ihQMRU)IE(j%XpT=z4?Rb|o?$NTg+lu2Ey2(|xRIch=eka~Uu|N-hQrn{>|A~xeLM@xB?%%+k4M;} z3mm}s>m&n!A7ra`Stnt8-znYQS~dWiRax<4%-I37VV`E=8{`TWQ@+0!WU(beZP61A z*CqBzqJl>Sp_RI;9oUhQ?B>nG5G0BI1J@-ZSEeH5mjPrn7xF#*PcU9Vx}+uof5x`O z9%&ls0YW3kZgHM30O((p;BnXu?4u_Tw-}XzF1%7?-OlI}YeTIocae-JdI0H*X#EDF zG6JbllylLsQVw@Vj@Nv8nj~%pX69y^9E9w4x5ta0R7n0vvrqKs=jnHgr+6US59yMk z1$dbrbTu2G5@j~_!9zB(W5gOK3)$?9+%fz4xM+X^1L^xfzrvuHJT?}_YH?on757Zh zQcYnP8bknn*?}D=IU+PctDd3owB=bzv++hcT85}PoXaF3`cc#Ia0!i6;k>@{w4**# zZiQ+_N2CJHw>FrpL~B%sknX!f`QKQ+Nw?HBGFZ7xsq>s4dF`v7MC2b_zE`M{ds`YO z?s_5C&r|M&fh1+2lx_uuG1w&X;*oogW3h+eS*Zj~z00S{7AZS6OV@>W(lx%$Y^-KA zuKWZEHW>0A7<+b>jsda-j$paJ5xK+rhk;xIutMAMgIH%4}CbQoo>9N zb+=7UU{n?!2+jDRTM#YZJ^#75{DDMQc#V{w!Z-S(*_ew-+NJlYIXx(O?otEh2s%F| zv5HksMpdy6BDxfka<4Tph!1`LX9mzhXLV>Y9(jnX#BlFZ>!kdHCu%bYIjurlYcr&FRQHHN}0_wQ}$G?^eM3Xw_9aor@|fb=_K9qp5M5KoFQQ34~_SdyTmYJ+eJC zy1>8Yv^L!(Medp^<7z}^saoX=t5S&_~pF$P# zIKPCWvtKr28)sAZUt1^I*P)k>|8AvgLRO}!ioAzWc|VdPViH8;ezI!?>ai^li&_Nh zuje*?Y`e3@VcrDUN6Rm!%Hf%=u>jeq7YWbLS?CK1l({R(Ne5clYF?;h>?*et7o?i6 zaGK*FVyoo0QimGg;6G8D`;G)FSy+099(qyjdlm{z+u_8}LC_1^EtW<8k?TxQcQg2) zW@!K_(jkao$%us(gxve$x>oa|l=>gm0gB%E%fo8Ps{g4eNkk~_aNdvAyV4*}M*mXx z8=jKbteS3f$Z(~(JEN+X`8(%Z-AitBAP)LqvsE#uc&;nk`-|e{>^SY{?R(KIA)3Pe zTbj{!p$zGkI7rvN&-x=YM1qM@NyVhn#kGL8|8eeWg|mu>iG8-NNs1dVSDOSi3*S&@ zz1$cOWL+CcBBbtSwsm_0FR#?6P}B=B&ri7g+}(Wrh73uN^IU)$HW~zI;`@#Wp@`P{ zdEbnXnW(n=Ab6=hIqLP^9JIhjJ55?^nfl1ZhkXMY6I923+#g~Sp`fm6kQ~u~8)hdBVPuxvemETwUc*u6 zjN6q!cVc{a@iXOmGTHF(1&8Kmc1Aqj&;Hbm+MlRtR8*qx&>bXdh1@$yx}y_qMzl{g z6FsWLS`x?;#91{)YW4mOp7s@*JA@PsdFm?Xy<3q_+|$NgCpODZDz=V1oJ_$C6`e-s zSI*0+?%zt|)-iJ{%TBC+3?2YCgMy&xb=6$RGeZ+?H>0YTo+)Yt4EBMA#>(M~8DCv* zEJ}-AP~jel!ek42PTeHgZ*Zqx>Xld+AD)ky6HI8d3>8>o40{%=)*UoO25)U5mFLfJ zU=jvRE8>Usz@v~d6XFCGaA$DUksyU*5{LtNNGG|z%NI;(ViPlKxVK=;#t!d$ZurnQ z0CHaLuGO}?6;&u5-Bh}9bKQ^%T)W$sk*Za%=~{097k*rj+T$!>v&1o*=^-PDc2zT{ zyoyT$bm!E%<4?LWn%}bO=)MPSqp7-ffnT4mOoOI-WWyWZ^6Uf+SNgepM};6V<{&~E z?7;Kf)wEiyz;Q%w0;0W3UH9fmZl7_Xu7EjwM$-`bd0U*`Y2J~0e~dn}Qk4~A%pV1T zm3gwW{Dp7+_lO6dWb=d@V$gM_X zRoU$*8Gd&#I66*laA4xgZk+$ScQk~*^)KBy9rE@cj&$WHZ&c8N3b+)a=nfuldQpso zDveodB-W{UOr;lYLU-TS+!%%|Ur3F3K4*b6DO#KbvB&w5R1>!Sf~A-At1vrk+J<-v zm$Jya!VZMVLJf3bORr=u-wT1(Z_1DGvQ0PjSx6dT>z)?&rL`-tmq5`NlWK_um?8;Bu`wk9iz>{Pu0b!NZ+MuLP%#L-AX$o63vJ%1 z&Ykgiwfs?Eg-va7c+8P{>wISG<_eeGx3cie9zqg{jlmBRT!%icpS+ev5(!+>2);P+ zcHMk}Qd*tS-mZ?Ah)~jPl<-Aw5L?f&M-+$;QZ(CoKBiRoMb#hqXmzG!Tal91J#BNP z(|GfF7-lUd+p|BgFYi-mUCZ~yU_Qt*(aKjl;}L?Vlruq}5ptrD?0p!4)3u23CjtyM zCb+5!Z8ZJ9Li(#{g~vo> z;-Wf}9Ex*jL};-U!AtY(iPM)RG+(#v&Olwt{C=z&{fl`}LNAFaVWSPbAACvgboucNu@oMM3`dW2UgbozrqTVkzUQ$e`Ic9ctkC_evO>ipBU3={A^6@xr28 z15O_A^GYtS2BDy!v(?0T3JMp7D{QS{u*Mou>**56$Wge&>*m5$8Ja~)YmInr`Pt&q z+?|-)43m}gJ@jqBd5xu#8p9cDG3oGv_htJiz&=AT2u2dCz`3wX&D0Vo(Vb~No4%XV zvs8l4(~`;|B@ug@4I*ycr(xoh$4~qrj3a73GeDT-&VKb$gGu$1jTLqnM;Y~k^4sTE zrj(c7w|7!EX*H}CnBGQ{r8bZs5hPN_C&=KN1%JN4K>w;W(CpeFn;a0^^8XNb+Wp+V zOaQ4fyRADCwsrJtR5_J{Qxw(hYH){2I@k^zj)(GZj9B!s*ZbJFjND05#CMRYAYUSC zvIAgvMSI9jKI@wNwR$^F3Hy?6)$L;CFs+a1%rxWq(QQe%?X+k*-E6qsdowsZ-)2VU zrrFS~mIy*6W!m>aJiF7=FW(&BUkP%z`Q|6Tq(h1Q;t*IQhsh`5Io4KH$?}s<4Uri< zlPn!$8Bl~7Ju{5B4Ii&)=~38k7&#x#VPhyG%$e->8JRDW;2VAL_~hBZ+{if^$HaD* zyZa4s2h=Q_KknvvjNXi=3K5pqH-an?WgGf#9E&t8Q_TI#w=5DAorGU4LrRjiLGzNl z6wm7D`lKHvU8sPr0b3ZQeX2pbsEzXL7g~aSUTDMbnRS}3ZAlQ$@lTn^u(qbVqFi+% za-F(0cN%&!u~;_FY>oHT2W?m}`V*kSQj~(V8YZB!yJ@LvLpK_yS8X%}`rRYWoChzc zbN$C|2?MgV5H2=Aq^~^sRH#v4iXWwLlv30w6ig>mOGMqX0TmAp%qe#1fJ?5APogq+FBZAF-}66bWN{6 zk#VklHJfKDle-Rm2Yl=2md3yLETne#&Q*9mC+opSt<2eS8Ff>;YtAa)LUi?mCXq2m zcf0v*kVmovx~}kOk5r6(rb&A*6#xyz&RwL_fb|bNV;c^ z;hNVNy9BG#pnqS1!LoSydKlvAw?t1b)3rAWF7VTckj>EuUUj5#ViODwb}h>s#btO) zd>u=>@p#t1p;LNL;%m|yC{STBiVP|aGE{GC#rKBUr4clvL7)8wT3fN#8dm=s&&C1T zL3{Og;nwgrH2jNBfpT*6Qw}v>ZmWsLfK-W>w>qLOQ|8?3%}%xzOEGDu}o5mPn3Bx)C+I3f=7*jpypol1>>5JP)hJ4jCwsdVR*s+y2cY? z;{tip5`u*YGuL(?gda??n7+qSEkA<{F(z+LzkHFwkQ(!0P&weR3Mu#>7c+~YEAj3j z8m0N1eCvX2aR*QBhdX{H%a0k|s)!r*9?qDoT_?5wqrmG%V8zmUGSeT5Ti#n~q9yw! zZE~vn6*uDXjVPP-MR~+hoETBZKN_1Cs3dgtwkbZy1t0F8~1?o<(QwpqDW5Zn7v2&$r(5Y$(2 z^sLjTf-NiEXqc(vTx(@X-j5(WiojxN6jinqKiKB365SL#7EXf7Mz}q1B0Wmp%$3OB5S6 z(VdPJ@^~?MsEA`Yh8?(FtZG)C+U5La_5xyKMJiLtZ<-rT3Gx$;PUHTK6<3~jgu@+^5;JNPZH+m9|~W; zZ^D>3_b69 z_~-5U_4WSo`S+h&oc*_7`WNSL-x`C4;e<%rvvb5x_z2EjVAgqhnbqKV5HYLC=hrmT z=hYuQvL5Oi!aSEj^>*$4Cr|EE%Utl82}pj$jk8JG-ihIGs1ki^0~(Iuh{i)|;FX0Z ze3<8_JCc3ohRO@)KIdy=7DuP?lX9Xh&ds~rQdPxpxN2nlX2#SGo$GA>jzvicd}epA zL)YLc+1oWmjqy9iP>x$g$gfr6%PJ@S`m+D>8~IoeV`T9MD8k=gTlhH76qkl45q~yD z|Mg?r#UVst#Z&V8FDBM5NH=ISKT-Gh_lXq`5|TEI2(8~Q6>3d%<1q8COC{O*pWvg*VGW(%h4i@UnG-Yp7DdNDHxm>pVmosxInLW+;FK6ZrxN^U&tN-=N zeUWM00!C@*)eyoc$;7CII7=7-Od+qRSXyw2^Ikl%M6X#iQAC!x9qe*|GxKd5gB{j@ z2)+a?jIz9#V?km7*?hX&a~ef#gpL;HL-}^RGxIt;L$-HCeQ2H@`=p6^not6k87QL= zsZ!KQP5yoBCTgMn)_Y;`jGa=$v= z|JYpq{8xM^VERy)wzL25h@kNQf|OvxE-ZQ{_V(}ZJ~9-wMuRM|Q0GTU{;t@M5CDSM8j^8FVi9 zwmabfId~Y6|JcXb>;iaxv)%BS;@tw}%a?BV0xo=YH;Oq?6@;9LFHbf6ekI6p!!MWT z{a|zM_gmgA4?q7q%sP$dZUXB_((>T*>xV0c7HU6inE~VIO^`>(2Oxgj(A1E>$N6K>XQb)o|l}kLO&==+0 zXqbThr!5@z%gynKun3|>C#gHUxi~y%iWn~=uFb}|>rwuEF06EH)i357S2L{z|Gws>-sZZ62;Yl4*tsn`^ zsB6R&C+OD6=H0YCqdGEJ7F|FlQ`B zU?PMhSz2xULGw=vCLA(4I~Hdpsjxu)3U!A;4vDu*kf|(&D{2_FA09t*>n)6@IPn|+ zN42Rckuev2zgN@UwG@;*cF9rbSDojX@@`(o!bd{HX@;6dMUbLcYaSwO4~(u6 z^-xgUp~Mscv}qWw`Mm$$Y766d9ihuU+}JW?RH4IGrc*dd&NRuA6S#iY()IHjVErkt zN;D&N9&7sI(R-4^FJf;XQ;Ut0{u@7?P==9PHs&{dS)9W7yi&;Y#}8+zA;0&QTHZKd}ztmVQ`baK|xZk!wxx6ZXyNc7k;dK7|<1wGw#u#zID zw1c>NxdBF!WO((1dZAOV=mzR#vtJ*mm)(>ireHQ-je^u$zBL)DS4~S{PHXx`C@w|w z^M;RreGYH0j3>VYl*>37pIqhHLqfLM|3SU*k>YtE-K&mLnKUj@637V=ilsoe$w_il zNo3T%Vj7wt&?n|p#~wvz&0JO!&)ZPHJ-PXMw^F-PJ(h7G!4pM$)@jOW=F?A zPyd6vaMdm!fU!zMHsoNE(cRFB8~;bZM2{FD2ERb~88B)s2)zH&AD}i?8s!;E#JhSS z&2(e+N`+p?OfjG4}ulqzSAqbCZQmTQcG);;u5?esuVvNjA)${ zdOCm*ZjRw!6^kF+0y!>ZCyzr@t8~EHKA6H)Mz0(r0)dAZZ9*~k;m1aVu`x*~Y#~0F zW91HGfT7Q=hl-e0%%ln5K^PHgRqZ@~><2J!WPt0zdoUw)I=Ami8}L0}0y(~2ppv?h zqgraW>)d(4{>y1>DzxuUqe>VYkYryEq3G~Z%VU}(Is2xL6}`7tXKMhMi;9T)rch3k zx7|HE0i{Vj2o>?kLffe%A6oF=^2AgwC?S_q%in`==nju;7owh;I%L~mrt~>{5M;d1+$7Hd&Z6XsTW!FRjVpHr>LNhO#tig0Hn16=JsU`| zly(ZqDlOtS+W!Iw%?4w>69Wu`h4fuqj_3|%KHhbCs?I;=_O3TqA)%pH$RvF08^ z-{NONB6r;bnZoimcFODB5~bX_HCtKzN#|8A*8M6~Ljnhsz$h6^L0ky2p8D99b@5ph zLtbqYkkb?73FaRT5BBz4R(m}>$*Gu`k#yrbYvy;0+{)V)6il`wS3roVUDXx@G_F>k zh~N1mtg%%J6$J zJ1l=;HOA*m7f~sO8myi5S)T0&Nw{xU2`hSjD33G+s5>Gq>v5)@4-^VC7yjp4Oh5Zlghx)e!zLg0!qUEU&Xx!4|fB`oY+no1#JDW*3} z8fnhhSa|Dkyef&GP%{dj+)6uLUzyo#sEk#Icc)3}1Kn z0f~Z<>goE@you8koLBj5V8q!Lx=0UI?(+>ZR+OHE5c_b-{V@GY4b#Ke`9H%T4TR<@nqo?I`MR!q<}I zrB%Fh!&fXjXdLiRvi$jvp0q?VZqbs_ZNI=rli^c(z6$v~#hYxAJ(Xv91k$+5iaP$W zS_Dn8QOZpjIWp@R3!*sVSxRn$>}l>YWpt_~twf1)63R*P2K5ciigXe8CwSVzu3yrQ zTFs(c>8?szOZ3GQ(7K&&$T}tb(6RBF&$hD|p|S|J zxU7Yd2|sUp0S(jSQ=V#F@1(N36%9J-srvkPKBqol3U1*pzrU!U*m>DjrRN>>Rx-oZgGfzMx~of-1z$ho|<3u);Ar=7KRyYm)u z!qJCr@MM^mfl)7I7Hv)ndz8;H<;VJ~=kB-8g*20$hBY1Vh_J%&P$+51$3= znX(B^*6$IOLiWCKv+Z-t(6dsDknN3h-ZkwuvXdYrx+|Anr_te6phh-{Tb>nSK(>n% zBnymFtFkSbQKw;9uiPlrmpK<}(?dDNuRjGJ!}jTZ3s9Po@UsukPhN?Pr`QXP43);dn7EC)>^9YOF3`4!{X0hwafrlbRUbEm>ZV zEr^%!jG*wo5?C`OlNE_J2`C)*7B;wuTbl8@>5E0uaI+hl}tVSQTtae^Yr6;A{grfl&9|I#N z`s$@b6325hd#4`_upG=iL)hNUA>_2@Y41i{i2m}IQ=XI96`u$;5yC6T9O+}FvnzJR z0!RErh9d6}tGv(Gqwymv(@e-PRoHPtP5P|N!kK5c$Ah*kx$*rc06Ty7diuI58HLWa zxYr6l!mCr)EC`=ZH`YPJ4=j#lw8`+yaB_u^JJbYno5}Gwa#iwwJ&9DvTpB_}

~R??$f^C^gc{HG0U>`LkCpJFCBO3xv93v0B}4u}5U*3*fvp_$tQb!L(GykkqKGVCkqmur z04~eUi*QddY+TywIgilK*6#98il=E!sGPD5mB~rI;W22X`?DV9Q-v=4G?H3q`c$Et$z8Hg<IT-eLz`Xn-rXd?Cl6i9$p|oH9f9?hIZ# zNA<{)Trvf#p&;XR!bid%j%6!6h+5kg0H*kA6^459alYAn;;dMz83ytppc0athNXz< zQX=x%!NQVO)sm_8wm@i&3P)no4m1IK_46N%dyCI2_16sy&^Xl@3WI5xPDsRjyrrCK ztGCJ<_1@lg73w&lhVTT^U>x?jLWQ$oG1Nds99Q*7-}KIX%fF>^n@D9tXUu$DC4k6h z`63CRbkWb{%P3Lozq9}-C11YS;G*)sn=rIAH?|%kqZ0jSF-y&F<+VgqSkc3{h|g1w z23XC-iYGtaU3dnJJzdsm-)h;E7dIxoI%~^ZR3@t)yhEpoY>dLcQjzv*6{0;s(^I2N zq0Ql!ulQC!Jlvn+-8*n`W8187X=YHkddQ3KPd*t&>j4eZy`Gimt>E>A!BP{2mbLxx zId$3og-%2cq&1x?>f432@(8YT1|rDX6IQiE0HNWGtLBn*ln#VG8|f35(m4pozhbYF zmwxE2=5gH>h+tGH3e97M%h$rF!1MF+v7oi>ecl(HrcdfN{kB89aY|1AfDsNUTe|>_ z9xjg_qd30cV?VhE_R)N+e(liD1!O3JqTRRTf81ce^i{qfeC_!{>R@h=IsK!AF!u5x zV?*4}x4?+`lIe0Wou@VhI-c1oF!0;8qmR; z7iq?$^)a%ZJzT1Nd)`ETK)3RQwVgYq)vf!ETE%9|vvP5N%Np`v3g0-@ z&f9X}P#%ZDWNP$p9HjfsT^XKbr@m(ZqWnmP_&VldDJ2ivSEB-lm9fUD>}>Q_%*fbJ zMd7u&(6?SoXLB@u*G=z!VSRYE#QLkkorcg4=+4GuBb1IC`R61@25rB3xmVgP&~Xeb zLg}HyEtgo?Q5b)s>NBpSS_~$iQUjP-U$}a2uWnj%+6X1WfhQj^fJKiRGSHtY7HQDQ zrRGW)@y^W>OKFH0^+ymW(Pb=yHO%#a(%2izBX>>`>oj#Jyc?0237&a;>y4s3a18MW zvQpe^stOmUEoVd(Q5GhrhZP=Fm6FsmOqtx`RD9Un=w&t*`5FCnO@*qY%bMRPp^XaOU= zd;qI0@qMPQcSnxu&AvQMUi*n)q1zH~257ui#v6Q;531GFm7@^d-_TDj_b-xZmLh`` zoFKkMy14L#M)J*>JAQkc)gqEmN}|oYEHXYs2(#n z)cs2Ky1l&26X7NuGLovOYz4m_-pgm7X|rp-FR%&DlW9VVG2QHV&mI~WhUw&MJN6R> zy#*c937k;p6VKv5EXpHTLhDs$1y&7Eqja<>QOwg=d};mBH_#lkj173JwYORjJ;?Q& z(0|IgkV zt{&=I3+viRWek3ouU+JJDpF)H)O@MydR;dF6%%$fQfmXOfL!sL$aI&#yff_K0;q^# zoi_Ud8#eB%H!|OBpj3JC%}v1=hTax=wf+bN>XU-kmj{gV9PM!)T1>R#(rE;1dF(^~ zcw;ME<0)IUlSZFX@}X2FeoUIMuV&sjOiAzT32Y&&cg~$|bouN1gDR7TJ~iuSl|VBd ztkJX-K+4Byg+thjqP_9=TH6hDWISjLQ)MWP1g~5QAc%YPCfGzb`#DS}ji^-VVwZ2z z+cYUcvROSDisUEoB@_vd>5Ae}bO5?Sa@>fmj#r+EHsIU`LkOP*`7{R|1r)ncKk4+6HR zVe*lWTI)+tC)>iN-{I@kab%ZXHn+TyW|WK)`pyCzr;}A)anorQaxz1gv4}GGLwrWh z@T$KP#e|T@XJq~zs*rzb*a^467>ro~hPq{iO%ZY`V>1Cq|jS_Nc7eLWQtWJmMOp&bm6oxl5iV z{zkP{u+o)I>_J5R5QEiRYjizidoFq%sSM|D`lPs8N1%NS=#6w zqrfPVpLTYZ{H9CW@QGh7d3cVCCHb&%sv1hoM@Ja#I<;~TD5W>Q-TjmtJzAT0<763^ zW#iyu!dJ>KdomYTi68TYpZn3WC~8#YJ%z!KzH#`VR&J9v4L?D? z5uWwO$iDlC&-OfYLu{W>RsCL30&G60g;yU5fQS6=`s(ea5csgj)~)cO7YpK$L~QD#<_s`7Q$)R=#K*57(0KVQCu1`pxQKgCY| z{jb@C;4p4G%|Q$olP`G0opo9B+vKjA}%o)rc)c@G^VJ<-HY zx8wL8OE+*{8lE-(@eEv|<70!B2FB4a>HiGWF*6&F2RB0(tVYA)3Ia>0Zs zeE7V|S&v7@wrr0*9*#y3fVI+N$Iv17MEk?e7=ZxVM$wOf)K6RuZf&{|9H2>vh)U8E z|N1{srhjd;-~R(SR__Ee|K=C|I(=!3$_(g!cPWmc*CGAP3-~BxbnQQ1HLw7HKl|VO za>jBp#?UUC+1*-Nis3RJ;j)Kv%C{buT(No#qOzh7)?wlt_B31i&>Igs89AXaA*s6` za`9biK{tspfeucMp6E6{b(FDY}h2y!l40A2fciwP%*1KksN4wr;=WT(gK2M zkof4fL`>$8eyx~LC1S8J^qr!PvRaf|`~*+{>MTQ3PGfBIHpOqC07RqXS0^8oDpn8T z#A)ICD#Q2fri`4>2vvCoN+w5aAFQf|`Wi4L+skY>#gH5eO7TI2bEQh?h`f#(+`~_FAxoP$R=@GRtWd3@B#TI%LlU+Ad&^;*6eW^A> z=VHjY4eMI|W{OP)7SyGp|K7p}oeVB_0#+r~zv*QB|7IT>ZiC3m|39?Iw^oY8fI8@W0zkUKyMTi4}ramF=3FrJf8S=~wC zIJLabc2d3>R%~W4UlydJ;XR+3c7G=aQ!McX`bO5f7eQ#{=#}ZE^`9acKf2!kapm9t zE|PI@uItY4k0=nyfTIVoSproG7rMvLkg3~yZy9x7xZJ`TGBDN03W&FWS*;h=>CQrm zdC08~*8#;In(r?x)NOMxgZT*i9F=0Lr8jGVF>J;P^)4?T@g-uoL34J`c@FxtHn2Ns zBu47Dxg*1R2<7|?6vDWnIIp}$XtfF*nN3qSCc4yN>?HQO3G$H*wByE zZ!Qd0LQprMzC;;g(m8D&^M>}?k4e=ZCpYX->7+A%1HkGfi`RWarFi;tN(PL~05ZCG z@EH-xL8KCSMu8kaW)Y_Bpi-HB_`(Hhac1v4F*SCQBX|Cn0RX43qyL|@|K)C?4NoD$ z7O~x~Aj6@9pa47R;!z=Zfz7>zInHHD*timx*1NXvMr&mK^hsKY8n-*g>yE)=)eq@@~*${AXJpSESpMdZ8)3RL#V|Mh4YGyr6 zw*Kz=3?zdkYe%G81ICP7&9r%})01c?uOL7)cl;qJx9#OncC&rG*bH37()t)}hu8*m z%p*1g4?z^f9+VuEmApp#a1bs1#g-Z<-46lEmQ;~K-k3t#;YZ~vCk*XBu^Q9nJje(? z9Kb+ufM5Gbk1&xQ%1fmX;*Z!HuTOV4N<3G*e0(>Q7ma(|efvGhJ|=Jjd0i}ie~a;0 z;~pu;G>9n~=M<}fmBbLB4T}U9Wg;d*XmiWRcI{*}=&y?5((~_anW&M9zn9=?FSyWjG9FZ(V^jHtgRVw%6P$j6Y~qJ$gblP+~d<9(gCXper~W z3k}ta1RP)4kgAI}Ui%yWxQA^~UPzBv z3K@x>RenmI(_JDzfxsMHK??qJsk?xo+gkNskCd|vPW3^tAlfQale~NLEP1D-U1bJd zG)4<3P{_R0DXa#f)r#(Yo0q5hKHui z8rAdEwB?m+5$K)$41~JT(OjLU)lFu*UyU$pVxL3_r3kc>(W6-0;JWGwt|XHjQ18|^ zM@aYXLDgJ+-Bi1GZ`Z7gzZl`!o3MF8h0&NT#{{;(wPmpBlJa+}l~H48FXSAZ`6DlU z^=_^wg?aT(TIqV<&16EurkF>&8FPnoHHWls0$d>=JcV(FW8xg|l&n`0HTw5&)%+Z} zTBn;42}T`?BqH;=atGMgl0(AHRzKiLeKs4|gv`!9(Kzj3bCA)hCiS4qQ-E^lZ%hK6 zfKGV_7%xyCz-KJ`U8)iW2bSzl%uR@_hQvA#jJWo)mLPp-U}X&Zi+xZ0RUlHiW&t}K z`}8a__|S#O*-(|h&0}_i`>wyb3YbR=40g2JR1l3|1bDB0^cGE zMy9)8g@*F;8-DXw_=zzfjvYK{PZdaJC>+6n$_8u{YLc=MLz+z%lsfo^&~T)%GC?!d zkD5nBO?+k*S_E}c96NnIv*eQPP&s{LYDo`m-J3AOTnyk z%*Hh`OxfJC-u!!16yZEclRgonePHZm9%q=g(JCVEa3(!YUTvJcddDq`;JxrxQ2j0fN}&zCXRbX!>_DdaP8KdQ z)?Mptuwmes43pje@MuHzQx6meCls~ZU=VMlxmC?uS=nkOfy>FRhjHhimpilOJoX6^ zQKtH9bV0Bne+IySaX>~>g z5JjhF(qX2TAt7oIK>|;!bmx7md50f)U&)L`zM9a4FX*?!S=QO2WURa(Pj#Lay43x@D|o{Y5*G$2nF0b6(1?SR1>aV&q8P+=0W& z^k$o20ZJk%^c69^9#h8{Ej(t_3}|)#uw@zhJgck9m>%uYZL~&mwA~^8DM>FCUm29xn&pTd!G zgE1}vT~=Em+VKVLd%XnxTIovaR{DAh%tl%G+(wn1wIW(A=7aU?;K>5{+YXsc6-rEp zLdPZBW#{ghR7k&rtpv2QA8gWyaoH{z1hAsqg<5S@l%8zXeW;gcW*&YllQ82XYgd=| z^|Pa7h5q{iGWShY}+8$m#eDu zVr+$4GH;T~_~#XCcI9nG=MF>01h;&4>9=rq{P1s8=u@b0r|#Ou&-R~PVhN}3C`>0% z*bScU57oN2H3_lfv<}+!j)Q@2%Vo@!U$$~k&?Q~2T5|m~BLo&+bcUfH2wkS%jIw{5av2Mt-%2(z=*-67vR#9=P_R*BpC-UIA zm!KGzs-8)(Vzm-J5oiF>?KI0xs1v#4*~k1fH~#A}9|ZDhgj*ry0Ej#qmZsLkA~X?NE=>O2tvV&q4{+x6 zxu?vfETW-|DV(lCYmHUk@3!(4b$9}$6Qtr%EsU-PbLPR>ru-DaVO)9?=`93eA_pQW z4=GyCqheCTL&77+SP8VR6tGq*ONEcS4rddmS)9_j2H6qjnRFurU7zt$Tk3S8>fH0M zMx%ROKBBwsn(!IT5?Bql@zKpvesY$0&Aw(Yw)FL<;xA1M z-IcGD3Fd~|svp~E_#2ue26%q-Aq1{s@1wwI;v^Z@*-2*HqGUp><^7(qj4pkM6!I|? zjOV@8BBS_jd1R=u`$q5hwd%L>zoU~5lg)Z9p~H6nsaM1`OMh&MRk5Nm6a(|5q)Z^S zW*Igu32l%=f8Figlspt4tMp|*{B!*Zp2a#xIuu$Y47GMth5kVbWL@r>@ z!R(Aj;fSv8>z~;%YxtwXn!2NtdbHM{TQo8* zQo{A}F&_sqB{m`5{vm-9<8DVLdCs@e?c-m|)%FN4UzhXpqU|?LVp8Pz>ZmLud=0mx zOS~jp3eoA1(e%K1-*n(`l{j+MduSKDVFq9PEBBG-a8CFu#)Qh9(8Dp>)Th~`fJ?m1 zAl+*WBQaEt5*||!k^V+FB>hLC32wz$Xn|A`!84H%9aKb^lwtX7@!Yz-ARb0yLFY$r z)x!16Zp%}9wLBPpB7ezfXl=$6kUkfHqOmWw;m*0|dnyMnrd8(w`rg93?YFW8`Q5!m z3r2`Vse6;@eAmL4i8XLcfrx5uAH%0F>!^$(jMNQ992=wR3dY3hbA;vx0P1d{RatlE zckK-Ft#+SK=DUhkbm7d;`a0`Lw6@CrEf?!Bsi z9YV8rLm4S9)X?i_H8eBy_EP$=NSxB&Q!)TKY@v-owT!xpN~(8_6XCKedU^^le9r!) z!hN3sQS;xOdh2NtJsG(#J6A5tby-X{rfncIY@u|DKA!!;n)s)?*R~|LZ&Ila?zj+O$7F&>OYNSLiuRe4irc#>=p)g1i73(#c)`sK}J8AWZV;J zb^eeytVOszP=y>O?fjER_Fa2_KqDppQ$wSPH>N#e?-J^~PEI10Qq_aG^yf`~lq(jj z))Ea{u-R)X1ksp1Qn+XsA`@}l=@omZ8Kz~Be`}d(r)*a8dJsE98mVu3=|n!I&g7Y< z7j<(VbxgZD4{#J;8U}>Y`I~T=XmN}XaemaH*Pd#5m?iJDi@GU2bP8qNBr;ctx=qU(&Di@1OBX;(FSa~ zbx@~^%?4YU8DL5hapGMv<=^s#-gsN4;RU`j*d8fLq;~3QISRI7;43q!k(HavKtn0Q z5z=D9RdK6WJFCBqSivFp)!x?zzUlhr=F{UWO3@{C)A1W(le#kP(=W;QpEq?=7XBeB z6PHcnJt{$QL$CEk#;Kj$!^}VR(^VXuYCHUDaFDZvH70WhTo*I0|^Q)-eBk>lW;Hz^bKAwyY`GMC?(bId5 z^Oub}Q$)^Zi;wb`oD%A7vJ7Uf*9yxRg7PG19L1F7w!}4K2Wy-de19hWhdO_?XV}D{ zRvmmollCJ;^tQ|FtMnupB1VmQeCqpTS;ws35$HC)PR443mHRQiN6dDpN(uo_Bxz{W zt`WqQKI)2os%T;4tMTzYk!cHw(hg(-@4lh` zvlM(k3S&N&UUu%&t?>Ye@UEuWlcR`2+~zM!64A6*tir)UT>TP|#apgZB7mF_)tq*3 za?LMB?MvQ|gK?$NSYRG`Dn~dz!Ndw{r20dSo%y-Jy9{s1cL}RtYG<`Pfa_O<2U6N2 zB)2?OS__5aBrMZ%f8UeGBdy-6QNUmU6*k5Ng`9AqU)mbjR~_2#oD|HpL^PQ7Huj?T ziZh_dNfkh5(E#Le%BdQ`9EJkdq^~v-;g}bPr0mD9@KAnNm zv$*94(!4$9DdbK7-V)r5#x69i3jLC1GMA`Gs+)??vc?I&nMs(}FP z;&+{hd-!jLM)nBIR}e!KkUsF;O}0c>7Nk-4bmk3&;p;@VM_j&`^EpC`Pt+SqJ2!H^S%eHpHZIj@ykUtF z$qGPbc2Kv<@lX4qCCJ}>*y+<~*w?vo^nS+R7~PGuw- zkwtmFdN~Y{s@JN7h4ZzOf-cpW2CvWecSYrCa+(h!*~UzRfTg;LmNS%8D<=0Tm?m)3W6WF@1=7_{c90%mSIebOdesg$kr&KF=KHA1lk8ph#yoi-0 zl^$-92!|!yh1yORP|Z>3=GMnfOp74VaED@}Om72#s2Ay$GKac4+piOSQ>EX@NN`e(->+i<|B#ngZJN=EMq zcH8}jm%eHL7=~$%L>xS>#8^yjK{b~pf*op~`rmr|esC=g zct#*}A^sR~r}3U`BY&udseS}b;rh+91h;$LbeSiCY;l^osVJD3HzMwhv^hpRYXNTI znR^`g{_IK4c*DzXUXALIkyF=v^!1&UsStS+E5puK><$K26^aH;k(Rj$z0m#W@xb^4- zHFy=Dbmg_&sm3PR?5=3_SpV`3;(Lbsd{SWh3~ob$_a&89CXfl(eihKLvK5{Z00DMV zC_$yjwmKP+I@L=H&)C&Lm*ygzF~{NuRB>rhEqs7WkygVmTMmx8;G6z38&YPSNa=nsx@k7uky_d)=iKwj2)e@c{HrGjO#=^U z-9lzV%@?)G^9=&+Wd3w@=n+Z)_3*4I85i? z|K9FX@O#;q+im{KpuQ8_=~?C1KlEb$(?{|>LvqsV$0ct5enDgakDv0t_|=TNmm-cd zU}RDK=RJpc~TU=K}-Y|B)7eCj^Eu{jBoY?By@M%s>nKGY}is3BEe2v+#) zldv;v9#AF3`(kO>gDmxmYpHh$pk9#YdBQ&pHYN&0z$IiX-RjSl%fCMRqIVz*KxN2M z{r7cblE zdm_fjJxHKDB_7AsZ@Vzi(-zBFO1UdWW&9YpKGOh}s@5R5k!~*=FVce4`ujN0w7vF%}CGsm#_}iUN;5s!AOswh=p156$K7GK)NG<(m&-!d*Yx-EU zdq{@3>*?e3Nyi-}Cn(#U{OzREQsZ$0xIEvT`JWev)t3(jFNR?32GP~%N_YuvC9wDH zOuT!t53FQPOsdo(dB=BMm{n$u480jpdBx-cb;`YDFP?e{ zqXW6-qtzY#AePQqj(+$1;hw+_JEozBrFrqLQSP9$bA_a{*__7h@lW*kwcpbywC)W^ zltQ}mXUyKEX8}!T?O8+9jSSsmt8b^g_B-g z(|X+l6kp)KODIBwqmH|m_o|pa>lwZslf4A$%*yWmo4E%(!$U8bLg`)!mdY+Ua%4*N z(pzRlPLp%~ABTVk&2>`2rzjy1TbV>Wk}GUx#+)4o4AaAlJ;`lyD0Dx9wc`Emj&k@K z$*cI=Z}PEmQL4EWvzZy$-$o2)cB3nK!$3q1F8+7T2bLS|ds0%BjHBw4@r9$O(<@F_ zcJGx8?PMPxF2uqPu`S85wskgLVjn0;HtsUx-jWw>Vm^95v$z(#R6(#tlv-RMF(sik zJTjbA#HjJ&xy*+mE7dDyp>yr&{;FKoi7`xzql^AjqkgOS#zG78MW4=?B`@5rDDE{L zCv;)$YKvWtiaA^#G?b?vO{+A&oZ9AUuJVCgRD8jPqgr#;o;JQns{?myhPOVob91Eu zhthpfC0)rza>KZ3C~tV8=9z8Fl*>#BcfNbGYk$Pz9OJig5qH-n`W=UoPb7ylUg^1o zw~Kkr$I{K3rq+h_POe)K+t1A^&>hsbIgH=kYI>YEXG0!)W@e#x#G)rNdUN<@P-k(W zeDiSclR^IEG?)HhKZH1^(hb1A6bcH=4qBIo4d}Z@va5x zYD2d2&*Mab{B^%xR&__pgYCSdT}I7l{NsN49ZKGO*CgO}#SVdPz;{mTcod==f)IO) z)q9I#bl(8l3+(Juy6(D5$wh?|f~2jEs!rgiv1tiIr=r=LAk%_q2#OArKVu(g1PKmH z9@DW8zGk5k>?>-B3OIa_*%so@j3iRlGRJmdM(TYPz$Vfcy?fJf>1--vpCnA#F8si&C3E+S=cTfN}MaI z+H*Wvo_lg5aMeKnan3+xn=IZGci`OA$YG6sR~T{3=5YPSvY)qnWOkLCap}evp5S6X zeCF8A&%LJQnrF9W1?|(r2g4ql>7TV4yb^M?Ou`nmz1JDKTN%k%-Joo-+B29P-dkT+ z=v+P}ReddIS7LYRd2^xY#Uwl&S-(I`67is1)tv=<>3AEBW_zl<0DF`Hc|$;bl0>Y zKRHl3VWk!9{2%r>{9Ax0*$~kBIN2c}Yk%N=iFF6e5uW4P%@~j!Mgb(7v{ZB!KisqZ zs?&8>Zn9Jf>)ZwUUx>Xib901G z-nt$d*v|pJS=bO_%w(!^`M91b43Bq4?pthJNXxC(OHoyHiqa_&sPM6C|7eOFOEj+) zUZS4on=EyUPp)bH@JeTpdV!MD?!a_`t~Ba6<-iftV(txT`u zFP3y2RelsG{2HvUp$%etgwYIou?{0zot=+NL6SLM`x-ijy8NTep+WamXcWBakIT#- zC;Vf&{+hn0peX4M@rT-z)k>EVof#|B6nQEn?p$uYL(OJ&bN}G&>Mg(q?!$cWqv7B8s}p%kL6Id zsuoX3wVQ=#D8jRfL`N(t%}D(<7PSu_0?a?rL6J(Ds~~A|lc%3-T$`gqlvROs50jwP zRno)Bdu$ER{9VU9Cunw*3N6i&z(!LT9AVYQy!ldFIDgNlVy!FsQgPLHu>Ir~S@VfuS5es>%!(=!P>}G<+-Y3#;HU4Q5Ua z(0mElavC3E__>O!M_7At&3Z5hd(XYfw8Nq__pKldIeKP~p{f2&^EkwGiIcsM$wz8I zwa9fSSL3{4$IYt^9X12sDwp>~4sccP`jUBjq5wT?5{jZzkwbdh* zb8b0ZCt;4$V;{UurcZ0{G}osI++MF>iD;S?u07OB<2x)hnD9ZQEpX^W)1#j3;qQNI zE6rtjTywooNcojTqTLxOEb#qfme9!g7fDiel7magl(V+gBuLN1klWkZ5vtO;n$rl} z;JP|iGKK27x@)KNN!u&-n{^%~S_@Qa7cK7a!{e3T=S2kbVq(t=(oaDe0~6|KvOT&kA*P%UBB#@YPcy4TH&j$w8WD8$s}OOD5jm}*_fBCNuZo(D z>Jv&?q*V8UU38HvERt`G-K=sSa@jqEki*%OubtW7^4J)2fE$tC3?af*(B(1mUvux1 zkDav6eel(6to*W}+D$DI;SMY;EPhUD2{F~vVdduGQtP;488p*lI2-ANwlaGvl$?EQ zVFlHS$dyEoDLp;P>E5D04ef^Iww>Qd5Aa-Va<&Xc?;Lv79a3u&*X2cwIrL*&fJ&ns&`gMq%9bu~FH$Rd&@p%$AkuK@h~{)Lr1%@d8dRQi zNR-bE`xy=aQ2Ru^8TbW92xryne_5SA-e9L-J+cRKln5(We@G73*UrV8 z-SVs>kNHOFUr4t2#-no%qjGaeE9E;~3j?aIxzJWkm3d~r-6|c7;bYa`Xzv{$Wz2V! z5xbe-ekL-Rs&U-6xu$_?bF$w&*}H>~?hcC%(vNYEVP(iHI_4Cp-V*WIuFB{%+^yD_ zd@DJ3*w4;Z-%_L2{iW_Y_uPm4k`jfuJm!uEqudMXaw1ccnldXpBc-&VA1nW-U{CH= zI@av1H1~?A9;QmN1i;ovWXI{Gff4FNP$!6ZHMs#%@=3tQg36L1)opK|P#i6F|M1n%`AssZx zIh-^^CAZp585Mbqe9rN;| z)|V*fCYVV01^ZG5+PWj%@Lt^#K6_f=N{i-$Xs0RmR?^O=2gR`+X}$ZM6(oIzwGy@x zP0l9|o6}ZM@1xm@8BL?`ztD8U)=;I2N=K1ey8gK*o_`>8%}3b8J|}3f!#CJJcEZ;9 zRBNg(`nIl(l`7i;PwQaRX_7BsV>QZiA@+AdiK2c+;2BEyqhY_je1+Ib$%FJ9_3UHLQEIXnGIa%VZxk7Y5j5wQJI+;&KO2qZv9w zCAZV|$a_!6EX#&jI|50lEs<8MWEZUR_{P~9n@WWf6V%(K_M6FA9zPd1if2#e>+HN! zK9^$=(ouQG@|7=Jw0p5*tS28zu4#e)-e@uR_|$3W$z)ByIvMFO=R&YWq8snOc;l1` zZ`dEV5+CiYue}!+!+v93zry4Ml4wW_=b_0s@Io5Ki@zqi?~}sYqUkX_n`={z$fWzW z`p;c9ry4Uo*556t=R-m-WYjzdb^YvPYV4e^*EnNX%y0aFubah*+TySdaW=Q7I#EoF z?;ej{K}@fU*y>zZPmWzWX$}huUursYsp5)Lal0gPL!c&wSLGYj@p!Yv>MH{|ri`VY z=AK;=;b=#$bsw^Ft#+Kx)P?M=e&q6eMuKkk!ivMuseH?Dl;I+LC6*1T>nRakJSQfY z8+~g%(}2bMb4y2D@96+Xd?Gb!u1zY~Kq%upNr=f%0*)hDuXcQ_TT*nSL0H%ThfC`v zS-AWL

Y=nUch+OSA3dAVw_#-l=bvKLI%PwE^ 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 Date: Mon, 15 Jul 2024 11:38:05 +0400 Subject: [PATCH 056/144] Update xdcValidator.js --- contracts/validator/src/test/xdcValidator.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contracts/validator/src/test/xdcValidator.js b/contracts/validator/src/test/xdcValidator.js index f8e837e8391d..7d4cd5581fa8 100644 --- a/contracts/validator/src/test/xdcValidator.js +++ b/contracts/validator/src/test/xdcValidator.js @@ -79,6 +79,7 @@ describe("XDCValidator", () => { expect(validatorsState["cap"]).to.eq(minCandidateCap); expect(voterCap).to.eq(minCandidateCap); }); + it("resign", async () => { await setBalance(master, 1e30); const candidate = await ethers.Wallet.createRandom().getAddress(); @@ -115,6 +116,7 @@ describe("XDCValidator", () => { expect(validatorsState["cap"]).to.eq(0); expect(voterCap).to.eq(0); }); + it("vote", async () => { await setBalance(master, 1e30); const candidate = await ethers.Wallet.createRandom().getAddress(); @@ -148,6 +150,7 @@ describe("XDCValidator", () => { expect(validatorsState["cap"]).to.eq(minCandidateCap.add(minVoterCap)); expect(voterCap).to.eq(minCandidateCap.add(minVoterCap)); }); + it("unvote", async () => { await setBalance(master, 1e30); const candidate = await ethers.Wallet.createRandom().getAddress(); @@ -188,6 +191,7 @@ describe("XDCValidator", () => { expect(voterCap).to.eq(minCandidateCap); expect(withdrawCap).to.eq(minVoterCap); }); + it("withdraw", async () => { await setBalance(master, 1e30); const candidate = await ethers.Wallet.createRandom().getAddress(); @@ -219,6 +223,7 @@ describe("XDCValidator", () => { ); expect(afterBalance).to.eq(beforeBalance.sub(withdrawCap)); }); + it("directly resign one candidate", async () => { const oldCandidates = await xdcValidator.getCandidates(); @@ -230,6 +235,7 @@ describe("XDCValidator", () => { master, ]); }); + it("kyc upload and claim", async () => { const kyc = "0x01"; await xdcValidator.uploadKYC(kyc); From e32d5c7d7aa67b31ec31af978a54d35f7bd73c4d Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:39:36 +0400 Subject: [PATCH 057/144] update --- contracts/validator/src/README.md | 2 -- contracts/validator/src/scripts/deployment.js | 2 -- 2 files changed, 4 deletions(-) diff --git a/contracts/validator/src/README.md b/contracts/validator/src/README.md index d11bd8c46c12..3874dd7e51f5 100644 --- a/contracts/validator/src/README.md +++ b/contracts/validator/src/README.md @@ -58,8 +58,6 @@ This step is recommended to complete in python virtual environment because it is - `maxValidatorNumber`: Never used, I don't know why XDC people write this... - `candidateWithdrawDelay`: When you call resign() at block number x, you can only withdraw the cap at block x+candidateWithdrawDelay - `voterWithdrawDelay`: When you call unvote() at block number x, you can only withdraw the cap at block x+voterWithdrawDelay - - `grandMasters`: List of grand masters - - `minCandidateNum`: min candidate num - `xdcdevnet`: Targeted XDC public chain devnet, testnet or mainnet node RPC link - `xdcsubnet`: Targeted XDC private subnet chain devnet, testnet or mainnet node RPC link diff --git a/contracts/validator/src/scripts/deployment.js b/contracts/validator/src/scripts/deployment.js index 85f7ebd8d4bd..b1061c421664 100644 --- a/contracts/validator/src/scripts/deployment.js +++ b/contracts/validator/src/scripts/deployment.js @@ -17,8 +17,6 @@ async function main() { deploy["maxValidatorNumber"], deploy["candidateWithdrawDelay"], deploy["voterWithdrawDelay"], - deploy["grandMasters"], - deploy["minCandidateNum"] ); await xdcValidator.deployed(); From e190cc387d8aedffcdbac6e304c5a17356a4f1de Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 26 Jul 2024 12:40:50 +0400 Subject: [PATCH 058/144] Update XDCValidator.sol --- contracts/validator/src/contracts/XDCValidator.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/validator/src/contracts/XDCValidator.sol b/contracts/validator/src/contracts/XDCValidator.sol index 893fba7e56dc..39a75ddd5a4b 100644 --- a/contracts/validator/src/contracts/XDCValidator.sol +++ b/contracts/validator/src/contracts/XDCValidator.sol @@ -1,6 +1,7 @@ -pragma solidity ^0.4.26; +// SPDX-License-Identifier: MIT +pragma solidity =0.4.26; -import "./libraries/SafeMath.sol"; +import {SafeMath} from "./libraries/SafeMath.sol"; contract XDCValidator { using SafeMath for uint256; From 3ae7fcf368ca6c7072a34604ceb6852e4fc8f7da Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:21:56 +0400 Subject: [PATCH 059/144] Update XDCValidator.sol --- contracts/validator/src/contracts/XDCValidator.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/validator/src/contracts/XDCValidator.sol b/contracts/validator/src/contracts/XDCValidator.sol index 39a75ddd5a4b..47664edd3eb3 100644 --- a/contracts/validator/src/contracts/XDCValidator.sol +++ b/contracts/validator/src/contracts/XDCValidator.sol @@ -364,7 +364,7 @@ contract XDCValidator { if (isOwnerNow) { uint j = 0; uint count = 0; - address[] memory allMasternodes = new address[]( + address[] memory allInvalidMasternodes = new address[]( candidates.length ); address[] memory newCandidates = new address[]( @@ -376,7 +376,7 @@ contract XDCValidator { if (getCandidateOwner(candidate) == _owner) { // logic to remove cap. candidateCount = candidateCount.sub(1); - allMasternodes[count++] = candidate; + allInvalidMasternodes[count++] = candidate; invalidCandidate[candidate] = true; delete validatorsState[candidate]; delete KYCString[_owner]; @@ -390,12 +390,12 @@ contract XDCValidator { // Resize the array. assembly { mstore(newCandidates, j) - mstore(allMasternodes, count) + mstore(allInvalidMasternodes, count) } candidates = newCandidates; removeOwnerByIndex(ownerIndex); - emit InvalidatedNode(_owner, allMasternodes); + emit InvalidatedNode(_owner, allInvalidMasternodes); } } } From 307e99559658a75a45f3a4f4aa0655a3c902edc0 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:45:52 +0400 Subject: [PATCH 060/144] update --- contracts/validator/contract/validator.go | 476 +++++++++++++--------- contracts/validator/src/README.md | 2 +- contracts/validator/src/abi | 183 ++++++--- contracts/validator/src/bytecode | 2 +- 4 files changed, 413 insertions(+), 250 deletions(-) diff --git a/contracts/validator/contract/validator.go b/contracts/validator/contract/validator.go index f010a0367858..e8a6901eb08d 100644 --- a/contracts/validator/contract/validator.go +++ b/contracts/validator/contract/validator.go @@ -7,180 +7,19 @@ import ( "math/big" "strings" - ethereum "github.com/XinFinOrg/XDPoSChain" "github.com/XinFinOrg/XDPoSChain/accounts/abi" "github.com/XinFinOrg/XDPoSChain/accounts/abi/bind" "github.com/XinFinOrg/XDPoSChain/common" "github.com/XinFinOrg/XDPoSChain/core/types" "github.com/XinFinOrg/XDPoSChain/event" + ethereum "github.com/XinFinOrg/XDPoSChain" ) -// SafeMathABI is the input ABI used to generate the binding from. -const SafeMathABI = "[]" - -// SafeMathBin is the compiled bytecode used for deploying new contracts. -const SafeMathBin = `0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146060604052600080fd00a165627a7a72305820b9407d48ebc7efee5c9f08b3b3a957df2939281f5913225e8c1291f069b900490029` - -// DeploySafeMath deploys a new Ethereum contract, binding an instance of SafeMath to it. -func DeploySafeMath(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SafeMath, error) { - parsed, err := abi.JSON(strings.NewReader(SafeMathABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(SafeMathBin), backend) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil -} - -// SafeMath is an auto generated Go binding around an Ethereum contract. -type SafeMath struct { - SafeMathCaller // Read-only binding to the contract - SafeMathTransactor // Write-only binding to the contract - SafeMathFilterer // Log filterer for contract events -} - -// SafeMathCaller is an auto generated read-only Go binding around an Ethereum contract. -type SafeMathCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// SafeMathTransactor is an auto generated write-only Go binding around an Ethereum contract. -type SafeMathTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// SafeMathFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type SafeMathFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// SafeMathSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type SafeMathSession struct { - Contract *SafeMath // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// SafeMathCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type SafeMathCallerSession struct { - Contract *SafeMathCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// SafeMathTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type SafeMathTransactorSession struct { - Contract *SafeMathTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// SafeMathRaw is an auto generated low-level Go binding around an Ethereum contract. -type SafeMathRaw struct { - Contract *SafeMath // Generic contract binding to access the raw methods on -} - -// SafeMathCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type SafeMathCallerRaw struct { - Contract *SafeMathCaller // Generic read-only contract binding to access the raw methods on -} - -// SafeMathTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type SafeMathTransactorRaw struct { - Contract *SafeMathTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewSafeMath creates a new instance of SafeMath, bound to a specific deployed contract. -func NewSafeMath(address common.Address, backend bind.ContractBackend) (*SafeMath, error) { - contract, err := bindSafeMath(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil -} - -// NewSafeMathCaller creates a new read-only instance of SafeMath, bound to a specific deployed contract. -func NewSafeMathCaller(address common.Address, caller bind.ContractCaller) (*SafeMathCaller, error) { - contract, err := bindSafeMath(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &SafeMathCaller{contract: contract}, nil -} - -// NewSafeMathTransactor creates a new write-only instance of SafeMath, bound to a specific deployed contract. -func NewSafeMathTransactor(address common.Address, transactor bind.ContractTransactor) (*SafeMathTransactor, error) { - contract, err := bindSafeMath(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &SafeMathTransactor{contract: contract}, nil -} - -// NewSafeMathFilterer creates a new log filterer instance of SafeMath, bound to a specific deployed contract. -func NewSafeMathFilterer(address common.Address, filterer bind.ContractFilterer) (*SafeMathFilterer, error) { - contract, err := bindSafeMath(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &SafeMathFilterer{contract: contract}, nil -} - -// bindSafeMath binds a generic wrapper to an already deployed contract. -func bindSafeMath(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(SafeMathABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_SafeMath *SafeMathRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _SafeMath.Contract.SafeMathCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_SafeMath *SafeMathRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _SafeMath.Contract.SafeMathTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_SafeMath *SafeMathRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _SafeMath.Contract.SafeMathTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_SafeMath *SafeMathCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _SafeMath.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_SafeMath *SafeMathTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _SafeMath.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_SafeMath *SafeMathTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _SafeMath.Contract.contract.Transact(opts, method, params...) -} - // XDCValidatorABI is the input ABI used to generate the binding from. -const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"KYCString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" +const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeCandidatesZeroAddresses\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingKYC\",\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"name\":\"kycHash\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"validatorsState\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"isCandidate\",\"type\":\"bool\"},{\"name\":\"cap\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"KYCString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"voters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getOwnerToCandidateLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeOwnersZeroAddresses\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"claimKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" // XDCValidatorBin is the compiled bytecode used for deploying new contracts. -const XDCValidatorBin = `606060405260006009556000600a5534156200001a57600080fd5b60405162003dcc38038062003dcc83398101604052808051820191906020018051820191906020018051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091905050600085600b8190555084600c8190555083600d8190555082600e8190555081600f81905550885160098190555060078054806001018281620000bd9190620004f1565b9160005260206000209001600089909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a60008154809291906001019190505550600090505b8851811015620004e25760088054806001018281620001439190620004f1565b916000526020600020900160008b848151811015156200015f57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052808873ffffffffffffffffffffffffffffffffffffffff1681526020016001151581526020018983815181101515620001ea57fe5b90602001906020020151815250600160008b848151811015156200020a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050600260008a83815181101515620002d557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816200032d9190620004f1565b9160005260206000209001600089909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281620003cf9190620004f1565b916000526020600020900160008b84815181101515620003eb57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600b54600160008b848151811015156200044c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808060010191505062000123565b50505050505050505062000548565b8154818355818115116200051b578183600052602060002091820191016200051a919062000520565b5b505050565b6200054591905b808211156200054157600081600090555060010162000527565b5090565b90565b61387480620005586000396000f300606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063012679511461019b578063025e7c27146101c957806302aa9be21461022c57806306a49fce1461026e5780630db02622146102d85780630e3e4fb81461030157806315febd68146103715780632a3640b1146103a85780632d15cc041461042a5780632f9c4bba146104b8578063302b687214610522578063326586521461058e5780633477ee2e14610640578063441a3e70146106a357806358e7525f146106cf5780635b860d271461071c5780635b9cd8cc146107695780636dd7d8ea1461082457806372e44a3814610852578063a9a981a31461089f578063a9ff959e146108c8578063ae6e43f5146108f1578063b642facd1461092a578063c45607df146109a3578063d09f1ab4146109f0578063d161c76714610a19578063d51b9e9314610a42578063d55b7dff14610a93578063ef18374a14610abc578063f2ee3c7d14610ae5578063f5c9512514610b1e578063f8ac9dd514610b4c575b600080fd5b6101c7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b75565b005b34156101d457600080fd5b6101ea60048080359060200190919050506111fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023757600080fd5b61026c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123b565b005b341561027957600080fd5b610281611796565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102c45780820151818401526020810190506102a9565b505050509050019250505060405180910390f35b34156102e357600080fd5b6102eb61182a565b6040518082815260200191505060405180910390f35b341561030c57600080fd5b610357600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611830565b604051808215151515815260200191505060405180910390f35b341561037c57600080fd5b610392600480803590602001909190505061185f565b6040518082815260200191505060405180910390f35b34156103b357600080fd5b6103e8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506118bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043557600080fd5b610461600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611909565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a4578082015181840152602081019050610489565b505050509050019250505060405180910390f35b34156104c357600080fd5b6104cb6119dc565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561050e5780820151818401526020810190506104f3565b505050509050019250505060405180910390f35b341561052d57600080fd5b610578600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a79565b6040518082815260200191505060405180910390f35b341561059957600080fd5b6105c5600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b03565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106055780820151818401526020810190506105ea565b50505050905090810190601f1680156106325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064b57600080fd5b6106616004808035906020019091905050611da2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106ae57600080fd5b6106cd6004808035906020019091908035906020019091905050611de1565b005b34156106da57600080fd5b610706600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061208d565b6040518082815260200191505060405180910390f35b341561072757600080fd5b610753600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120d9565b6040518082815260200191505060405180910390f35b341561077457600080fd5b6107a9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506121a1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e95780820151818401526020810190506107ce565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610850600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061226a565b005b341561085d57600080fd5b610889600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612653565b6040518082815260200191505060405180910390f35b34156108aa57600080fd5b6108b261266b565b6040518082815260200191505060405180910390f35b34156108d357600080fd5b6108db612671565b6040518082815260200191505060405180910390f35b34156108fc57600080fd5b610928600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612677565b005b341561093557600080fd5b610961600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ae57600080fd5b6109da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ca2565b6040518082815260200191505060405180910390f35b34156109fb57600080fd5b610a03612cee565b6040518082815260200191505060405180910390f35b3415610a2457600080fd5b610a2c612cf4565b6040518082815260200191505060405180910390f35b3415610a4d57600080fd5b610a79600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612cfa565b604051808215151515815260200191505060405180910390f35b3415610a9e57600080fd5b610aa6612d53565b6040518082815260200191505060405180910390f35b3415610ac757600080fd5b610acf612d59565b6040518082815260200191505060405180910390f35b3415610af057600080fd5b610b1c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d63565b005b3415610b2957600080fd5b610b4a600480803590602001908201803590602001919091929050506134f1565b005b3415610b5757600080fd5b610b5f6135f0565b6040518082815260200191505060405180910390f35b6000600b543410151515610b8857600080fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050141580610c1c57506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050115b1515610c2757600080fd5b81600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151515610c8457600080fd5b610cd934600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b915060088054806001018281610cef919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200183815250600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050610eb834600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5160016009546135f690919063ffffffff16565b6009819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014156110185760078054806001018281610fb6919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a600081548092919060010191905055505b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611069919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611109919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1338434604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60078181548110151561120b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000828280600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156112cd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561140657600b546113f882600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b1015151561140557600080fd5b5b61145b84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061153384600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cb43600f546135f690919063ffffffff16565b9250611632846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180548060010182816116db9190613659565b9160005260206000209001600085909190915055507faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2338686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050505050565b61179e613685565b600880548060200260200160405190810160405280929190818152602001828054801561182057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117d6575b5050505050905090565b600a5481565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000838152602001908152602001600020549050919050565b6006602052816000526040600020818154811015156118d657fe5b90600052602060002090016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611911613685565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119d057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611986575b50505050509050919050565b6119e4613699565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015611a6f57602002820191906000526020600020905b815481526020019060010190808311611a5b575b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b0b6136ad565b611b1482612cfa565b15611c655760036000611b2684612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160036000611b6f86612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611bba57fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c595780601f10611c2e57610100808354040283529160200191611c59565b820191906000526020600020905b815481529060010190602001808311611c3c57829003601f168201915b50505050509050611d9d565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611cf657fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d955780601f10611d6a57610100808354040283529160200191611d95565b820191906000526020600020905b815481529060010190602001808311611d7857829003601f168201915b505050505090505b919050565b600881815481101515611db157fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282600082111515611df457600080fd5b814310151515611e0357600080fd5b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600084815260200190815260200160002054111515611e6457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182815481101515611eb357fe5b906000526020600020900154141515611ecb57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008681526020019081526020016000205492506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020600090556000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010184815481101515611fc457fe5b9060005260206000209001600090553373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561201357600080fd5b7ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568338685604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60008082600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561213857600080fd5b61214184612c36565b915061214b612d59565b6064600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561219757fe5b0492505050919050565b6003602052816000526040600020818154811015156121bc57fe5b9060005260206000209001600091509150508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122625780601f1061223757610100808354040283529160200191612262565b820191906000526020600020905b81548152906001019060200180831161224557829003601f168201915b505050505081565b600c54341015151561227b57600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff1615156122d757600080fd5b61232c34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561249b57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480600101828161244b919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b61252d34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc338334604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b60046020528060005260406000206000915090505481565b60095481565b600f5481565b6000806000833373ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561271957600080fd5b84600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561277557600080fd5b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a81548160ff0219169083151502179055506127e6600160095461361490919063ffffffff16565b600981905550600094505b6008805490508510156128bb578573ffffffffffffffffffffffffffffffffffffffff1660088681548110151561282457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128ae5760088581548110151561287b57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556128bb565b84806001019550506127f1565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054935061299284600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a7243600e546135f690919063ffffffff16565b9250612ad9846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806001018281612b829190613659565b9160005260206000209001600085909190915055507f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d33387604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600d5481565b600e5481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff169050919050565b600b5481565b6000600a54905090565b600080612d6e613685565b600080600033600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612dcf57600080fd5b87600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612e2b57600080fd5b612e3433612c36565b9750612e3f89612c36565b9650600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612ed757600080fd5b6001600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550604b612fc4612d59565b6064600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561301057fe5b041015156134e65760016008805490500360405180591061302e5750595b9080825280602002602001820160405250955060009450600093505b600880549050841015613357578673ffffffffffffffffffffffffffffffffffffffff166130b160088681548110151561308057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c36565b73ffffffffffffffffffffffffffffffffffffffff16141561334a576130e3600160095461361490919063ffffffff16565b6009819055506008848154811015156130f857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868680600101975081518110151561313857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060088481548110151561318357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160006008868154811015156131c457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff021916905560018201600090555050600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006132bb91906136c1565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061330691906136e2565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555b838060010194505061304a565b600092505b600780549050831015613439578673ffffffffffffffffffffffffffffffffffffffff1660078481548110151561338f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561342c576007838154811015156133e657fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a6000815480929190600190039190505550613439565b828060010193505061335c565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156134d15780820151818401526020810190506134b6565b50505050905001935050505060405180910390a15b505050505050505050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816135429190613703565b91600052602060002090016000848490919290919250919061356592919061372f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a15050565b600c5481565b600080828401905083811015151561360a57fe5b8091505092915050565b600082821115151561362257fe5b818303905092915050565b8154818355818115116136545781836000526020600020918201910161365391906137af565b5b505050565b8154818355818115116136805781836000526020600020918201910161367f91906137af565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906136df91906137d4565b50565b508054600082559060005260206000209081019061370091906137af565b50565b81548183558181151161372a5781836000526020600020918201910161372991906137d4565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061377057803560ff191683800117855561379e565b8280016001018555821561379e579182015b8281111561379d578235825591602001919060010190613782565b5b5090506137ab91906137af565b5090565b6137d191905b808211156137cd5760008160009055506001016137b5565b5090565b90565b6137fd91905b808211156137f957600081816137f09190613800565b506001016137da565b5090565b90565b50805460018160011615610100020316600290046000825580601f106138265750613845565b601f01602090049060005260206000209081019061384491906137af565b5b505600a165627a7a72305820f5bbb127b52ce86c873faef85cff176563476a5e49a3d88eaa9a06a8f432c9080029` +const XDCValidatorBin = `0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058208aa2ea0f8e87fc68507f275418a407fa4ee47253861d6f224fda4db207eaf2110029` // DeployXDCValidator deploys a new Ethereum contract, binding an instance of XDCValidator to it. func DeployXDCValidator(auth *bind.TransactOpts, backend bind.ContractBackend, _candidates []common.Address, _caps []*big.Int, _firstOwner common.Address, _minCandidateCap *big.Int, _minVoterCap *big.Int, _maxValidatorNumber *big.Int, _candidateWithdrawDelay *big.Int, _voterWithdrawDelay *big.Int) (common.Address, *types.Transaction, *XDCValidator, error) { @@ -597,6 +436,32 @@ func (_XDCValidator *XDCValidatorCallerSession) GetOwnerCount() (*big.Int, error return _XDCValidator.Contract.GetOwnerCount(&_XDCValidator.CallOpts) } +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetOwnerToCandidateLength(opts *bind.CallOpts, _address common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getOwnerToCandidateLength", _address) + return *ret0, err +} + +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) +} + +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) +} + // GetVoterCap is a free data retrieval call binding the contract method 0x302b6872. // // Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256) @@ -727,6 +592,32 @@ func (_XDCValidator *XDCValidatorCallerSession) HasVotedInvalid(arg0 common.Addr return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) } +// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. +// +// Solidity: function invalidCandidate( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) InvalidCandidate(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "invalidCandidate", arg0) + return *ret0, err +} + +// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. +// +// Solidity: function invalidCandidate( address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) InvalidCandidate(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidCandidate(&_XDCValidator.CallOpts, arg0) +} + +// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. +// +// Solidity: function invalidCandidate( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) InvalidCandidate(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidCandidate(&_XDCValidator.CallOpts, arg0) +} + // InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. // // Solidity: function invalidKYCCount( address) constant returns(uint256) @@ -753,30 +644,56 @@ func (_XDCValidator *XDCValidatorCallerSession) InvalidKYCCount(arg0 common.Addr return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0) } +// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. +// +// Solidity: function invalidOwner( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) InvalidOwner(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "invalidOwner", arg0) + return *ret0, err +} + +// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. +// +// Solidity: function invalidOwner( address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) InvalidOwner(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidOwner(&_XDCValidator.CallOpts, arg0) +} + +// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. +// +// Solidity: function invalidOwner( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) InvalidOwner(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidOwner(&_XDCValidator.CallOpts, arg0) +} + // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _invalidCandidate common.Address) (*big.Int, error) { +// Solidity: function invalidPercent(_owner address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _owner common.Address) (*big.Int, error) { var ( ret0 = new(*big.Int) ) out := ret0 - err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _invalidCandidate) + err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _owner) return *ret0, err } // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) -func (_XDCValidator *XDCValidatorSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { - return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) +// Solidity: function invalidPercent(_owner address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) InvalidPercent(_owner common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _owner) } // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { - return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) +// Solidity: function invalidPercent(_owner address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_owner common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _owner) } // IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. @@ -805,6 +722,36 @@ func (_XDCValidator *XDCValidatorCallerSession) IsCandidate(_candidate common.Ad return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate) } +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(owner address) constant returns(bool, uint256) +func (_XDCValidator *XDCValidatorCaller) IsOwner(opts *bind.CallOpts, owner common.Address) (bool, *big.Int, error) { + var ( + ret0 = new(bool) + ret1 = new(*big.Int) + ) + out := &[]interface{}{ + ret0, + ret1, + } + err := _XDCValidator.contract.Call(opts, out, "isOwner", owner) + return *ret0, *ret1, err +} + +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(owner address) constant returns(bool, uint256) +func (_XDCValidator *XDCValidatorSession) IsOwner(owner common.Address) (bool, *big.Int, error) { + return _XDCValidator.Contract.IsOwner(&_XDCValidator.CallOpts, owner) +} + +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(owner address) constant returns(bool, uint256) +func (_XDCValidator *XDCValidatorCallerSession) IsOwner(owner common.Address) (bool, *big.Int, error) { + return _XDCValidator.Contract.IsOwner(&_XDCValidator.CallOpts, owner) +} + // MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. // // Solidity: function maxValidatorNumber() constant returns(uint256) @@ -961,6 +908,82 @@ func (_XDCValidator *XDCValidatorCallerSession) Owners(arg0 *big.Int) (common.Ad return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0) } +// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. +// +// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) +func (_XDCValidator *XDCValidatorCaller) PendingKYC(opts *bind.CallOpts, arg0 common.Address) (struct { + BlockNumber *big.Int + KycHash string +}, error) { + ret := new(struct { + BlockNumber *big.Int + KycHash string + }) + out := ret + err := _XDCValidator.contract.Call(opts, out, "pendingKYC", arg0) + return *ret, err +} + +// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. +// +// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) +func (_XDCValidator *XDCValidatorSession) PendingKYC(arg0 common.Address) (struct { + BlockNumber *big.Int + KycHash string +}, error) { + return _XDCValidator.Contract.PendingKYC(&_XDCValidator.CallOpts, arg0) +} + +// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. +// +// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) +func (_XDCValidator *XDCValidatorCallerSession) PendingKYC(arg0 common.Address) (struct { + BlockNumber *big.Int + KycHash string +}, error) { + return _XDCValidator.Contract.PendingKYC(&_XDCValidator.CallOpts, arg0) +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorCaller) ValidatorsState(opts *bind.CallOpts, arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + ret := new(struct { + Owner common.Address + IsCandidate bool + Cap *big.Int + }) + out := ret + err := _XDCValidator.contract.Call(opts, out, "validatorsState", arg0) + return *ret, err +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorSession) ValidatorsState(arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorCallerSession) ValidatorsState(arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) +} + // VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e. // // Solidity: function voterWithdrawDelay() constant returns(uint256) @@ -987,6 +1010,53 @@ func (_XDCValidator *XDCValidatorCallerSession) VoterWithdrawDelay() (*big.Int, return _XDCValidator.Contract.VoterWithdrawDelay(&_XDCValidator.CallOpts) } +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) Voters(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "voters", arg0, arg1) + return *ret0, err +} + +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) +} + +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) +} + +// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. +// +// Solidity: function claimKYC() returns() +func (_XDCValidator *XDCValidatorTransactor) ClaimKYC(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "claimKYC") +} + +// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. +// +// Solidity: function claimKYC() returns() +func (_XDCValidator *XDCValidatorSession) ClaimKYC() (*types.Transaction, error) { + return _XDCValidator.Contract.ClaimKYC(&_XDCValidator.TransactOpts) +} + +// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. +// +// Solidity: function claimKYC() returns() +func (_XDCValidator *XDCValidatorTransactorSession) ClaimKYC() (*types.Transaction, error) { + return _XDCValidator.Contract.ClaimKYC(&_XDCValidator.TransactOpts) +} + // Propose is a paid mutator transaction binding the contract method 0x01267951. // // Solidity: function propose(_candidate address) returns() @@ -1008,6 +1078,48 @@ func (_XDCValidator *XDCValidatorTransactorSession) Propose(_candidate common.Ad return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate) } +// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. +// +// Solidity: function removeCandidatesZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactor) RemoveCandidatesZeroAddresses(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "removeCandidatesZeroAddresses") +} + +// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. +// +// Solidity: function removeCandidatesZeroAddresses() returns() +func (_XDCValidator *XDCValidatorSession) RemoveCandidatesZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveCandidatesZeroAddresses(&_XDCValidator.TransactOpts) +} + +// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. +// +// Solidity: function removeCandidatesZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactorSession) RemoveCandidatesZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveCandidatesZeroAddresses(&_XDCValidator.TransactOpts) +} + +// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. +// +// Solidity: function removeOwnersZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactor) RemoveOwnersZeroAddresses(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "removeOwnersZeroAddresses") +} + +// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. +// +// Solidity: function removeOwnersZeroAddresses() returns() +func (_XDCValidator *XDCValidatorSession) RemoveOwnersZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveOwnersZeroAddresses(&_XDCValidator.TransactOpts) +} + +// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. +// +// Solidity: function removeOwnersZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactorSession) RemoveOwnersZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveOwnersZeroAddresses(&_XDCValidator.TransactOpts) +} + // Resign is a paid mutator transaction binding the contract method 0xae6e43f5. // // Solidity: function resign(_candidate address) returns() @@ -1094,23 +1206,23 @@ func (_XDCValidator *XDCValidatorTransactorSession) Vote(_candidate common.Addre // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() -func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _invalidCandidate common.Address) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _invalidCandidate) +// Solidity: function voteInvalidKYC(_owner address) returns() +func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _owner common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _owner) } // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() -func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { - return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) +// Solidity: function voteInvalidKYC(_owner address) returns() +func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_owner common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _owner) } // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() -func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { - return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) +// Solidity: function voteInvalidKYC(_owner address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_owner common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _owner) } // Withdraw is a paid mutator transaction binding the contract method 0x441a3e70. diff --git a/contracts/validator/src/README.md b/contracts/validator/src/README.md index 3874dd7e51f5..984e1cad6165 100644 --- a/contracts/validator/src/README.md +++ b/contracts/validator/src/README.md @@ -40,7 +40,7 @@ node scripts/deployToGenesis.js If you don't have `abigen`, compile it. It's in `cmd/abigen/main.go` in XDC main repo (or Geth repo). -3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDC-Subnet"` +3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDPoSChain"` ## Deploy contract to node any block diff --git a/contracts/validator/src/abi b/contracts/validator/src/abi index ecd07cc0e4bc..a41ab3ed2fa7 100644 --- a/contracts/validator/src/abi +++ b/contracts/validator/src/abi @@ -64,6 +64,29 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [], + "name": "removeCandidatesZeroAddresses", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "ownerCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [ @@ -112,16 +135,16 @@ { "name": "", "type": "address" - }, - { - "name": "", - "type": "uint256" } ], - "name": "kycString", + "name": "pendingKYC", "outputs": [ { - "name": "", + "name": "blockNumber", + "type": "uint256" + }, + { + "name": "kycHash", "type": "string" } ], @@ -171,6 +194,29 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "owner", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + }, + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -291,34 +337,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": true, - "inputs": [], - "name": "minCandidateNum", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getGrandMasters", - "outputs": [ - { - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [ @@ -342,26 +360,7 @@ "constant": true, "inputs": [ { - "name": "", - "type": "address" - } - ], - "name": "grandMasterMap", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_invalidCandidate", + "name": "_owner", "type": "address" } ], @@ -388,11 +387,11 @@ "type": "uint256" } ], - "name": "voters", + "name": "KYCString", "outputs": [ { "name": "", - "type": "address" + "type": "string" } ], "payable": false, @@ -402,12 +401,16 @@ { "constant": true, "inputs": [ + { + "name": "", + "type": "address" + }, { "name": "", "type": "uint256" } ], - "name": "grandMasters", + "name": "voters", "outputs": [ { "name": "", @@ -437,6 +440,15 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [], + "name": "removeOwnersZeroAddresses", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": false, "inputs": [ @@ -470,6 +482,15 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [], + "name": "claimKYC", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": true, "inputs": [], @@ -512,6 +533,25 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidCandidate", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [ @@ -611,6 +651,25 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -629,7 +688,7 @@ "constant": false, "inputs": [ { - "name": "_invalidCandidate", + "name": "_owner", "type": "address" } ], @@ -700,14 +759,6 @@ { "name": "_voterWithdrawDelay", "type": "uint256" - }, - { - "name": "_grandMasters", - "type": "address[]" - }, - { - "name": "_minCandidateNum", - "type": "uint256" } ], "payable": false, diff --git a/contracts/validator/src/bytecode b/contracts/validator/src/bytecode index 814d09efc0be..78b97c66212f 100644 --- a/contracts/validator/src/bytecode +++ b/contracts/validator/src/bytecode @@ -1 +1 @@ -0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029 \ No newline at end of file +0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058208aa2ea0f8e87fc68507f275418a407fa4ee47253861d6f224fda4db207eaf2110029 \ No newline at end of file From 42073c9a91e90ddda82605b51c564653b0a3c44e Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:50:45 +0400 Subject: [PATCH 061/144] Revert "update" This reverts commit 307e99559658a75a45f3a4f4aa0655a3c902edc0. --- contracts/validator/contract/validator.go | 476 +++++++++------------- contracts/validator/src/README.md | 2 +- contracts/validator/src/abi | 183 +++------ contracts/validator/src/bytecode | 2 +- 4 files changed, 250 insertions(+), 413 deletions(-) diff --git a/contracts/validator/contract/validator.go b/contracts/validator/contract/validator.go index e8a6901eb08d..f010a0367858 100644 --- a/contracts/validator/contract/validator.go +++ b/contracts/validator/contract/validator.go @@ -7,19 +7,180 @@ import ( "math/big" "strings" + ethereum "github.com/XinFinOrg/XDPoSChain" "github.com/XinFinOrg/XDPoSChain/accounts/abi" "github.com/XinFinOrg/XDPoSChain/accounts/abi/bind" "github.com/XinFinOrg/XDPoSChain/common" "github.com/XinFinOrg/XDPoSChain/core/types" "github.com/XinFinOrg/XDPoSChain/event" - ethereum "github.com/XinFinOrg/XDPoSChain" ) +// SafeMathABI is the input ABI used to generate the binding from. +const SafeMathABI = "[]" + +// SafeMathBin is the compiled bytecode used for deploying new contracts. +const SafeMathBin = `0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146060604052600080fd00a165627a7a72305820b9407d48ebc7efee5c9f08b3b3a957df2939281f5913225e8c1291f069b900490029` + +// DeploySafeMath deploys a new Ethereum contract, binding an instance of SafeMath to it. +func DeploySafeMath(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SafeMath, error) { + parsed, err := abi.JSON(strings.NewReader(SafeMathABI)) + if err != nil { + return common.Address{}, nil, nil, err + } + address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(SafeMathBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil +} + +// SafeMath is an auto generated Go binding around an Ethereum contract. +type SafeMath struct { + SafeMathCaller // Read-only binding to the contract + SafeMathTransactor // Write-only binding to the contract + SafeMathFilterer // Log filterer for contract events +} + +// SafeMathCaller is an auto generated read-only Go binding around an Ethereum contract. +type SafeMathCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeMathTransactor is an auto generated write-only Go binding around an Ethereum contract. +type SafeMathTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeMathFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type SafeMathFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeMathSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type SafeMathSession struct { + Contract *SafeMath // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SafeMathCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type SafeMathCallerSession struct { + Contract *SafeMathCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// SafeMathTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type SafeMathTransactorSession struct { + Contract *SafeMathTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SafeMathRaw is an auto generated low-level Go binding around an Ethereum contract. +type SafeMathRaw struct { + Contract *SafeMath // Generic contract binding to access the raw methods on +} + +// SafeMathCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type SafeMathCallerRaw struct { + Contract *SafeMathCaller // Generic read-only contract binding to access the raw methods on +} + +// SafeMathTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type SafeMathTransactorRaw struct { + Contract *SafeMathTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewSafeMath creates a new instance of SafeMath, bound to a specific deployed contract. +func NewSafeMath(address common.Address, backend bind.ContractBackend) (*SafeMath, error) { + contract, err := bindSafeMath(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil +} + +// NewSafeMathCaller creates a new read-only instance of SafeMath, bound to a specific deployed contract. +func NewSafeMathCaller(address common.Address, caller bind.ContractCaller) (*SafeMathCaller, error) { + contract, err := bindSafeMath(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &SafeMathCaller{contract: contract}, nil +} + +// NewSafeMathTransactor creates a new write-only instance of SafeMath, bound to a specific deployed contract. +func NewSafeMathTransactor(address common.Address, transactor bind.ContractTransactor) (*SafeMathTransactor, error) { + contract, err := bindSafeMath(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &SafeMathTransactor{contract: contract}, nil +} + +// NewSafeMathFilterer creates a new log filterer instance of SafeMath, bound to a specific deployed contract. +func NewSafeMathFilterer(address common.Address, filterer bind.ContractFilterer) (*SafeMathFilterer, error) { + contract, err := bindSafeMath(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &SafeMathFilterer{contract: contract}, nil +} + +// bindSafeMath binds a generic wrapper to an already deployed contract. +func bindSafeMath(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(SafeMathABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_SafeMath *SafeMathRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _SafeMath.Contract.SafeMathCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_SafeMath *SafeMathRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SafeMath.Contract.SafeMathTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_SafeMath *SafeMathRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _SafeMath.Contract.SafeMathTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_SafeMath *SafeMathCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _SafeMath.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_SafeMath *SafeMathTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SafeMath.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_SafeMath *SafeMathTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _SafeMath.Contract.contract.Transact(opts, method, params...) +} + // XDCValidatorABI is the input ABI used to generate the binding from. -const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeCandidatesZeroAddresses\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingKYC\",\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"name\":\"kycHash\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"validatorsState\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"isCandidate\",\"type\":\"bool\"},{\"name\":\"cap\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"KYCString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"voters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getOwnerToCandidateLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeOwnersZeroAddresses\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"claimKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" +const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"KYCString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" // XDCValidatorBin is the compiled bytecode used for deploying new contracts. -const XDCValidatorBin = `0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058208aa2ea0f8e87fc68507f275418a407fa4ee47253861d6f224fda4db207eaf2110029` +const XDCValidatorBin = `606060405260006009556000600a5534156200001a57600080fd5b60405162003dcc38038062003dcc83398101604052808051820191906020018051820191906020018051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091905050600085600b8190555084600c8190555083600d8190555082600e8190555081600f81905550885160098190555060078054806001018281620000bd9190620004f1565b9160005260206000209001600089909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a60008154809291906001019190505550600090505b8851811015620004e25760088054806001018281620001439190620004f1565b916000526020600020900160008b848151811015156200015f57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052808873ffffffffffffffffffffffffffffffffffffffff1681526020016001151581526020018983815181101515620001ea57fe5b90602001906020020151815250600160008b848151811015156200020a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050600260008a83815181101515620002d557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816200032d9190620004f1565b9160005260206000209001600089909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281620003cf9190620004f1565b916000526020600020900160008b84815181101515620003eb57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600b54600160008b848151811015156200044c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808060010191505062000123565b50505050505050505062000548565b8154818355818115116200051b578183600052602060002091820191016200051a919062000520565b5b505050565b6200054591905b808211156200054157600081600090555060010162000527565b5090565b90565b61387480620005586000396000f300606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063012679511461019b578063025e7c27146101c957806302aa9be21461022c57806306a49fce1461026e5780630db02622146102d85780630e3e4fb81461030157806315febd68146103715780632a3640b1146103a85780632d15cc041461042a5780632f9c4bba146104b8578063302b687214610522578063326586521461058e5780633477ee2e14610640578063441a3e70146106a357806358e7525f146106cf5780635b860d271461071c5780635b9cd8cc146107695780636dd7d8ea1461082457806372e44a3814610852578063a9a981a31461089f578063a9ff959e146108c8578063ae6e43f5146108f1578063b642facd1461092a578063c45607df146109a3578063d09f1ab4146109f0578063d161c76714610a19578063d51b9e9314610a42578063d55b7dff14610a93578063ef18374a14610abc578063f2ee3c7d14610ae5578063f5c9512514610b1e578063f8ac9dd514610b4c575b600080fd5b6101c7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b75565b005b34156101d457600080fd5b6101ea60048080359060200190919050506111fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023757600080fd5b61026c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123b565b005b341561027957600080fd5b610281611796565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102c45780820151818401526020810190506102a9565b505050509050019250505060405180910390f35b34156102e357600080fd5b6102eb61182a565b6040518082815260200191505060405180910390f35b341561030c57600080fd5b610357600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611830565b604051808215151515815260200191505060405180910390f35b341561037c57600080fd5b610392600480803590602001909190505061185f565b6040518082815260200191505060405180910390f35b34156103b357600080fd5b6103e8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506118bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043557600080fd5b610461600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611909565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a4578082015181840152602081019050610489565b505050509050019250505060405180910390f35b34156104c357600080fd5b6104cb6119dc565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561050e5780820151818401526020810190506104f3565b505050509050019250505060405180910390f35b341561052d57600080fd5b610578600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a79565b6040518082815260200191505060405180910390f35b341561059957600080fd5b6105c5600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b03565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106055780820151818401526020810190506105ea565b50505050905090810190601f1680156106325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064b57600080fd5b6106616004808035906020019091905050611da2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106ae57600080fd5b6106cd6004808035906020019091908035906020019091905050611de1565b005b34156106da57600080fd5b610706600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061208d565b6040518082815260200191505060405180910390f35b341561072757600080fd5b610753600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120d9565b6040518082815260200191505060405180910390f35b341561077457600080fd5b6107a9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506121a1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e95780820151818401526020810190506107ce565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610850600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061226a565b005b341561085d57600080fd5b610889600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612653565b6040518082815260200191505060405180910390f35b34156108aa57600080fd5b6108b261266b565b6040518082815260200191505060405180910390f35b34156108d357600080fd5b6108db612671565b6040518082815260200191505060405180910390f35b34156108fc57600080fd5b610928600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612677565b005b341561093557600080fd5b610961600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ae57600080fd5b6109da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ca2565b6040518082815260200191505060405180910390f35b34156109fb57600080fd5b610a03612cee565b6040518082815260200191505060405180910390f35b3415610a2457600080fd5b610a2c612cf4565b6040518082815260200191505060405180910390f35b3415610a4d57600080fd5b610a79600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612cfa565b604051808215151515815260200191505060405180910390f35b3415610a9e57600080fd5b610aa6612d53565b6040518082815260200191505060405180910390f35b3415610ac757600080fd5b610acf612d59565b6040518082815260200191505060405180910390f35b3415610af057600080fd5b610b1c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d63565b005b3415610b2957600080fd5b610b4a600480803590602001908201803590602001919091929050506134f1565b005b3415610b5757600080fd5b610b5f6135f0565b6040518082815260200191505060405180910390f35b6000600b543410151515610b8857600080fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050141580610c1c57506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050115b1515610c2757600080fd5b81600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151515610c8457600080fd5b610cd934600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b915060088054806001018281610cef919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200183815250600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050610eb834600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5160016009546135f690919063ffffffff16565b6009819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014156110185760078054806001018281610fb6919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a600081548092919060010191905055505b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611069919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611109919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1338434604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60078181548110151561120b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000828280600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156112cd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561140657600b546113f882600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b1015151561140557600080fd5b5b61145b84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061153384600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cb43600f546135f690919063ffffffff16565b9250611632846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180548060010182816116db9190613659565b9160005260206000209001600085909190915055507faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2338686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050505050565b61179e613685565b600880548060200260200160405190810160405280929190818152602001828054801561182057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117d6575b5050505050905090565b600a5481565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000838152602001908152602001600020549050919050565b6006602052816000526040600020818154811015156118d657fe5b90600052602060002090016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611911613685565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119d057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611986575b50505050509050919050565b6119e4613699565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015611a6f57602002820191906000526020600020905b815481526020019060010190808311611a5b575b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b0b6136ad565b611b1482612cfa565b15611c655760036000611b2684612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160036000611b6f86612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611bba57fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c595780601f10611c2e57610100808354040283529160200191611c59565b820191906000526020600020905b815481529060010190602001808311611c3c57829003601f168201915b50505050509050611d9d565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611cf657fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d955780601f10611d6a57610100808354040283529160200191611d95565b820191906000526020600020905b815481529060010190602001808311611d7857829003601f168201915b505050505090505b919050565b600881815481101515611db157fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282600082111515611df457600080fd5b814310151515611e0357600080fd5b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600084815260200190815260200160002054111515611e6457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182815481101515611eb357fe5b906000526020600020900154141515611ecb57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008681526020019081526020016000205492506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020600090556000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010184815481101515611fc457fe5b9060005260206000209001600090553373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561201357600080fd5b7ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568338685604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60008082600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561213857600080fd5b61214184612c36565b915061214b612d59565b6064600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561219757fe5b0492505050919050565b6003602052816000526040600020818154811015156121bc57fe5b9060005260206000209001600091509150508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122625780601f1061223757610100808354040283529160200191612262565b820191906000526020600020905b81548152906001019060200180831161224557829003601f168201915b505050505081565b600c54341015151561227b57600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff1615156122d757600080fd5b61232c34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561249b57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480600101828161244b919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b61252d34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc338334604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b60046020528060005260406000206000915090505481565b60095481565b600f5481565b6000806000833373ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561271957600080fd5b84600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561277557600080fd5b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a81548160ff0219169083151502179055506127e6600160095461361490919063ffffffff16565b600981905550600094505b6008805490508510156128bb578573ffffffffffffffffffffffffffffffffffffffff1660088681548110151561282457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128ae5760088581548110151561287b57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556128bb565b84806001019550506127f1565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054935061299284600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a7243600e546135f690919063ffffffff16565b9250612ad9846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806001018281612b829190613659565b9160005260206000209001600085909190915055507f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d33387604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600d5481565b600e5481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff169050919050565b600b5481565b6000600a54905090565b600080612d6e613685565b600080600033600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612dcf57600080fd5b87600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612e2b57600080fd5b612e3433612c36565b9750612e3f89612c36565b9650600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612ed757600080fd5b6001600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550604b612fc4612d59565b6064600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561301057fe5b041015156134e65760016008805490500360405180591061302e5750595b9080825280602002602001820160405250955060009450600093505b600880549050841015613357578673ffffffffffffffffffffffffffffffffffffffff166130b160088681548110151561308057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c36565b73ffffffffffffffffffffffffffffffffffffffff16141561334a576130e3600160095461361490919063ffffffff16565b6009819055506008848154811015156130f857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868680600101975081518110151561313857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060088481548110151561318357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160006008868154811015156131c457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff021916905560018201600090555050600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006132bb91906136c1565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061330691906136e2565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555b838060010194505061304a565b600092505b600780549050831015613439578673ffffffffffffffffffffffffffffffffffffffff1660078481548110151561338f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561342c576007838154811015156133e657fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a6000815480929190600190039190505550613439565b828060010193505061335c565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156134d15780820151818401526020810190506134b6565b50505050905001935050505060405180910390a15b505050505050505050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816135429190613703565b91600052602060002090016000848490919290919250919061356592919061372f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a15050565b600c5481565b600080828401905083811015151561360a57fe5b8091505092915050565b600082821115151561362257fe5b818303905092915050565b8154818355818115116136545781836000526020600020918201910161365391906137af565b5b505050565b8154818355818115116136805781836000526020600020918201910161367f91906137af565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906136df91906137d4565b50565b508054600082559060005260206000209081019061370091906137af565b50565b81548183558181151161372a5781836000526020600020918201910161372991906137d4565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061377057803560ff191683800117855561379e565b8280016001018555821561379e579182015b8281111561379d578235825591602001919060010190613782565b5b5090506137ab91906137af565b5090565b6137d191905b808211156137cd5760008160009055506001016137b5565b5090565b90565b6137fd91905b808211156137f957600081816137f09190613800565b506001016137da565b5090565b90565b50805460018160011615610100020316600290046000825580601f106138265750613845565b601f01602090049060005260206000209081019061384491906137af565b5b505600a165627a7a72305820f5bbb127b52ce86c873faef85cff176563476a5e49a3d88eaa9a06a8f432c9080029` // DeployXDCValidator deploys a new Ethereum contract, binding an instance of XDCValidator to it. func DeployXDCValidator(auth *bind.TransactOpts, backend bind.ContractBackend, _candidates []common.Address, _caps []*big.Int, _firstOwner common.Address, _minCandidateCap *big.Int, _minVoterCap *big.Int, _maxValidatorNumber *big.Int, _candidateWithdrawDelay *big.Int, _voterWithdrawDelay *big.Int) (common.Address, *types.Transaction, *XDCValidator, error) { @@ -436,32 +597,6 @@ func (_XDCValidator *XDCValidatorCallerSession) GetOwnerCount() (*big.Int, error return _XDCValidator.Contract.GetOwnerCount(&_XDCValidator.CallOpts) } -// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. -// -// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCaller) GetOwnerToCandidateLength(opts *bind.CallOpts, _address common.Address) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "getOwnerToCandidateLength", _address) - return *ret0, err -} - -// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. -// -// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) -func (_XDCValidator *XDCValidatorSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { - return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) -} - -// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. -// -// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCallerSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { - return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) -} - // GetVoterCap is a free data retrieval call binding the contract method 0x302b6872. // // Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256) @@ -592,32 +727,6 @@ func (_XDCValidator *XDCValidatorCallerSession) HasVotedInvalid(arg0 common.Addr return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) } -// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. -// -// Solidity: function invalidCandidate( address) constant returns(bool) -func (_XDCValidator *XDCValidatorCaller) InvalidCandidate(opts *bind.CallOpts, arg0 common.Address) (bool, error) { - var ( - ret0 = new(bool) - ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "invalidCandidate", arg0) - return *ret0, err -} - -// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. -// -// Solidity: function invalidCandidate( address) constant returns(bool) -func (_XDCValidator *XDCValidatorSession) InvalidCandidate(arg0 common.Address) (bool, error) { - return _XDCValidator.Contract.InvalidCandidate(&_XDCValidator.CallOpts, arg0) -} - -// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. -// -// Solidity: function invalidCandidate( address) constant returns(bool) -func (_XDCValidator *XDCValidatorCallerSession) InvalidCandidate(arg0 common.Address) (bool, error) { - return _XDCValidator.Contract.InvalidCandidate(&_XDCValidator.CallOpts, arg0) -} - // InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. // // Solidity: function invalidKYCCount( address) constant returns(uint256) @@ -644,56 +753,30 @@ func (_XDCValidator *XDCValidatorCallerSession) InvalidKYCCount(arg0 common.Addr return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0) } -// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. -// -// Solidity: function invalidOwner( address) constant returns(bool) -func (_XDCValidator *XDCValidatorCaller) InvalidOwner(opts *bind.CallOpts, arg0 common.Address) (bool, error) { - var ( - ret0 = new(bool) - ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "invalidOwner", arg0) - return *ret0, err -} - -// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. -// -// Solidity: function invalidOwner( address) constant returns(bool) -func (_XDCValidator *XDCValidatorSession) InvalidOwner(arg0 common.Address) (bool, error) { - return _XDCValidator.Contract.InvalidOwner(&_XDCValidator.CallOpts, arg0) -} - -// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. -// -// Solidity: function invalidOwner( address) constant returns(bool) -func (_XDCValidator *XDCValidatorCallerSession) InvalidOwner(arg0 common.Address) (bool, error) { - return _XDCValidator.Contract.InvalidOwner(&_XDCValidator.CallOpts, arg0) -} - // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_owner address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _owner common.Address) (*big.Int, error) { +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _invalidCandidate common.Address) (*big.Int, error) { var ( ret0 = new(*big.Int) ) out := ret0 - err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _owner) + err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _invalidCandidate) return *ret0, err } // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_owner address) constant returns(uint256) -func (_XDCValidator *XDCValidatorSession) InvalidPercent(_owner common.Address) (*big.Int, error) { - return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _owner) +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) } // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_owner address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_owner common.Address) (*big.Int, error) { - return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _owner) +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) } // IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. @@ -722,36 +805,6 @@ func (_XDCValidator *XDCValidatorCallerSession) IsCandidate(_candidate common.Ad return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate) } -// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. -// -// Solidity: function isOwner(owner address) constant returns(bool, uint256) -func (_XDCValidator *XDCValidatorCaller) IsOwner(opts *bind.CallOpts, owner common.Address) (bool, *big.Int, error) { - var ( - ret0 = new(bool) - ret1 = new(*big.Int) - ) - out := &[]interface{}{ - ret0, - ret1, - } - err := _XDCValidator.contract.Call(opts, out, "isOwner", owner) - return *ret0, *ret1, err -} - -// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. -// -// Solidity: function isOwner(owner address) constant returns(bool, uint256) -func (_XDCValidator *XDCValidatorSession) IsOwner(owner common.Address) (bool, *big.Int, error) { - return _XDCValidator.Contract.IsOwner(&_XDCValidator.CallOpts, owner) -} - -// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. -// -// Solidity: function isOwner(owner address) constant returns(bool, uint256) -func (_XDCValidator *XDCValidatorCallerSession) IsOwner(owner common.Address) (bool, *big.Int, error) { - return _XDCValidator.Contract.IsOwner(&_XDCValidator.CallOpts, owner) -} - // MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. // // Solidity: function maxValidatorNumber() constant returns(uint256) @@ -908,82 +961,6 @@ func (_XDCValidator *XDCValidatorCallerSession) Owners(arg0 *big.Int) (common.Ad return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0) } -// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. -// -// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) -func (_XDCValidator *XDCValidatorCaller) PendingKYC(opts *bind.CallOpts, arg0 common.Address) (struct { - BlockNumber *big.Int - KycHash string -}, error) { - ret := new(struct { - BlockNumber *big.Int - KycHash string - }) - out := ret - err := _XDCValidator.contract.Call(opts, out, "pendingKYC", arg0) - return *ret, err -} - -// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. -// -// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) -func (_XDCValidator *XDCValidatorSession) PendingKYC(arg0 common.Address) (struct { - BlockNumber *big.Int - KycHash string -}, error) { - return _XDCValidator.Contract.PendingKYC(&_XDCValidator.CallOpts, arg0) -} - -// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. -// -// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) -func (_XDCValidator *XDCValidatorCallerSession) PendingKYC(arg0 common.Address) (struct { - BlockNumber *big.Int - KycHash string -}, error) { - return _XDCValidator.Contract.PendingKYC(&_XDCValidator.CallOpts, arg0) -} - -// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. -// -// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) -func (_XDCValidator *XDCValidatorCaller) ValidatorsState(opts *bind.CallOpts, arg0 common.Address) (struct { - Owner common.Address - IsCandidate bool - Cap *big.Int -}, error) { - ret := new(struct { - Owner common.Address - IsCandidate bool - Cap *big.Int - }) - out := ret - err := _XDCValidator.contract.Call(opts, out, "validatorsState", arg0) - return *ret, err -} - -// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. -// -// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) -func (_XDCValidator *XDCValidatorSession) ValidatorsState(arg0 common.Address) (struct { - Owner common.Address - IsCandidate bool - Cap *big.Int -}, error) { - return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) -} - -// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. -// -// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) -func (_XDCValidator *XDCValidatorCallerSession) ValidatorsState(arg0 common.Address) (struct { - Owner common.Address - IsCandidate bool - Cap *big.Int -}, error) { - return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) -} - // VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e. // // Solidity: function voterWithdrawDelay() constant returns(uint256) @@ -1010,53 +987,6 @@ func (_XDCValidator *XDCValidatorCallerSession) VoterWithdrawDelay() (*big.Int, return _XDCValidator.Contract.VoterWithdrawDelay(&_XDCValidator.CallOpts) } -// Voters is a free data retrieval call binding the contract method 0x5c134d66. -// -// Solidity: function voters( address, uint256) constant returns(address) -func (_XDCValidator *XDCValidatorCaller) Voters(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "voters", arg0, arg1) - return *ret0, err -} - -// Voters is a free data retrieval call binding the contract method 0x5c134d66. -// -// Solidity: function voters( address, uint256) constant returns(address) -func (_XDCValidator *XDCValidatorSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { - return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) -} - -// Voters is a free data retrieval call binding the contract method 0x5c134d66. -// -// Solidity: function voters( address, uint256) constant returns(address) -func (_XDCValidator *XDCValidatorCallerSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { - return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) -} - -// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. -// -// Solidity: function claimKYC() returns() -func (_XDCValidator *XDCValidatorTransactor) ClaimKYC(opts *bind.TransactOpts) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "claimKYC") -} - -// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. -// -// Solidity: function claimKYC() returns() -func (_XDCValidator *XDCValidatorSession) ClaimKYC() (*types.Transaction, error) { - return _XDCValidator.Contract.ClaimKYC(&_XDCValidator.TransactOpts) -} - -// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. -// -// Solidity: function claimKYC() returns() -func (_XDCValidator *XDCValidatorTransactorSession) ClaimKYC() (*types.Transaction, error) { - return _XDCValidator.Contract.ClaimKYC(&_XDCValidator.TransactOpts) -} - // Propose is a paid mutator transaction binding the contract method 0x01267951. // // Solidity: function propose(_candidate address) returns() @@ -1078,48 +1008,6 @@ func (_XDCValidator *XDCValidatorTransactorSession) Propose(_candidate common.Ad return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate) } -// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. -// -// Solidity: function removeCandidatesZeroAddresses() returns() -func (_XDCValidator *XDCValidatorTransactor) RemoveCandidatesZeroAddresses(opts *bind.TransactOpts) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "removeCandidatesZeroAddresses") -} - -// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. -// -// Solidity: function removeCandidatesZeroAddresses() returns() -func (_XDCValidator *XDCValidatorSession) RemoveCandidatesZeroAddresses() (*types.Transaction, error) { - return _XDCValidator.Contract.RemoveCandidatesZeroAddresses(&_XDCValidator.TransactOpts) -} - -// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. -// -// Solidity: function removeCandidatesZeroAddresses() returns() -func (_XDCValidator *XDCValidatorTransactorSession) RemoveCandidatesZeroAddresses() (*types.Transaction, error) { - return _XDCValidator.Contract.RemoveCandidatesZeroAddresses(&_XDCValidator.TransactOpts) -} - -// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. -// -// Solidity: function removeOwnersZeroAddresses() returns() -func (_XDCValidator *XDCValidatorTransactor) RemoveOwnersZeroAddresses(opts *bind.TransactOpts) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "removeOwnersZeroAddresses") -} - -// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. -// -// Solidity: function removeOwnersZeroAddresses() returns() -func (_XDCValidator *XDCValidatorSession) RemoveOwnersZeroAddresses() (*types.Transaction, error) { - return _XDCValidator.Contract.RemoveOwnersZeroAddresses(&_XDCValidator.TransactOpts) -} - -// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. -// -// Solidity: function removeOwnersZeroAddresses() returns() -func (_XDCValidator *XDCValidatorTransactorSession) RemoveOwnersZeroAddresses() (*types.Transaction, error) { - return _XDCValidator.Contract.RemoveOwnersZeroAddresses(&_XDCValidator.TransactOpts) -} - // Resign is a paid mutator transaction binding the contract method 0xae6e43f5. // // Solidity: function resign(_candidate address) returns() @@ -1206,23 +1094,23 @@ func (_XDCValidator *XDCValidatorTransactorSession) Vote(_candidate common.Addre // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_owner address) returns() -func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _owner common.Address) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _owner) +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _invalidCandidate) } // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_owner address) returns() -func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_owner common.Address) (*types.Transaction, error) { - return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _owner) +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) } // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_owner address) returns() -func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_owner common.Address) (*types.Transaction, error) { - return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _owner) +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) } // Withdraw is a paid mutator transaction binding the contract method 0x441a3e70. diff --git a/contracts/validator/src/README.md b/contracts/validator/src/README.md index 984e1cad6165..3874dd7e51f5 100644 --- a/contracts/validator/src/README.md +++ b/contracts/validator/src/README.md @@ -40,7 +40,7 @@ node scripts/deployToGenesis.js If you don't have `abigen`, compile it. It's in `cmd/abigen/main.go` in XDC main repo (or Geth repo). -3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDPoSChain"` +3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDC-Subnet"` ## Deploy contract to node any block diff --git a/contracts/validator/src/abi b/contracts/validator/src/abi index a41ab3ed2fa7..ecd07cc0e4bc 100644 --- a/contracts/validator/src/abi +++ b/contracts/validator/src/abi @@ -64,29 +64,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": false, - "inputs": [], - "name": "removeCandidatesZeroAddresses", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "ownerCount", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [ @@ -135,16 +112,16 @@ { "name": "", "type": "address" + }, + { + "name": "", + "type": "uint256" } ], - "name": "pendingKYC", + "name": "kycString", "outputs": [ { - "name": "blockNumber", - "type": "uint256" - }, - { - "name": "kycHash", + "name": "", "type": "string" } ], @@ -194,29 +171,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "name": "owner", - "type": "address" - } - ], - "name": "isOwner", - "outputs": [ - { - "name": "", - "type": "bool" - }, - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [], @@ -337,6 +291,34 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [], + "name": "minCandidateNum", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getGrandMasters", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [ @@ -360,7 +342,26 @@ "constant": true, "inputs": [ { - "name": "_owner", + "name": "", + "type": "address" + } + ], + "name": "grandMasterMap", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_invalidCandidate", "type": "address" } ], @@ -387,11 +388,11 @@ "type": "uint256" } ], - "name": "KYCString", + "name": "voters", "outputs": [ { "name": "", - "type": "string" + "type": "address" } ], "payable": false, @@ -401,16 +402,12 @@ { "constant": true, "inputs": [ - { - "name": "", - "type": "address" - }, { "name": "", "type": "uint256" } ], - "name": "voters", + "name": "grandMasters", "outputs": [ { "name": "", @@ -440,15 +437,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": false, - "inputs": [], - "name": "removeOwnersZeroAddresses", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": false, "inputs": [ @@ -482,15 +470,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": false, - "inputs": [], - "name": "claimKYC", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": true, "inputs": [], @@ -533,25 +512,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "name": "", - "type": "address" - } - ], - "name": "invalidCandidate", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [ @@ -651,25 +611,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "name": "", - "type": "address" - } - ], - "name": "invalidOwner", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [], @@ -688,7 +629,7 @@ "constant": false, "inputs": [ { - "name": "_owner", + "name": "_invalidCandidate", "type": "address" } ], @@ -759,6 +700,14 @@ { "name": "_voterWithdrawDelay", "type": "uint256" + }, + { + "name": "_grandMasters", + "type": "address[]" + }, + { + "name": "_minCandidateNum", + "type": "uint256" } ], "payable": false, diff --git a/contracts/validator/src/bytecode b/contracts/validator/src/bytecode index 78b97c66212f..814d09efc0be 100644 --- a/contracts/validator/src/bytecode +++ b/contracts/validator/src/bytecode @@ -1 +1 @@ -0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058208aa2ea0f8e87fc68507f275418a407fa4ee47253861d6f224fda4db207eaf2110029 \ No newline at end of file +0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029 \ No newline at end of file From 4297a922a8856ebfbc0735546150c918de1f30ea Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:55:04 +0400 Subject: [PATCH 062/144] update to v2 --- .../{ => contract_v2}/src/.env.sample | 0 .../{ => contract_v2}/src/.gitignore | 0 .../{ => contract_v2}/src/.prettierignore | 0 .../{ => contract_v2}/src/.prettierrc | 0 .../{ => contract_v2}/src/.solhint.json | 0 .../{ => contract_v2}/src/.solhintignore | 0 .../validator/{ => contract_v2}/src/README.md | 4 +- contracts/validator/{ => contract_v2}/src/abi | 0 .../validator/{ => contract_v2}/src/bytecode | 0 .../src/contracts/XDCValidator.sol | 0 .../src/contracts/libraries/SafeMath.sol | 0 .../{ => contract_v2}/src/deployment.json | 0 .../{ => contract_v2}/src/hardhat.config.js | 0 .../validator/{ => contract_v2}/src/image.png | Bin .../{ => contract_v2}/src/package.json | 0 .../@ethersproject+address+5.7.0.patch | 0 .../@ethersproject+providers+5.7.2.patch | 0 .../src/scripts/deployToGenesis.js | 0 .../src/scripts/deployment.js | 0 .../src/test/xdcValidator.js | 0 contracts/validator/contract_v2/validator.go | 2009 +++++++++++++++++ 21 files changed, 2011 insertions(+), 2 deletions(-) rename contracts/validator/{ => contract_v2}/src/.env.sample (100%) rename contracts/validator/{ => contract_v2}/src/.gitignore (100%) rename contracts/validator/{ => contract_v2}/src/.prettierignore (100%) rename contracts/validator/{ => contract_v2}/src/.prettierrc (100%) rename contracts/validator/{ => contract_v2}/src/.solhint.json (100%) rename contracts/validator/{ => contract_v2}/src/.solhintignore (100%) rename contracts/validator/{ => contract_v2}/src/README.md (93%) rename contracts/validator/{ => contract_v2}/src/abi (100%) rename contracts/validator/{ => contract_v2}/src/bytecode (100%) rename contracts/validator/{ => contract_v2}/src/contracts/XDCValidator.sol (100%) rename contracts/validator/{ => contract_v2}/src/contracts/libraries/SafeMath.sol (100%) rename contracts/validator/{ => contract_v2}/src/deployment.json (100%) rename contracts/validator/{ => contract_v2}/src/hardhat.config.js (100%) rename contracts/validator/{ => contract_v2}/src/image.png (100%) rename contracts/validator/{ => contract_v2}/src/package.json (100%) rename contracts/validator/{ => contract_v2}/src/patches/@ethersproject+address+5.7.0.patch (100%) rename contracts/validator/{ => contract_v2}/src/patches/@ethersproject+providers+5.7.2.patch (100%) rename contracts/validator/{ => contract_v2}/src/scripts/deployToGenesis.js (100%) rename contracts/validator/{ => contract_v2}/src/scripts/deployment.js (100%) rename contracts/validator/{ => contract_v2}/src/test/xdcValidator.js (100%) create mode 100644 contracts/validator/contract_v2/validator.go diff --git a/contracts/validator/src/.env.sample b/contracts/validator/contract_v2/src/.env.sample similarity index 100% rename from contracts/validator/src/.env.sample rename to contracts/validator/contract_v2/src/.env.sample diff --git a/contracts/validator/src/.gitignore b/contracts/validator/contract_v2/src/.gitignore similarity index 100% rename from contracts/validator/src/.gitignore rename to contracts/validator/contract_v2/src/.gitignore diff --git a/contracts/validator/src/.prettierignore b/contracts/validator/contract_v2/src/.prettierignore similarity index 100% rename from contracts/validator/src/.prettierignore rename to contracts/validator/contract_v2/src/.prettierignore diff --git a/contracts/validator/src/.prettierrc b/contracts/validator/contract_v2/src/.prettierrc similarity index 100% rename from contracts/validator/src/.prettierrc rename to contracts/validator/contract_v2/src/.prettierrc diff --git a/contracts/validator/src/.solhint.json b/contracts/validator/contract_v2/src/.solhint.json similarity index 100% rename from contracts/validator/src/.solhint.json rename to contracts/validator/contract_v2/src/.solhint.json diff --git a/contracts/validator/src/.solhintignore b/contracts/validator/contract_v2/src/.solhintignore similarity index 100% rename from contracts/validator/src/.solhintignore rename to contracts/validator/contract_v2/src/.solhintignore diff --git a/contracts/validator/src/README.md b/contracts/validator/contract_v2/src/README.md similarity index 93% rename from contracts/validator/src/README.md rename to contracts/validator/contract_v2/src/README.md index 3874dd7e51f5..e4a96cf27de9 100644 --- a/contracts/validator/src/README.md +++ b/contracts/validator/contract_v2/src/README.md @@ -35,12 +35,12 @@ node scripts/deployToGenesis.js 2. run ```shell -./abigen --abi abi --bin bytecode --pkg contract --type XDCValidator --out ../contract/validator.go +./abigen --abi abi --bin bytecode --pkg contract --type XDCValidator --out ../validator.go ``` If you don't have `abigen`, compile it. It's in `cmd/abigen/main.go` in XDC main repo (or Geth repo). -3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDC-Subnet"` +3. Go `../validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDPoSChain"` ## Deploy contract to node any block diff --git a/contracts/validator/src/abi b/contracts/validator/contract_v2/src/abi similarity index 100% rename from contracts/validator/src/abi rename to contracts/validator/contract_v2/src/abi diff --git a/contracts/validator/src/bytecode b/contracts/validator/contract_v2/src/bytecode similarity index 100% rename from contracts/validator/src/bytecode rename to contracts/validator/contract_v2/src/bytecode diff --git a/contracts/validator/src/contracts/XDCValidator.sol b/contracts/validator/contract_v2/src/contracts/XDCValidator.sol similarity index 100% rename from contracts/validator/src/contracts/XDCValidator.sol rename to contracts/validator/contract_v2/src/contracts/XDCValidator.sol diff --git a/contracts/validator/src/contracts/libraries/SafeMath.sol b/contracts/validator/contract_v2/src/contracts/libraries/SafeMath.sol similarity index 100% rename from contracts/validator/src/contracts/libraries/SafeMath.sol rename to contracts/validator/contract_v2/src/contracts/libraries/SafeMath.sol diff --git a/contracts/validator/src/deployment.json b/contracts/validator/contract_v2/src/deployment.json similarity index 100% rename from contracts/validator/src/deployment.json rename to contracts/validator/contract_v2/src/deployment.json diff --git a/contracts/validator/src/hardhat.config.js b/contracts/validator/contract_v2/src/hardhat.config.js similarity index 100% rename from contracts/validator/src/hardhat.config.js rename to contracts/validator/contract_v2/src/hardhat.config.js diff --git a/contracts/validator/src/image.png b/contracts/validator/contract_v2/src/image.png similarity index 100% rename from contracts/validator/src/image.png rename to contracts/validator/contract_v2/src/image.png diff --git a/contracts/validator/src/package.json b/contracts/validator/contract_v2/src/package.json similarity index 100% rename from contracts/validator/src/package.json rename to contracts/validator/contract_v2/src/package.json diff --git a/contracts/validator/src/patches/@ethersproject+address+5.7.0.patch b/contracts/validator/contract_v2/src/patches/@ethersproject+address+5.7.0.patch similarity index 100% rename from contracts/validator/src/patches/@ethersproject+address+5.7.0.patch rename to contracts/validator/contract_v2/src/patches/@ethersproject+address+5.7.0.patch diff --git a/contracts/validator/src/patches/@ethersproject+providers+5.7.2.patch b/contracts/validator/contract_v2/src/patches/@ethersproject+providers+5.7.2.patch similarity index 100% rename from contracts/validator/src/patches/@ethersproject+providers+5.7.2.patch rename to contracts/validator/contract_v2/src/patches/@ethersproject+providers+5.7.2.patch diff --git a/contracts/validator/src/scripts/deployToGenesis.js b/contracts/validator/contract_v2/src/scripts/deployToGenesis.js similarity index 100% rename from contracts/validator/src/scripts/deployToGenesis.js rename to contracts/validator/contract_v2/src/scripts/deployToGenesis.js diff --git a/contracts/validator/src/scripts/deployment.js b/contracts/validator/contract_v2/src/scripts/deployment.js similarity index 100% rename from contracts/validator/src/scripts/deployment.js rename to contracts/validator/contract_v2/src/scripts/deployment.js diff --git a/contracts/validator/src/test/xdcValidator.js b/contracts/validator/contract_v2/src/test/xdcValidator.js similarity index 100% rename from contracts/validator/src/test/xdcValidator.js rename to contracts/validator/contract_v2/src/test/xdcValidator.js diff --git a/contracts/validator/contract_v2/validator.go b/contracts/validator/contract_v2/validator.go new file mode 100644 index 000000000000..5210f6805762 --- /dev/null +++ b/contracts/validator/contract_v2/validator.go @@ -0,0 +1,2009 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "math/big" + "strings" + + "github.com/XinFinOrg/XDPoSChain/accounts/abi" + "github.com/XinFinOrg/XDPoSChain/accounts/abi/bind" + "github.com/XinFinOrg/XDPoSChain/common" + "github.com/XinFinOrg/XDPoSChain/core/types" + "github.com/XinFinOrg/XDPoSChain/event" + ethereum "github.com/XinFinOrg/XDPoSChain" +) + +// XDCValidatorABI is the input ABI used to generate the binding from. +const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kycString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"validatorsState\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"isCandidate\",\"type\":\"bool\"},{\"name\":\"cap\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateNum\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getGrandMasters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"grandMasterMap\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"voters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"grandMasters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getOwnerToCandidateLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_grandMasters\",\"type\":\"address[]\"},{\"name\":\"_minCandidateNum\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" + +// XDCValidatorBin is the compiled bytecode used for deploying new contracts. +const XDCValidatorBin = `0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029` + +// DeployXDCValidator deploys a new Ethereum contract, binding an instance of XDCValidator to it. +func DeployXDCValidator(auth *bind.TransactOpts, backend bind.ContractBackend, _candidates []common.Address, _caps []*big.Int, _firstOwner common.Address, _minCandidateCap *big.Int, _minVoterCap *big.Int, _maxValidatorNumber *big.Int, _candidateWithdrawDelay *big.Int, _voterWithdrawDelay *big.Int, _grandMasters []common.Address, _minCandidateNum *big.Int) (common.Address, *types.Transaction, *XDCValidator, error) { + parsed, err := abi.JSON(strings.NewReader(XDCValidatorABI)) + if err != nil { + return common.Address{}, nil, nil, err + } + address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(XDCValidatorBin), backend, _candidates, _caps, _firstOwner, _minCandidateCap, _minVoterCap, _maxValidatorNumber, _candidateWithdrawDelay, _voterWithdrawDelay, _grandMasters, _minCandidateNum) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &XDCValidator{XDCValidatorCaller: XDCValidatorCaller{contract: contract}, XDCValidatorTransactor: XDCValidatorTransactor{contract: contract}, XDCValidatorFilterer: XDCValidatorFilterer{contract: contract}}, nil +} + +// XDCValidator is an auto generated Go binding around an Ethereum contract. +type XDCValidator struct { + XDCValidatorCaller // Read-only binding to the contract + XDCValidatorTransactor // Write-only binding to the contract + XDCValidatorFilterer // Log filterer for contract events +} + +// XDCValidatorCaller is an auto generated read-only Go binding around an Ethereum contract. +type XDCValidatorCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// XDCValidatorTransactor is an auto generated write-only Go binding around an Ethereum contract. +type XDCValidatorTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// XDCValidatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type XDCValidatorFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// XDCValidatorSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type XDCValidatorSession struct { + Contract *XDCValidator // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// XDCValidatorCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type XDCValidatorCallerSession struct { + Contract *XDCValidatorCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// XDCValidatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type XDCValidatorTransactorSession struct { + Contract *XDCValidatorTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// XDCValidatorRaw is an auto generated low-level Go binding around an Ethereum contract. +type XDCValidatorRaw struct { + Contract *XDCValidator // Generic contract binding to access the raw methods on +} + +// XDCValidatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type XDCValidatorCallerRaw struct { + Contract *XDCValidatorCaller // Generic read-only contract binding to access the raw methods on +} + +// XDCValidatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type XDCValidatorTransactorRaw struct { + Contract *XDCValidatorTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewXDCValidator creates a new instance of XDCValidator, bound to a specific deployed contract. +func NewXDCValidator(address common.Address, backend bind.ContractBackend) (*XDCValidator, error) { + contract, err := bindXDCValidator(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &XDCValidator{XDCValidatorCaller: XDCValidatorCaller{contract: contract}, XDCValidatorTransactor: XDCValidatorTransactor{contract: contract}, XDCValidatorFilterer: XDCValidatorFilterer{contract: contract}}, nil +} + +// NewXDCValidatorCaller creates a new read-only instance of XDCValidator, bound to a specific deployed contract. +func NewXDCValidatorCaller(address common.Address, caller bind.ContractCaller) (*XDCValidatorCaller, error) { + contract, err := bindXDCValidator(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &XDCValidatorCaller{contract: contract}, nil +} + +// NewXDCValidatorTransactor creates a new write-only instance of XDCValidator, bound to a specific deployed contract. +func NewXDCValidatorTransactor(address common.Address, transactor bind.ContractTransactor) (*XDCValidatorTransactor, error) { + contract, err := bindXDCValidator(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &XDCValidatorTransactor{contract: contract}, nil +} + +// NewXDCValidatorFilterer creates a new log filterer instance of XDCValidator, bound to a specific deployed contract. +func NewXDCValidatorFilterer(address common.Address, filterer bind.ContractFilterer) (*XDCValidatorFilterer, error) { + contract, err := bindXDCValidator(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &XDCValidatorFilterer{contract: contract}, nil +} + +// bindXDCValidator binds a generic wrapper to an already deployed contract. +func bindXDCValidator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(XDCValidatorABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_XDCValidator *XDCValidatorRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _XDCValidator.Contract.XDCValidatorCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_XDCValidator *XDCValidatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.Contract.XDCValidatorTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_XDCValidator *XDCValidatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _XDCValidator.Contract.XDCValidatorTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_XDCValidator *XDCValidatorCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _XDCValidator.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_XDCValidator *XDCValidatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_XDCValidator *XDCValidatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _XDCValidator.Contract.contract.Transact(opts, method, params...) +} + +// CandidateCount is a free data retrieval call binding the contract method 0xa9a981a3. +// +// Solidity: function candidateCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) CandidateCount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "candidateCount") + return *ret0, err +} + +// CandidateCount is a free data retrieval call binding the contract method 0xa9a981a3. +// +// Solidity: function candidateCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) CandidateCount() (*big.Int, error) { + return _XDCValidator.Contract.CandidateCount(&_XDCValidator.CallOpts) +} + +// CandidateCount is a free data retrieval call binding the contract method 0xa9a981a3. +// +// Solidity: function candidateCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) CandidateCount() (*big.Int, error) { + return _XDCValidator.Contract.CandidateCount(&_XDCValidator.CallOpts) +} + +// CandidateWithdrawDelay is a free data retrieval call binding the contract method 0xd161c767. +// +// Solidity: function candidateWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) CandidateWithdrawDelay(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "candidateWithdrawDelay") + return *ret0, err +} + +// CandidateWithdrawDelay is a free data retrieval call binding the contract method 0xd161c767. +// +// Solidity: function candidateWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) CandidateWithdrawDelay() (*big.Int, error) { + return _XDCValidator.Contract.CandidateWithdrawDelay(&_XDCValidator.CallOpts) +} + +// CandidateWithdrawDelay is a free data retrieval call binding the contract method 0xd161c767. +// +// Solidity: function candidateWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) CandidateWithdrawDelay() (*big.Int, error) { + return _XDCValidator.Contract.CandidateWithdrawDelay(&_XDCValidator.CallOpts) +} + +// Candidates is a free data retrieval call binding the contract method 0x3477ee2e. +// +// Solidity: function candidates( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) Candidates(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "candidates", arg0) + return *ret0, err +} + +// Candidates is a free data retrieval call binding the contract method 0x3477ee2e. +// +// Solidity: function candidates( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) Candidates(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Candidates(&_XDCValidator.CallOpts, arg0) +} + +// Candidates is a free data retrieval call binding the contract method 0x3477ee2e. +// +// Solidity: function candidates( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) Candidates(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Candidates(&_XDCValidator.CallOpts, arg0) +} + +// GetCandidateCap is a free data retrieval call binding the contract method 0x58e7525f. +// +// Solidity: function getCandidateCap(_candidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetCandidateCap(opts *bind.CallOpts, _candidate common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getCandidateCap", _candidate) + return *ret0, err +} + +// GetCandidateCap is a free data retrieval call binding the contract method 0x58e7525f. +// +// Solidity: function getCandidateCap(_candidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetCandidateCap(_candidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetCandidateCap(&_XDCValidator.CallOpts, _candidate) +} + +// GetCandidateCap is a free data retrieval call binding the contract method 0x58e7525f. +// +// Solidity: function getCandidateCap(_candidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetCandidateCap(_candidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetCandidateCap(&_XDCValidator.CallOpts, _candidate) +} + +// GetCandidateOwner is a free data retrieval call binding the contract method 0xb642facd. +// +// Solidity: function getCandidateOwner(_candidate address) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) GetCandidateOwner(opts *bind.CallOpts, _candidate common.Address) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getCandidateOwner", _candidate) + return *ret0, err +} + +// GetCandidateOwner is a free data retrieval call binding the contract method 0xb642facd. +// +// Solidity: function getCandidateOwner(_candidate address) constant returns(address) +func (_XDCValidator *XDCValidatorSession) GetCandidateOwner(_candidate common.Address) (common.Address, error) { + return _XDCValidator.Contract.GetCandidateOwner(&_XDCValidator.CallOpts, _candidate) +} + +// GetCandidateOwner is a free data retrieval call binding the contract method 0xb642facd. +// +// Solidity: function getCandidateOwner(_candidate address) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) GetCandidateOwner(_candidate common.Address) (common.Address, error) { + return _XDCValidator.Contract.GetCandidateOwner(&_XDCValidator.CallOpts, _candidate) +} + +// GetCandidates is a free data retrieval call binding the contract method 0x06a49fce. +// +// Solidity: function getCandidates() constant returns(address[]) +func (_XDCValidator *XDCValidatorCaller) GetCandidates(opts *bind.CallOpts) ([]common.Address, error) { + var ( + ret0 = new([]common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getCandidates") + return *ret0, err +} + +// GetCandidates is a free data retrieval call binding the contract method 0x06a49fce. +// +// Solidity: function getCandidates() constant returns(address[]) +func (_XDCValidator *XDCValidatorSession) GetCandidates() ([]common.Address, error) { + return _XDCValidator.Contract.GetCandidates(&_XDCValidator.CallOpts) +} + +// GetCandidates is a free data retrieval call binding the contract method 0x06a49fce. +// +// Solidity: function getCandidates() constant returns(address[]) +func (_XDCValidator *XDCValidatorCallerSession) GetCandidates() ([]common.Address, error) { + return _XDCValidator.Contract.GetCandidates(&_XDCValidator.CallOpts) +} + +// GetGrandMasters is a free data retrieval call binding the contract method 0x52b3ed16. +// +// Solidity: function getGrandMasters() constant returns(address[]) +func (_XDCValidator *XDCValidatorCaller) GetGrandMasters(opts *bind.CallOpts) ([]common.Address, error) { + var ( + ret0 = new([]common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getGrandMasters") + return *ret0, err +} + +// GetGrandMasters is a free data retrieval call binding the contract method 0x52b3ed16. +// +// Solidity: function getGrandMasters() constant returns(address[]) +func (_XDCValidator *XDCValidatorSession) GetGrandMasters() ([]common.Address, error) { + return _XDCValidator.Contract.GetGrandMasters(&_XDCValidator.CallOpts) +} + +// GetGrandMasters is a free data retrieval call binding the contract method 0x52b3ed16. +// +// Solidity: function getGrandMasters() constant returns(address[]) +func (_XDCValidator *XDCValidatorCallerSession) GetGrandMasters() ([]common.Address, error) { + return _XDCValidator.Contract.GetGrandMasters(&_XDCValidator.CallOpts) +} + +// GetHashCount is a free data retrieval call binding the contract method 0xc45607df. +// +// Solidity: function getHashCount(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetHashCount(opts *bind.CallOpts, _address common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getHashCount", _address) + return *ret0, err +} + +// GetHashCount is a free data retrieval call binding the contract method 0xc45607df. +// +// Solidity: function getHashCount(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetHashCount(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetHashCount(&_XDCValidator.CallOpts, _address) +} + +// GetHashCount is a free data retrieval call binding the contract method 0xc45607df. +// +// Solidity: function getHashCount(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetHashCount(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetHashCount(&_XDCValidator.CallOpts, _address) +} + +// GetLatestKYC is a free data retrieval call binding the contract method 0x32658652. +// +// Solidity: function getLatestKYC(_address address) constant returns(string) +func (_XDCValidator *XDCValidatorCaller) GetLatestKYC(opts *bind.CallOpts, _address common.Address) (string, error) { + var ( + ret0 = new(string) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getLatestKYC", _address) + return *ret0, err +} + +// GetLatestKYC is a free data retrieval call binding the contract method 0x32658652. +// +// Solidity: function getLatestKYC(_address address) constant returns(string) +func (_XDCValidator *XDCValidatorSession) GetLatestKYC(_address common.Address) (string, error) { + return _XDCValidator.Contract.GetLatestKYC(&_XDCValidator.CallOpts, _address) +} + +// GetLatestKYC is a free data retrieval call binding the contract method 0x32658652. +// +// Solidity: function getLatestKYC(_address address) constant returns(string) +func (_XDCValidator *XDCValidatorCallerSession) GetLatestKYC(_address common.Address) (string, error) { + return _XDCValidator.Contract.GetLatestKYC(&_XDCValidator.CallOpts, _address) +} + +// GetOwnerCount is a free data retrieval call binding the contract method 0xef18374a. +// +// Solidity: function getOwnerCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetOwnerCount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getOwnerCount") + return *ret0, err +} + +// GetOwnerCount is a free data retrieval call binding the contract method 0xef18374a. +// +// Solidity: function getOwnerCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetOwnerCount() (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerCount(&_XDCValidator.CallOpts) +} + +// GetOwnerCount is a free data retrieval call binding the contract method 0xef18374a. +// +// Solidity: function getOwnerCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetOwnerCount() (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerCount(&_XDCValidator.CallOpts) +} + +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetOwnerToCandidateLength(opts *bind.CallOpts, _address common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getOwnerToCandidateLength", _address) + return *ret0, err +} + +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) +} + +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) +} + +// GetVoterCap is a free data retrieval call binding the contract method 0x302b6872. +// +// Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetVoterCap(opts *bind.CallOpts, _candidate common.Address, _voter common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getVoterCap", _candidate, _voter) + return *ret0, err +} + +// GetVoterCap is a free data retrieval call binding the contract method 0x302b6872. +// +// Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetVoterCap(_candidate common.Address, _voter common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetVoterCap(&_XDCValidator.CallOpts, _candidate, _voter) +} + +// GetVoterCap is a free data retrieval call binding the contract method 0x302b6872. +// +// Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetVoterCap(_candidate common.Address, _voter common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetVoterCap(&_XDCValidator.CallOpts, _candidate, _voter) +} + +// GetVoters is a free data retrieval call binding the contract method 0x2d15cc04. +// +// Solidity: function getVoters(_candidate address) constant returns(address[]) +func (_XDCValidator *XDCValidatorCaller) GetVoters(opts *bind.CallOpts, _candidate common.Address) ([]common.Address, error) { + var ( + ret0 = new([]common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getVoters", _candidate) + return *ret0, err +} + +// GetVoters is a free data retrieval call binding the contract method 0x2d15cc04. +// +// Solidity: function getVoters(_candidate address) constant returns(address[]) +func (_XDCValidator *XDCValidatorSession) GetVoters(_candidate common.Address) ([]common.Address, error) { + return _XDCValidator.Contract.GetVoters(&_XDCValidator.CallOpts, _candidate) +} + +// GetVoters is a free data retrieval call binding the contract method 0x2d15cc04. +// +// Solidity: function getVoters(_candidate address) constant returns(address[]) +func (_XDCValidator *XDCValidatorCallerSession) GetVoters(_candidate common.Address) ([]common.Address, error) { + return _XDCValidator.Contract.GetVoters(&_XDCValidator.CallOpts, _candidate) +} + +// GetWithdrawBlockNumbers is a free data retrieval call binding the contract method 0x2f9c4bba. +// +// Solidity: function getWithdrawBlockNumbers() constant returns(uint256[]) +func (_XDCValidator *XDCValidatorCaller) GetWithdrawBlockNumbers(opts *bind.CallOpts) ([]*big.Int, error) { + var ( + ret0 = new([]*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getWithdrawBlockNumbers") + return *ret0, err +} + +// GetWithdrawBlockNumbers is a free data retrieval call binding the contract method 0x2f9c4bba. +// +// Solidity: function getWithdrawBlockNumbers() constant returns(uint256[]) +func (_XDCValidator *XDCValidatorSession) GetWithdrawBlockNumbers() ([]*big.Int, error) { + return _XDCValidator.Contract.GetWithdrawBlockNumbers(&_XDCValidator.CallOpts) +} + +// GetWithdrawBlockNumbers is a free data retrieval call binding the contract method 0x2f9c4bba. +// +// Solidity: function getWithdrawBlockNumbers() constant returns(uint256[]) +func (_XDCValidator *XDCValidatorCallerSession) GetWithdrawBlockNumbers() ([]*big.Int, error) { + return _XDCValidator.Contract.GetWithdrawBlockNumbers(&_XDCValidator.CallOpts) +} + +// GetWithdrawCap is a free data retrieval call binding the contract method 0x15febd68. +// +// Solidity: function getWithdrawCap(_blockNumber uint256) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetWithdrawCap(opts *bind.CallOpts, _blockNumber *big.Int) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getWithdrawCap", _blockNumber) + return *ret0, err +} + +// GetWithdrawCap is a free data retrieval call binding the contract method 0x15febd68. +// +// Solidity: function getWithdrawCap(_blockNumber uint256) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetWithdrawCap(_blockNumber *big.Int) (*big.Int, error) { + return _XDCValidator.Contract.GetWithdrawCap(&_XDCValidator.CallOpts, _blockNumber) +} + +// GetWithdrawCap is a free data retrieval call binding the contract method 0x15febd68. +// +// Solidity: function getWithdrawCap(_blockNumber uint256) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetWithdrawCap(_blockNumber *big.Int) (*big.Int, error) { + return _XDCValidator.Contract.GetWithdrawCap(&_XDCValidator.CallOpts, _blockNumber) +} + +// GrandMasterMap is a free data retrieval call binding the contract method 0x5b6e3963. +// +// Solidity: function grandMasterMap( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) GrandMasterMap(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "grandMasterMap", arg0) + return *ret0, err +} + +// GrandMasterMap is a free data retrieval call binding the contract method 0x5b6e3963. +// +// Solidity: function grandMasterMap( address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) GrandMasterMap(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.GrandMasterMap(&_XDCValidator.CallOpts, arg0) +} + +// GrandMasterMap is a free data retrieval call binding the contract method 0x5b6e3963. +// +// Solidity: function grandMasterMap( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) GrandMasterMap(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.GrandMasterMap(&_XDCValidator.CallOpts, arg0) +} + +// GrandMasters is a free data retrieval call binding the contract method 0x6132cd83. +// +// Solidity: function grandMasters( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) GrandMasters(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "grandMasters", arg0) + return *ret0, err +} + +// GrandMasters is a free data retrieval call binding the contract method 0x6132cd83. +// +// Solidity: function grandMasters( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) GrandMasters(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.GrandMasters(&_XDCValidator.CallOpts, arg0) +} + +// GrandMasters is a free data retrieval call binding the contract method 0x6132cd83. +// +// Solidity: function grandMasters( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) GrandMasters(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.GrandMasters(&_XDCValidator.CallOpts, arg0) +} + +// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. +// +// Solidity: function hasVotedInvalid( address, address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) HasVotedInvalid(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "hasVotedInvalid", arg0, arg1) + return *ret0, err +} + +// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. +// +// Solidity: function hasVotedInvalid( address, address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) HasVotedInvalid(arg0 common.Address, arg1 common.Address) (bool, error) { + return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) +} + +// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. +// +// Solidity: function hasVotedInvalid( address, address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) HasVotedInvalid(arg0 common.Address, arg1 common.Address) (bool, error) { + return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) +} + +// InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. +// +// Solidity: function invalidKYCCount( address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) InvalidKYCCount(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "invalidKYCCount", arg0) + return *ret0, err +} + +// InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. +// +// Solidity: function invalidKYCCount( address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) InvalidKYCCount(arg0 common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0) +} + +// InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. +// +// Solidity: function invalidKYCCount( address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) InvalidKYCCount(arg0 common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0) +} + +// InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. +// +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _invalidCandidate common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _invalidCandidate) + return *ret0, err +} + +// InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. +// +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) +} + +// InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. +// +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) +} + +// IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. +// +// Solidity: function isCandidate(_candidate address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) IsCandidate(opts *bind.CallOpts, _candidate common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "isCandidate", _candidate) + return *ret0, err +} + +// IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. +// +// Solidity: function isCandidate(_candidate address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) IsCandidate(_candidate common.Address) (bool, error) { + return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate) +} + +// IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. +// +// Solidity: function isCandidate(_candidate address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) IsCandidate(_candidate common.Address) (bool, error) { + return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate) +} + +// KycString is a free data retrieval call binding the contract method 0x27a6296b. +// +// Solidity: function kycString( address, uint256) constant returns(string) +func (_XDCValidator *XDCValidatorCaller) KycString(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (string, error) { + var ( + ret0 = new(string) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "kycString", arg0, arg1) + return *ret0, err +} + +// KycString is a free data retrieval call binding the contract method 0x27a6296b. +// +// Solidity: function kycString( address, uint256) constant returns(string) +func (_XDCValidator *XDCValidatorSession) KycString(arg0 common.Address, arg1 *big.Int) (string, error) { + return _XDCValidator.Contract.KycString(&_XDCValidator.CallOpts, arg0, arg1) +} + +// KycString is a free data retrieval call binding the contract method 0x27a6296b. +// +// Solidity: function kycString( address, uint256) constant returns(string) +func (_XDCValidator *XDCValidatorCallerSession) KycString(arg0 common.Address, arg1 *big.Int) (string, error) { + return _XDCValidator.Contract.KycString(&_XDCValidator.CallOpts, arg0, arg1) +} + +// MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. +// +// Solidity: function maxValidatorNumber() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) MaxValidatorNumber(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "maxValidatorNumber") + return *ret0, err +} + +// MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. +// +// Solidity: function maxValidatorNumber() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) MaxValidatorNumber() (*big.Int, error) { + return _XDCValidator.Contract.MaxValidatorNumber(&_XDCValidator.CallOpts) +} + +// MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. +// +// Solidity: function maxValidatorNumber() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) MaxValidatorNumber() (*big.Int, error) { + return _XDCValidator.Contract.MaxValidatorNumber(&_XDCValidator.CallOpts) +} + +// MinCandidateCap is a free data retrieval call binding the contract method 0xd55b7dff. +// +// Solidity: function minCandidateCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) MinCandidateCap(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "minCandidateCap") + return *ret0, err +} + +// MinCandidateCap is a free data retrieval call binding the contract method 0xd55b7dff. +// +// Solidity: function minCandidateCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) MinCandidateCap() (*big.Int, error) { + return _XDCValidator.Contract.MinCandidateCap(&_XDCValidator.CallOpts) +} + +// MinCandidateCap is a free data retrieval call binding the contract method 0xd55b7dff. +// +// Solidity: function minCandidateCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) MinCandidateCap() (*big.Int, error) { + return _XDCValidator.Contract.MinCandidateCap(&_XDCValidator.CallOpts) +} + +// MinCandidateNum is a free data retrieval call binding the contract method 0x49e971be. +// +// Solidity: function minCandidateNum() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) MinCandidateNum(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "minCandidateNum") + return *ret0, err +} + +// MinCandidateNum is a free data retrieval call binding the contract method 0x49e971be. +// +// Solidity: function minCandidateNum() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) MinCandidateNum() (*big.Int, error) { + return _XDCValidator.Contract.MinCandidateNum(&_XDCValidator.CallOpts) +} + +// MinCandidateNum is a free data retrieval call binding the contract method 0x49e971be. +// +// Solidity: function minCandidateNum() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) MinCandidateNum() (*big.Int, error) { + return _XDCValidator.Contract.MinCandidateNum(&_XDCValidator.CallOpts) +} + +// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. +// +// Solidity: function minVoterCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) MinVoterCap(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "minVoterCap") + return *ret0, err +} + +// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. +// +// Solidity: function minVoterCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) MinVoterCap() (*big.Int, error) { + return _XDCValidator.Contract.MinVoterCap(&_XDCValidator.CallOpts) +} + +// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. +// +// Solidity: function minVoterCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) MinVoterCap() (*big.Int, error) { + return _XDCValidator.Contract.MinVoterCap(&_XDCValidator.CallOpts) +} + +// OwnerToCandidate is a free data retrieval call binding the contract method 0x2a3640b1. +// +// Solidity: function ownerToCandidate( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) OwnerToCandidate(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "ownerToCandidate", arg0, arg1) + return *ret0, err +} + +// OwnerToCandidate is a free data retrieval call binding the contract method 0x2a3640b1. +// +// Solidity: function ownerToCandidate( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) OwnerToCandidate(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.OwnerToCandidate(&_XDCValidator.CallOpts, arg0, arg1) +} + +// OwnerToCandidate is a free data retrieval call binding the contract method 0x2a3640b1. +// +// Solidity: function ownerToCandidate( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) OwnerToCandidate(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.OwnerToCandidate(&_XDCValidator.CallOpts, arg0, arg1) +} + +// Owners is a free data retrieval call binding the contract method 0x025e7c27. +// +// Solidity: function owners( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) Owners(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "owners", arg0) + return *ret0, err +} + +// Owners is a free data retrieval call binding the contract method 0x025e7c27. +// +// Solidity: function owners( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) Owners(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0) +} + +// Owners is a free data retrieval call binding the contract method 0x025e7c27. +// +// Solidity: function owners( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) Owners(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0) +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorCaller) ValidatorsState(opts *bind.CallOpts, arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + ret := new(struct { + Owner common.Address + IsCandidate bool + Cap *big.Int + }) + out := ret + err := _XDCValidator.contract.Call(opts, out, "validatorsState", arg0) + return *ret, err +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorSession) ValidatorsState(arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorCallerSession) ValidatorsState(arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) +} + +// VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e. +// +// Solidity: function voterWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) VoterWithdrawDelay(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "voterWithdrawDelay") + return *ret0, err +} + +// VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e. +// +// Solidity: function voterWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) VoterWithdrawDelay() (*big.Int, error) { + return _XDCValidator.Contract.VoterWithdrawDelay(&_XDCValidator.CallOpts) +} + +// VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e. +// +// Solidity: function voterWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) VoterWithdrawDelay() (*big.Int, error) { + return _XDCValidator.Contract.VoterWithdrawDelay(&_XDCValidator.CallOpts) +} + +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) Voters(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "voters", arg0, arg1) + return *ret0, err +} + +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) +} + +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) +} + +// Propose is a paid mutator transaction binding the contract method 0x01267951. +// +// Solidity: function propose(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactor) Propose(opts *bind.TransactOpts, _candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "propose", _candidate) +} + +// Propose is a paid mutator transaction binding the contract method 0x01267951. +// +// Solidity: function propose(_candidate address) returns() +func (_XDCValidator *XDCValidatorSession) Propose(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate) +} + +// Propose is a paid mutator transaction binding the contract method 0x01267951. +// +// Solidity: function propose(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) Propose(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate) +} + +// Resign is a paid mutator transaction binding the contract method 0xae6e43f5. +// +// Solidity: function resign(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactor) Resign(opts *bind.TransactOpts, _candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "resign", _candidate) +} + +// Resign is a paid mutator transaction binding the contract method 0xae6e43f5. +// +// Solidity: function resign(_candidate address) returns() +func (_XDCValidator *XDCValidatorSession) Resign(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Resign(&_XDCValidator.TransactOpts, _candidate) +} + +// Resign is a paid mutator transaction binding the contract method 0xae6e43f5. +// +// Solidity: function resign(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) Resign(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Resign(&_XDCValidator.TransactOpts, _candidate) +} + +// Unvote is a paid mutator transaction binding the contract method 0x02aa9be2. +// +// Solidity: function unvote(_candidate address, _cap uint256) returns() +func (_XDCValidator *XDCValidatorTransactor) Unvote(opts *bind.TransactOpts, _candidate common.Address, _cap *big.Int) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "unvote", _candidate, _cap) +} + +// Unvote is a paid mutator transaction binding the contract method 0x02aa9be2. +// +// Solidity: function unvote(_candidate address, _cap uint256) returns() +func (_XDCValidator *XDCValidatorSession) Unvote(_candidate common.Address, _cap *big.Int) (*types.Transaction, error) { + return _XDCValidator.Contract.Unvote(&_XDCValidator.TransactOpts, _candidate, _cap) +} + +// Unvote is a paid mutator transaction binding the contract method 0x02aa9be2. +// +// Solidity: function unvote(_candidate address, _cap uint256) returns() +func (_XDCValidator *XDCValidatorTransactorSession) Unvote(_candidate common.Address, _cap *big.Int) (*types.Transaction, error) { + return _XDCValidator.Contract.Unvote(&_XDCValidator.TransactOpts, _candidate, _cap) +} + +// UploadKYC is a paid mutator transaction binding the contract method 0xf5c95125. +// +// Solidity: function uploadKYC(kychash string) returns() +func (_XDCValidator *XDCValidatorTransactor) UploadKYC(opts *bind.TransactOpts, kychash string) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "uploadKYC", kychash) +} + +// UploadKYC is a paid mutator transaction binding the contract method 0xf5c95125. +// +// Solidity: function uploadKYC(kychash string) returns() +func (_XDCValidator *XDCValidatorSession) UploadKYC(kychash string) (*types.Transaction, error) { + return _XDCValidator.Contract.UploadKYC(&_XDCValidator.TransactOpts, kychash) +} + +// UploadKYC is a paid mutator transaction binding the contract method 0xf5c95125. +// +// Solidity: function uploadKYC(kychash string) returns() +func (_XDCValidator *XDCValidatorTransactorSession) UploadKYC(kychash string) (*types.Transaction, error) { + return _XDCValidator.Contract.UploadKYC(&_XDCValidator.TransactOpts, kychash) +} + +// Vote is a paid mutator transaction binding the contract method 0x6dd7d8ea. +// +// Solidity: function vote(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactor) Vote(opts *bind.TransactOpts, _candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "vote", _candidate) +} + +// Vote is a paid mutator transaction binding the contract method 0x6dd7d8ea. +// +// Solidity: function vote(_candidate address) returns() +func (_XDCValidator *XDCValidatorSession) Vote(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Vote(&_XDCValidator.TransactOpts, _candidate) +} + +// Vote is a paid mutator transaction binding the contract method 0x6dd7d8ea. +// +// Solidity: function vote(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) Vote(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Vote(&_XDCValidator.TransactOpts, _candidate) +} + +// VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. +// +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _invalidCandidate) +} + +// VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. +// +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) +} + +// VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. +// +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x441a3e70. +// +// Solidity: function withdraw(_blockNumber uint256, _index uint256) returns() +func (_XDCValidator *XDCValidatorTransactor) Withdraw(opts *bind.TransactOpts, _blockNumber *big.Int, _index *big.Int) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "withdraw", _blockNumber, _index) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x441a3e70. +// +// Solidity: function withdraw(_blockNumber uint256, _index uint256) returns() +func (_XDCValidator *XDCValidatorSession) Withdraw(_blockNumber *big.Int, _index *big.Int) (*types.Transaction, error) { + return _XDCValidator.Contract.Withdraw(&_XDCValidator.TransactOpts, _blockNumber, _index) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x441a3e70. +// +// Solidity: function withdraw(_blockNumber uint256, _index uint256) returns() +func (_XDCValidator *XDCValidatorTransactorSession) Withdraw(_blockNumber *big.Int, _index *big.Int) (*types.Transaction, error) { + return _XDCValidator.Contract.Withdraw(&_XDCValidator.TransactOpts, _blockNumber, _index) +} + +// XDCValidatorInvalidatedNodeIterator is returned from FilterInvalidatedNode and is used to iterate over the raw logs and unpacked data for InvalidatedNode events raised by the XDCValidator contract. +type XDCValidatorInvalidatedNodeIterator struct { + Event *XDCValidatorInvalidatedNode // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorInvalidatedNodeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorInvalidatedNode) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorInvalidatedNode) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorInvalidatedNodeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorInvalidatedNodeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorInvalidatedNode represents a InvalidatedNode event raised by the XDCValidator contract. +type XDCValidatorInvalidatedNode struct { + MasternodeOwner common.Address + Masternodes []common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInvalidatedNode is a free log retrieval operation binding the contract event 0xe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e. +// +// Solidity: event InvalidatedNode(_masternodeOwner address, _masternodes address[]) +func (_XDCValidator *XDCValidatorFilterer) FilterInvalidatedNode(opts *bind.FilterOpts) (*XDCValidatorInvalidatedNodeIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "InvalidatedNode") + if err != nil { + return nil, err + } + return &XDCValidatorInvalidatedNodeIterator{contract: _XDCValidator.contract, event: "InvalidatedNode", logs: logs, sub: sub}, nil +} + +// WatchInvalidatedNode is a free log subscription operation binding the contract event 0xe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e. +// +// Solidity: event InvalidatedNode(_masternodeOwner address, _masternodes address[]) +func (_XDCValidator *XDCValidatorFilterer) WatchInvalidatedNode(opts *bind.WatchOpts, sink chan<- *XDCValidatorInvalidatedNode) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "InvalidatedNode") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorInvalidatedNode) + if err := _XDCValidator.contract.UnpackLog(event, "InvalidatedNode", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorProposeIterator is returned from FilterPropose and is used to iterate over the raw logs and unpacked data for Propose events raised by the XDCValidator contract. +type XDCValidatorProposeIterator struct { + Event *XDCValidatorPropose // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorProposeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorPropose) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorPropose) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorProposeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorProposeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorPropose represents a Propose event raised by the XDCValidator contract. +type XDCValidatorPropose struct { + Owner common.Address + Candidate common.Address + Cap *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPropose is a free log retrieval operation binding the contract event 0x7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1. +// +// Solidity: event Propose(_owner address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) FilterPropose(opts *bind.FilterOpts) (*XDCValidatorProposeIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Propose") + if err != nil { + return nil, err + } + return &XDCValidatorProposeIterator{contract: _XDCValidator.contract, event: "Propose", logs: logs, sub: sub}, nil +} + +// WatchPropose is a free log subscription operation binding the contract event 0x7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1. +// +// Solidity: event Propose(_owner address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) WatchPropose(opts *bind.WatchOpts, sink chan<- *XDCValidatorPropose) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Propose") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorPropose) + if err := _XDCValidator.contract.UnpackLog(event, "Propose", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorResignIterator is returned from FilterResign and is used to iterate over the raw logs and unpacked data for Resign events raised by the XDCValidator contract. +type XDCValidatorResignIterator struct { + Event *XDCValidatorResign // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorResignIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorResign) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorResign) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorResignIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorResignIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorResign represents a Resign event raised by the XDCValidator contract. +type XDCValidatorResign struct { + Owner common.Address + Candidate common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterResign is a free log retrieval operation binding the contract event 0x4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3. +// +// Solidity: event Resign(_owner address, _candidate address) +func (_XDCValidator *XDCValidatorFilterer) FilterResign(opts *bind.FilterOpts) (*XDCValidatorResignIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Resign") + if err != nil { + return nil, err + } + return &XDCValidatorResignIterator{contract: _XDCValidator.contract, event: "Resign", logs: logs, sub: sub}, nil +} + +// WatchResign is a free log subscription operation binding the contract event 0x4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3. +// +// Solidity: event Resign(_owner address, _candidate address) +func (_XDCValidator *XDCValidatorFilterer) WatchResign(opts *bind.WatchOpts, sink chan<- *XDCValidatorResign) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Resign") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorResign) + if err := _XDCValidator.contract.UnpackLog(event, "Resign", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorUnvoteIterator is returned from FilterUnvote and is used to iterate over the raw logs and unpacked data for Unvote events raised by the XDCValidator contract. +type XDCValidatorUnvoteIterator struct { + Event *XDCValidatorUnvote // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorUnvoteIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorUnvote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorUnvote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorUnvoteIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorUnvoteIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorUnvote represents a Unvote event raised by the XDCValidator contract. +type XDCValidatorUnvote struct { + Voter common.Address + Candidate common.Address + Cap *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnvote is a free log retrieval operation binding the contract event 0xaa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2. +// +// Solidity: event Unvote(_voter address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) FilterUnvote(opts *bind.FilterOpts) (*XDCValidatorUnvoteIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Unvote") + if err != nil { + return nil, err + } + return &XDCValidatorUnvoteIterator{contract: _XDCValidator.contract, event: "Unvote", logs: logs, sub: sub}, nil +} + +// WatchUnvote is a free log subscription operation binding the contract event 0xaa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2. +// +// Solidity: event Unvote(_voter address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) WatchUnvote(opts *bind.WatchOpts, sink chan<- *XDCValidatorUnvote) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Unvote") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorUnvote) + if err := _XDCValidator.contract.UnpackLog(event, "Unvote", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorUploadedKYCIterator is returned from FilterUploadedKYC and is used to iterate over the raw logs and unpacked data for UploadedKYC events raised by the XDCValidator contract. +type XDCValidatorUploadedKYCIterator struct { + Event *XDCValidatorUploadedKYC // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorUploadedKYCIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorUploadedKYC) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorUploadedKYC) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorUploadedKYCIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorUploadedKYCIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorUploadedKYC represents a UploadedKYC event raised by the XDCValidator contract. +type XDCValidatorUploadedKYC struct { + Owner common.Address + KycHash string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUploadedKYC is a free log retrieval operation binding the contract event 0x949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a. +// +// Solidity: event UploadedKYC(_owner address, kycHash string) +func (_XDCValidator *XDCValidatorFilterer) FilterUploadedKYC(opts *bind.FilterOpts) (*XDCValidatorUploadedKYCIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "UploadedKYC") + if err != nil { + return nil, err + } + return &XDCValidatorUploadedKYCIterator{contract: _XDCValidator.contract, event: "UploadedKYC", logs: logs, sub: sub}, nil +} + +// WatchUploadedKYC is a free log subscription operation binding the contract event 0x949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a. +// +// Solidity: event UploadedKYC(_owner address, kycHash string) +func (_XDCValidator *XDCValidatorFilterer) WatchUploadedKYC(opts *bind.WatchOpts, sink chan<- *XDCValidatorUploadedKYC) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "UploadedKYC") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorUploadedKYC) + if err := _XDCValidator.contract.UnpackLog(event, "UploadedKYC", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorVoteIterator is returned from FilterVote and is used to iterate over the raw logs and unpacked data for Vote events raised by the XDCValidator contract. +type XDCValidatorVoteIterator struct { + Event *XDCValidatorVote // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorVoteIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorVote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorVote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorVoteIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorVoteIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorVote represents a Vote event raised by the XDCValidator contract. +type XDCValidatorVote struct { + Voter common.Address + Candidate common.Address + Cap *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterVote is a free log retrieval operation binding the contract event 0x66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc. +// +// Solidity: event Vote(_voter address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) FilterVote(opts *bind.FilterOpts) (*XDCValidatorVoteIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Vote") + if err != nil { + return nil, err + } + return &XDCValidatorVoteIterator{contract: _XDCValidator.contract, event: "Vote", logs: logs, sub: sub}, nil +} + +// WatchVote is a free log subscription operation binding the contract event 0x66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc. +// +// Solidity: event Vote(_voter address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) WatchVote(opts *bind.WatchOpts, sink chan<- *XDCValidatorVote) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Vote") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorVote) + if err := _XDCValidator.contract.UnpackLog(event, "Vote", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorWithdrawIterator is returned from FilterWithdraw and is used to iterate over the raw logs and unpacked data for Withdraw events raised by the XDCValidator contract. +type XDCValidatorWithdrawIterator struct { + Event *XDCValidatorWithdraw // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorWithdrawIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorWithdraw) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorWithdraw) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorWithdrawIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorWithdrawIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorWithdraw represents a Withdraw event raised by the XDCValidator contract. +type XDCValidatorWithdraw struct { + Owner common.Address + BlockNumber *big.Int + Cap *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWithdraw is a free log retrieval operation binding the contract event 0xf279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568. +// +// Solidity: event Withdraw(_owner address, _blockNumber uint256, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) FilterWithdraw(opts *bind.FilterOpts) (*XDCValidatorWithdrawIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Withdraw") + if err != nil { + return nil, err + } + return &XDCValidatorWithdrawIterator{contract: _XDCValidator.contract, event: "Withdraw", logs: logs, sub: sub}, nil +} + +// WatchWithdraw is a free log subscription operation binding the contract event 0xf279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568. +// +// Solidity: event Withdraw(_owner address, _blockNumber uint256, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) WatchWithdraw(opts *bind.WatchOpts, sink chan<- *XDCValidatorWithdraw) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Withdraw") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorWithdraw) + if err := _XDCValidator.contract.UnpackLog(event, "Withdraw", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} From 1103881021cd52096369814be04a45f0ad89703e Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:59:57 +0400 Subject: [PATCH 063/144] update --- contracts/validator/contract_v2/src/README.md | 4 ++-- .../validator/contract_v2/{validator.go => validator_v2.go} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename contracts/validator/contract_v2/{validator.go => validator_v2.go} (100%) diff --git a/contracts/validator/contract_v2/src/README.md b/contracts/validator/contract_v2/src/README.md index e4a96cf27de9..9573c023f30a 100644 --- a/contracts/validator/contract_v2/src/README.md +++ b/contracts/validator/contract_v2/src/README.md @@ -35,12 +35,12 @@ node scripts/deployToGenesis.js 2. run ```shell -./abigen --abi abi --bin bytecode --pkg contract --type XDCValidator --out ../validator.go +./abigen --abi abi --bin bytecode --pkg contract --type XDCValidator --out ../validator_v2.go ``` If you don't have `abigen`, compile it. It's in `cmd/abigen/main.go` in XDC main repo (or Geth repo). -3. Go `../validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDPoSChain"` +3. Go `../validator_v2.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDPoSChain"` ## Deploy contract to node any block diff --git a/contracts/validator/contract_v2/validator.go b/contracts/validator/contract_v2/validator_v2.go similarity index 100% rename from contracts/validator/contract_v2/validator.go rename to contracts/validator/contract_v2/validator_v2.go From 611fcc26de77cf2e07ee08b0a85e8d780db6249c Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 20 Aug 2024 11:09:00 +0400 Subject: [PATCH 064/144] update --- common/types.go | 3 ++- consensus/XDPoS/XDPoS.go | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/common/types.go b/common/types.go index 905c7d5a4ecc..20e2f2202b07 100644 --- a/common/types.go +++ b/common/types.go @@ -48,6 +48,7 @@ const ( SignMethod = "0xe341eaa4" XDCXApplyMethod = "0xc6b32f34" XDCZApplyMethod = "0xc6b32f34" + XDCValidatorV2Code = "0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029" ) var ( @@ -256,7 +257,7 @@ func (a *Address) Set(other Address) { // MarshalText returns the hex representation of a. func (a Address) MarshalText() ([]byte, error) { // Handle '0x' or 'xdc' prefix here. - if (Enable0xPrefix) { + if Enable0xPrefix { return hexutil.Bytes(a[:]).MarshalText() } else { return hexutil.Bytes(a[:]).MarshalXDCText() diff --git a/consensus/XDPoS/XDPoS.go b/consensus/XDPoS/XDPoS.go index 7a213f5b6563..5176671e2d97 100644 --- a/consensus/XDPoS/XDPoS.go +++ b/consensus/XDPoS/XDPoS.go @@ -271,6 +271,12 @@ func (x *XDPoS) Prepare(chain consensus.ChainReader, header *types.Header) error // Finalize implements consensus.Engine, ensuring no uncles are set, nor block // rewards given, and returns the final block. func (x *XDPoS) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, parentState *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { + number := header.Number.Uint64() + log.Info("poc", "fun", "Finalize", "number", number) + if number == 99999999999 { + UpgradeXDCValidtorV2(state) + } + switch x.config.BlockConsensusVersion(header.Number, header.Extra, ExtraFieldCheck) { case params.ConsensusEngineVersion2: return x.EngineV2.Finalize(chain, header, state, parentState, txs, uncles, receipts) @@ -549,3 +555,11 @@ func (x *XDPoS) CacheSigningTxs(hash common.Hash, txs []*types.Transaction) []*t func (x *XDPoS) GetCachedSigningTxs(hash common.Hash) (interface{}, bool) { return x.signingTxsCache.Get(hash) } + +func UpgradeXDCValidtorV2(statedb *state.StateDB) { + log.Info("poc", "MasternodeVotingSMC", common.MasternodeVotingSMC, "step", 1) + addr := common.HexToAddress(common.MasternodeVotingSMC) + // upgrade code + statedb.SetCode(addr, common.FromHex(common.XDCValidatorV2Code)) + log.Info("poc", "MasternodeVotingSMC", common.XDCValidatorV2Code, "step", 2) +} From 0e3d7ec8e72a84d59dff6786a566cee8c9947212 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 28 Aug 2024 07:48:29 +0400 Subject: [PATCH 065/144] Update types.go --- common/types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/types.go b/common/types.go index 20e2f2202b07..b0fe22ed234e 100644 --- a/common/types.go +++ b/common/types.go @@ -48,7 +48,7 @@ const ( SignMethod = "0xe341eaa4" XDCXApplyMethod = "0xc6b32f34" XDCZApplyMethod = "0xc6b32f34" - XDCValidatorV2Code = "0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029" + XDCValidatorV2Code = "0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058202d2b261fc54b86312f961b1aa09e979c6f856a164967a71bddacf098a2d282900029" ) var ( From 31cccc5b760389e0d9a14ae12b3ab550aa75cbb2 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:13:14 +0400 Subject: [PATCH 066/144] Update deployToGenesis.js --- .../validator/contract_v2/src/scripts/deployToGenesis.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/contracts/validator/contract_v2/src/scripts/deployToGenesis.js b/contracts/validator/contract_v2/src/scripts/deployToGenesis.js index 305d56ba70dd..cd559f785e66 100644 --- a/contracts/validator/contract_v2/src/scripts/deployToGenesis.js +++ b/contracts/validator/contract_v2/src/scripts/deployToGenesis.js @@ -3,6 +3,7 @@ const fs = require("fs"); const abi = XDCValidator["abi"]; const bytecode = XDCValidator["bytecode"]; +const deployedBytecode = XDCValidator["deployedBytecode"]; fs.writeFile("./abi", JSON.stringify(abi, null, 3), "utf8", function (error) { if (error) { @@ -18,3 +19,10 @@ fs.writeFile("./bytecode", bytecode, "utf8", function (error) { } console.log("Write success "); }); +fs.writeFile("./deployedBytecode", deployedBytecode, "utf8", function (error) { + if (error) { + console.log(error); + return false; + } + console.log("Write success "); +}); \ No newline at end of file From 18e9652686b61a56f5699d33c8088520f9555e66 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:56:13 +0400 Subject: [PATCH 067/144] Update types.go --- common/types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/types.go b/common/types.go index b0fe22ed234e..ea9dd1c2d81e 100644 --- a/common/types.go +++ b/common/types.go @@ -48,7 +48,7 @@ const ( SignMethod = "0xe341eaa4" XDCXApplyMethod = "0xc6b32f34" XDCZApplyMethod = "0xc6b32f34" - XDCValidatorV2Code = "0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058202d2b261fc54b86312f961b1aa09e979c6f856a164967a71bddacf098a2d282900029" + XDCValidatorV2Code = "0x6080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058202d2b261fc54b86312f961b1aa09e979c6f856a164967a71bddacf098a2d282900029" ) var ( From bd30cd5989da6932edd1031db500d4194ae8f089 Mon Sep 17 00:00:00 2001 From: Gary Date: Fri, 30 Aug 2024 15:31:14 +0800 Subject: [PATCH 068/144] right place to upgrade --- consensus/XDPoS/XDPoS.go | 14 -------------- consensus/XDPoS/engines/engine_v2/engine.go | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/consensus/XDPoS/XDPoS.go b/consensus/XDPoS/XDPoS.go index 5176671e2d97..7a213f5b6563 100644 --- a/consensus/XDPoS/XDPoS.go +++ b/consensus/XDPoS/XDPoS.go @@ -271,12 +271,6 @@ func (x *XDPoS) Prepare(chain consensus.ChainReader, header *types.Header) error // Finalize implements consensus.Engine, ensuring no uncles are set, nor block // rewards given, and returns the final block. func (x *XDPoS) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, parentState *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { - number := header.Number.Uint64() - log.Info("poc", "fun", "Finalize", "number", number) - if number == 99999999999 { - UpgradeXDCValidtorV2(state) - } - switch x.config.BlockConsensusVersion(header.Number, header.Extra, ExtraFieldCheck) { case params.ConsensusEngineVersion2: return x.EngineV2.Finalize(chain, header, state, parentState, txs, uncles, receipts) @@ -555,11 +549,3 @@ func (x *XDPoS) CacheSigningTxs(hash common.Hash, txs []*types.Transaction) []*t func (x *XDPoS) GetCachedSigningTxs(hash common.Hash) (interface{}, bool) { return x.signingTxsCache.Get(hash) } - -func UpgradeXDCValidtorV2(statedb *state.StateDB) { - log.Info("poc", "MasternodeVotingSMC", common.MasternodeVotingSMC, "step", 1) - addr := common.HexToAddress(common.MasternodeVotingSMC) - // upgrade code - statedb.SetCode(addr, common.FromHex(common.XDCValidatorV2Code)) - log.Info("poc", "MasternodeVotingSMC", common.XDCValidatorV2Code, "step", 2) -} diff --git a/consensus/XDPoS/engines/engine_v2/engine.go b/consensus/XDPoS/engines/engine_v2/engine.go index fc2c46edd84f..1dfd1fadcd86 100644 --- a/consensus/XDPoS/engines/engine_v2/engine.go +++ b/consensus/XDPoS/engines/engine_v2/engine.go @@ -393,6 +393,13 @@ func (x *XDPoS_v2) Finalize(chain consensus.ChainReader, header *types.Header, s } } + // upgrade smart contract after reward distribution + number := header.Number.Uint64() + log.Info("poc", "fun", "Finalize", "number", number) + if number == 99999999999 { + UpgradeXDCValidtorV2(state) + } + // the state remains as is and uncles are dropped header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) header.UncleHash = types.CalcUncleHash(nil) @@ -1101,3 +1108,11 @@ func (x *XDPoS_v2) periodicJob() { func (x *XDPoS_v2) GetLatestCommittedBlockInfo() *types.BlockInfo { return x.highestCommitBlock } + +func UpgradeXDCValidtorV2(statedb *state.StateDB) { + log.Info("poc", "MasternodeVotingSMC", common.MasternodeVotingSMC, "step", 1) + addr := common.HexToAddress(common.MasternodeVotingSMC) + // upgrade code + statedb.SetCode(addr, common.FromHex(common.XDCValidatorV2Code)) + log.Info("poc", "MasternodeVotingSMC", common.XDCValidatorV2Code, "step", 2) +} From d3fa5272915acad48db2a6b9a2c364a02e7cd701 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 26 Feb 2024 11:44:43 +0400 Subject: [PATCH 069/144] Update XDCValidator.sol --- contracts/validator/contract/XDCValidator.sol | 234 ++++++++++++------ 1 file changed, 163 insertions(+), 71 deletions(-) diff --git a/contracts/validator/contract/XDCValidator.sol b/contracts/validator/contract/XDCValidator.sol index 0e67746a177a..0dd2c1e5d6d4 100644 --- a/contracts/validator/contract/XDCValidator.sol +++ b/contracts/validator/contract/XDCValidator.sol @@ -1,9 +1,7 @@ - pragma solidity ^0.4.21; import "./libs/SafeMath.sol"; - contract XDCValidator { using SafeMath for uint256; @@ -12,7 +10,7 @@ contract XDCValidator { event Propose(address _owner, address _candidate, uint256 _cap); event Resign(address _owner, address _candidate); event Withdraw(address _owner, uint256 _blockNumber, uint256 _cap); - event UploadedKYC(address _owner,string kycHash); + event UploadedKYC(address _owner, string kycHash); event InvalidatedNode(address _masternodeOwner, address[] _masternodes); struct ValidatorState { @@ -23,8 +21,8 @@ contract XDCValidator { } struct WithdrawState { - mapping(uint256 => uint256) caps; - uint256[] blockNumbers; + mapping(uint256 => uint256) caps; + uint256[] blockNumbers; } mapping(address => WithdrawState) withdrawsState; @@ -42,28 +40,30 @@ contract XDCValidator { address[] public candidates; uint256 public candidateCount = 0; - uint256 public ownerCount =0; + uint256 public ownerCount = 0; uint256 public minCandidateCap; uint256 public minVoterCap; uint256 public maxValidatorNumber; uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - modifier onlyValidCandidateCap { + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); _; } - modifier onlyValidVoterCap { - + modifier onlyValidVoterCap() { require(msg.value >= minVoterCap); _; } - modifier onlyKYCWhitelisted { - require(KYCString[msg.sender].length!=0 || ownerToCandidate[msg.sender].length>0); - _; + modifier onlyKYCWhitelisted() { + require( + KYCString[msg.sender].length != 0 || + ownerToCandidate[msg.sender].length > 0 + ); + _; } modifier onlyOwner(address _candidate) { @@ -76,33 +76,38 @@ contract XDCValidator { _; } - modifier onlyValidCandidate (address _candidate) { + modifier onlyValidCandidate(address _candidate) { require(validatorsState[_candidate].isCandidate); _; } - modifier onlyNotCandidate (address _candidate) { + modifier onlyNotCandidate(address _candidate) { require(!validatorsState[_candidate].isCandidate); _; } - modifier onlyValidVote (address _candidate, uint256 _cap) { + modifier onlyValidVote(address _candidate, uint256 _cap) { require(validatorsState[_candidate].voters[msg.sender] >= _cap); if (validatorsState[_candidate].owner == msg.sender) { - require(validatorsState[_candidate].voters[msg.sender].sub(_cap) >= minCandidateCap); + require( + validatorsState[_candidate].voters[msg.sender].sub(_cap) >= + minCandidateCap + ); } _; } - modifier onlyValidWithdraw (uint256 _blockNumber, uint _index) { + modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); - require(withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber); + require( + withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber + ); _; } - function XDCValidator ( + function XDCValidator( address[] _candidates, uint256[] _caps, address _firstOwner, @@ -129,19 +134,28 @@ contract XDCValidator { }); voters[_candidates[i]].push(_firstOwner); ownerToCandidate[_firstOwner].push(_candidates[i]); - validatorsState[_candidates[i]].voters[_firstOwner] = minCandidateCap; + validatorsState[_candidates[i]].voters[ + _firstOwner + ] = minCandidateCap; } } - // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. function uploadKYC(string kychash) external { KYCString[msg.sender].push(kychash); - emit UploadedKYC(msg.sender,kychash); + emit UploadedKYC(msg.sender, kychash); } // propose : any non-candidate who has uploaded its KYC can become an owner by proposing a candidate. - function propose(address _candidate) external payable onlyValidCandidateCap onlyKYCWhitelisted onlyNotCandidate(_candidate) { + function propose( + address _candidate + ) + external + payable + onlyValidCandidateCap + onlyKYCWhitelisted + onlyNotCandidate(_candidate) + { uint256 cap = validatorsState[_candidate].cap.add(msg.value); candidates.push(_candidate); validatorsState[_candidate] = ValidatorState({ @@ -149,9 +163,11 @@ contract XDCValidator { isCandidate: true, cap: cap }); - validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].add(msg.value); + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].add(msg.value); candidateCount = candidateCount.add(1); - if (ownerToCandidate[msg.sender].length ==0){ + if (ownerToCandidate[msg.sender].length == 0) { owners.push(msg.sender); ownerCount++; } @@ -160,144 +176,220 @@ contract XDCValidator { emit Propose(msg.sender, _candidate, msg.value); } - function vote(address _candidate) external payable onlyValidVoterCap onlyValidCandidate(_candidate) { - validatorsState[_candidate].cap = validatorsState[_candidate].cap.add(msg.value); + function vote( + address _candidate + ) external payable onlyValidVoterCap onlyValidCandidate(_candidate) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.add( + msg.value + ); if (validatorsState[_candidate].voters[msg.sender] == 0) { voters[_candidate].push(msg.sender); } - validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].add(msg.value); + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].add(msg.value); emit Vote(msg.sender, _candidate, msg.value); } - function getCandidates() public view returns(address[]) { + function getCandidates() public view returns (address[]) { return candidates; } - function getCandidateCap(address _candidate) public view returns(uint256) { + function getCandidateCap(address _candidate) public view returns (uint256) { return validatorsState[_candidate].cap; } - function getCandidateOwner(address _candidate) public view returns(address) { + function getCandidateOwner( + address _candidate + ) public view returns (address) { return validatorsState[_candidate].owner; } - function getVoterCap(address _candidate, address _voter) public view returns(uint256) { + function getVoterCap( + address _candidate, + address _voter + ) public view returns (uint256) { return validatorsState[_candidate].voters[_voter]; } - function getVoters(address _candidate) public view returns(address[]) { + function getVoters(address _candidate) public view returns (address[]) { return voters[_candidate]; } - function isCandidate(address _candidate) public view returns(bool) { + function isCandidate(address _candidate) public view returns (bool) { return validatorsState[_candidate].isCandidate; } - function getWithdrawBlockNumbers() public view returns(uint256[]) { + function getWithdrawBlockNumbers() public view returns (uint256[]) { return withdrawsState[msg.sender].blockNumbers; } - function getWithdrawCap(uint256 _blockNumber) public view returns(uint256) { + function getWithdrawCap( + uint256 _blockNumber + ) public view returns (uint256) { return withdrawsState[msg.sender].caps[_blockNumber]; } - function unvote(address _candidate, uint256 _cap) public onlyValidVote(_candidate, _cap) { - validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub(_cap); - validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].sub(_cap); + function unvote( + address _candidate, + uint256 _cap + ) public onlyValidVote(_candidate, _cap) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( + _cap + ); + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].sub(_cap); // refund after delay X blocks uint256 withdrawBlockNumber = voterWithdrawDelay.add(block.number); - withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[msg.sender].caps[withdrawBlockNumber].add(_cap); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ + msg.sender + ].caps[withdrawBlockNumber].add(_cap); withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); emit Unvote(msg.sender, _candidate, _cap); } - function resign(address _candidate) public onlyOwner(_candidate) onlyCandidate(_candidate) { + function resign( + address _candidate + ) public onlyOwner(_candidate) onlyCandidate(_candidate) { validatorsState[_candidate].isCandidate = false; candidateCount = candidateCount.sub(1); for (uint256 i = 0; i < candidates.length; i++) { if (candidates[i] == _candidate) { + address[] memory cacheArray = ownerToCandidate[msg.sender]; + uint256 cacheArrayLength = cacheArray.length; + for (uint256 j = 0; j < cacheArrayLength; j++) { + if (cacheArray[j] == _candidate) { + delete cacheArray[j]; + } + } + ownerToCandidate[msg.sender] = removeZeroAddresses(cacheArray); + if (ownerToCandidate[msg.sender].length == 0) { + ownerCount--; + } delete candidates[i]; break; } } + candidates = removeZeroAddresses(candidates); uint256 cap = validatorsState[_candidate].voters[msg.sender]; - validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub(cap); + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( + cap + ); validatorsState[_candidate].voters[msg.sender] = 0; // refunding after resigning X blocks uint256 withdrawBlockNumber = candidateWithdrawDelay.add(block.number); - withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[msg.sender].caps[withdrawBlockNumber].add(cap); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ + msg.sender + ].caps[withdrawBlockNumber].add(cap); withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); emit Resign(msg.sender, _candidate); } // voteInvalidKYC : any candidate can vote for invalid KYC i.e. a particular candidate's owner has uploaded a bad KYC. // On securing 75% votes against an owner ( not candidate ), owner & all its candidates will lose their funds. - function voteInvalidKYC(address _invalidCandidate) onlyValidCandidate(msg.sender) onlyValidCandidate(_invalidCandidate) public { + function voteInvalidKYC( + address _invalidCandidate + ) + public + onlyValidCandidate(msg.sender) + onlyValidCandidate(_invalidCandidate) + { address candidateOwner = getCandidateOwner(msg.sender); address _invalidMasternode = getCandidateOwner(_invalidCandidate); require(!hasVotedInvalid[candidateOwner][_invalidMasternode]); hasVotedInvalid[candidateOwner][_invalidMasternode] = true; invalidKYCCount[_invalidMasternode] += 1; - if( invalidKYCCount[_invalidMasternode]*100/getOwnerCount() >= 75 ){ + if ( + (invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount() >= 75 + ) { // 75% owners say that the KYC is invalid - address[] memory allMasternodes = new address[](candidates.length-1) ; - uint count=0; - for (uint i=0;i Date: Mon, 4 Mar 2024 07:53:29 +0400 Subject: [PATCH 070/144] update --- contracts/validator/contract/XDCValidator.sol | 236 ++++------- .../validator/contract/XDCValidatorV2.sol | 395 ++++++++++++++++++ 2 files changed, 467 insertions(+), 164 deletions(-) create mode 100644 contracts/validator/contract/XDCValidatorV2.sol diff --git a/contracts/validator/contract/XDCValidator.sol b/contracts/validator/contract/XDCValidator.sol index 0dd2c1e5d6d4..732c6904201f 100644 --- a/contracts/validator/contract/XDCValidator.sol +++ b/contracts/validator/contract/XDCValidator.sol @@ -1,7 +1,9 @@ + pragma solidity ^0.4.21; import "./libs/SafeMath.sol"; + contract XDCValidator { using SafeMath for uint256; @@ -10,7 +12,7 @@ contract XDCValidator { event Propose(address _owner, address _candidate, uint256 _cap); event Resign(address _owner, address _candidate); event Withdraw(address _owner, uint256 _blockNumber, uint256 _cap); - event UploadedKYC(address _owner, string kycHash); + event UploadedKYC(address _owner,string kycHash); event InvalidatedNode(address _masternodeOwner, address[] _masternodes); struct ValidatorState { @@ -21,8 +23,8 @@ contract XDCValidator { } struct WithdrawState { - mapping(uint256 => uint256) caps; - uint256[] blockNumbers; + mapping(uint256 => uint256) caps; + uint256[] blockNumbers; } mapping(address => WithdrawState) withdrawsState; @@ -40,30 +42,28 @@ contract XDCValidator { address[] public candidates; uint256 public candidateCount = 0; - uint256 public ownerCount = 0; + uint256 public ownerCount =0; uint256 public minCandidateCap; uint256 public minVoterCap; uint256 public maxValidatorNumber; uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - modifier onlyValidCandidateCap() { + modifier onlyValidCandidateCap { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); _; } - modifier onlyValidVoterCap() { + modifier onlyValidVoterCap { + require(msg.value >= minVoterCap); _; } - modifier onlyKYCWhitelisted() { - require( - KYCString[msg.sender].length != 0 || - ownerToCandidate[msg.sender].length > 0 - ); - _; + modifier onlyKYCWhitelisted { + require(KYCString[msg.sender].length!=0 || ownerToCandidate[msg.sender].length>0); + _; } modifier onlyOwner(address _candidate) { @@ -76,38 +76,33 @@ contract XDCValidator { _; } - modifier onlyValidCandidate(address _candidate) { + modifier onlyValidCandidate (address _candidate) { require(validatorsState[_candidate].isCandidate); _; } - modifier onlyNotCandidate(address _candidate) { + modifier onlyNotCandidate (address _candidate) { require(!validatorsState[_candidate].isCandidate); _; } - modifier onlyValidVote(address _candidate, uint256 _cap) { + modifier onlyValidVote (address _candidate, uint256 _cap) { require(validatorsState[_candidate].voters[msg.sender] >= _cap); if (validatorsState[_candidate].owner == msg.sender) { - require( - validatorsState[_candidate].voters[msg.sender].sub(_cap) >= - minCandidateCap - ); + require(validatorsState[_candidate].voters[msg.sender].sub(_cap) >= minCandidateCap); } _; } - modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { + modifier onlyValidWithdraw (uint256 _blockNumber, uint _index) { require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); - require( - withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber - ); + require(withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber); _; } - function XDCValidator( + function XDCValidator ( address[] _candidates, uint256[] _caps, address _firstOwner, @@ -134,28 +129,19 @@ contract XDCValidator { }); voters[_candidates[i]].push(_firstOwner); ownerToCandidate[_firstOwner].push(_candidates[i]); - validatorsState[_candidates[i]].voters[ - _firstOwner - ] = minCandidateCap; + validatorsState[_candidates[i]].voters[_firstOwner] = minCandidateCap; } } + // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. function uploadKYC(string kychash) external { KYCString[msg.sender].push(kychash); - emit UploadedKYC(msg.sender, kychash); + emit UploadedKYC(msg.sender,kychash); } // propose : any non-candidate who has uploaded its KYC can become an owner by proposing a candidate. - function propose( - address _candidate - ) - external - payable - onlyValidCandidateCap - onlyKYCWhitelisted - onlyNotCandidate(_candidate) - { + function propose(address _candidate) external payable onlyValidCandidateCap onlyKYCWhitelisted onlyNotCandidate(_candidate) { uint256 cap = validatorsState[_candidate].cap.add(msg.value); candidates.push(_candidate); validatorsState[_candidate] = ValidatorState({ @@ -163,11 +149,9 @@ contract XDCValidator { isCandidate: true, cap: cap }); - validatorsState[_candidate].voters[msg.sender] = validatorsState[ - _candidate - ].voters[msg.sender].add(msg.value); + validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].add(msg.value); candidateCount = candidateCount.add(1); - if (ownerToCandidate[msg.sender].length == 0) { + if (ownerToCandidate[msg.sender].length ==0){ owners.push(msg.sender); ownerCount++; } @@ -176,220 +160,144 @@ contract XDCValidator { emit Propose(msg.sender, _candidate, msg.value); } - function vote( - address _candidate - ) external payable onlyValidVoterCap onlyValidCandidate(_candidate) { - validatorsState[_candidate].cap = validatorsState[_candidate].cap.add( - msg.value - ); + function vote(address _candidate) external payable onlyValidVoterCap onlyValidCandidate(_candidate) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.add(msg.value); if (validatorsState[_candidate].voters[msg.sender] == 0) { voters[_candidate].push(msg.sender); } - validatorsState[_candidate].voters[msg.sender] = validatorsState[ - _candidate - ].voters[msg.sender].add(msg.value); + validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].add(msg.value); emit Vote(msg.sender, _candidate, msg.value); } - function getCandidates() public view returns (address[]) { + function getCandidates() public view returns(address[]) { return candidates; } - function getCandidateCap(address _candidate) public view returns (uint256) { + function getCandidateCap(address _candidate) public view returns(uint256) { return validatorsState[_candidate].cap; } - function getCandidateOwner( - address _candidate - ) public view returns (address) { + function getCandidateOwner(address _candidate) public view returns(address) { return validatorsState[_candidate].owner; } - function getVoterCap( - address _candidate, - address _voter - ) public view returns (uint256) { + function getVoterCap(address _candidate, address _voter) public view returns(uint256) { return validatorsState[_candidate].voters[_voter]; } - function getVoters(address _candidate) public view returns (address[]) { + function getVoters(address _candidate) public view returns(address[]) { return voters[_candidate]; } - function isCandidate(address _candidate) public view returns (bool) { + function isCandidate(address _candidate) public view returns(bool) { return validatorsState[_candidate].isCandidate; } - function getWithdrawBlockNumbers() public view returns (uint256[]) { + function getWithdrawBlockNumbers() public view returns(uint256[]) { return withdrawsState[msg.sender].blockNumbers; } - function getWithdrawCap( - uint256 _blockNumber - ) public view returns (uint256) { + function getWithdrawCap(uint256 _blockNumber) public view returns(uint256) { return withdrawsState[msg.sender].caps[_blockNumber]; } - function unvote( - address _candidate, - uint256 _cap - ) public onlyValidVote(_candidate, _cap) { - validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( - _cap - ); - validatorsState[_candidate].voters[msg.sender] = validatorsState[ - _candidate - ].voters[msg.sender].sub(_cap); + function unvote(address _candidate, uint256 _cap) public onlyValidVote(_candidate, _cap) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub(_cap); + validatorsState[_candidate].voters[msg.sender] = validatorsState[_candidate].voters[msg.sender].sub(_cap); // refund after delay X blocks uint256 withdrawBlockNumber = voterWithdrawDelay.add(block.number); - withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ - msg.sender - ].caps[withdrawBlockNumber].add(_cap); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[msg.sender].caps[withdrawBlockNumber].add(_cap); withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); emit Unvote(msg.sender, _candidate, _cap); } - function resign( - address _candidate - ) public onlyOwner(_candidate) onlyCandidate(_candidate) { + function resign(address _candidate) public onlyOwner(_candidate) onlyCandidate(_candidate) { validatorsState[_candidate].isCandidate = false; candidateCount = candidateCount.sub(1); for (uint256 i = 0; i < candidates.length; i++) { if (candidates[i] == _candidate) { - address[] memory cacheArray = ownerToCandidate[msg.sender]; - uint256 cacheArrayLength = cacheArray.length; - for (uint256 j = 0; j < cacheArrayLength; j++) { - if (cacheArray[j] == _candidate) { - delete cacheArray[j]; - } - } - ownerToCandidate[msg.sender] = removeZeroAddresses(cacheArray); - if (ownerToCandidate[msg.sender].length == 0) { - ownerCount--; - } delete candidates[i]; break; } } - candidates = removeZeroAddresses(candidates); uint256 cap = validatorsState[_candidate].voters[msg.sender]; - validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( - cap - ); + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub(cap); validatorsState[_candidate].voters[msg.sender] = 0; // refunding after resigning X blocks uint256 withdrawBlockNumber = candidateWithdrawDelay.add(block.number); - withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ - msg.sender - ].caps[withdrawBlockNumber].add(cap); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[msg.sender].caps[withdrawBlockNumber].add(cap); withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); emit Resign(msg.sender, _candidate); } // voteInvalidKYC : any candidate can vote for invalid KYC i.e. a particular candidate's owner has uploaded a bad KYC. // On securing 75% votes against an owner ( not candidate ), owner & all its candidates will lose their funds. - function voteInvalidKYC( - address _invalidCandidate - ) - public - onlyValidCandidate(msg.sender) - onlyValidCandidate(_invalidCandidate) - { + function voteInvalidKYC(address _invalidCandidate) onlyValidCandidate(msg.sender) onlyValidCandidate(_invalidCandidate) public { address candidateOwner = getCandidateOwner(msg.sender); address _invalidMasternode = getCandidateOwner(_invalidCandidate); require(!hasVotedInvalid[candidateOwner][_invalidMasternode]); hasVotedInvalid[candidateOwner][_invalidMasternode] = true; invalidKYCCount[_invalidMasternode] += 1; - if ( - (invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount() >= 75 - ) { + if( invalidKYCCount[_invalidMasternode]*100/getOwnerCount() >= 75 ){ // 75% owners say that the KYC is invalid - address[] memory allMasternodes = new address[]( - candidates.length - 1 - ); - uint count = 0; - for (uint i = 0; i < candidates.length; i++) { - if (getCandidateOwner(candidates[i]) == _invalidMasternode) { + address[] memory allMasternodes = new address[](candidates.length-1) ; + uint count=0; + for (uint i=0;i uint256) voters; + } + + struct WithdrawState { + mapping(uint256 => uint256) caps; + uint256[] blockNumbers; + } + + mapping(address => WithdrawState) withdrawsState; + + mapping(address => ValidatorState) validatorsState; + mapping(address => address[]) voters; + + // Mapping structures added for KYC feature. + mapping(address => string[]) public KYCString; + mapping(address => uint) public invalidKYCCount; + mapping(address => mapping(address => bool)) public hasVotedInvalid; + mapping(address => address[]) public ownerToCandidate; + address[] public owners; + + address[] public candidates; + + uint256 public candidateCount = 0; + uint256 public ownerCount = 0; + uint256 public minCandidateCap; + uint256 public minVoterCap; + uint256 public maxValidatorNumber; + uint256 public candidateWithdrawDelay; + uint256 public voterWithdrawDelay; + + modifier onlyValidCandidateCap() { + // anyone can deposit X XDC to become a candidate + require(msg.value >= minCandidateCap); + _; + } + + modifier onlyValidVoterCap() { + require(msg.value >= minVoterCap); + _; + } + + modifier onlyKYCWhitelisted() { + require( + KYCString[msg.sender].length != 0 || + ownerToCandidate[msg.sender].length > 0 + ); + _; + } + + modifier onlyOwner(address _candidate) { + require(validatorsState[_candidate].owner == msg.sender); + _; + } + + modifier onlyCandidate(address _candidate) { + require(validatorsState[_candidate].isCandidate); + _; + } + + modifier onlyValidCandidate(address _candidate) { + require(validatorsState[_candidate].isCandidate); + _; + } + + modifier onlyNotCandidate(address _candidate) { + require(!validatorsState[_candidate].isCandidate); + _; + } + + modifier onlyValidVote(address _candidate, uint256 _cap) { + require(validatorsState[_candidate].voters[msg.sender] >= _cap); + if (validatorsState[_candidate].owner == msg.sender) { + require( + validatorsState[_candidate].voters[msg.sender].sub(_cap) >= + minCandidateCap + ); + } + _; + } + + modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { + require(_blockNumber > 0); + require(block.number >= _blockNumber); + require(withdrawsState[msg.sender].caps[_blockNumber] > 0); + require( + withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber + ); + _; + } + + function XDCValidator( + address[] _candidates, + uint256[] _caps, + address _firstOwner, + uint256 _minCandidateCap, + uint256 _minVoterCap, + uint256 _maxValidatorNumber, + uint256 _candidateWithdrawDelay, + uint256 _voterWithdrawDelay + ) public { + minCandidateCap = _minCandidateCap; + minVoterCap = _minVoterCap; + maxValidatorNumber = _maxValidatorNumber; + candidateWithdrawDelay = _candidateWithdrawDelay; + voterWithdrawDelay = _voterWithdrawDelay; + candidateCount = _candidates.length; + owners.push(_firstOwner); + ownerCount++; + for (uint256 i = 0; i < _candidates.length; i++) { + candidates.push(_candidates[i]); + validatorsState[_candidates[i]] = ValidatorState({ + owner: _firstOwner, + isCandidate: true, + cap: _caps[i] + }); + voters[_candidates[i]].push(_firstOwner); + ownerToCandidate[_firstOwner].push(_candidates[i]); + validatorsState[_candidates[i]].voters[ + _firstOwner + ] = minCandidateCap; + } + } + + // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. + function uploadKYC(string kychash) external { + KYCString[msg.sender].push(kychash); + emit UploadedKYC(msg.sender, kychash); + } + + // propose : any non-candidate who has uploaded its KYC can become an owner by proposing a candidate. + function propose( + address _candidate + ) + external + payable + onlyValidCandidateCap + onlyKYCWhitelisted + onlyNotCandidate(_candidate) + { + uint256 cap = validatorsState[_candidate].cap.add(msg.value); + candidates.push(_candidate); + validatorsState[_candidate] = ValidatorState({ + owner: msg.sender, + isCandidate: true, + cap: cap + }); + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].add(msg.value); + candidateCount = candidateCount.add(1); + if (ownerToCandidate[msg.sender].length == 0) { + owners.push(msg.sender); + ownerCount++; + } + ownerToCandidate[msg.sender].push(_candidate); + voters[_candidate].push(msg.sender); + emit Propose(msg.sender, _candidate, msg.value); + } + + function vote( + address _candidate + ) external payable onlyValidVoterCap onlyValidCandidate(_candidate) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.add( + msg.value + ); + if (validatorsState[_candidate].voters[msg.sender] == 0) { + voters[_candidate].push(msg.sender); + } + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].add(msg.value); + emit Vote(msg.sender, _candidate, msg.value); + } + + function getCandidates() public view returns (address[]) { + return candidates; + } + + function getCandidateCap(address _candidate) public view returns (uint256) { + return validatorsState[_candidate].cap; + } + + function getCandidateOwner( + address _candidate + ) public view returns (address) { + return validatorsState[_candidate].owner; + } + + function getVoterCap( + address _candidate, + address _voter + ) public view returns (uint256) { + return validatorsState[_candidate].voters[_voter]; + } + + function getVoters(address _candidate) public view returns (address[]) { + return voters[_candidate]; + } + + function isCandidate(address _candidate) public view returns (bool) { + return validatorsState[_candidate].isCandidate; + } + + function getWithdrawBlockNumbers() public view returns (uint256[]) { + return withdrawsState[msg.sender].blockNumbers; + } + + function getWithdrawCap( + uint256 _blockNumber + ) public view returns (uint256) { + return withdrawsState[msg.sender].caps[_blockNumber]; + } + + function unvote( + address _candidate, + uint256 _cap + ) public onlyValidVote(_candidate, _cap) { + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( + _cap + ); + validatorsState[_candidate].voters[msg.sender] = validatorsState[ + _candidate + ].voters[msg.sender].sub(_cap); + + // refund after delay X blocks + uint256 withdrawBlockNumber = voterWithdrawDelay.add(block.number); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ + msg.sender + ].caps[withdrawBlockNumber].add(_cap); + withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); + + emit Unvote(msg.sender, _candidate, _cap); + } + + function resign( + address _candidate + ) public onlyOwner(_candidate) onlyCandidate(_candidate) { + validatorsState[_candidate].isCandidate = false; + candidateCount = candidateCount.sub(1); + for (uint256 i = 0; i < candidates.length; i++) { + if (candidates[i] == _candidate) { + address[] memory cacheArray = ownerToCandidate[msg.sender]; + uint256 cacheArrayLength = cacheArray.length; + for (uint256 j = 0; j < cacheArrayLength; j++) { + if (cacheArray[j] == _candidate) { + delete cacheArray[j]; + } + } + ownerToCandidate[msg.sender] = removeZeroAddresses(cacheArray); + if (ownerToCandidate[msg.sender].length == 0) { + ownerCount--; + } + delete candidates[i]; + break; + } + } + candidates = removeZeroAddresses(candidates); + uint256 cap = validatorsState[_candidate].voters[msg.sender]; + validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( + cap + ); + validatorsState[_candidate].voters[msg.sender] = 0; + // refunding after resigning X blocks + uint256 withdrawBlockNumber = candidateWithdrawDelay.add(block.number); + withdrawsState[msg.sender].caps[withdrawBlockNumber] = withdrawsState[ + msg.sender + ].caps[withdrawBlockNumber].add(cap); + withdrawsState[msg.sender].blockNumbers.push(withdrawBlockNumber); + emit Resign(msg.sender, _candidate); + } + + // voteInvalidKYC : any candidate can vote for invalid KYC i.e. a particular candidate's owner has uploaded a bad KYC. + // On securing 75% votes against an owner ( not candidate ), owner & all its candidates will lose their funds. + function voteInvalidKYC( + address _invalidCandidate + ) + public + onlyValidCandidate(msg.sender) + onlyValidCandidate(_invalidCandidate) + { + address candidateOwner = getCandidateOwner(msg.sender); + address _invalidMasternode = getCandidateOwner(_invalidCandidate); + require(!hasVotedInvalid[candidateOwner][_invalidMasternode]); + hasVotedInvalid[candidateOwner][_invalidMasternode] = true; + invalidKYCCount[_invalidMasternode] += 1; + if ( + (invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount() >= 75 + ) { + // 75% owners say that the KYC is invalid + address[] memory allMasternodes = new address[]( + candidates.length - 1 + ); + uint count = 0; + for (uint i = 0; i < candidates.length; i++) { + if (getCandidateOwner(candidates[i]) == _invalidMasternode) { + // logic to remove cap. + candidateCount = candidateCount.sub(1); + allMasternodes[count++] = candidates[i]; + delete validatorsState[candidates[i]]; + delete candidates[i]; + delete KYCString[_invalidMasternode]; + delete ownerToCandidate[_invalidMasternode]; + delete invalidKYCCount[_invalidMasternode]; + } + } + candidates = removeZeroAddresses(candidates); + for (uint k = 0; k < owners.length; k++) { + if (owners[k] == _invalidMasternode) { + delete owners[k]; + ownerCount--; + break; + } + } + owners = removeZeroAddresses(owners); + emit InvalidatedNode(_invalidMasternode, allMasternodes); + } + } + + // invalidPercent : get votes against an owner in percentage. + function invalidPercent( + address _invalidCandidate + ) public view onlyValidCandidate(_invalidCandidate) returns (uint) { + address _invalidMasternode = getCandidateOwner(_invalidCandidate); + return ((invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount()); + } + + // getOwnerCount : get count of total owners; accounts who own atleast one masternode. + function getOwnerCount() public view returns (uint) { + return ownerCount; + } + + // getKYC : get KYC uploaded of the owner of the given masternode or the owner themselves + function getLatestKYC(address _address) public view returns (string) { + if (isCandidate(_address)) { + return + KYCString[getCandidateOwner(_address)][ + KYCString[getCandidateOwner(_address)].length - 1 + ]; + } else { + return KYCString[_address][KYCString[_address].length - 1]; + } + } + + function getHashCount(address _address) public view returns (uint) { + return KYCString[_address].length; + } + + function withdraw( + uint256 _blockNumber, + uint _index + ) public onlyValidWithdraw(_blockNumber, _index) { + uint256 cap = withdrawsState[msg.sender].caps[_blockNumber]; + delete withdrawsState[msg.sender].caps[_blockNumber]; + delete withdrawsState[msg.sender].blockNumbers[_index]; + msg.sender.transfer(cap); + emit Withdraw(msg.sender, _blockNumber, cap); + } + + function removeZeroAddresses( + address[] memory addresses + ) private pure returns (address[] memory) { + address[] memory newAddresses = new address[](addresses.length); + uint256 j = 0; + for (uint256 i = 0; i < addresses.length; i++) { + if (addresses[i] != address(0)) { + newAddresses[j] = addresses[i]; + j++; + } + } + // Resize the array. + assembly { + mstore(newAddresses, j) + } + return newAddresses; + } +} From 7d3fc1fc8b11754a6f60b8b956aec37fd2df67d8 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 6 Mar 2024 20:39:10 +0400 Subject: [PATCH 071/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 0dd2c1e5d6d4..c5f1f283bc61 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,6 +47,8 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; + mapping(address => bool) public withdrawInvalid; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); @@ -98,6 +100,7 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { + require(!withdrawInvalid[msg.sender]); require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); @@ -309,6 +312,8 @@ contract XDCValidator { address[] memory allMasternodes = new address[]( candidates.length - 1 ); + //make the masternode invalid + withdrawInvalid[_invalidMasternode] = true; uint count = 0; for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _invalidMasternode) { From eeee36c807cbe4dc5fca39f7f7f8f51f7374a485 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:20:22 +0400 Subject: [PATCH 072/144] xdv-01 --- contracts/validator/contract/XDCValidatorV2.sol | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index c5f1f283bc61..3f15d6d4f5e4 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -320,6 +320,15 @@ contract XDCValidator { // logic to remove cap. candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; + + //delete voters[candidates[i]]; + for (uint256 y = 0; y < voters[candidates[i]].length; y++) { + //delete mapping + validatorsState[candidates[i]].voters[ + voters[candidates[i]][y] + ] = 0; + voters[candidates[i]][y] = address(0); + } delete validatorsState[candidates[i]]; delete candidates[i]; delete KYCString[_invalidMasternode]; From 0269a9930058f84b987649f8cd3dd7cb5e219c8e Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:29:34 +0400 Subject: [PATCH 073/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 3f15d6d4f5e4..0fa33ca24386 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -329,6 +329,9 @@ contract XDCValidator { ] = 0; voters[candidates[i]][y] = address(0); } + voters[candidates[i]] = removeZeroAddresses( + voters[candidates[i]] + ); delete validatorsState[candidates[i]]; delete candidates[i]; delete KYCString[_invalidMasternode]; From 57ea283d6e43b560e4a83a2b13f2c6e326bb6b3b Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:37:32 +0400 Subject: [PATCH 074/144] xdv-06 --- .../validator/contract/XDCValidatorV2.sol | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 0fa33ca24386..044b632055b5 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -272,7 +272,8 @@ contract XDCValidator { if (ownerToCandidate[msg.sender].length == 0) { ownerCount--; } - delete candidates[i]; + deleteCandidateFromArrayBySwapWithLastElement(candidates[i]); + break; } } @@ -333,7 +334,9 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - delete candidates[i]; + deleteCandidateFromArrayBySwapWithLastElement( + candidates[i] + ); delete KYCString[_invalidMasternode]; delete ownerToCandidate[_invalidMasternode]; delete invalidKYCCount[_invalidMasternode]; @@ -409,4 +412,16 @@ contract XDCValidator { } return newAddresses; } + + function deleteCandidateFromArrayBySwapWithLastElement( + address addr + ) public { + for (uint256 i = 0; i < candidates.length; i++) { + if (candidates[i] == addr) { + candidates[i] = candidates[candidates.length - 1]; + candidates.length--; + break; + } + } + } } From 9c723c610c15e4cad7bffe66767e0145762b4713 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:55:29 +0400 Subject: [PATCH 075/144] xdv-06 xdv-06 --- contracts/validator/contract/XDCValidatorV2.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 044b632055b5..1de5bd502762 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -277,7 +277,7 @@ contract XDCValidator { break; } } - candidates = removeZeroAddresses(candidates); + uint256 cap = validatorsState[_candidate].voters[msg.sender]; validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( cap @@ -342,7 +342,7 @@ contract XDCValidator { delete invalidKYCCount[_invalidMasternode]; } } - candidates = removeZeroAddresses(candidates); + for (uint k = 0; k < owners.length; k++) { if (owners[k] == _invalidMasternode) { delete owners[k]; From bc792e5b96fff4458c1abba606ba5c599973c6f1 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 14 Mar 2024 11:13:34 +0400 Subject: [PATCH 076/144] xdv-01 --- .../validator/contract/XDCValidatorV2.sol | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 1de5bd502762..cf09de87f649 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -272,12 +272,14 @@ contract XDCValidator { if (ownerToCandidate[msg.sender].length == 0) { ownerCount--; } - deleteCandidateFromArrayBySwapWithLastElement(candidates[i]); + delete candidates[i]; break; } } - + + candidates = removeZeroAddresses(candidates); + uint256 cap = validatorsState[_candidate].voters[msg.sender]; validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( cap @@ -334,15 +336,15 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - deleteCandidateFromArrayBySwapWithLastElement( - candidates[i] - ); + delete candidates[i]; delete KYCString[_invalidMasternode]; delete ownerToCandidate[_invalidMasternode]; delete invalidKYCCount[_invalidMasternode]; } } - + + candidates = removeZeroAddresses(candidates); + for (uint k = 0; k < owners.length; k++) { if (owners[k] == _invalidMasternode) { delete owners[k]; @@ -412,16 +414,4 @@ contract XDCValidator { } return newAddresses; } - - function deleteCandidateFromArrayBySwapWithLastElement( - address addr - ) public { - for (uint256 i = 0; i < candidates.length; i++) { - if (candidates[i] == addr) { - candidates[i] = candidates[candidates.length - 1]; - candidates.length--; - break; - } - } - } } From 82a30f32edce29f2d20a73c4487ecdfb003d2631 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 16 Mar 2024 18:33:13 +0400 Subject: [PATCH 077/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 61 +++++++++++++++++-- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index cf09de87f649..511e5c1dd969 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -272,14 +272,12 @@ contract XDCValidator { if (ownerToCandidate[msg.sender].length == 0) { ownerCount--; } - delete candidates[i]; + deleteCandidateFromArrayBySwapWithLastElement(candidates[i]); break; } } - candidates = removeZeroAddresses(candidates); - uint256 cap = validatorsState[_candidate].voters[msg.sender]; validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( cap @@ -347,12 +345,11 @@ contract XDCValidator { for (uint k = 0; k < owners.length; k++) { if (owners[k] == _invalidMasternode) { - delete owners[k]; + deleteOwnersFromArrayBySwapWithLastElement(owners[k]); ownerCount--; break; } } - owners = removeZeroAddresses(owners); emit InvalidatedNode(_invalidMasternode, allMasternodes); } } @@ -414,4 +411,58 @@ contract XDCValidator { } return newAddresses; } + + function removeCandidatesZeroAddresses() external { + address[] memory newAddresses = new address[](candidates.length); + uint256 j = 0; + for (uint256 i = 0; i < candidates.length; i++) { + if (candidates[i] != address(0)) { + newAddresses[j] = candidates[i]; + j++; + } + } + // Resize the array. + assembly { + mstore(newAddresses, j) + } + candidates = newAddresses; + } + + function removeOwnersZeroAddresses() external { + address[] memory newAddresses = new address[](owners.length); + uint256 j = 0; + for (uint256 i = 0; i < owners.length; i++) { + if (owners[i] != address(0)) { + newAddresses[j] = owners[i]; + j++; + } + } + // Resize the array. + assembly { + mstore(newAddresses, j) + } + owners = newAddresses; + } + + function deleteCandidateFromArrayBySwapWithLastElement( + address addr + ) public { + for (uint256 i = 0; i < candidates.length; i++) { + if (candidates[i] == addr) { + candidates[i] = candidates[candidates.length - 1]; + candidates.length--; + break; + } + } + } + + function deleteOwnersFromArrayBySwapWithLastElement(address addr) public { + for (uint256 i = 0; i < owners.length; i++) { + if (owners[i] == addr) { + owners[i] = owners[owners.length - 1]; + owners.length--; + break; + } + } + } } From c22658b44137403a9b5cf96e905492d4838fe437 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 16 Mar 2024 18:35:55 +0400 Subject: [PATCH 078/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 511e5c1dd969..de4d99839192 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -412,38 +412,6 @@ contract XDCValidator { return newAddresses; } - function removeCandidatesZeroAddresses() external { - address[] memory newAddresses = new address[](candidates.length); - uint256 j = 0; - for (uint256 i = 0; i < candidates.length; i++) { - if (candidates[i] != address(0)) { - newAddresses[j] = candidates[i]; - j++; - } - } - // Resize the array. - assembly { - mstore(newAddresses, j) - } - candidates = newAddresses; - } - - function removeOwnersZeroAddresses() external { - address[] memory newAddresses = new address[](owners.length); - uint256 j = 0; - for (uint256 i = 0; i < owners.length; i++) { - if (owners[i] != address(0)) { - newAddresses[j] = owners[i]; - j++; - } - } - // Resize the array. - assembly { - mstore(newAddresses, j) - } - owners = newAddresses; - } - function deleteCandidateFromArrayBySwapWithLastElement( address addr ) public { From ee30def300c470c00d50570906e7113b386f7ec6 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 16 Mar 2024 18:45:50 +0400 Subject: [PATCH 079/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index de4d99839192..54f0ae3b2514 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -334,15 +334,16 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - delete candidates[i]; + deleteCandidateFromArrayBySwapWithLastElement( + candidates[i] + ); delete KYCString[_invalidMasternode]; delete ownerToCandidate[_invalidMasternode]; delete invalidKYCCount[_invalidMasternode]; + break; } } - candidates = removeZeroAddresses(candidates); - for (uint k = 0; k < owners.length; k++) { if (owners[k] == _invalidMasternode) { deleteOwnersFromArrayBySwapWithLastElement(owners[k]); From bfb6e21eacf83617340db0d8000a6a7edc3e4c2f Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 16 Mar 2024 18:52:34 +0400 Subject: [PATCH 080/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 54f0ae3b2514..2d4329a39363 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -313,11 +313,11 @@ contract XDCValidator { address[] memory allMasternodes = new address[]( candidates.length - 1 ); - //make the masternode invalid - withdrawInvalid[_invalidMasternode] = true; uint count = 0; for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _invalidMasternode) { + //make the masternode invalid + withdrawInvalid[candidates[i]] = true; // logic to remove cap. candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; @@ -413,9 +413,41 @@ contract XDCValidator { return newAddresses; } + function removeCandidatesZeroAddresses() external { + address[] memory newAddresses = new address[](candidates.length); + uint256 j = 0; + for (uint256 i = 0; i < candidates.length; i++) { + if (candidates[i] != address(0)) { + newAddresses[j] = candidates[i]; + j++; + } + } + // Resize the array. + assembly { + mstore(newAddresses, j) + } + candidates = newAddresses; + } + + function removeOwnersZeroAddresses() external { + address[] memory newAddresses = new address[](owners.length); + uint256 j = 0; + for (uint256 i = 0; i < owners.length; i++) { + if (owners[i] != address(0)) { + newAddresses[j] = owners[i]; + j++; + } + } + // Resize the array. + assembly { + mstore(newAddresses, j) + } + owners = newAddresses; + } + function deleteCandidateFromArrayBySwapWithLastElement( address addr - ) public { + ) private { for (uint256 i = 0; i < candidates.length; i++) { if (candidates[i] == addr) { candidates[i] = candidates[candidates.length - 1]; @@ -425,7 +457,7 @@ contract XDCValidator { } } - function deleteOwnersFromArrayBySwapWithLastElement(address addr) public { + function deleteOwnersFromArrayBySwapWithLastElement(address addr) private { for (uint256 i = 0; i < owners.length; i++) { if (owners[i] == addr) { owners[i] = owners[owners.length - 1]; From c234eb7e25e4fdf34f91582e69a9cf924d77d34b Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 19 Mar 2024 10:27:11 +0400 Subject: [PATCH 081/144] xdv-06 --- .../validator/contract/XDCValidatorV2.sol | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 2d4329a39363..8cc09399edc6 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -259,25 +259,27 @@ contract XDCValidator { ) public onlyOwner(_candidate) onlyCandidate(_candidate) { validatorsState[_candidate].isCandidate = false; candidateCount = candidateCount.sub(1); - for (uint256 i = 0; i < candidates.length; i++) { - if (candidates[i] == _candidate) { - address[] memory cacheArray = ownerToCandidate[msg.sender]; - uint256 cacheArrayLength = cacheArray.length; - for (uint256 j = 0; j < cacheArrayLength; j++) { - if (cacheArray[j] == _candidate) { - delete cacheArray[j]; - } - } - ownerToCandidate[msg.sender] = removeZeroAddresses(cacheArray); - if (ownerToCandidate[msg.sender].length == 0) { - ownerCount--; - } - deleteCandidateFromArrayBySwapWithLastElement(candidates[i]); + deleteCandidate(_candidate); + + // Cleanup the ownerToCandidate mapping for the resigning candidate's owner + address[] storage ownedCandidates = ownerToCandidate[msg.sender]; + uint256 ownedCandidatesLength = ownedCandidates.length; + for (uint256 j = 0; j < ownedCandidatesLength; j++) { + if (ownedCandidates[j] == _candidate) { + ownedCandidates[j] = ownedCandidates[ownedCandidatesLength - 1]; + delete ownedCandidates[ownedCandidatesLength - 1]; + ownedCandidates.length--; // Manually decrease the array length break; } } + // Optionally, consider adjusting ownerCount if needed + if (ownedCandidates.length == 0) { + // If specific logic is needed to manage the owners array, implement here + ownerCount--; + } + uint256 cap = validatorsState[_candidate].voters[msg.sender]; validatorsState[_candidate].cap = validatorsState[_candidate].cap.sub( cap @@ -334,9 +336,9 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - deleteCandidateFromArrayBySwapWithLastElement( - candidates[i] - ); + + deleteCandidate(candidates[i]); + delete KYCString[_invalidMasternode]; delete ownerToCandidate[_invalidMasternode]; delete invalidKYCCount[_invalidMasternode]; @@ -344,13 +346,7 @@ contract XDCValidator { } } - for (uint k = 0; k < owners.length; k++) { - if (owners[k] == _invalidMasternode) { - deleteOwnersFromArrayBySwapWithLastElement(owners[k]); - ownerCount--; - break; - } - } + deleteOwner(_invalidMasternode); emit InvalidatedNode(_invalidMasternode, allMasternodes); } } @@ -445,23 +441,27 @@ contract XDCValidator { owners = newAddresses; } - function deleteCandidateFromArrayBySwapWithLastElement( - address addr - ) private { - for (uint256 i = 0; i < candidates.length; i++) { - if (candidates[i] == addr) { - candidates[i] = candidates[candidates.length - 1]; - candidates.length--; + // Efficiently remove _candidate from the candidates array + function deleteCandidate(address candidate) private { + uint256 candidatesLength = candidates.length; + for (uint256 i = 0; i < candidatesLength; i++) { + if (candidates[i] == candidate) { + candidates[i] = candidates[candidatesLength - 1]; + delete candidates[candidatesLength - 1]; + candidates.length--; // Manually decrease the array length break; } } } - function deleteOwnersFromArrayBySwapWithLastElement(address addr) private { - for (uint256 i = 0; i < owners.length; i++) { - if (owners[i] == addr) { - owners[i] = owners[owners.length - 1]; - owners.length--; + // Efficiently remove the invalid owner from the owners array + function deleteOwner(address owner) private { + uint256 ownersLength = owners.length; + for (uint k = 0; k < ownersLength; k++) { + if (owners[k] == owner) { + owners[k] = owners[ownersLength - 1]; // Swap with the last element + delete owners[ownersLength - 1]; // Delete the last element + owners.length--; // Decrease the array size break; } } From 1300f2cccb8e247484ff3119de02b886954487a3 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 20 Mar 2024 17:24:45 +0400 Subject: [PATCH 082/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 39 +++++++------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 8cc09399edc6..a4bd40cf04f1 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,8 +47,6 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - mapping(address => bool) public withdrawInvalid; - modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); @@ -100,7 +98,6 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { - require(!withdrawInvalid[msg.sender]); require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); @@ -297,19 +294,15 @@ contract XDCValidator { // voteInvalidKYC : any candidate can vote for invalid KYC i.e. a particular candidate's owner has uploaded a bad KYC. // On securing 75% votes against an owner ( not candidate ), owner & all its candidates will lose their funds. function voteInvalidKYC( - address _invalidCandidate - ) - public - onlyValidCandidate(msg.sender) - onlyValidCandidate(_invalidCandidate) - { + address _owner + ) public onlyValidCandidate(msg.sender) { address candidateOwner = getCandidateOwner(msg.sender); - address _invalidMasternode = getCandidateOwner(_invalidCandidate); - require(!hasVotedInvalid[candidateOwner][_invalidMasternode]); - hasVotedInvalid[candidateOwner][_invalidMasternode] = true; - invalidKYCCount[_invalidMasternode] += 1; + + require(!hasVotedInvalid[candidateOwner][_owner]); + hasVotedInvalid[candidateOwner][_owner] = true; + invalidKYCCount[_owner] += 1; if ( - (invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount() >= 75 + (invalidKYCCount[_owner] * 100) / getOwnerCount() >= 75 ) { // 75% owners say that the KYC is invalid address[] memory allMasternodes = new address[]( @@ -317,9 +310,7 @@ contract XDCValidator { ); uint count = 0; for (uint i = 0; i < candidates.length; i++) { - if (getCandidateOwner(candidates[i]) == _invalidMasternode) { - //make the masternode invalid - withdrawInvalid[candidates[i]] = true; + if (getCandidateOwner(candidates[i]) == _owner) { // logic to remove cap. candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; @@ -339,15 +330,15 @@ contract XDCValidator { deleteCandidate(candidates[i]); - delete KYCString[_invalidMasternode]; - delete ownerToCandidate[_invalidMasternode]; - delete invalidKYCCount[_invalidMasternode]; + delete KYCString[_owner]; + delete ownerToCandidate[_owner]; + delete invalidKYCCount[_owner]; break; } } - deleteOwner(_invalidMasternode); - emit InvalidatedNode(_invalidMasternode, allMasternodes); + deleteOwner(_owner); + emit InvalidatedNode(_owner, allMasternodes); } } @@ -355,8 +346,8 @@ contract XDCValidator { function invalidPercent( address _invalidCandidate ) public view onlyValidCandidate(_invalidCandidate) returns (uint) { - address _invalidMasternode = getCandidateOwner(_invalidCandidate); - return ((invalidKYCCount[_invalidMasternode] * 100) / getOwnerCount()); + address _owner = getCandidateOwner(_invalidCandidate); + return ((invalidKYCCount[_owner] * 100) / getOwnerCount()); } // getOwnerCount : get count of total owners; accounts who own atleast one masternode. From 26ad555a9d1f3cf20366190089d97e48f5380e8e Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:19:39 +0400 Subject: [PATCH 083/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index a4bd40cf04f1..012d72a2dc62 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,6 +47,8 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; + mapping(address => bool) public invalidOwner; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); @@ -98,6 +100,7 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { + require(!invalidOwner[msg.sender]); require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); @@ -301,9 +304,7 @@ contract XDCValidator { require(!hasVotedInvalid[candidateOwner][_owner]); hasVotedInvalid[candidateOwner][_owner] = true; invalidKYCCount[_owner] += 1; - if ( - (invalidKYCCount[_owner] * 100) / getOwnerCount() >= 75 - ) { + if ((invalidKYCCount[_owner] * 100) / getOwnerCount() >= 75) { // 75% owners say that the KYC is invalid address[] memory allMasternodes = new address[]( candidates.length - 1 @@ -311,6 +312,8 @@ contract XDCValidator { uint count = 0; for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { + //set owner is invalid + invalidOwner[_owner] = true; // logic to remove cap. candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; From 8d49ab644cbf39d2643f601b282f9e22a249cb97 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 20 Mar 2024 18:20:45 +0400 Subject: [PATCH 084/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 012d72a2dc62..2b7288d315f6 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -310,10 +310,10 @@ contract XDCValidator { candidates.length - 1 ); uint count = 0; + //set owner is invalid + invalidOwner[_owner] = true; for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { - //set owner is invalid - invalidOwner[_owner] = true; // logic to remove cap. candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; From 52a6ecb76daa4c0830c610c83c328f1221612fe0 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:24:27 +0400 Subject: [PATCH 085/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 2b7288d315f6..4125a2ea4a85 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,7 +47,7 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - mapping(address => bool) public invalidOwner; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate @@ -100,7 +100,7 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { - require(!invalidOwner[msg.sender]); + require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); @@ -310,8 +310,7 @@ contract XDCValidator { candidates.length - 1 ); uint count = 0; - //set owner is invalid - invalidOwner[_owner] = true; + for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { // logic to remove cap. From 82eb0139c0277505b09f486911d106361785e9e6 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:27:01 +0400 Subject: [PATCH 086/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 4125a2ea4a85..44d21b028ac0 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,8 +47,6 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - - modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap); @@ -100,7 +98,6 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { - require(_blockNumber > 0); require(block.number >= _blockNumber); require(withdrawsState[msg.sender].caps[_blockNumber] > 0); @@ -310,7 +307,7 @@ contract XDCValidator { candidates.length - 1 ); uint count = 0; - + for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { // logic to remove cap. @@ -346,9 +343,8 @@ contract XDCValidator { // invalidPercent : get votes against an owner in percentage. function invalidPercent( - address _invalidCandidate - ) public view onlyValidCandidate(_invalidCandidate) returns (uint) { - address _owner = getCandidateOwner(_invalidCandidate); + address _owner + ) public view onlyValidCandidate(_owner) returns (uint) { return ((invalidKYCCount[_owner] * 100) / getOwnerCount()); } From 56af003613cde6750cd682e3e4ac161cde27f190 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:38:06 +0400 Subject: [PATCH 087/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 44d21b028ac0..bd253abefee6 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -307,7 +307,8 @@ contract XDCValidator { candidates.length - 1 ); uint count = 0; - + uint j = 0; + address[] memory newCandidates = new address[](candidates.length); for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { // logic to remove cap. @@ -326,15 +327,16 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - - deleteCandidate(candidates[i]); - + delete KYCString[_owner]; delete ownerToCandidate[_owner]; delete invalidKYCCount[_owner]; - break; + } else { + newCandidates[j++] = candidates[i]; } } + candidates = newCandidates; + candidates.length = j; deleteOwner(_owner); emit InvalidatedNode(_owner, allMasternodes); From 3c0572c9423e8cb3e38643a73dc804da87f2b024 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 22 Mar 2024 08:31:52 +0400 Subject: [PATCH 088/144] upgrade solidity version to 0.4.26 and add revert mssage --- .../validator/contract/XDCValidatorV2.sol | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index bd253abefee6..901e3cdf3c79 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.21; +pragma solidity ^0.4.26; import "./libs/SafeMath.sol"; @@ -49,60 +49,81 @@ contract XDCValidator { modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate - require(msg.value >= minCandidateCap); + require(msg.value >= minCandidateCap, "Invalid Candidate Cap"); _; } modifier onlyValidVoterCap() { - require(msg.value >= minVoterCap); + require(msg.value >= minVoterCap, "Invalid Voter Cap"); _; } modifier onlyKYCWhitelisted() { require( KYCString[msg.sender].length != 0 || - ownerToCandidate[msg.sender].length > 0 + ownerToCandidate[msg.sender].length > 0, + "KYC not uploaded" ); _; } modifier onlyOwner(address _candidate) { - require(validatorsState[_candidate].owner == msg.sender); + require( + validatorsState[_candidate].owner == msg.sender, + "Only owner can call this function" + ); _; } modifier onlyCandidate(address _candidate) { - require(validatorsState[_candidate].isCandidate); + require( + validatorsState[_candidate].isCandidate, + "Only candidate can call this function" + ); _; } modifier onlyValidCandidate(address _candidate) { - require(validatorsState[_candidate].isCandidate); + require(validatorsState[_candidate].isCandidate, "Invalid Candidate"); _; } modifier onlyNotCandidate(address _candidate) { - require(!validatorsState[_candidate].isCandidate); + require( + !validatorsState[_candidate].isCandidate, + "Already a candidate" + ); _; } modifier onlyValidVote(address _candidate, uint256 _cap) { - require(validatorsState[_candidate].voters[msg.sender] >= _cap); + require( + validatorsState[_candidate].voters[msg.sender] >= _cap, + "Invalid Vote" + ); if (validatorsState[_candidate].owner == msg.sender) { require( validatorsState[_candidate].voters[msg.sender].sub(_cap) >= - minCandidateCap + minCandidateCap, + "Minimum cap should be maintained" ); } _; } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { - require(_blockNumber > 0); - require(block.number >= _blockNumber); - require(withdrawsState[msg.sender].caps[_blockNumber] > 0); + require(_blockNumber > 0, "Invalid block number"); + require( + block.number >= _blockNumber, + "Block number should be less than current block number" + ); require( - withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber + withdrawsState[msg.sender].caps[_blockNumber] > 0, + "No cap to withdraw" + ); + require( + withdrawsState[msg.sender].blockNumbers[_index] == _blockNumber, + "Invalid index" ); _; } @@ -298,7 +319,7 @@ contract XDCValidator { ) public onlyValidCandidate(msg.sender) { address candidateOwner = getCandidateOwner(msg.sender); - require(!hasVotedInvalid[candidateOwner][_owner]); + require(!hasVotedInvalid[candidateOwner][_owner], "Already voted"); hasVotedInvalid[candidateOwner][_owner] = true; invalidKYCCount[_owner] += 1; if ((invalidKYCCount[_owner] * 100) / getOwnerCount() >= 75) { @@ -327,7 +348,7 @@ contract XDCValidator { voters[candidates[i]] ); delete validatorsState[candidates[i]]; - + delete KYCString[_owner]; delete ownerToCandidate[_owner]; delete invalidKYCCount[_owner]; From 4b9367bb7242936523032ca53c0249bea4ce3c07 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:26:00 +0400 Subject: [PATCH 089/144] change constructor --- contracts/validator/contract/XDCValidatorV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 901e3cdf3c79..0553e14af76a 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -128,7 +128,7 @@ contract XDCValidator { _; } - function XDCValidator( + constructor( address[] _candidates, uint256[] _caps, address _firstOwner, From 4891d4569490f3a9e2ec6bf8a3c1d7ac3105b22f Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:54:54 +0400 Subject: [PATCH 090/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 0553e14af76a..5f2a43545ae2 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -356,6 +356,7 @@ contract XDCValidator { newCandidates[j++] = candidates[i]; } } + newCandidates = removeZeroAddresses(newCandidates); candidates = newCandidates; candidates.length = j; From bfcde8535db96f3cb23de23a88a19145c56960f7 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:57:25 +0400 Subject: [PATCH 091/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 5f2a43545ae2..89254eacc8fe 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -47,6 +47,8 @@ contract XDCValidator { uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; + mapping(address => bool) public invalidOwner; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap, "Invalid Candidate Cap"); @@ -112,6 +114,7 @@ contract XDCValidator { } modifier onlyValidWithdraw(uint256 _blockNumber, uint _index) { + require(!invalidOwner[msg.sender], "Invalid Owner"); require(_blockNumber > 0, "Invalid block number"); require( block.number >= _blockNumber, @@ -330,6 +333,7 @@ contract XDCValidator { uint count = 0; uint j = 0; address[] memory newCandidates = new address[](candidates.length); + invalidOwner[_owner] = true; for (uint i = 0; i < candidates.length; i++) { if (getCandidateOwner(candidates[i]) == _owner) { // logic to remove cap. From 11fc4509903d1e88e92f5ea3c0d549a12ba298e4 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:00:24 +0400 Subject: [PATCH 092/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 89254eacc8fe..8ae61deb92fb 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -360,6 +360,7 @@ contract XDCValidator { newCandidates[j++] = candidates[i]; } } + newCandidates = removeZeroAddresses(newCandidates); candidates = newCandidates; candidates.length = j; @@ -479,6 +480,7 @@ contract XDCValidator { owners[k] = owners[ownersLength - 1]; // Swap with the last element delete owners[ownersLength - 1]; // Delete the last element owners.length--; // Decrease the array size + ownerCount--; // Decrease the owner count break; } } From c942df0b9dff60a420b903aa2f0422f3e96f0fbf Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:03:40 +0400 Subject: [PATCH 093/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 8ae61deb92fb..256068139fea 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -340,17 +340,18 @@ contract XDCValidator { candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; - //delete voters[candidates[i]]; - for (uint256 y = 0; y < voters[candidates[i]].length; y++) { - //delete mapping - validatorsState[candidates[i]].voters[ - voters[candidates[i]][y] - ] = 0; - voters[candidates[i]][y] = address(0); - } - voters[candidates[i]] = removeZeroAddresses( - voters[candidates[i]] - ); + //delete voters[candidates[i]]; in blacklist no need use in the future + // for (uint256 y = 0; y < voters[candidates[i]].length; y++) { + // //delete mapping + // validatorsState[candidates[i]].voters[ + // voters[candidates[i]][y] + // ] = 0; + // voters[candidates[i]][y] = address(0); + // } + // voters[candidates[i]] = removeZeroAddresses( + // voters[candidates[i]] + // ); + delete validatorsState[candidates[i]]; delete KYCString[_owner]; From 8ae4f5cec40c1e6eec5badc545063b3ecc4e19cd Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:11:33 +0400 Subject: [PATCH 094/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 256068139fea..bd14655a3566 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -49,6 +49,8 @@ contract XDCValidator { mapping(address => bool) public invalidOwner; + mapping(address => bool) public invalidCandidate; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap, "Invalid Candidate Cap"); @@ -91,6 +93,7 @@ contract XDCValidator { } modifier onlyNotCandidate(address _candidate) { + require(!invalidCandidate[_candidate], "Invalid Candidate"); require( !validatorsState[_candidate].isCandidate, "Already a candidate" @@ -340,6 +343,7 @@ contract XDCValidator { candidateCount = candidateCount.sub(1); allMasternodes[count++] = candidates[i]; + invalidCandidate[candidates[i]] = true; //delete voters[candidates[i]]; in blacklist no need use in the future // for (uint256 y = 0; y < voters[candidates[i]].length; y++) { // //delete mapping @@ -351,7 +355,7 @@ contract XDCValidator { // voters[candidates[i]] = removeZeroAddresses( // voters[candidates[i]] // ); - + delete validatorsState[candidates[i]]; delete KYCString[_owner]; From b60b93bb16d3ac33ed8bf68d9aebcbe6090080eb Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:20:54 +0400 Subject: [PATCH 095/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index bd14655a3566..b5e4547ea386 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -366,7 +366,10 @@ contract XDCValidator { } } - newCandidates = removeZeroAddresses(newCandidates); + // Resize the array. + assembly { + mstore(newCandidates, j) + } candidates = newCandidates; candidates.length = j; From 40c8b4f14bafddf4fb924ca3080c0ce43ed019e3 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 26 Mar 2024 09:16:34 +0400 Subject: [PATCH 096/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index b5e4547ea386..8ee9ec9d414b 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -301,7 +301,7 @@ contract XDCValidator { // Optionally, consider adjusting ownerCount if needed if (ownedCandidates.length == 0) { // If specific logic is needed to manage the owners array, implement here - ownerCount--; + deleteOwner(msg.sender); } uint256 cap = validatorsState[_candidate].voters[msg.sender]; @@ -371,7 +371,6 @@ contract XDCValidator { mstore(newCandidates, j) } candidates = newCandidates; - candidates.length = j; deleteOwner(_owner); emit InvalidatedNode(_owner, allMasternodes); From 758954880a808bc047a9a201539a16bd2ad88642 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 17 Apr 2024 11:41:06 +0400 Subject: [PATCH 097/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 8ee9ec9d414b..961bc6f04e92 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -51,6 +51,8 @@ contract XDCValidator { mapping(address => bool) public invalidCandidate; + mapping(string => uint256) public validKYCCount; + modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate require(msg.value >= minCandidateCap, "Invalid Candidate Cap"); @@ -168,9 +170,20 @@ contract XDCValidator { } // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. - function uploadKYC(string kychash) external { - KYCString[msg.sender].push(kychash); - emit UploadedKYC(msg.sender, kychash); + function uploadKYC(address owner, string kychash) private { + KYCString[owner].push(kychash); + emit UploadedKYC(owner, kychash); + } + + // voteValidKYC : any candidate can vote for valid KYC i.e. a particular candidate's owner has uploaded a valid KYC. + function voteValidKYC( + address owner, + string kychash + ) public onlyValidCandidate(msg.sender) { + validKYCCount[kychash]++; + if ((validKYCCount[kychash] * 100) / getOwnerCount() >= 75) { + uploadKYC(owner, kychash); + } } // propose : any non-candidate who has uploaded its KYC can become an owner by proposing a candidate. From 841e6d7860024351a00ceb28d2402b2d91a81bcb Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 18 Apr 2024 12:23:36 +0400 Subject: [PATCH 098/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 961bc6f04e92..df6780e147eb 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -51,7 +51,9 @@ contract XDCValidator { mapping(address => bool) public invalidCandidate; - mapping(string => uint256) public validKYCCount; + mapping(address => mapping(string => uint256)) public validKYCCount; + + mapping(address => mapping(address => bool)) public hasVotedValid; modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate @@ -180,8 +182,11 @@ contract XDCValidator { address owner, string kychash ) public onlyValidCandidate(msg.sender) { - validKYCCount[kychash]++; - if ((validKYCCount[kychash] * 100) / getOwnerCount() >= 75) { + address candidateOwner = getCandidateOwner(msg.sender); + require(!hasVotedValid[candidateOwner][owner], "Already voted"); + hasVotedValid[candidateOwner][owner] = true; + validKYCCount[owner][kychash]++; + if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { uploadKYC(owner, kychash); } } From 0f93139b0394671f0e2c7ee9568e01d50a67cf5b Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 18 Apr 2024 12:24:34 +0400 Subject: [PATCH 099/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index df6780e147eb..fafe76b3efca 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -53,7 +53,8 @@ contract XDCValidator { mapping(address => mapping(string => uint256)) public validKYCCount; - mapping(address => mapping(address => bool)) public hasVotedValid; + mapping(address => mapping(address => mapping(string => bool))) + public hasVotedValid; modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate @@ -183,8 +184,11 @@ contract XDCValidator { string kychash ) public onlyValidCandidate(msg.sender) { address candidateOwner = getCandidateOwner(msg.sender); - require(!hasVotedValid[candidateOwner][owner], "Already voted"); - hasVotedValid[candidateOwner][owner] = true; + require( + !hasVotedValid[candidateOwner][owner][kychash], + "Already voted" + ); + hasVotedValid[candidateOwner][owner][kychash] = true; validKYCCount[owner][kychash]++; if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { uploadKYC(owner, kychash); From 86fa3cc274ce5dacbb4d2ac0277d766c9da4a353 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:12:04 +0400 Subject: [PATCH 100/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index fafe76b3efca..b771532059fa 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -93,6 +93,7 @@ contract XDCValidator { } modifier onlyValidCandidate(address _candidate) { + require(!invalidCandidate[_candidate], "Invalid Candidate"); require(validatorsState[_candidate].isCandidate, "Invalid Candidate"); _; } From 9137b88ff148eecdd8e77164e5d43b4c1515a9be Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 24 Apr 2024 11:01:58 +0400 Subject: [PATCH 101/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index b771532059fa..104fc7464a98 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -189,6 +189,7 @@ contract XDCValidator { !hasVotedValid[candidateOwner][owner][kychash], "Already voted" ); + require(!invalidCandidate[owner], "Invalid owner"); hasVotedValid[candidateOwner][owner][kychash] = true; validKYCCount[owner][kychash]++; if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { From a3aafb2870281179113dcd0b5452fb32a02dcd93 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 26 Apr 2024 13:22:30 +0400 Subject: [PATCH 102/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 104fc7464a98..329f5c3e74ad 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -51,10 +51,9 @@ contract XDCValidator { mapping(address => bool) public invalidCandidate; - mapping(address => mapping(string => uint256)) public validKYCCount; + mapping(address => mapping(string => uint256)) validKYCCount; - mapping(address => mapping(address => mapping(string => bool))) - public hasVotedValid; + mapping(address => mapping(address => mapping(string => bool))) hasVotedValid; modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate @@ -93,6 +92,7 @@ contract XDCValidator { } modifier onlyValidCandidate(address _candidate) { + require(!invalidOwner[_candidate], "Invalid Owner"); require(!invalidCandidate[_candidate], "Invalid Candidate"); require(validatorsState[_candidate].isCandidate, "Invalid Candidate"); _; @@ -183,13 +183,13 @@ contract XDCValidator { function voteValidKYC( address owner, string kychash - ) public onlyValidCandidate(msg.sender) { + ) public onlyValidCandidate(msg.sender) onlyValidCandidate(owner) { address candidateOwner = getCandidateOwner(msg.sender); require( !hasVotedValid[candidateOwner][owner][kychash], "Already voted" ); - require(!invalidCandidate[owner], "Invalid owner"); + hasVotedValid[candidateOwner][owner][kychash] = true; validKYCCount[owner][kychash]++; if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { From 23b4eaf54b6a547e547d78190a1d828d642509a6 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sun, 28 Apr 2024 16:39:54 +0400 Subject: [PATCH 103/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 329f5c3e74ad..0be1a89d8048 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -92,7 +92,6 @@ contract XDCValidator { } modifier onlyValidCandidate(address _candidate) { - require(!invalidOwner[_candidate], "Invalid Owner"); require(!invalidCandidate[_candidate], "Invalid Candidate"); require(validatorsState[_candidate].isCandidate, "Invalid Candidate"); _; @@ -183,8 +182,11 @@ contract XDCValidator { function voteValidKYC( address owner, string kychash - ) public onlyValidCandidate(msg.sender) onlyValidCandidate(owner) { + ) public onlyValidCandidate(msg.sender) { + require(!invalidOwner[owner], "Invalid Owner"); + require(!invalidCandidate[owner], "Invalid Candidate"); address candidateOwner = getCandidateOwner(msg.sender); + require( !hasVotedValid[candidateOwner][owner][kychash], "Already voted" From bf833e410ec39f9ac353b7142ce8ec1a7f9b38cf Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 6 May 2024 15:49:34 +0400 Subject: [PATCH 104/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 0be1a89d8048..513634437050 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -518,4 +518,14 @@ contract XDCValidator { } } } + + // isOwner : check if the given address is an owner or not. + function isOwner(address owner) public view returns (bool) { + for (uint i = 0; i < owners.length; i++) { + if (owners[i] == owner) { + return true; + } + } + return false; + } } From d77ccfdee308555155e0f611d6b7f137f89c35d2 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sun, 12 May 2024 09:54:58 +0400 Subject: [PATCH 105/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 513634437050..bf733ca08626 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -173,7 +173,7 @@ contract XDCValidator { } // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. - function uploadKYC(address owner, string kychash) private { + function approveKYC(address owner, string kychash) private { KYCString[owner].push(kychash); emit UploadedKYC(owner, kychash); } @@ -195,7 +195,7 @@ contract XDCValidator { hasVotedValid[candidateOwner][owner][kychash] = true; validKYCCount[owner][kychash]++; if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { - uploadKYC(owner, kychash); + approveKYC(owner, kychash); } } From 4ed9a55c380b4d715396dbaf5bdf66f730e890f6 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 14 May 2024 15:52:08 +0400 Subject: [PATCH 106/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index bf733ca08626..701f416de522 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -166,9 +166,7 @@ contract XDCValidator { }); voters[_candidates[i]].push(_firstOwner); ownerToCandidate[_firstOwner].push(_candidates[i]); - validatorsState[_candidates[i]].voters[ - _firstOwner - ] = minCandidateCap; + validatorsState[_candidates[i]].voters[_firstOwner] = _caps[i]; } } From 1032572e08ae718b836042d66537beea9b40e1a2 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 14 May 2024 15:52:34 +0400 Subject: [PATCH 107/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 701f416de522..e981cc4f9017 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -368,17 +368,6 @@ contract XDCValidator { allMasternodes[count++] = candidates[i]; invalidCandidate[candidates[i]] = true; - //delete voters[candidates[i]]; in blacklist no need use in the future - // for (uint256 y = 0; y < voters[candidates[i]].length; y++) { - // //delete mapping - // validatorsState[candidates[i]].voters[ - // voters[candidates[i]][y] - // ] = 0; - // voters[candidates[i]][y] = address(0); - // } - // voters[candidates[i]] = removeZeroAddresses( - // voters[candidates[i]] - // ); delete validatorsState[candidates[i]]; From 45998211463c3449001285d00f4d84acd7f52393 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 17 May 2024 08:33:17 +0400 Subject: [PATCH 108/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index e981cc4f9017..b76ce6cf5f85 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -362,20 +362,21 @@ contract XDCValidator { address[] memory newCandidates = new address[](candidates.length); invalidOwner[_owner] = true; for (uint i = 0; i < candidates.length; i++) { - if (getCandidateOwner(candidates[i]) == _owner) { + address candidate = candidates[i]; + if (getCandidateOwner(candidate) == _owner) { // logic to remove cap. candidateCount = candidateCount.sub(1); - allMasternodes[count++] = candidates[i]; + allMasternodes[count++] = candidate; - invalidCandidate[candidates[i]] = true; + invalidCandidate[candidate] = true; - delete validatorsState[candidates[i]]; + delete validatorsState[candidate]; delete KYCString[_owner]; delete ownerToCandidate[_owner]; delete invalidKYCCount[_owner]; } else { - newCandidates[j++] = candidates[i]; + newCandidates[j++] = candidate; } } From e4bfdd7d5ac4d905d988900af3f7bf4a0ef869ee Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 17 May 2024 08:35:50 +0400 Subject: [PATCH 109/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index b76ce6cf5f85..a366a35eced1 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -46,13 +46,13 @@ contract XDCValidator { uint256 public maxValidatorNumber; uint256 public candidateWithdrawDelay; uint256 public voterWithdrawDelay; - + // owner => invalid mapping(address => bool) public invalidOwner; - + // candaite => invalid mapping(address => bool) public invalidCandidate; - + // candidate => kyc => voted count mapping(address => mapping(string => uint256)) validKYCCount; - + // voter owner => kyc owner => kyc => voted mapping(address => mapping(address => mapping(string => bool))) hasVotedValid; modifier onlyValidCandidateCap() { From 67d04e1efcc1e895f70d9c3eebd44036d31b0cd3 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 11 Jun 2024 15:58:19 +0400 Subject: [PATCH 110/144] Update XDCValidatorV2.sol --- .../validator/contract/XDCValidatorV2.sol | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index a366a35eced1..fcac4da280ea 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -50,10 +50,13 @@ contract XDCValidator { mapping(address => bool) public invalidOwner; // candaite => invalid mapping(address => bool) public invalidCandidate; - // candidate => kyc => voted count - mapping(address => mapping(string => uint256)) validKYCCount; - // voter owner => kyc owner => kyc => voted - mapping(address => mapping(address => mapping(string => bool))) hasVotedValid; + + struct PendingKYCState { + uint256 blockNumber; + string kycHash; + } + + mapping(address => PendingKYCState) public pendingKYC; modifier onlyValidCandidateCap() { // anyone can deposit X XDC to become a candidate @@ -170,31 +173,23 @@ contract XDCValidator { } } - // uploadKYC : anyone can upload a KYC; its not equivalent to becoming an owner. - function approveKYC(address owner, string kychash) private { - KYCString[owner].push(kychash); - emit UploadedKYC(owner, kychash); + function uplodaKYC(string kychash) external { + pendingKYC[msg.sender] = PendingKYCState({ + blockNumber: block.number, + kycHash: kychash + }); } - // voteValidKYC : any candidate can vote for valid KYC i.e. a particular candidate's owner has uploaded a valid KYC. - function voteValidKYC( - address owner, - string kychash - ) public onlyValidCandidate(msg.sender) { - require(!invalidOwner[owner], "Invalid Owner"); - require(!invalidCandidate[owner], "Invalid Candidate"); - address candidateOwner = getCandidateOwner(msg.sender); + function claimKYC() external { + string memory kychash = pendingKYC[msg.sender].kycHash; + uint256 blockNumber = pendingKYC[msg.sender].blockNumber; + require(bytes(kychash).length > 0, "No KYC uploaded"); + require(block.number > blockNumber + 10 * 43200, "No KYC uploaded"); - require( - !hasVotedValid[candidateOwner][owner][kychash], - "Already voted" - ); + pendingKYC[msg.sender].blockNumber = 0; + pendingKYC[msg.sender].kycHash = ""; - hasVotedValid[candidateOwner][owner][kychash] = true; - validKYCCount[owner][kychash]++; - if ((validKYCCount[owner][kychash] * 100) / getOwnerCount() >= 75) { - approveKYC(owner, kychash); - } + emit UploadedKYC(msg.sender, kychash); } // propose : any non-candidate who has uploaded its KYC can become an owner by proposing a candidate. From 73b637da107aac7664219820c49ec773cda4338d Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 11 Jun 2024 18:39:46 +0400 Subject: [PATCH 111/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index fcac4da280ea..a9efd0b92f45 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -184,7 +184,10 @@ contract XDCValidator { string memory kychash = pendingKYC[msg.sender].kycHash; uint256 blockNumber = pendingKYC[msg.sender].blockNumber; require(bytes(kychash).length > 0, "No KYC uploaded"); - require(block.number > blockNumber + 10 * 43200, "No KYC uploaded"); + require( + block.number > blockNumber + 10 * 43200, + "KYC not verified yet" + ); pendingKYC[msg.sender].blockNumber = 0; pendingKYC[msg.sender].kycHash = ""; From 217dc1b4002f83bab8a3efe76ded27a595249639 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 22 Jun 2024 09:45:07 +0400 Subject: [PATCH 112/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index a9efd0b92f45..808b0314ddb0 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -359,6 +359,9 @@ contract XDCValidator { uint j = 0; address[] memory newCandidates = new address[](candidates.length); invalidOwner[_owner] = true; + pendingKYC[_owner].blockNumber = 0; + pendingKYC[_owner].kycHash = ""; + for (uint i = 0; i < candidates.length; i++) { address candidate = candidates[i]; if (getCandidateOwner(candidate) == _owner) { From f654e1f3fcc2b21a5782d694af8bc35e31ba8584 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:24:36 +0400 Subject: [PATCH 113/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 808b0314ddb0..2c1ee575929f 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -174,6 +174,7 @@ contract XDCValidator { } function uplodaKYC(string kychash) external { + require(!invalidOwner[msg.sender], "Invalid Owner"); pendingKYC[msg.sender] = PendingKYCState({ blockNumber: block.number, kycHash: kychash @@ -361,7 +362,7 @@ contract XDCValidator { invalidOwner[_owner] = true; pendingKYC[_owner].blockNumber = 0; pendingKYC[_owner].kycHash = ""; - + for (uint i = 0; i < candidates.length; i++) { address candidate = candidates[i]; if (getCandidateOwner(candidate) == _owner) { From 05dd01bb46c089c172882eaf72b2e7d2fe2b71c7 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:59:18 +0400 Subject: [PATCH 114/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 2c1ee575929f..b26dcca47e6b 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -173,7 +173,7 @@ contract XDCValidator { } } - function uplodaKYC(string kychash) external { + function uploadKYC(string kychash) external { require(!invalidOwner[msg.sender], "Invalid Owner"); pendingKYC[msg.sender] = PendingKYCState({ blockNumber: block.number, From bc593ee28761189f3e512188a66edff1fb215842 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 25 Jun 2024 09:30:54 +0400 Subject: [PATCH 115/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index b26dcca47e6b..6b830b434538 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -192,6 +192,7 @@ contract XDCValidator { pendingKYC[msg.sender].blockNumber = 0; pendingKYC[msg.sender].kycHash = ""; + KYCString[msg.sender].push(kychash); emit UploadedKYC(msg.sender, kychash); } From d51b8574d27d7e25b0c17181b9921c0facf1da0e Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Thu, 27 Jun 2024 11:20:25 +0400 Subject: [PATCH 116/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 6b830b434538..444c53821051 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -182,6 +182,7 @@ contract XDCValidator { } function claimKYC() external { + require(!invalidOwner[msg.sender], "Invalid Owner"); string memory kychash = pendingKYC[msg.sender].kycHash; uint256 blockNumber = pendingKYC[msg.sender].blockNumber; require(bytes(kychash).length > 0, "No KYC uploaded"); From f77eb785be9cf4c8dfea2ae5d5adc4db1c6d560e Mon Sep 17 00:00:00 2001 From: Daniel Liu Date: Mon, 1 Jul 2024 12:16:17 +0800 Subject: [PATCH 117/144] refactor function voteInvalidKYC --- .../validator/contract/XDCValidatorV2.sol | 73 +++++++++++-------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 444c53821051..56842a1efc36 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -355,43 +355,43 @@ contract XDCValidator { invalidKYCCount[_owner] += 1; if ((invalidKYCCount[_owner] * 100) / getOwnerCount() >= 75) { // 75% owners say that the KYC is invalid - address[] memory allMasternodes = new address[]( - candidates.length - 1 - ); - uint count = 0; - uint j = 0; - address[] memory newCandidates = new address[](candidates.length); invalidOwner[_owner] = true; pendingKYC[_owner].blockNumber = 0; pendingKYC[_owner].kycHash = ""; - for (uint i = 0; i < candidates.length; i++) { - address candidate = candidates[i]; - if (getCandidateOwner(candidate) == _owner) { - // logic to remove cap. - candidateCount = candidateCount.sub(1); - allMasternodes[count++] = candidate; - - invalidCandidate[candidate] = true; - - delete validatorsState[candidate]; + isOwnerNow, ownerIndex = isOwner(_owner); + if (isOwnerNow) { + uint j = 0; + uint count = 0; + address[] memory allMasternodes = new address[](candidates.length); + address[] memory newCandidates = new address[](candidates.length); + + for (uint i = 0; i < candidates.length; i++) { + address candidate = candidates[i]; + if (getCandidateOwner(candidate) == _owner) { + // logic to remove cap. + candidateCount = candidateCount.sub(1); + allMasternodes[count++] = candidate; + invalidCandidate[candidate] = true; + delete validatorsState[candidate]; + delete KYCString[_owner]; + delete ownerToCandidate[_owner]; + delete invalidKYCCount[_owner]; + } else { + newCandidates[j++] = candidate; + } + } - delete KYCString[_owner]; - delete ownerToCandidate[_owner]; - delete invalidKYCCount[_owner]; - } else { - newCandidates[j++] = candidate; + // Resize the array. + assembly { + mstore(newCandidates, j) + mstore(allMasternodes, count) } - } + candidates = newCandidates; - // Resize the array. - assembly { - mstore(newCandidates, j) + removeOwnerByIndex(ownerIndex); + emit InvalidatedNode(_owner, allMasternodes); } - candidates = newCandidates; - - deleteOwner(_owner); - emit InvalidatedNode(_owner, allMasternodes); } } @@ -512,12 +512,21 @@ contract XDCValidator { } // isOwner : check if the given address is an owner or not. - function isOwner(address owner) public view returns (bool) { + function isOwner(address owner) public view returns (bool, uint256) { for (uint i = 0; i < owners.length; i++) { if (owners[i] == owner) { - return true; + return (true, i); } } - return false; + return (false, 0); + } + + function removeOwnerByIndex(uint256 index) private { + // no need to check: index <= lastIndex + uint256 lastIndex = owners.length - 1; + owners[index] = owners[lastIndex]; + delete owners[lastIndex]; + owners.length--; + ownerCount--; } } From f73c032992d8a2f39b57e0e9b45d98802c4f686f Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 1 Jul 2024 10:12:25 +0400 Subject: [PATCH 118/144] Update XDCValidatorV2.sol --- contracts/validator/contract/XDCValidatorV2.sol | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/contract/XDCValidatorV2.sol index 56842a1efc36..f9f1d85c30b3 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/contract/XDCValidatorV2.sol @@ -359,12 +359,16 @@ contract XDCValidator { pendingKYC[_owner].blockNumber = 0; pendingKYC[_owner].kycHash = ""; - isOwnerNow, ownerIndex = isOwner(_owner); + (bool isOwnerNow, uint ownerIndex) = isOwner(_owner); if (isOwnerNow) { uint j = 0; uint count = 0; - address[] memory allMasternodes = new address[](candidates.length); - address[] memory newCandidates = new address[](candidates.length); + address[] memory allMasternodes = new address[]( + candidates.length + ); + address[] memory newCandidates = new address[]( + candidates.length + ); for (uint i = 0; i < candidates.length; i++) { address candidate = candidates[i]; From ddc265c316b02502652833ac8788025b8caca2bb Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:27:51 +0400 Subject: [PATCH 119/144] add test script --- contracts/validator/src/.env.sample | 1 + contracts/validator/src/.gitignore | 7 + contracts/validator/src/.prettierignore | 5 + contracts/validator/src/.prettierrc | 1 + contracts/validator/src/.solhint.json | 7 + contracts/validator/src/.solhintignore | 1 + contracts/validator/src/README.md | 94 ++ contracts/validator/src/abi | 856 ++++++++++++++++++ contracts/validator/src/bytecode | 1 + .../contracts/XDCValidator.sol} | 2 +- .../src/contracts/libraries/SafeMath.sol | 46 + contracts/validator/src/deployment.json | 15 + contracts/validator/src/hardhat.config.js | 34 + contracts/validator/src/image.png | Bin 0 -> 99557 bytes contracts/validator/src/package.json | 25 + .../@ethersproject+address+5.7.0.patch | 33 + .../@ethersproject+providers+5.7.2.patch | 25 + .../validator/src/scripts/deployToGenesis.js | 20 + contracts/validator/src/scripts/deployment.js | 36 + contracts/validator/src/test/xdcValidator.js | 235 +++++ 20 files changed, 1443 insertions(+), 1 deletion(-) create mode 100644 contracts/validator/src/.env.sample create mode 100644 contracts/validator/src/.gitignore create mode 100644 contracts/validator/src/.prettierignore create mode 100644 contracts/validator/src/.prettierrc create mode 100644 contracts/validator/src/.solhint.json create mode 100644 contracts/validator/src/.solhintignore create mode 100644 contracts/validator/src/README.md create mode 100644 contracts/validator/src/abi create mode 100644 contracts/validator/src/bytecode rename contracts/validator/{contract/XDCValidatorV2.sol => src/contracts/XDCValidator.sol} (99%) create mode 100644 contracts/validator/src/contracts/libraries/SafeMath.sol create mode 100644 contracts/validator/src/deployment.json create mode 100644 contracts/validator/src/hardhat.config.js create mode 100644 contracts/validator/src/image.png create mode 100644 contracts/validator/src/package.json create mode 100644 contracts/validator/src/patches/@ethersproject+address+5.7.0.patch create mode 100644 contracts/validator/src/patches/@ethersproject+providers+5.7.2.patch create mode 100644 contracts/validator/src/scripts/deployToGenesis.js create mode 100644 contracts/validator/src/scripts/deployment.js create mode 100644 contracts/validator/src/test/xdcValidator.js diff --git a/contracts/validator/src/.env.sample b/contracts/validator/src/.env.sample new file mode 100644 index 000000000000..c46db5d4065b --- /dev/null +++ b/contracts/validator/src/.env.sample @@ -0,0 +1 @@ +PRIVATE_KEY=1234567890123456789012345678901234567890123456789012345678901234 \ No newline at end of file diff --git a/contracts/validator/src/.gitignore b/contracts/validator/src/.gitignore new file mode 100644 index 000000000000..1ee02f4ea0d2 --- /dev/null +++ b/contracts/validator/src/.gitignore @@ -0,0 +1,7 @@ +.env +cache/ +artifacts/ +node_modules/ +.vscode/ +abigen +yarn.lock \ No newline at end of file diff --git a/contracts/validator/src/.prettierignore b/contracts/validator/src/.prettierignore new file mode 100644 index 000000000000..f268596e5e48 --- /dev/null +++ b/contracts/validator/src/.prettierignore @@ -0,0 +1,5 @@ +node_modules +artifacts +cache +coverage* +gasReporterOutput.json diff --git a/contracts/validator/src/.prettierrc b/contracts/validator/src/.prettierrc new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/contracts/validator/src/.prettierrc @@ -0,0 +1 @@ +{} diff --git a/contracts/validator/src/.solhint.json b/contracts/validator/src/.solhint.json new file mode 100644 index 000000000000..c2100cefc881 --- /dev/null +++ b/contracts/validator/src/.solhint.json @@ -0,0 +1,7 @@ +{ + "extends": "solhint:recommended", + "rules": { + "compiler-version": ["error", "0.4.26"], + "func-visibility": ["warn", { "ignoreConstructors": true }] + } +} diff --git a/contracts/validator/src/.solhintignore b/contracts/validator/src/.solhintignore new file mode 100644 index 000000000000..3c3629e647f5 --- /dev/null +++ b/contracts/validator/src/.solhintignore @@ -0,0 +1 @@ +node_modules diff --git a/contracts/validator/src/README.md b/contracts/validator/src/README.md new file mode 100644 index 000000000000..d11bd8c46c12 --- /dev/null +++ b/contracts/validator/src/README.md @@ -0,0 +1,94 @@ +# XDC Validator Contract + +This folder has provided scripts for: + +- Contract Building and Testing +- Contract Deployment + +## Contract Building and Testing: + +Environmental preparation + +###### Nodejs 16 or higher version + +Install dependencies + +```shell +yarn +``` + +Test + +```shell +npx hardhat compile +npx hardhat test +``` + +## Deploy contract to node genesis block + +1. run generate script to genera + +```shell +node scripts/deployToGenesis.js +``` + +2. run + +```shell +./abigen --abi abi --bin bytecode --pkg contract --type XDCValidator --out ../contract/validator.go +``` + +If you don't have `abigen`, compile it. It's in `cmd/abigen/main.go` in XDC main repo (or Geth repo). + +3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDC-Subnet"` + +## Deploy contract to node any block + +### Contract Setup: + +This step is recommended to complete in python virtual environment because it is going to use the web3 library adapted for XDC. And before running the process, it is required to performed two operations: + +1. Fill in the fields in `deployment.json` + + - `candidates`: Initial candidates + - `caps`: Initial caps, one cap for one candidate + - `firstOwner`: Owner of initial candidates + - `minCandidateCap`: Minimal value for a transaction to call propose() + - `minVoterCap`: Minimal value for a transaction to call vote() + - `maxValidatorNumber`: Never used, I don't know why XDC people write this... + - `candidateWithdrawDelay`: When you call resign() at block number x, you can only withdraw the cap at block x+candidateWithdrawDelay + - `voterWithdrawDelay`: When you call unvote() at block number x, you can only withdraw the cap at block x+voterWithdrawDelay + - `grandMasters`: List of grand masters + - `minCandidateNum`: min candidate num + - `xdcdevnet`: Targeted XDC public chain devnet, testnet or mainnet node RPC link + - `xdcsubnet`: Targeted XDC private subnet chain devnet, testnet or mainnet node RPC link + +2. Create a `.env` file which contain a valid account privatekey, check `.env.sample` for example + +### Contract Deployment: + +And get the deployed contract address + +```shell +npx hardhat run scripts/deployment.js --network xdcdevnet +``` + +## Other command + +```shell +npx hardhat accounts +npx hardhat compile +npx hardhat clean +npx hardhat test +npx hardhat node +npx hardhat help +REPORT_GAS=true npx hardhat test +npx prettier '**/*.{js,json,sol,md}' --check +npx prettier '**/*.{js,json,sol,md}' --write +npx solhint 'contracts/**/*.sol' +npx solhint 'contracts/**/*.sol' --fix +``` + +## Gas report + +![Alt text](image.png) diff --git a/contracts/validator/src/abi b/contracts/validator/src/abi new file mode 100644 index 000000000000..ecd07cc0e4bc --- /dev/null +++ b/contracts/validator/src/abi @@ -0,0 +1,856 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "propose", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "owners", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + }, + { + "name": "_cap", + "type": "uint256" + } + ], + "name": "unvote", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCandidates", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "address" + } + ], + "name": "hasVotedInvalid", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_blockNumber", + "type": "uint256" + } + ], + "name": "getWithdrawCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "uint256" + } + ], + "name": "kycString", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "uint256" + } + ], + "name": "ownerToCandidate", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "getVoters", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getWithdrawBlockNumbers", + "outputs": [ + { + "name": "", + "type": "uint256[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + }, + { + "name": "_voter", + "type": "address" + } + ], + "name": "getVoterCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "name": "getLatestKYC", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "candidates", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "validatorsState", + "outputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "isCandidate", + "type": "bool" + }, + { + "name": "cap", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_blockNumber", + "type": "uint256" + }, + { + "name": "_index", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "minCandidateNum", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getGrandMasters", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "getCandidateCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "grandMasterMap", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_invalidCandidate", + "type": "address" + } + ], + "name": "invalidPercent", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "uint256" + } + ], + "name": "voters", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "grandMasters", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "name": "getOwnerToCandidateLength", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "vote", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidKYCCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "candidateCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "voterWithdrawDelay", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "resign", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "getCandidateOwner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "name": "getHashCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "maxValidatorNumber", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "candidateWithdrawDelay", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "isCandidate", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "minCandidateCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwnerCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_invalidCandidate", + "type": "address" + } + ], + "name": "voteInvalidKYC", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "kychash", + "type": "string" + } + ], + "name": "uploadKYC", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "minVoterCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "name": "_candidates", + "type": "address[]" + }, + { + "name": "_caps", + "type": "uint256[]" + }, + { + "name": "_firstOwner", + "type": "address" + }, + { + "name": "_minCandidateCap", + "type": "uint256" + }, + { + "name": "_minVoterCap", + "type": "uint256" + }, + { + "name": "_maxValidatorNumber", + "type": "uint256" + }, + { + "name": "_candidateWithdrawDelay", + "type": "uint256" + }, + { + "name": "_voterWithdrawDelay", + "type": "uint256" + }, + { + "name": "_grandMasters", + "type": "address[]" + }, + { + "name": "_minCandidateNum", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_voter", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Vote", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_voter", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Unvote", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Propose", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + } + ], + "name": "Resign", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "_blockNumber", + "type": "uint256" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "kycHash", + "type": "string" + } + ], + "name": "UploadedKYC", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_masternodeOwner", + "type": "address" + }, + { + "indexed": false, + "name": "_masternodes", + "type": "address[]" + } + ], + "name": "InvalidatedNode", + "type": "event" + } +] \ No newline at end of file diff --git a/contracts/validator/src/bytecode b/contracts/validator/src/bytecode new file mode 100644 index 000000000000..814d09efc0be --- /dev/null +++ b/contracts/validator/src/bytecode @@ -0,0 +1 @@ +0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029 \ No newline at end of file diff --git a/contracts/validator/contract/XDCValidatorV2.sol b/contracts/validator/src/contracts/XDCValidator.sol similarity index 99% rename from contracts/validator/contract/XDCValidatorV2.sol rename to contracts/validator/src/contracts/XDCValidator.sol index f9f1d85c30b3..249b74872094 100644 --- a/contracts/validator/contract/XDCValidatorV2.sol +++ b/contracts/validator/src/contracts/XDCValidator.sol @@ -1,6 +1,6 @@ pragma solidity ^0.4.26; -import "./libs/SafeMath.sol"; +import "./libraries/SafeMath.sol"; contract XDCValidator { using SafeMath for uint256; diff --git a/contracts/validator/src/contracts/libraries/SafeMath.sol b/contracts/validator/src/contracts/libraries/SafeMath.sol new file mode 100644 index 000000000000..8c205f939a49 --- /dev/null +++ b/contracts/validator/src/contracts/libraries/SafeMath.sol @@ -0,0 +1,46 @@ +pragma solidity =0.4.26; + +/** + * @title SafeMath + * @dev Math operations with safety checks that throw on error + */ +library SafeMath { + /** + * @dev Multiplies two numbers, throws on overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + if (a == 0) { + return 0; + } + uint256 c = a * b; + assert(c / a == b); + return c; + } + + /** + * @dev Integer division of two numbers, truncating the quotient. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + // assert(b > 0); // Solidity automatically throws when dividing by 0 + // uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + return a / b; + } + + /** + * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + assert(b <= a); + return a - b; + } + + /** + * @dev Adds two numbers, throws on overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + assert(c >= a); + return c; + } +} diff --git a/contracts/validator/src/deployment.json b/contracts/validator/src/deployment.json new file mode 100644 index 000000000000..f06716fbcad7 --- /dev/null +++ b/contracts/validator/src/deployment.json @@ -0,0 +1,15 @@ +{ + "candidates": [ + "0xf0AbABbb043792D8cDAf1961c96758932189965D", + "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd" + ], + "caps": ["10000000000000000000000000", "10000000000000000000000000"], + "firstOwner": "0x662696e1f7925b68b4f6f440977d1da2b1b8d3f6", + "minCandidateCap": "10000000000000000000000000", + "minVoterCap": "25000000000000000000000", + "maxValidatorNumber": 18, + "candidateWithdrawDelay": 1296000, + "voterWithdrawDelay": 432000, + "xdcdevnet": "https://devnetstats.apothem.network/devnet", + "xdcsubnet": "https://devnetstats.apothem.network/subnet" +} diff --git a/contracts/validator/src/hardhat.config.js b/contracts/validator/src/hardhat.config.js new file mode 100644 index 000000000000..69f02229ffcf --- /dev/null +++ b/contracts/validator/src/hardhat.config.js @@ -0,0 +1,34 @@ +require("@nomiclabs/hardhat-waffle"); +require("hardhat-gas-reporter"); +require("dotenv").config(); +const deploy = require("./deployment.json"); +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: { + version: "0.4.26", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + networks: { + xdcdevnet: { + url: deploy["xdcdevnet"], + accounts: [ + process.env.PRIVATE_KEY || + "1234567890123456789012345678901234567890123456789012345678901234", + ], + }, + xdcsubnet: { + url: deploy["xdcsubnet"], + accounts: [ + process.env.PRIVATE_KEY || + "1234567890123456789012345678901234567890123456789012345678901234", + ], + }, + }, +}; diff --git a/contracts/validator/src/image.png b/contracts/validator/src/image.png new file mode 100644 index 0000000000000000000000000000000000000000..a4958a8b9ba22353b0931eec365eec50f05945aa GIT binary patch literal 99557 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

Y=nUch+OSA3dAVw_#-l=bvKLI%PwE^ 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 { + return hre.ethers.utils.parseUnits(item, 0); + }), + deploy["firstOwner"], + hre.ethers.utils.parseUnits(deploy["minCandidateCap"], 0), + hre.ethers.utils.parseUnits(deploy["minVoterCap"], 0), + deploy["maxValidatorNumber"], + deploy["candidateWithdrawDelay"], + deploy["voterWithdrawDelay"], + deploy["grandMasters"], + deploy["minCandidateNum"] + ); + + await xdcValidator.deployed(); + + console.log("xdcValidator deployed to:", xdcValidator.address); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/contracts/validator/src/test/xdcValidator.js b/contracts/validator/src/test/xdcValidator.js new file mode 100644 index 000000000000..43e8cbe21193 --- /dev/null +++ b/contracts/validator/src/test/xdcValidator.js @@ -0,0 +1,235 @@ +const { expect } = require("chai"); +const { ethers } = require("hardhat"); +const deploy = { + candidates: [ + "0xf0AbABbb043792D8cDAf1961c96758932189965D", + "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd", + "0xF5D476D1566e102d4591Fc11D93E2F0B1FB82C70", + ], + caps: ["10000000000000000000000000", "10000000000000000000000000", "100"], + minCandidateCap: "10000000000000000000000000", + minVoterCap: "25000000000000000000000", + maxValidatorNumber: 18, + candidateWithdrawDelay: 1296000, + voterWithdrawDelay: 432000, + minCandidateNum: 2, +}; +const { + loadFixture, + setBalance, + time, + mine, +} = require("@nomicfoundation/hardhat-toolbox/network-helpers"); + +describe("XDCValidator", () => { + let xdcValidator; + let master; + const fixture = async () => { + const factory = await ethers.getContractFactory("XDCValidator"); + const signer = await ethers.getSigner(); + const master = signer.address; + + const xdcValidator = await factory.deploy( + deploy["candidates"], + deploy["caps"].map((item) => { + return hre.ethers.utils.parseUnits(item, 0); + }), + master, + hre.ethers.utils.parseUnits(deploy["minCandidateCap"], 0), + hre.ethers.utils.parseUnits(deploy["minVoterCap"], 0), + deploy["maxValidatorNumber"], + deploy["candidateWithdrawDelay"], + deploy["voterWithdrawDelay"] + ); + + return { xdcValidator, master }; + }; + + beforeEach("deploy fixture", async () => { + ({ xdcValidator, master } = await loadFixture(fixture)); + }); + + describe("test xdc validator contract", () => { + it("propose", async () => { + await setBalance(master, 1e30); + const candidate = await ethers.Wallet.createRandom().getAddress(); + const minCandidateCap = hre.ethers.utils.parseUnits( + deploy["minCandidateCap"], + 0 + ); + await xdcValidator.propose(candidate, { + value: minCandidateCap, + }); + + const candidates = await xdcValidator.getCandidates(); + const voters = await xdcValidator.getVoters(candidate); + const ownerLength = await xdcValidator.getOwnerToCandidateLength(master); + const ownerToCandidates = []; + for (let i = 0; i < ownerLength; i++) { + const ownerToCandidate = await xdcValidator.ownerToCandidate(master, i); + ownerToCandidates.push(ownerToCandidate); + } + const validatorsState = await xdcValidator.validatorsState(candidate); + const voterCap = await xdcValidator.getVoterCap(candidate, master); + + expect(candidates).to.include(candidate); + expect(voters).to.include(master); + expect(ownerToCandidates).to.include(candidate); + expect(validatorsState["owner"]).to.eq(master); + expect(validatorsState["isCandidate"]).to.eq(true); + expect(validatorsState["cap"]).to.eq(minCandidateCap); + expect(voterCap).to.eq(minCandidateCap); + }); + it("resign", async () => { + await setBalance(master, 1e30); + const candidate = await ethers.Wallet.createRandom().getAddress(); + const minCandidateCap = hre.ethers.utils.parseUnits( + deploy["minCandidateCap"], + 0 + ); + await xdcValidator.propose(candidate, { + value: minCandidateCap, + }); + const candidatesBefore = await xdcValidator.getCandidates(); + + await xdcValidator.resign(candidate); + const candidates = await xdcValidator.getCandidates(); + const voters = await xdcValidator.getVoters(candidate); + const ownerLength = await xdcValidator.getOwnerToCandidateLength(master); + const ownerToCandidates = []; + for (let i = 0; i < ownerLength; i++) { + const ownerToCandidate = await xdcValidator.ownerToCandidate(master, i); + ownerToCandidates.push(ownerToCandidate); + } + const validatorsState = await xdcValidator.validatorsState(candidate); + const voterCap = await xdcValidator.getVoterCap(candidate, master); + + const before = [...deploy["candidates"]]; + before.push(candidate); + + expect(candidatesBefore).to.deep.eq(before); + expect(candidates).to.deep.eq(deploy["candidates"]); + expect(voters).to.include(master); + expect(ownerToCandidates).to.include(candidate); + expect(validatorsState["owner"]).to.eq(master); + expect(validatorsState["isCandidate"]).to.eq(false); + expect(validatorsState["cap"]).to.eq(0); + expect(voterCap).to.eq(0); + }); + it("vote", async () => { + await setBalance(master, 1e30); + const candidate = await ethers.Wallet.createRandom().getAddress(); + const minCandidateCap = hre.ethers.utils.parseUnits( + deploy["minCandidateCap"], + 0 + ); + await xdcValidator.propose(candidate, { + value: minCandidateCap, + }); + const minVoterCap = hre.ethers.utils.parseUnits(deploy["minVoterCap"], 0); + await xdcValidator.vote(candidate, { + value: minVoterCap, + }); + const candidates = await xdcValidator.getCandidates(); + const voters = await xdcValidator.getVoters(candidate); + const ownerLength = await xdcValidator.getOwnerToCandidateLength(master); + const ownerToCandidates = []; + for (let i = 0; i < ownerLength; i++) { + const ownerToCandidate = await xdcValidator.ownerToCandidate(master, i); + ownerToCandidates.push(ownerToCandidate); + } + const validatorsState = await xdcValidator.validatorsState(candidate); + const voterCap = await xdcValidator.getVoterCap(candidate, master); + + expect(candidates).to.include(candidate); + expect(voters).to.include(master); + expect(ownerToCandidates).to.include(candidate); + expect(validatorsState["owner"]).to.eq(master); + expect(validatorsState["isCandidate"]).to.eq(true); + expect(validatorsState["cap"]).to.eq(minCandidateCap.add(minVoterCap)); + expect(voterCap).to.eq(minCandidateCap.add(minVoterCap)); + }); + it("unvote", async () => { + await setBalance(master, 1e30); + const candidate = await ethers.Wallet.createRandom().getAddress(); + const minCandidateCap = hre.ethers.utils.parseUnits( + deploy["minCandidateCap"], + 0 + ); + await xdcValidator.propose(candidate, { + value: minCandidateCap, + }); + const minVoterCap = hre.ethers.utils.parseUnits(deploy["minVoterCap"], 0); + await xdcValidator.vote(candidate, { + value: minVoterCap, + }); + + const block = await time.latestBlock(); + await xdcValidator.unvote(candidate, minVoterCap); + + const candidates = await xdcValidator.getCandidates(); + const voters = await xdcValidator.getVoters(candidate); + const ownerLength = await xdcValidator.getOwnerToCandidateLength(master); + const ownerToCandidates = []; + for (let i = 0; i < ownerLength; i++) { + const ownerToCandidate = await xdcValidator.ownerToCandidate(master, i); + ownerToCandidates.push(ownerToCandidate); + } + const validatorsState = await xdcValidator.validatorsState(candidate); + const voterCap = await xdcValidator.getVoterCap(candidate, master); + const withdrawCap = await xdcValidator.getWithdrawCap( + block + deploy["voterWithdrawDelay"] + 1 + ); + expect(candidates).to.include(candidate); + expect(voters).to.include(master); + expect(ownerToCandidates).to.include(candidate); + expect(validatorsState["owner"]).to.eq(master); + expect(validatorsState["isCandidate"]).to.eq(true); + expect(validatorsState["cap"]).to.eq(minCandidateCap); + expect(voterCap).to.eq(minCandidateCap); + expect(withdrawCap).to.eq(minVoterCap); + }); + it("withdraw", async () => { + await setBalance(master, 1e30); + const candidate = await ethers.Wallet.createRandom().getAddress(); + const minCandidateCap = hre.ethers.utils.parseUnits( + deploy["minCandidateCap"], + 0 + ); + await xdcValidator.propose(candidate, { + value: minCandidateCap, + }); + const minVoterCap = hre.ethers.utils.parseUnits(deploy["minVoterCap"], 0); + await xdcValidator.vote(candidate, { + value: minVoterCap, + }); + + const block = await time.latestBlock(); + await xdcValidator.unvote(candidate, minVoterCap); + mine(deploy["voterWithdrawDelay"] + 1); + const beforeBalance = await ethers.provider.getBalance( + xdcValidator.address + ); + const withdrawCap = await xdcValidator.getWithdrawCap( + block + deploy["voterWithdrawDelay"] + 1 + ); + + await xdcValidator.withdraw(block + deploy["voterWithdrawDelay"] + 1, 0); + const afterBalance = await ethers.provider.getBalance( + xdcValidator.address + ); + expect(afterBalance).to.eq(beforeBalance.sub(withdrawCap)); + }); + it("directly resign one candidate", async () => { + const oldCandidates = await xdcValidator.getCandidates(); + + await xdcValidator.resign("0xF5D476D1566e102d4591Fc11D93E2F0B1FB82C70"); + const newCandidates = await xdcValidator.getCandidates(); + expect(oldCandidates).to.deep.eq(deploy["candidates"]); + expect(newCandidates).to.deep.eq([ + "0xf0AbABbb043792D8cDAf1961c96758932189965D", + "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd", + ]); + }); + }); +}); From 832e0899d29c314056c67b624d568c37344f0b00 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 8 Jul 2024 19:54:04 +0400 Subject: [PATCH 120/144] update --- .../contract/{XDCValidator.sol => XDCValidatorLegacy.sol} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contracts/validator/contract/{XDCValidator.sol => XDCValidatorLegacy.sol} (100%) diff --git a/contracts/validator/contract/XDCValidator.sol b/contracts/validator/contract/XDCValidatorLegacy.sol similarity index 100% rename from contracts/validator/contract/XDCValidator.sol rename to contracts/validator/contract/XDCValidatorLegacy.sol From a3216919a7b80954862297ff17d90c7c3dcd2b53 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:32:12 +0400 Subject: [PATCH 121/144] update --- .../validator/src/contracts/XDCValidator.sol | 10 ++++++-- contracts/validator/src/test/xdcValidator.js | 23 ++++++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/contracts/validator/src/contracts/XDCValidator.sol b/contracts/validator/src/contracts/XDCValidator.sol index 249b74872094..893fba7e56dc 100644 --- a/contracts/validator/src/contracts/XDCValidator.sol +++ b/contracts/validator/src/contracts/XDCValidator.sol @@ -27,8 +27,8 @@ contract XDCValidator { mapping(address => WithdrawState) withdrawsState; - mapping(address => ValidatorState) validatorsState; - mapping(address => address[]) voters; + mapping(address => ValidatorState) public validatorsState; + mapping(address => address[]) public voters; // Mapping structures added for KYC feature. mapping(address => string[]) public KYCString; @@ -533,4 +533,10 @@ contract XDCValidator { owners.length--; ownerCount--; } + + function getOwnerToCandidateLength( + address _address + ) external view returns (uint256) { + return ownerToCandidate[_address].length; + } } diff --git a/contracts/validator/src/test/xdcValidator.js b/contracts/validator/src/test/xdcValidator.js index 43e8cbe21193..8db3284eb5fb 100644 --- a/contracts/validator/src/test/xdcValidator.js +++ b/contracts/validator/src/test/xdcValidator.js @@ -110,7 +110,7 @@ describe("XDCValidator", () => { expect(candidatesBefore).to.deep.eq(before); expect(candidates).to.deep.eq(deploy["candidates"]); expect(voters).to.include(master); - expect(ownerToCandidates).to.include(candidate); + expect(ownerToCandidates).to.not.include(candidate); expect(validatorsState["owner"]).to.eq(master); expect(validatorsState["isCandidate"]).to.eq(false); expect(validatorsState["cap"]).to.eq(0); @@ -231,5 +231,26 @@ describe("XDCValidator", () => { "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd", ]); }); + it("kyc upload and claim", async () => { + const kyc = "0x01"; + await xdcValidator.uploadKYC(kyc); + const pendingKYC = await xdcValidator.pendingKYC(master); + expect(pendingKYC?.kycHash).to.eq(kyc); + await mine(10 * 43200); + await xdcValidator.claimKYC(); + const kycString = await xdcValidator.KYCString(master, 0); + expect(kycString).to.eq(kyc); + }); + + it("kyc invalide vote", async () => { + const kyc = "0x01"; + await xdcValidator.uploadKYC(kyc); + const pendingKYC = await xdcValidator.pendingKYC(master); + expect(pendingKYC?.kycHash).to.eq(kyc); + await mine(10 * 43200); + await xdcValidator.claimKYC(); + const kycString = await xdcValidator.KYCString(master, 0); + expect(kycString).to.eq(kyc); + }); }); }); From 880083715a9fa786de7070ecc8057e779590e347 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:01:10 +0400 Subject: [PATCH 122/144] Update xdcValidator.js --- contracts/validator/src/test/xdcValidator.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/contracts/validator/src/test/xdcValidator.js b/contracts/validator/src/test/xdcValidator.js index 8db3284eb5fb..f8e837e8391d 100644 --- a/contracts/validator/src/test/xdcValidator.js +++ b/contracts/validator/src/test/xdcValidator.js @@ -4,7 +4,6 @@ const deploy = { candidates: [ "0xf0AbABbb043792D8cDAf1961c96758932189965D", "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd", - "0xF5D476D1566e102d4591Fc11D93E2F0B1FB82C70", ], caps: ["10000000000000000000000000", "10000000000000000000000000", "100"], minCandidateCap: "10000000000000000000000000", @@ -28,7 +27,7 @@ describe("XDCValidator", () => { const factory = await ethers.getContractFactory("XDCValidator"); const signer = await ethers.getSigner(); const master = signer.address; - + deploy["candidates"].push(master); const xdcValidator = await factory.deploy( deploy["candidates"], deploy["caps"].map((item) => { @@ -223,12 +222,12 @@ describe("XDCValidator", () => { it("directly resign one candidate", async () => { const oldCandidates = await xdcValidator.getCandidates(); - await xdcValidator.resign("0xF5D476D1566e102d4591Fc11D93E2F0B1FB82C70"); + await xdcValidator.resign("0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd"); const newCandidates = await xdcValidator.getCandidates(); expect(oldCandidates).to.deep.eq(deploy["candidates"]); expect(newCandidates).to.deep.eq([ "0xf0AbABbb043792D8cDAf1961c96758932189965D", - "0xf43988206b1F23cBECe8EA835F31FA97EB1a73fd", + master, ]); }); it("kyc upload and claim", async () => { @@ -242,15 +241,14 @@ describe("XDCValidator", () => { expect(kycString).to.eq(kyc); }); - it("kyc invalide vote", async () => { + it("kyc invalid vote", async () => { const kyc = "0x01"; await xdcValidator.uploadKYC(kyc); const pendingKYC = await xdcValidator.pendingKYC(master); expect(pendingKYC?.kycHash).to.eq(kyc); - await mine(10 * 43200); - await xdcValidator.claimKYC(); - const kycString = await xdcValidator.KYCString(master, 0); - expect(kycString).to.eq(kyc); + await xdcValidator.voteInvalidKYC(master); + const pendingKYCAfter = await xdcValidator.pendingKYC(master); + expect(pendingKYCAfter?.kycHash).to.eq(""); }); }); }); From 757ed9aaceaa4c1f526d6ffa9b8a6d4aa2a22d5f Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:04:42 +0400 Subject: [PATCH 123/144] Update image.png --- contracts/validator/src/image.png | Bin 99557 -> 287026 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/contracts/validator/src/image.png b/contracts/validator/src/image.png index a4958a8b9ba22353b0931eec365eec50f05945aa..f3ee5a907df8d46ed00b6a6c3cdd926dca6291fe 100644 GIT binary patch literal 287026 zcmeFZ1zc3y_cwfo8M<2<2|>EMkrJhp?gr`Z7DO5pP>>c-Qo2EDL>fUr1O^dNVn&G( z5T1kHdw>7;UY`HM`+nZ~e4cw?&snq2uC-(B?^?6=IemA!3=mycR#OHb5CBL4|A5mK zz+1`R(GCD^-UK)R0KfuZ5NZG&q`)MA420${S{cF)K!3%f0l+;+0QN^34e)+;fu;S* z^ZSmLkM?H@jJx^JKk2gqz*@HeF)ar-Z#ORoH+M!s9zH-!LG32&tVHnoMYH}QiKgii z=8}P0*hV<^qfL}T=qa3VTuo8YTuVn&S?z|>FGdJoTDrSCqY(jsi>tS%j*0@KfuRv2 z=4Y_wlmHIE3-DQ5d%4SNY27$0^UwRQ^8fnSpZV2xV2b;!tiPf!MiATBdRc?aYk|qF zY`m;pK)N0PU{9>wJ-q<{<1C)p&)fZs1_MCm2{sU801z^Qw2X_3n+-@?fHXUp#vP>3$``Zx zFXh<(7uwR&>aQ{_E$#oJfAa$71S`Jg=;iKg8Sv}N|D7K$&OTs&{kpDzpLh{*yf;0(8qZ~o*e$!|;4nC^7APuHRqqX)@1p5-80BJrO%WLW& zO$*Y>uFe`~<9!xyW#_1@2GT?z?eFNVb{nKGfpn~`m(s02(&T%(>HJX_TBDt(qWmB6 zgO;8k^}DVQK2Ex4@n_|KbFfwWqkJeqpu=r_Fdhd0pe(+QdS@$w0Hk@moNk@92W$gW zD$qgkEdEy-PamDL_OpQTI<~GV3Lp*g0`;}?R6gVVEPb4d7fAi$9h&dpsCJeY><4JA zx5I5!kOun)+G}n3tNkD^&~aN=`9Jyu>TBy|aMm_3JzArU?KLHk26=~mwsqA#>L1ueAZj!Kw8Ml_tqbIVS3)4x6k6icEar3y|vEz5Nszb z@Q&qmEszG=14{vJ0E)mhfD!NkgB9Qg+yNX%H=8!WZ@-@?1D1d%U=P>=+<(OUnM42A z6Ibx_77z$*0j^*gufOss{Ca8&_=532|BC&cmm9GA_0;!Q4kzFfSc40o4mg9~eL&h4 z%=2e$dca38#__N3f7WgZmT3*P*BK0F&(DwlGxk3z0DvTN?1CxZ^06*oxAOI7CiT}yRf6}9WLZ3i~qrXL8MxQfxjP(3lAKe6&L5_a+ zp)J_I|D`WrSHLobVG1y5uyn9w7zK1glZ%_tA<2)2xBuGTzUi~@WDLI7~KznrB3 zfbZJB_6-QdoBzZ`EdhXZ*XikL+kfJ&cL6|+D7gGv{u9S81^~pk05I5M?c?eDyFA$0 z4IPvcgy2e}0_Xu|fF0yV01yEr0XaYkxDIFnw*f=I44khH;5_#P{D5E}0*C?P!5ugq z$O7_!BH$TN3Dg2jKs)dX=m&;@ao{bm0M4E@;46Rt_JJb^1cC{{hmb<3APf*z2q#1U zA_kFxC_!#ObRdQh3y3|$72*R4hD1T)A!(2-NCD(Iqz2Lgc?B7QOhD!!E07JyH^?Cx z6b%oJ42=%$3K}n(7@9nqI@)bCQ#5-t541qEyJ$&hkI)LyD$p9yUZD-6y+vC_`--*) z1)#W43g~4hH&hI&2-SodLG7TP&`@X`Gy_@)t%A0K<2(gjhHgTCz%XE>Fh&?RID=JT zx-e^)2P_np0Ly|sgEhi>VNJj*m`@&WSF8u7+-aZjbJV9)q5NUV`3$-UqIw zHS~Q93=9ekHVjd4EgE9n!3e@gz{tU<#(0S_fw79Qhlz5l<8s|379h?Z9M>thDeK_xNzT@KJGU1BjYU4WMhT}fMeStfOyMp@z zj|7hcPZ7@q&j&9FuN3bk-W=X{e0=;X_;UD0_}=(Q_|Nfs@ITesBgj|SRkKCU;o4kX3nF302g+h(OnIf5@mSTqDkdls4p3;``K4lfFnuA)K+K)Pyx{rF3hKxp%#+oLMrj}-&7LAsJ zR);o-wutr(?H(OHoeG^h-DA2Qx=nftdO7+#^bhGf={Fci8Dtn786GlpF??YpXOw4j zW_-lh%ZRv4ds+3e&*g&4qnD4E*qC&gBAKe07MXFF#hC4wA2N3{BUl(%Zn6Zkl(WpU zVzY{|IXq+OPj+{B16I|$A;#{s=gbzTD;9D?AiDH+Uj>ns~N( zS$K_jQ+Wq?PxyrSocW&eE%1}@U+0hHZ{`0cz#(8QkS#DRh%cxt7$(>(h!o-!vK7h| zdM8XOd{g+IaJTSJ5m6COkt&f5Q5I1P(I=v_Vq{`kVhLh{;^^WE;$hmsys*ENdxSC<~Wkma~y7kz1F) zDt|}5LVjC;Pr*~6LE%7ALNP?~d6r zqN}Q_rmD`W(WzOhJy%0q7rh>Gy;mJi{g!%`I{XI54bK~`H_>ihzxm+idkt0%SB)l3 zKvPZgf##wXo0f-Gn>L2FmUg!GCmnvBV4ZyY8F>8R+K<%qnadMEGBfs>|Fsne;mzH_w;mWzc;iz|t%lWVUVy_>(= zggd8ujQg^Ogh#pu!c*O|#0%nO>ecK`1_JpvKI}fxJ}bU5zS+JgKRv%Xe`0@E|2F{~ z0rvye1C;}dgJ40{LEXWZgCl}hLgYgVLLs46q1|E3VRysU!d1ebMc_m@MT|u9MW#jW zM(Ibj-le-6es?umCAvI@AjUIh_MYUuyjWPQW9;aC!TXQzpTyb3y^iOL&xk)xuugcL z$e;Kq@ifUUX*5|RIX49(#WiInRW|im8gW`++UkRw4;mjbK8$;~n{J*ylp&Onmx+_< zlezrp#-rxPERRzjA7?paz0Fq0u6{!M5LD7_Yom z*<8h4RZvY)9sdG&;q&54jYZ8&t$J;DomgE}J!}1w2GWMOMo42oBcjQnX}Q_3d7|Zd zOLwbeYeO4PTWR~{_UsPwj^s|9&bytbU4dPDFWp~mzOsL{+HKyw&|}au-K*U@+Na(( z*st8*Gax_EH7GsUJ|r>J@>=Y5)3C^J;~U{O4I{!M4WlBXjbox?&Ew+ZtrJocos+VY zucod|^-rr!55LuTJ29g>^KRB;cKMynyU%mZbI5t$`J;vK_vr8A7Ks)!KG1$BT)Mhc zy)3fav2tzY4g3~-Vbyx|>qoDT$7^>#;eX0lXIOv!S>SW~hVsVv7vnE$U){eRZN_X7 zZ#~&&->%=0+j)a9K&&A>k*D7hzEgcK-4)vH-qYIquebP$K4LOuH-_G92s|8V`t z?-=v=(a)WUXR0!q9jKXqD+K_2LjWKh2l0dPZ~gCA3dnDr z6{I15gtO?s(Z6-Xvj-rC0IERzuDuDOn^^#O@e}~AfaMdK0Du-g0NfS_&;$kl3cs>| zI`uET^6U!+s6*sy|Fm+k`s306;r3hS1f%|J_uuazH-ds7c>3G@^d&%y1qCqfLLp25 z8ZiV)3_0xu7(hPIL68Dof7Sv)gTl};FtM<4aKQu(L;xBD3PpoK(b3Ng2api(IRGO@ zC%Mcok3p(!iOJ+aCJ>QYfW@p(^NL(&0>L6^wjS zYf8#0s%qD7-PYC92jQ8ujjf%%gX0}9Zy#Sj|A4@#yU{WCV(-VLJ$RU&k@@IxR$KhuHnp;}CdwTo&2L^{;Pfkt0otb?%H@^a3{kZmN{qx2b+A)w*KPmZ+sDhe4)W$P#ESJUl24uFhGf6=$H91NaVFKEj>t?1R}7=6jBRn zUSTr}>LAFiJST7{ScFzsk!P&^;_PCKMgCvn>@UXt!`A|+TA=;9plE1NbSM;xj)4wd z7+4_k!oa}7!TNRK{Bhy^x(LoL!oRLlun-7X1`Gzn1pkR}v2lt1PhY2tprOg}bRNKi zLcqxcB?e@HWAnl|cHsZpu*VS3fYq*#a5A3qCZv?ETfCFyP5s2&Hub4CdXL02tJlpI z*3J>B+YZp-XN7S9`~Q=nS{qe^i0=!-Xy_1?LwYSp&pa=cf8MumNUcOPA(#ni-rGUi*Ln)vGn?ZMrYw~y4Ot%??1$-FF+q&IENP-5 zcFauW(8;v_e-ju^$B)e`@tM`zX7-G^DPCfh_a#hv*boF4;K+67|h_xAc$XZ&oe% zXP8qhij>;B2tU0Q;BL#<;{P!n__n{2b!kX!?6r7h7|J<$-umQTTi4Ndms6ns8FZLC zlpxr&Gvf;`FZ63BiNWwk6Rtqpsd|A;LlIS&O}Vp=ODU!kbUdzc3EC-Km>G8OLe6J)&Z*7Tif}fOIyFK5?#h7*D+Fn&F$f6VYqFS6JM@2_x zeK|b>M&z!-lpO+g&h}#x&FB6MCiO{bRuR-L0$+q3?L255aFrqUzBuJ?AB793R-FRZ zewKGRXc9Qg(9=&y*?T#aI;JQ&x#09choytpd?Cd})nE$%2rIHV*hGyP|Xqc2!{roZ*;k@f1LoJv{|5Wq1aj zDLw6q*z4=eWy=*KcKDCrsdO{y%$uZVx#(@A_N%>>yAe)fczZw z%A&4<1+3~`pIu(>Ti9^TuSLkTc(5jPDs>N(m`W=0^gXZ%SH9jjpf~UC`$8J)yo!aE z=BxK3C$<|nMjS;@cXDU*4#TEeaQZV~;s}pArhi5z8kK@5BstQsOxU2#*!Y zidb?uHUZ3^wPiC57@fRd8buCsA1}N3ejD8u%AzWm;&~cp@DY+aF(W`_KqQX|^W>a* z`m;vX(NVi7jLvk+UA|XuHENrwVvBUY>SuwJc#(mB&^2VvNL5aWJb7h3CmBoykAp-A zy@(AbACh(xaHm`XyLKa$wX20L-d6i<;}hCOkAc)bOMpG8@RVJwv8{8dnK zHWw*lT`cQnr0jjX@F+zN97@EL*FQ#OcKB?~ z-*RgFz?#|bck}t&!c9lA4<=NqJZ9poa#9`5b}<4Pg5Q#y%ui^T_aB`C1=~9(#|vS| zGT_^=c~l;yTXAdT@XN!s-VA{sl(_Vdy|?h%C~l@fs5lnrj2&OizuaZ2YuBtFM1H(UnxS-^>W-^muhZtcCgLT`)DOtL)vvmq7c7hJ|6t=1B*;dpBCs zu3D#HsHhkW+FHoNXo&|)mM$g{IlCrg@9fNz_GAg)yH~GC^?rV1-iFv{L7_(OntOKv zvz(EDdl^8*G9{dMHXD)n6(WHH3ENeck)J+nkqw|lNIxx?;{Dbyu10JC?N?z67biq% zhtY(6&hx)_3ZRRI9p8B_`)Vw{<_obS?{bKTTj~AvBxs2#wi)|l-NjqO?{y8w1tH;v z@?SWoPl1(MS;yo<`t4I-XQb&Apsu)ow&rnMd>49aQKK6Tl9G;NKFlk-mq<&$!wNt4!3ac~jkMHZnEF zhih!+7>Uy=Yu+|Kp{pQNIJe?N(f#tD`Sn4S*S~8ZbEXBID4Djm?z)q5!P%Dyyr^D% zgDbs!*`34=O>&D^qMlIi>Ny37%AO6eU2g**r+{-=!@XD4@rRX(ouwuIG^Xu!ZHZT6 z9K460Gi8VaHr_r7F?ui}`B$`YyBo63n)61t9hL_4gG`7#$eWjsV#_5jCKKgo(GS4R zZM9L8DP9iooD^q`gE`g@KYLsJxYr|}`x1K2JC15SD`1G}+-2}p_G~J`X$+kAlBpI= zdeBEY=C3B9qXnty`J1mLc&0JEz)VO|aykWiY(l3PcBMgKx|Hp9A}mL5a6yS$-t~`h z@%eVP=*i}{n(o^obEfY2`c4@siDqKx;ASSNX%X_eQWYdTNH{Lan*E0`4wtIEpg=8m zK}fC|UG+nS!O3;0ST^)60NJf{UkSIfZP($zDE(8;s^l}f86Ks@1+3*OhP~P^X+H@@ zt@Xx7L`2i-JChy${=)g#28=8^Z%OOE#5 z-%-`=$_ql2f7Z%;^VfdMP5)J=eX8Bw2XDS_u&vFK7B(yvCkB1e?;hNo>dwbk6bGzk zFZ=b^>+B#-fnJU>0kz4hmq6G8N96?pN{58z0_lE6I<+YB?T1+yt&*#l44h;1V&ZTd z6LLX(bKU|t96OtZ{xLH&($@Wc`h2gv+w>bBVfbITtiN|Go;)Xjr>HPJ&?o)uv`e7=0xRi}2J2d4K zh^9m~o!mc&4MW@lQA&T=gNp%_4$Z%VjKR#a)m}2|(yq>%u$_IYt}$!!YJ0Olib=cY z_3(fo_YpjsC-!T!vXly4%MQfNR21Y_B$1bz$jA^ zu+IO4frrHe504!lF7^pUhpZ%PJC;S_lqIBjm%jiQ_FtD9Tnw62YdqNR{aIYBoOtZx z*YFCH*f@!>Ij*k$VxsVWFI{gv(f-;@u;g>iLR4h;>WyjcSds;a=t{U4?he?o z-h*i&>Y%Rk)Ki@dYsxWGyIfr`c2&-Z4_ESqu31GdBu&ZmAHuJ^`hwc}c^I$e1hj7? zYsIUDLBGa_NNGyB(+PaOj=c7|>PxN}ylgb$5gyuWLT&x9f9UyN*Dk263!kS^+E#;D zx@mGz-WJ5taCNHS_~_&tt-dj)@mGd`gmjmr%KGIki$G$%g>!+&ruW4Z_DZ#L5dSmi z8)q5(VDq=mE_>2~FXy+`a^5=%2`ZMDs*%+ULYa#yYy@5~MiO9syyeyjcFz=(+8${B z$w(dI(qg_@VyaxpHOdUyN?vkpztRn?Bf?N4U;3Qa;J1anGD6+cGtZW=?c%*9fK};I zV35xwW~r5$&rKz!3*ey=-y{DL_BR}(ckO~;)z>EI6lD<%_`(GRT1F`O3Rd&+=^FPrd%7TT@c_RUZr&`yVI@N!U)Os?&xG zNJ#W6a-v}|E+;7kdY_{|=;mBZ6y_749fAG2D8Q1Z16qw7Y18`9gywCh?@Yddi-9&z zw9!p+{c?W5CiT1(uy-*%{d|;nF+r-k^mi4%^~VME^z&3n!wbq$-Ny4!M;qP6G<8m$ z^WZ-4o#tYqlx*RGve564ZOimX!QV^y1!DjHs${mQp3iVGDeCtR-M*^xf-3sC zn&d_0sLQ$L<*I>;D(chc!ToTl{tL=dkqZh#)02zAn#UKjIg_1d&R4q_GBGRthrQZH z{bD9(hjTQ^^09^-QbWXcu}nN17dKH*tC3ON#fP*<$Tr-vRTPrRAx}kzCA=&9kHx+s z!-EXFFBJgi9Ha1W{jtYwuElQOoWgF;9w|Jig^81oM-Uk1MH&=Z^jHHtSu^Xq}`D)q$#Ah67PK_GL^#P7POX3lwz34h>X z((^o2dqK^7=Dc4EGcG7SjnB6zm)BfSJ#Sz+=l7g^LjDVi(0?_%vVS$Ze>J=RYEu4x zNwd?H_FB>JBgAv8{c6UF2(5X#0eU8zEN&bSDMSzIF0#ay3G_l942e~%UCc;5qnU6D zIPxYj5FJZ;t;kaO*RI~0a-JvrkZQEsn3O+-!-7zvq)4!I> zf4x-x^-}rQOXXiLm4Cfd{+E7x|9YwX>!tFqm&(6hDslhx7x~vq<$vz9_rIH$3bq>- zDvgj#ad|{VBTr+dB$vjmcCmlv+tUZ>Sad9qOv#9k-r^gknf-)Op@Jv|cu*J?YRzTx zah)SYdHqDS56MjoHKo8v!|TYqy60 z&Rs1&N!?`nV-;jq?@v2fBGiFirs1?@giD%ZWQ>9K^Y(+LAn7hm&>ma$^yKbxy6`)1qWPLAJWmA{o2aB5+$L z0B9r1Ke7k?o+pe0L07%K9bEGq-d;U{jRQH1IgYK@xe293gzl=H1gYb12`9t;c@PImqW! z2RRZH8&z&VbEhGn>Tf?#&J&(=#y;w$Ra zrp+weP9AMY?Wb@+5Ufd~EPuplqEv(@@WAeY zbD^T)A(BVNisMy0&ZF0d!{e5H=GqfMFD%+wVn0VeOE2#9U0xRtC|Q~~Sy2%|!NcW9 zX?#Gxu!CuK1+#Z}MBygSQcsgIoLt}iHSuk}*K6;hhX$bHRlW=u{#C2Jyeq0g<@esg zt*V`wWvo_P=rUn+0|`W4Ne6eD$GpgcsLhySxHN^6q>jSlP<ni%T*jpWD;>k zUpapSgrG-v@sbB;s^SqvaNbz&no5U5{E@x~i9=V=cIcm7itJgG&nJ{FY^*;82)?#f z)pydqsL3$Zemu3gaDBLyPyM;xD|9(=%o5HrS?o?0{3|XV?b5!DzDMyjH~4VhMv}Ha z8_>cU5bpy57Rg<^yT9M=Y?|^$Wd)T#r(iEKGh7@cBYZAg3}?V|Iw9*c747vEFff&} z(oNEi)V>dC9;1SVl0l-C$Uds1&WKId)c~L`h&1>{fO*c%*iPExtBBHADOtpr`9#&R zJY3pLC@4FY&42RUP_8cVG`U=HlKf@mZLhc=-{Ga+W?vX^ve2GoGI{g_?SR8)MEb}yLtz-T$4>u1c&}YwK$ct&HWpsk=VJ)PIjV;{cSR5WMV_n!W zW`Giu?&=ppSr#t}rI<)a`H=vo+>fRD&%9OGE#L7&OZ+!{Iu!T45c{QGE9r>0Cna3* zudWnkYS0yHKCD&w#N{kX(5w}N#xKVp_}|GG{kLHavwaL0!3M~&n7uLR2kEVnyp;tS z>^XQENfY0&WUH0j(`AWoV$zAh&y@f&?XzII(<2KTLSpv&(qAGGA{sSZPglOKNS$FN z*smdy>?tTmOHRJ`A#-Ic{6rXe^PtBR_j>D;FgmG{dYa}B8YjVb@z9Ww6vMUs& z!MU#P2KaZM9O+KgkMKBc>>9SmH$?dT@N~0*LLX%4U`Vq=lMCC-Nsc9uT~S+B9Y~&J z>BRPr=&9j0@0ArYbQEfK#bn-Ybm4Yle(B_iInqKBu zv8+PB$}z}Hn3~_0!iVo*v5=s$)w4C!)4B!O0e%x3Jklwq4$77FC}Af_&QpN+>j#3? znceac5la`QXA87aL8L|4{-p*A*YudVx|M0-NGd$Y0XpMMdl)?g0pQ&oq}uq zMef+CkpXtXk=^wIlqjNJpMHe8AvPCIPPW>*=0_0gRUdGVjD(GckwwjvsSf} z{e#@^s+P#m3OpgYjga3k9qXeL;bxVRwg?s$y~k59wW^*c2Dp~o;C#)eAvIJ^2!jgA>nj{}~m6)&KCKfhNf+on?Bh@moRBWe*_wioXC(yCWn z@P%|kqN8r!%vfZODaFNBI)HvPC6IU!9xnK~u(cY`pSdqrFiTa6zj)-?rJ9ZuOHyg5 zBvF3u%UlO&dSO$$;z}41O5+qb670<&**Fk;Podktws&jdo^zzKe^u-3@=_n}@N?&7 z#M*2&&b^S=#B!D?qWm}-lF+<6z;_8w%V626&e~v!tl+IOY&>&Y;+ky#FKzr!l1nw5 zYTlj@9;=Vn&%WK$Bz&*rNRsJiTI;MmU0Yz4@5h4Ymrp2C*m1Bzd3Se*6vYXLJ#Z|4 zc1O<_JlAE}O_|R6VDuEw!<2kfw)@r04Q_rYX`IZA?{dax3#QdBGd0usx-o|xV+!{Vm3-m* zf~l4@bGwryKp8`sgYl;a9cI)q^=u!f+>ZhR^o~a%mnM(SO!#)+ktg z&zPDbrsMl0T+Z3cjL@%GGXNg2Ysv)Wnlf!Cy7nZkU*TENE*T_B$rW|4hZ^+Z;?2B? zq)W)4)V!2#{m|l}m7J?!zdS>9s22z)7)g-CmH{afFt!@(VW>evU(jn zK0EzIxesNr09bgP>Bp@kt#{?_06 z6+IX7$)x;BB9Dt)U*cvI*5l7q@1kM*uN;1k0 zbQoXvR_7FVwrQ@(U7FT+d>Sl{9PMzj4=HkJ67`*rl6b}9_|Tf_a?59cF;W8~XvXh; zJ1blh(;Q#4cRn~Pq=#qC5V)LKqWdu2a`#HO_-oFIdfvNv#K-ETJk^Dt1;^|eU#t4| z(*~A4dTkJt5Vz96EvhxKQ!*uN9Kg-9wcwn3z1UQ<00W$urpo2Z)#RT8rAxZXHy#*m z%pOVIe-ESu#F=`G`M~1VK7)sq_s?*LEY#baz@VyQvxNv_O_=CqNS918mzMrsar(FFeU`v zH75uqL*447XF%Ckf1V9xMABDNOON!DwmUl8jB&(%!N~`Yqox%3fv_dmO(|%m0HN_| zVU9HzNZ`2r*HQ597LBOuCdh4VxUvu{_o{3~aU$o{HEhb9kvMkP*3T6a9%5=E@* zaCSl)`lV}b0iGNs!+@fJpWK6I4>YtP?eE#Wm`b-wljk1p6M(Tou+vsEULI7Z|8+FE zx~vieL-E~9IPLtagp~e)A$mK8j@G_0pA1Gn`mLiWnS~Re1Ht7=LF;`C07_xt)jVZy z9$I$13$IaXfs=YsX5y?LM}XKHX99I!#^qVl70Eno)Y3|F!dhl`R!H>vJ@3y6`h2B3 zX3B;TPfg`F0jtyFn6K+^!Q<4Ps#+?tq!E>s2^i!8fX|fzS!1Hz;7*G&#vwe&NJXirJA(r(E@N!rn$Y}wg1|V=Ti2!;CmWn@UjH=8t-$FB zZD@Z#z|PS9ZqotE6L)9~x1pzg8%l_>?w{9)urD;bqhB|`G+#2&D98cHeM%Sp{X;vh z0%E@b?u0Df|+A5smIh$Ut6vsxl`3NF0h^iz*{P)@~n zGDDeXqyky*sUq$=&!+VIw%75jtYN^s-+4tnS+)UH)fI33=~mDUJPZTXwW2%L+XZ}{ zHG*!`so;1Yz>>X$n#5y%h) z%fAg)Tn@wDplqZxViHKS82#2i#pw(wvg3@gPzCT`Uy3XxgCIl5xASm2sW*&@mtyyl z>F--kN?oQA{>YzG%{AN{ARj>|Lc6>!MnyH^D{=Au0%VK|JL3=oQOD2~^O%_>;uB_r zu?m?QNqK8)vPxh+I>OhMYj{Q3M0GvsF0kYMb@Wl z(7Rk}QVAbPR5{+K$N>z}+Dhs$Qj-z7hI$vS$rsnIp+A0{1OT3DQUE&|2j`S4=&hvP zATlf(v;Ey)HGv~W9LE^HKBp9TBEtD-JeUezO=dn);vc4-d-&-+TsP4_;bU@65_tg3 zQwi`A(zk~v-^&$77^#Tf-@RX9mEKs9097`oTIj&#@mLW5x}oiF{L+jcS$QrFs4FuD3X8nc( ztxHrW%06?#1_N(R%DIrp{U8T75?K*(FZAx6#Di;ZiaftZdP+u^q=z^j*@X?=nv~r% zo(S80q=h-;{YxSHQ!zXL9(FqU%YX#kUP7@G9;XvxhP^8&IR!o+m7%V8ZvE56>n^Cl zp7XYlY8{j#Qd0-z#l6=$r&#W2RCu?ouK6ep9p>&X$3jAIJ5r2s*?QP%>KJ`B84q;_ zJO!nK)Q?_9lII*1t$qAfd^ex@qx;i@^&0a^AaH9Y8qo&tiVRkPyJ2pS_}d#JHW{3< z$U|nnG3t4iwe({t17#%yf~mU4w&h6Xtjr1PV z-^>5}T5o<-R3Nz5qOAtE`OqWvL7Li?vSVRXst;oO@JCiZxBkty79s~3UUcOgw5y+b zED}-&86)NCuz=!(cIkqYxuO35obuk77Z3}e}* zeH-=1S|2#kCdr!&s?_0pbBksmt&+Lqq#u}4L!DE()e>oJm-$-nM}*$!?3%lZ#@$)| zRZR*r|Ea##+i_IZv`J~T6!3%8QY z$yN>l$XjIld9nO!=SNOJhijh>o!7)z9g*AW`spf~{I{s2hu$lz%@>JPUqv>>?>x z#SSZUaQ6?LWY-~U4BuwB%of!7_Win4ngH0S4Z?Y+f!wQ8QkJ$WTQs+trz#oilkAKG zs7byJj$~NfC5_ev=${Z@ZNRMaVe%h|iy8)k7b+Sl$LVCI%{Qt_b8xA$xAqp}lpq)K!#m9I<2PwOZe;jds=d?VxL;WNRRc$ zSrIO?;q8!>ntaEsyXD+d9X;>WuPRhv7^hQdAFCt*RN{RI%A|JE74-V{>0`Q|H5CT$ zabv4x>#sD;YezADOE)B#lw6nY0}N3)PUt)RBWABR8hbpRSGb0d&&kWCR$oIMt>#gH zr@CXO>Lq{dE=ZHmSUQmrO!Os246$SBecWP9AmX2F|30upEJeA>AM(r)C3?hb(wT1S zwDN33P-GgV;I5a(wGvO{%wNgqfa7ZVQ z4MtyVMtFKn3CFK!#+oA%g4G#_WnS$+F)`KLcN4Wg4t^S+ENFSu_C2S4wb22}LDQCp zcdS6!%G#U@9ts>bR=EAbH_k0pqzZcou<+V2It9q3tl?oas3bb$zN|YNeyPSRoFoG* zhKZ){MCR0_GMJ^sD!4iO%;$2&8 z$4v$~80%O6>J~HK*|aL@c1h)qx3`iutH@gl& zyv$fv3CX|YiX!QD?(d~_Id)iF&+le>hErBFaU1d_FxLSM|5kVI)$uLnu9^Cv5t(^A zoV54GLuAgq6cEE{G*wu*B+jAYelWuJIG1j=lhJ{{&!>7J^Tm|)<8%@#Q?em(F04UA zjEN;Y!ViP1q3ppPpp_(b1>B<;-sR0LS>}qj@6`WTIBw3Ba``qzwfN-YZl6Cn5HbcQ zj5ZT?3!nKw)k>^ZHg|_)={?00BJ19Yk@h|7W@^-c3SvDrSmE11zN4Q}wgM!@=;e1Z z{P7oZ9#1^7HmgpULdsWMGJDK7e|A}Si00k-?$suFqRDH|5LUH1RqTAsfI4%aEBtz^ z<>d9r^vQ(k1NyMkx?wJ_Jnru~AEqH6MMY*Q{7B|ad&f1Q0%|nR^;K@g=-nD*1nrLI za={!3-}IG5=}^94g*Vh9PgW|p2Y;^ZO@7Q*5_|oeitauvFV(2s$#9lwCRjHFuC^tY zbhvNa*u`OLpk`6Z|eBr6-ec~RQ5={$; z(E)ToK5iK7*xYMXHu(W6+YqNo;vpryQBrEO95H6qyICr5jGT%Pe!XKLNMUa3UR03> z&8c^dJ{e~lR9?H}kU{R5q!Hlt!d0e}8KytlWF}Sr0@;w6(2iL&u+n4sqWDF6714{q zkT(jn5;+wZVxPUtN*M+~s4-tTn@~@P*5e4zes$$*X=}h`l@!aT#4b?oV`JY34>H8X z0fae)BcFo|$Beh69WOynkcV@^`?ME>gV+O}=w5qv-?rDa+Hz0!6@~kT>uV)_?7dnZ z9i@5co)4SORC=eLTaF?hm?o=)KOZj&a5htK@aK$kg%9%aY3MU`4DaV4F<+UJ1k2TR zp@=QA{O(QNj1ezV_ifZ`BY9)mC@bsUFSuncKJoi)VIizXoWpowq>HTm8_sOEPk|s$ z(UVC0;0066=yvrof5~17GuDa6df#3hlpr5k$m{6=Q87C5uP`wq356gVdC*E%IBK?V z{svZa4E&=iA?8)Qw(mcv4`eaE%o^z)47gY;U*XI)WKCl;A*p3HJzf>3WyosZ>Xb%V zYj$*-B7d`6Tu!B`+w=GOnHuv{y zhsg#w#bg~mRB41FSV+8PQykD3q9s1mz^m_tk$Ah2EDk@PmoI5}Z?`sY&f{%JXF$R7 zZLo6B+6ZO*>NfN#+3|dR3J7c)zV@YHh7W;X018KU0f~J^Vw2+X}a0w>hB{ zPbW>h(Y#xUD6bdiv#->3;R^d7SJ7YO*9i9oiy(jQ^duA0`OeHpe*P2znzd6_Y-1F# zP2Y)$Yk5WO<`ZaY&FtkEFnwt{pe*EiNP7L7%b1BP8&zKj;gQsx!-kRd`}M=|b8B@` za&7!CzX@KuD`d@acZ*I_{{3tUYPeShcUEWVgxDM>nLssROAvR?^=?5;IE9i{wnkv! zk$$ni$|_-aI~8s9Q-4g`w~GaJE!jtU*6YfsrEm4llpZF>?MdO|;DKwqw)-wp`f!@& zOBE@f^^>0Z;8hc2ey`S;Y}beDp~4Uues6h2>2&Qb3+!#^2TACdUf4Ze(}-Zsx8C#530IAPVUTO?vMFhNhaw2!wI<@c%; zbKhozD!4Au8r2v8>dOYM;C zbjELLBffbIc3JD{s1OeiW_7Ms{I<3ht~YPW)L6c$N#FDkrI$gJ)UBF2^>uP0s`u+9 z%H5J?w=u{7O7ctP6Mgu&cx3TY5*_;J!x$0-l&hO84EOW%y8j3aDTi`mgjPC({iX zDjA=ybp{kUm=mF_M?;s|a=ntYh>T#ALur4;;T zsgGKiGhq}`^2<&Pm#WgA`&S!{+fEclT&|xgnsXz1M|XWS(*31FWuy<2mXJ)7Pt#D9g zdt0{a4_nEc#%J2ixoR(=SK7kj%!$HQZ2h13CvP&$y=zJ$lo&LiJFlEndk zk@Cqey)UH7`rT#V$;|hK8kU?i9yKa9z(p!W4HJM?qKa0lA^uS-qv%qPt6WJ2kig2&Mvu`1eG{eEVKNmtzJct_h^POK74pf-<| z>?uyCqK*Jx2KVYkuwv6xeKMUBJ@d33Da(C>iv`3CBdD$J|j`|QLR$srGN;sNUs!MgxnVa&Vq>(2^4d;#KKpw{bYK6lmSP# zI#%lhUa&lsD=>)p`853!qqW0wI6?Lb_w>o7sZRby2kXJi8;OaX6DJjY`;|`#@^}PM zdJNqzZu&_5a2Xbd&MR%%I<@z1IMs{tOagedDnssy z?Xe)G3g)lcbt|_Ob0tXCeZn9iK9-iCh38ZR8;^4zvp(}zUs;cy?eTC53SH!H33_a* zVldqd{qfxmtyi&K=G=SCH-=F z5CY%p10|BaXoZ2u0QEqPgQtRpgwZnH^-YDu%ENTfnt+i1)V34LK-A8*dM)ip193O- zN`r@3uG71!#e-bGldo3KxCT62Tj+*HfRL+5>t1?{8f4stQD)p;C59D_ryM=-n4 zf;73CM>?y4{FJw9j^U6okLEa0q2@@nL>nJN_~`|fNoymnwG?#PE?nAv8MBv=>T4Lq z2Rd`D=C*r!No!S1sdGgN`Gdt;X{3&j+XUgO#s0Js#V7ZXSa%Lh&^~<|yCu-`KiGTk zs3yB^Uo;5Pdr^8&svsa8q^mTMqDU`MQ4x?P0-=VkbO8kgDGCZo3B7j$2uKqF=_K@? zASFVG_wg(H?)`nQFWKkyj&t_8{s9bRz;HclK6B1B*RL>`+~kXpHTHZ*GKUH3@eO~5 zIcQF2AGwQ>3$G*ND$L4Fk}KgDQ4F~g+4fZUg@3-bA+1DgC{!#4<+2vXZUJpwn{pX- zN!t4`UFkWh)RT&KTTW{X13gqd`Un7*h8rB+<$H&LR229kHIf8`mM)5%X(o9<&RYe~ z6;;wgoj6S0^x%DO%~3vb>6VK!t|{GutM=6L_^sJF?@o_!WlOx)jjXc=zh0CbDpcDncyhJ~3aRbuTHYd4v+>{`hVR zW-;<%AFDakSM&3R^s2Tf?~9}<&Ct3MsXNbKksyuL$Z}N5xAr2+X{fFb&DEh75)UJ8 zb-i*5=-*S+X0=_=Cg$qMaDMjL@6V6RnRMn@%l9i5i-8Si9em0^CMPG_50B43N%9=! zT%ls>Y$8rHhmk*f)B=xmRv){+4pJ^r!hHvwpTV>GX{*w?$S~Ipj+lHZPjz?lc33a< z;S9WZV~hA)`#E)GdEWAB>>zSnmBKNd44n~bq%$aUZ#U1sVD8y%g-PDhyptcsSRTmE zY`Hg)<#(%w)JdT&n`=yR3Rc)@8sHq0Is(sMc+bz&bRD`<1(NyEc8T-=caf`2HauAO zH&9#c&zt2jMmp8gEJNF7&zq2YS=v6aruc7=%X4*SFc5=M^lL0#hXo}x@lr5EcEY>I zMH!fZjh>#1PjDq21ZH5a5`K=ebjMfE8#hGFY*J`sYLK+wt+G!+EkK^eyqR#O>h;{< z<*{WZT95|jkSyiMcV($A4ECn%+X2omSSDy5KJQ&Rp>~^&4#=!X+{szV-fn{7AgiIO>kS{1Uda2%N4; zMvDC8KI7S@9ctEKlx1%RmF!sR7Dmej>~AG5d<(v10$OC7p{MmWY-upZTF(MHe#^uXWt+xMBhh$C>&gVJAkhwfd~-pJw|gUXotZ$98sTUc3JC zp)}EkD#h5A0SIU1bP+Z-*2OD^zWD8V)pQlNdawKS00t4dFbMNRNZIHZ$oIDQH@t^| z9(LR|2RaSGFb8lNti>^F%&)LJ>a$rtzd3oE0WO-v$D(j{Vv9U!an|6`eH?!w6xw=%)_$>PJ<-h2q}J>w7KA)S37F4+QW-vCpMfE!1_J zU_%byp+_!ay?5zE4%kuV_`!vZuS&!572kYGCtOymwwHUP%z%8oTiKdM+yuU{)mXHU z?o#%xwr*Ns5;G4>FB;h<+#^Bzva?p`zP43Wx-l%Q{VP`0tfV~hi+$gM7V(uv;Wdxj z)(G5t^}8ZLWt@@ULQu4EC?~SE{n+GL3j9#sh0aC2y3U0S4PoRsNpQ9Y+s>lQN)n8@ zfvMHQsZbZaAU%}-(K(!BBzB^c`&>KED>7dBFaBR`G-h2+tf(kpl=mV%G|U$3Z+HrL zzCInQ!M1Ivu;IO_#-+5#I9b_jva+>W)_xuH0gS0PM&KE4_ zId?csqfINJtFwYQfd)`Nj_NReS9Q(SIbdKnPO9fXiH2@sYs7hd^q_-FVbz9L?YNIi zt9bZcy6OZA zeCdY?W)R0q>X(d;(+!dkOF!A6okq6t%K{kHNZ!bfE5@CUy0;@v*lQi!se<@deV7oL z`wrrORyNz5E~%^p?o?*ca~N&&dELq?Ndbvc$J0T53h>JWjY-tNn$~?Ju(F0Ik~!&) z)^?S;Z$b0!*mcrs1M;bhGZ~LnIItSXZ=rjdj!}o63+LQKTh)2bD&SGno~xBv&MaF_ zi->8aNt`+`{YYFm?T{zg6-YcU{Cb#we&I`ZzQ%=(`?t3{=PTWx(6L}6F#xa(v2{sZYe@WZ{2-}Un_Jn!T~D#O zQi)E%1f914mXq0#?DI6alHP&pvMQMpEZa|e@Wg7nSHG3mBSlN4w+if|NvBK1DJt$W z8mvOj4*dO6gk{%hI{Fmas|iMI-ScXBeym*v3Dja8p_o;NSJ;=v6 zhAf~c;i>f=aDlyJwd(Jw+ugmtZWb$l-+xw(%d1Tn+raO4YM_DFvVGsy-b(0i)Q4j`-oS>t4!R9QViSzNs!*}xJLp6XCOqN}Qkg@$61^LA3-4fI znbwxQxZu^YxXBcl#g~A1X)A(+BckAsyhc6_OE}ax=Mh!bl|ElLH(UhEa**7PRVQI2 zUs5Bxc_3@Q>jez*ws-3&r|(31XPK~(YFr`SVLPi#-s1rw58%NLnqsG^Ez)1PNuSRj z(Q$JCj;zd@8_cKpO}m99f|^*D^t|sk(r@?hwx73)!h`QoAUg&-dWfnLmIdxkaJac< zlWLBsb>#AlWWhTi6!t!0n~^y28E6^Mv`$A5TkAahs=?8@mv(FHr06t}@7&9mfe#z0 zr4PW=*eKL+ZPuj>C-g_TcR9!8$cJohk&_iFz2UCn^OE`Mi#=!`}NO-}5{&FXMX z__)Ovd3aHTQRNXESDrx=j8SHj2%BWUXyH`vSk&poJol_BR&xRwXN}n6c*&g^tiI~e z2*!z5eJUr%DbJ9X9U5GVn3d}G{MzAcHCJ}EWSs;?VOZ>HlV!O!fw>3Y*CJW0rY*Gikh;v1Bz(w|5 z+h|q)R<^Md)n^)byr-$w@f?RC+#28N4@^@>gu6?-$MGZ9(_#03>lsxfKi2o=Odo@N z@YZ*b_I+~)8_&_xQ9<)H_Z8a*DmTS71oBxszI=E9oYDu0{b zo^38<+3VP*UUkwZS8~P+>l}eTFPe^#Pp{5V_Go%ecC-$xq?8vSGJygUR-wvpZk_Tk$g2mTa541L}Snhe-*;&of zET?Z1O+ZtPKKrSojoQ3?dOjv6jA7s4vZRtF3Wtb{+!U`n%M%ABuA0M2+u?auQ_$2a zRrTqX^3qhLoOHa>+7~q?bM*&4Z*%o{=YIz=`fVOtRiVW9cI-CfdWfq62tCuZ#@f-+ zg@Z<4*L_nbBsf~-82a{uhWHt-WK+-Z-UXL+^SCsQSysKj9|%-SV2#FmZOLZ)z@w}VcT;rZDHDWK_fp;Tl(gO6AQYg>IzsnplZlgC zgp9i$kE$7x_RDjLbYx=T=tz$3kwIkk)fKmM53kqVywCc8F1fTDY#>&*X^bsEr5T`@ zVT^Lw=bzQ)U5KQJ;8icvik^FS?V@{P;-ECqjzOr)DYO9sOoKa(#3Kn1C^9f%|2X}F=c&`c(&kWQI%1+qK5m^9hzSBtDf0CMh+Qr^sWmg$)q z44pnVHFo8TdH;V(*#HD&MVX^LDP0iVh#1$SQRzealW81~rh-ptGw3Vz`jmwd_sNf^ zKe)1+WW%9K=|?s@ORj9D=oMjcJ#3mKl{$zv&MQUG|(n7GM z7hhuWQ#+CbsIaDG0stc%1165X)AW8kXoHA4ePp3HPFu{1`&diK1WjJXjByk9m%@x$ z{+-HJCx|5`t?ac66ZW-y{=+t_q_PU__`6SG6_#OpRMWxAal~?m~|*c}~d= zs)%6kQe~GN+^t*ZL!gruW=g>aNHE*1GBkUj&fXpcqr&Nx^$)J$Pxe2A6xkPVF$Xcv zeq7AcR#W;KQ@zNCt45Eb0PUF8o@-lkV*+_OEAgx@P6GGOF1g30(gaIt@dQ(lxW|9O z=AnAy+>sP@R5RkVIgh0CMlX%r?j2$LsBS`49e({-R`mxEHFYr2w&Y9s6OtmXofHj(#Ow2tea1!&l)o2S&qhGdKf_7nY72 zdXHt@gWNZL0To9zWMpFjqgm|u1qj1E0T&hKuPGEx6AAk5S6?#f%)DcB)|SsVh)`u* zzI~PId{^*_G3%35v*U*6i6a;4D3FsT8!l|nNEfCa zqyg=h38(t15VxeelCmE@pQ0J6-Z@K33*7_WP@jT+Owy~uNk2v48c9-B*uLEQ@_hDK zS7t)7%O&;dCeJfZ)cAH~wl;%R&W>U4LqoJi$~=b4=oqwbrwnCpz2I;=^(;_nmTl<) z5sB>+I*&mC^xFb-NXIZcZS6a3`0((Ug28SAu2@^{{PT##guwW5(4I__pCTqB)PpWu z96fG|Io=Vn**2@6T$ESlp7$L@9d=HQi}l3SFr%t15doK2cADf+88|W2vV~#U!sZ>7 zX0~-*LVnzntq;AS4VwKYd7a58)Ikp#PGI1zzRJhOFJa<>6HS2s+)Zzq?(r+gFGZ$X zElC|e5EaKk1{kjvZZUN6C$QB>Ba-iv^K5+Cc(KUkx2jKzIHH_-=Xt5Sv@VWtOWC}^ zh@c=i!Km!znt*Gss?EV`#6$CF(z2Emu*hlLy z%10cZNcl~yq3p0!b?)6Vcvp0(asLW{O0M}2RO-)-b5y?%{s1NQf0C}PcQGy*xDRs7 z`!-woSYnJip-6)yJw&ho^sqqz8!@XIVG)xKpN-Mmv8<)i&c6}=N&1Wv#obE?hs>E; z&XV*x~Q=U&u*alGwN`fge!#f)Lc)vH1+(Oy4jZ<YSS|V3B;>lBWA>za9Zd&&z>ykWraKSk{=oMidyXaBSNY|*;XW>aJIkU z*;#O807EU{t>EI~6<^b*%k0)umG4LIRe)rM zaF}rf>pH29+38>d^~7O-8Ui=LHltnIVZ=BC7bKXopawEA#=qj90#TrrRBWeRqxI69 zxb@yo5Nm(}%!WiE$FXNl`D>AVC4Z&Y%PX z>kKg9*7$MR7^KjA(suVb9obfjv|RyO6un(;Cn`|sZluU4;9CXm09;5RnSM6IvlS3J zY=SnbOyVQA)2HkNf$fei%JzuTIm8u#pfzQ%fvS+eFvHXI#BxiQr5LB%r6{a*6B zU3$u_L1)s6To^|Fg@}9eK zs|q-YL19%-)!^8Vtw9(NK{HUQ zk9aGbI9jfDi!LYKNN@^gQe3;jh2ZJCn%D;I0Wq7FLg6#2adjN%Mm21GLC5_DForL_ z?Vjy(rSUg9e0s}qPg!E(jK=D6v_Ea^)SGl`6cH7|7h|V*I_^ncZf0imp-wL&%Fyts zB!EV1gj8*Toxs^)9I)ceI#es7B+1}qM(?YSQSB&8vUE*SA>tmPg2p2kx%vr51?&v~ z>N$>rJ;rm!jsn-uT4yWYng{DtuwL0LKIcUrqO57aOf)MEL^Y}rh-$P;%ONppx00&_ z3qvGmvAl}C@zwbmU%cE~6+;tQWdjEgCPn1p&lg#~L_oqZBzrnwlZ?(lszw2n;&Q)} zGudG~CxUh3wj-2s5pK3_q9J{}#4H`y)YkpDP@K+ttf?7g<-W|st|<}6gNTATi7Jx~ zxiih1KRBqR(38N{7AwU>_1;6T$6y56R7kya=Y=!@=>UYm;!(H6GZ8mw$wBkHx3jomQ<0C zKh<+N71L7bR;^Fx1400s)6@uT4u+}8Mi3i^{IH&?iGKQ^+vm=6zSNtcy$4KWZsby* zZ)0qv0Mz{2ln9m%z@Xv8`&Gmp-NwZq;dJ=iELa!lWS6h$F!|WdAGfvrybC|`XLZzW zz@~rzf41vb19V0kkew_VsL_@5dckEwEzkW-;xGJf6F+L~~^!2ic%aLo`ZX_(@ zfS^4DXB;32*K46VTEtm!?8DoW#BF`|_blF~k>;Eny=~8|?%MmFwWN@hb)4t6Z_3un zLFK=z*E7DZ7e6ZFh{R#!9_@fBu!+X#!Xg%zZO7`h!eg@YOqL&PT?;0hjY6gZC4}I2 z39J96(fvdgCO+-(9E(Y_<-NhNafp!aOxO6E!=BeRIiqjBK56BxyRp%<_|U0cIOnL=z>qBE zs%3xx8lQz!Wprp@89r8kkMUA|)}%S{+R>ZZnWZ+S%hh+}4VJKEBm^`y1Sg}OJaiqHq=)e3GpGw@cCM| z7i)k>frohn=E1V8`|h|hR0^d`UE~OJo_+9=dz&Z%*c!q*y}G-Bl!SJAHb&X@UOrQK zcV2%1jhKGzaG|#?W8=RONuf+?U;*lTU2jQ1r}yrt<^Z@^eQGj&)Eak|1CIZw5|7i5 zVN?+?TCMwIa-msCmV;-T`NpXQyuLhFe5{_HB^U{GH9+)4(5@BEo>UPqOb-%afACiV}{ z&Hs~|*!2cNJ&qxs_z#dRT|nzZ{D4_Zbz7sykNvKK*7g6LQT}dS|2`5SsC6|Ox0)EW((<*~W6UH-hH$?ah_P zG!380^G1H%7Xrc6hVjCF>KJf{bmOCxsY+!)JH*ud?AnBQGS%slGbEr6$~97*nURbE zwG;U+&fDYT{+caD$9wW4&R!Fr(xDGG;hu>eF`u1&jF-b^^lIW7C`+8&+X_lv6s#@V12u^)V0Ct zY~+V*dSXtIA~wMgE4`TYsZ?K=+%K1JRF}u|M`|2&o~G|=onT1G(*Su+DP!YiVG;Wu z15RN!3dBltTaS(N4IZa1%945y3eqH2yxAE@R1;qewoI|40=DUnI3WELS;dpH*%6?SXWVwYQE(|exy1`qNNr9J<2R@8y?T& z7_XPzoxWQ1wAtP9v@UbhUc#kQ&mL9r$_x__k%a=0pjF%vQQ17S-{f_qHf@~mn6 zY?rWrvTI)!co9|m(koZVNuCs>+AJ)YJ5eO@wu4OZJk^30bAOk zl0|zYci#`FaaG0z@M5P?0j1!_e!h9S`77s|DmtZ`FP;_pxDv>7HL$lM$0wwjTN(4H z)!)NUZ^r+cHLsD`)F~x(UGE3}^R36o<+lqjM1ltXd~Jn|tq>L!9;|BX`MwZ8nS#EX zudzYgiU-#zuX)5%-{)}UyF+0VEDu)&E?Bo|Tu?a(FauUf7wcWH>OKYa((p*=?P>Yu zS|W1#i5j(QVbkq&8t+49B8T?fO}+Zc&-eMyS&e;2Xghs47f*iY<^}*7Og}mxS0i2r z0)ih$L}ihOzvb1D9mh#8v$R6^4%=LH)eB6G&f8lXi=20!Cpeyu1Z~q19FxEn6Bd(* zFH@7tl@L^D%^A(IA$19-sPmPZ+1>-db0-3lN#;?B_9;+uT zkJ!L8Ko-UIwSz8BI~){OPRf?>6>B$o^Ic#w^9`1=wj&@OQTH-w8;^*|{3FtT?~lYs zXiNe-Oju01$^PG4+K&4J3ZMUKy-V@m(Axw-!NE$tvvlG6E7;Vg{p=dex5afAputI7 za|hkwB=l~}X6G9Ua##1uH)`|sM@;vlx2z_vU?=$oCA{2YB|qxOq-lVB$if?dT8xH; zdt{Je9WB#aH897NymoV$vsX{EevzHg?qbX#aRZ`^nP`c9`bQDuMc++Ef3+N51hjY~ zSNYRY!?uvOO*D7{S&`O(ol5Me`#-DMLl#2B6_`x~j00ydY>T0b^RV|w(_}p{D)3zB zP8eI7AqnL4WZ}lfH?$R)-O2~6XHw~{YuzXiv=iEL^eSMIG_ZgR7ve& zbTakMzJ0Vyg(c>rRS>Zg8n>^J6UDN8p-yc6kxWI+ewIZFOFJ4Fa4r~C^EiZx^3a=M z57rx&w^MGsN@Bk2p++y%WM?~A?<&VDXF^=sGPHA|jdQ(a9bxo(; zU8G-?IZM1Y52?KA4M_vis??v>Ym-ROdYvx@+zwpw?mWj`oSn3=w!0dByh7(KCEHC+ zyX!>9qDeiK6+d&6V>Y8zI9BseF2pMd%j_xb7zz}nWq0DH7%RPc$D0SthNQ87zBms& z`;X?S8P7Hh2w4|6`_i05kYlFDGOs1(KeoLw9>gnj`6WXeP^&Flm51@JEE?jg|e1EcnVu z%|@}JHDpDq)7?#K_F>|cw#i=kZVA3&4$37%`NT;81A?G4v|pV)q%*!~Be*fysB z)fFx@@4q2tep}zr2QS#r3}UdXY5>4-HKD=CjJ#ii6scO*gBlsm_~+JY{d3{{WMRK!=Rd{e@7Vd{?)!J_{Fl-1@4N$4 zhu?YUf9cxb|NPkTXplmSulb@6j2~UX_$MQxs7BXc)oJ4TU`nxFaTHH8r$Y%yfi>j2%4Gf>0%6u*1RLgsk9gggX68)_S5$$H5(&L6Y zbEpP6cr9!uQ+4aQ5*J{q8=m?dl(mtE6#kpj(|+pi6|DWtbR@Up&_f7^S?YnJwaf;u z`q?L_tJ2yW5|W9n48d+a{%lCPQQfAmxciv5iG}tFx=3r;v0iHxCZ*1#dbSVoR*K$E z%n`vIxq>fElkv@sTShz62gHr|rxzjGeu{^$>%>ue=#xR)g%??avO(*E~2N0aD724 zLVn`u;25BdYwZh9QEnTvxbk{xnCoke);zDo*|ykz%Ou;Ni4ope@ep7#p#rwx{|<^) zQg+X=(7q7y(RuZ*aigH{*Xe%jQ3+usd4{pbYR(jI*| zwyT4~)}HIb45#~GEQ^vGx(cTV+)dTlVXk$z6B`F3ujyt8DDZxzM_$(&aYQE8q^FT` zN_-mN_pePsLdO}a&$MJn-^zTG{W9%SZH);;*?g;U4Rau-iV!bffia%-;F1FDH>hG% zpxp9FGkU%1w;yOuFf^?~Q~^O^!Pq)7HXN~>taYpF{c4% zX*2C7a~%%jX%6kV#axyP5ZZf{jTONV>!ujxobcn@mtreVyOfgcofhD+drOvCcwa^A zYVg8{W*;#R>ZLvh#qr0HPrdp1Hom204_D&z1Dsc;i2@|Q`pa%I>JXNqz z;dUCtl-agx|{J0~G2@s3EqhBt6psUf|Gd|@x zQkZTD2!>D3B&EFx=xb!yR5^_`=E0~ukrAj&T2Y<8RQ#obPmklFFlPc~0!5z;W+XU( z38#sT;T*(@t5v&4XR4KN$Uvx*_! zzV?p!7H?X4G?VyC8IO4eQjls|1@*i4I>up%FqX)QEVSk{QWlQt^rI`VD4Ut$i*oqL zjm$CUt#Y+xqh<(UxlbHT&Hi}g9k-Wb?aSx)7r__g-@mLIG-mXyjW#Z~cX1Jyn(1T1 zDPbyGyFc9bv(M_w?slcpSjZjav2y;ha#?mFdgkSAyWB#_hW5kvel!^I))VRMwHQcb zBT}*-2IC5wZ7=TQxXd!jCsOr+?K<;=^_Oy#5*e|M{jZEtgteyTUWByW%rftk-9%4~ ze_N?%y{f_TZYAu8Tfpy+U-u0DMKs>D(_<%R{RN=TW&j**i(NFngFf9<1M~lxOV~dg z3W>fC|6EAE7Q%_Ugvme@X!e<6+TZRMOonBfoYP)rXRZh>J$*~Y(A7FtU#Cx?>iyr! z)gCx-nynG3jeUK9$oTRdG!AhpbuR+DR$-Xqb)JqVqS#}`yGU589`V} z0U|0l@csDSBy*LXg>RO)FH=h1sSwubj2a))mjmWCSG~R}eVc#CFI?g_{JN~%Cr@T; za?RfzIXyOl;O4}}p&+c|OT`oSrp_cNh&_DgOhp1kF@(puh!Z^qOGrFv4VEWy#6H?h z!QRKS50|-+;6#i1;pN>_scd4XbD9{@&v)g<=hgC?h?^!dN7}Yc3@G&XiWj=WT*Vyx zk{r6V_^1MORviB2#NE^?w$Cg5a;7eOIbzccubyOyP21Z zd?i5K&jlTa=vKU%<)>1NZhynIRF}Rxr9I^sR35@xVu|Q*KX*%)TT6fEYYa=)tCM2B z4xXPoT|XiG?K`G7JsY;uGJ3$*{qzpssv>Qnd(8oIz$nD!Kow7akh>Akx7#PT&LI%% zREv8$njy|MHt8OF&K}yhn=-P~7_|>+1F!+hQCZf@6%qHGZoiyplfIcP#&_y;S5YEs zyE;+O2i9*1kMB6VVMh?|;7dY%RzSx^zTrbTYFW9X`W;{yr@rv{i z!d1i5uRj=9Bfot+TtNUtv{fp0PC*_H#-2I2;y6tu!{xeK0YS$vPw_sVnC#$du*$H1 z;Po-z_~|Ceqic<_C*wmho-e&KyKFB%?w+1OF^_q3UN}9We8*|IqF~bUO|&sQxWrKC8^RRDbMjiF@K5mCFAFaB&2y|slu3%LWiLl227`-V5A>n6tz|&9m!K=XH0EwN=@zb zL{b@W-17KurDfAxoC;P0)fnL;807&tIn|d~V8!+Q^$+^u!0RWgnT6&wf|F5=0EhfcwMiB-21^Y(;ZN?m%kXlkB2UCTgEIi5;B z!Aa+{wel}9^RF@VU%wYwH5iw|Urvt)&IMCZ-$B_e4Z4Mu?E&X8rU)(*E|<2wMwj~F zF%Id(uGq8c&b7RH#lr8#>TXA;&-Ih>9|1%Ao8;E_5gg>t2 z8uSRk$Oxie!FTukt2m~9vbO|qaBYGPxM7{$P$qmMa1A-YXc~t-8j20SaTupMH(y8b z9Rx{$Eky_s2Vw!`RsIf?;9;~+BR)yjlrS|5mW#6;xMc9-j9m!;)VyyldYd5h2{X~+ z4x!H&NQMMKX8Xy&e~~9D@^S5Fm@-c#x=u1*tY+WA3p>T*lbpV&E-NB@ohA~98GJ|kgWT6{Qr*s|194` zsI<}l(edB$Cn9_V3DkX6{3)265b{?h4dhoyX?;G5uX7afFHqT(F!dW7DH}o&`Tb3ppJNyQrw!cv-yEERb&4Nm0tp$=jvF{BgW>-33gTb=FTWv8gnst_L9zJ# zvizMT`}<`%QpV`_boz&+olXO#jiAv0Ts4#K55Q;h(?^zacy8mr zVb+rwGul(V-`%A>h^WndM z?x)7~>(o6(y2}5Y>Q5LOUWmAFmC(C1LbFvSt?FMCZ#I4LQ$YcOsK6kHU!ce}oO1+w z^9TmGG|}$jTG)3GU*m2tfc3fnc;a2M8fh`!bNPdRz5YMx^5tk1sghs9X$IZ-WvbP1 z;a{Tpkx8dYsDvkQ%Rm@AJW&4dPwox~aUQU-`>AY7P2bUZYnv$VC@E9|bkZ%-{~8^* zpX@!ss#=Z&OV5A^y%_j2bA;NzDyVUfcu?inXt|r)94!@dq;}Eo{!W=NQNaI8`n&bM zf2aNa0Tnp+H>&2}#MyqMYIX=RY50w*`I!XH@5b)m#cF;xc7zF4{^iCFK@hQ||8K++ z(CdZ|hZTS_kO2wqBDydY$t5tZRbGQ`$Z$XFS)8xSw<+3E7JV}BoH0qdzR0Z4-yza) zb*vE@aEC0#FkQfUWyyyxT2wKxX-}MrxZWxK=0R;;)li1Bx_py@%zhN=hl>l^;5#VT zr{Ga*W5gNdsd_$%vJu7!2ihgRgA%=6O|z`Y=rF1$ReVl7Pv|;QM22?2kGvX0u*E1k z5HZ0Y>MnHJ_Zs zIBr>SC92m&hf22eMj~#9@iB!2HD}WCy{=Deoi3ejho6AL3^1nQb*KDumo4(1ujhmj zpAA*i)MlGtmaH%f1hENn4$+Lbn-rK(crs3 zQ0jb#g!IFQUP(Z7KNmizd~%n*y819}v(6~b{(PA#6Ytk6?DtX_n4De;)1(@hl}xXy zwlvUU#9QJXr_*7a9tA1szOpiN+|NnewUisXox0A*`g*+ViI=>v0wA>5cMtx`33dlO zcKWL&jJA2kakEn6nAQ2}2wt;nyXyj`Zmef*?~AQZJS>E0VJR?i2yXGuIEpOn<^4sg z0dtdGP$1Q<*$3Vw5)8SnlA#rx52~4o=B}HT`KcYI;br_pKYa&PDtRCk3*_{vSqjx- zp@zjo7dweRysLUbijstKj)(vjMo1Tgc%;wM8iUq#%0{qUmoB!$h#baDqELO5)?X$alNrX${X1`^qfEx)`HH1F>f{--o2?aLuF|e;E4EdZ)v3U$RjFxSx9?w^37d#GLUNE7f(&?X5o+0rLlJT zIgjeRvU{=|BrjA_QIC7EzAVX$$&O~sKff!}{_mQuHsc2h(7x91AUYLUtU-H#aFwIA zpl-Fj82@#9N|8&;X^*M6%^s4BL|jz^SiNojzE>~?ZQ`uh42>r}IV=0Uue|TiUp^U* zLe9lR7LnXB<79}Rs-pZSN#fAxFa~xP90Frgp_;}fcAS@*Tm_Grn#5c44Ue}a!u7P?n^1M@EzJ=7J{wJ?DRsJR)0=TO-*%ou6UqalBu1oakJrs zYn%Q>TEK}6=l6pUG16=hnQ_8z7we6zEx0RUGJ5vI33&!g+FN^bUYcOq$ zb&OmyUZe=E6;Y?)mE&lUU)*ZvA`I*3?rNsLH1pK2^mtb>2z`&ZXNkb@tV`Z?#Pa6a zgUdD_sc_@&p{q1%OY3SJskY4-wcF~ZET0{J8o1=P0hs5Z97Hza#!l{&v>lZOYf3*+J5;uMt?TPsM081X$*cI}k2fcc_o(w?V zs+R4wKuEB>yV}^BC}qXg6Jv4_aIkii;Y;n)Ql0ZXPdMD3so$6gXZe&`P2`5ilIoeQcp=g}hP%b8El^-}jqgfoT~voP6PI_-EK z8YJI?7X(n_s0Mamk5z;Q0(dk(EjMsHHNTZ~M1{pM~`F!A~ zI@7m3ZzoDNji0)%zH~NWGhv(MNq0glXotY<(;@!0-*MGaINn!kH2mg;%la}*75fFszMMNO&tmFCJ-c|j&419L8N0;2>YA{rT?NW;PvIsTaG%DJ)Tf9ZC!umyhu4Zr!|8UIxm>q z;v)laJ1ZHL97Bzw*C!BSYcN{(_3Iwf$FZfYvi&yDM>^Gmuc{NYv+QRj!l9OqxqTkI zq{-*&3$;dsz8;8q^!!k+cKZkrq_wnv{>awWe>^fe91R9`5u-OdHVORoQZxImVjZ5O zdDM$zjDew@ZrwM0fh6!xj5?E~bM(P@Gq_|oW_AEcb3vTL#->x{b?rj@!%4-5TjFWl zvV|Xp`ENDRBNCu(0sj3&8Z6s-kJge8G*^6BF)TSj;yo`6&XH|py)2Y!tF8H{!v(sM z{+Z}ℑ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 RaV3NR9XCLtkw5(Ke*vrR-{JrO literal 99557 zcmeFZXIN9+);5X=N)ZtdkS=uY1f+{p>Am+V9YRw9kq**HLX{G# z)BpiI;d!3D-}l>R>#uYEoa=C1$y!;ND{IU#$GFFwW89NS4K)Qk9C92qG&DTLm$F)D zX!l;Cp`iz3-9uf;Xw?0MhK5saDk*1-}D?PX+g>U|w;IN{r0ev=do z*aY!}zC=Ytl1f{aC>I45tS3kx0QD$sNpH-1>J+ zI~JeA2irfv%Ydie0Z+ao3RFe z`3~`gc@RllF74}xurM@P#$AbZ(EYdadsI6U#=mZ^y5EB((>~uv!;ulxjQ^}Ib538t zdCu*_h*sA5ZplWo#36}-pk(O7J%TQQ!2%cRC+od0RjsL2Kpb!i%*{8 zwhdm*4}5q*l*JI6!}po2oZxff3(8_Z4VL~HXVSfMm6=oheKGd6_Urd;gH7oJAA$xu zj~S7qO7n?AJQm5F*r8nki7zwQht*OQK1Y(35VWtFYD=RDOhI8B>&q_B=M# zn8UdH@a26%+4Z;B((!>^Xm4;xtz&_qi5y1HNTU*X(j9(;W2YN4FIkaKF3v38c{_m= zz7g)QjE2d)b9w!}WrGoodR9SRepKZ$I1x=SfDCQb%f;$GnueU63F{{74}-O?y7tgJ zvUxaLlDJ!U=*%8g1&KM|+y6vy9`y7P&NC^>H2m|YWJR>uoajTJ?Beg^d}92Fm-JT5 zOhOPNHh3+MBnvb3lddyS<6F<4kKBVye-b_jMwmSbeo84DWD`$Pgr6>{7cbTuEJ`cE zgn<*WnuqZcLy;D<@qyu8V#zQK>_+^Gw*et)GO2kx8m#U#+u@h_0^`F zOq!Dnhli}Z^rmJDCjBz+%+Ya&BYbF?&Kb`iy9>Le$KUfF@43r7$7W@ z5TNXmlvm;Xi6ySb(GS1ktc9;wSiE>P{7i+q1k3G_8;%?1WGuX|qu-+LK^55yCdIp$ zo)WWEi`my+=9P7%b=7m!yN@15Onxy~5p~WNq~;(>jerD+1h>Dn?>Su+Usd!5b%-s} z(8Q&#y8VRp{=l7=xNXwJwqHQIR#zy}__(lH99ci%@{`^!f6`ki91Y++#^gdp- zvv^VW-aG94-Fb@aGqMC@#Rf%-?<`s`;7{P><(VguDhx&mLO-e zou8)F!F-scGI&o3bDet~d%X}xwNE~*@|lJ~xmJZ%;rEgwrQ|%jfsUuKs8OQ|bzO1ez1KVEvAZt74@Cv7VbYq*so%Tvq6 zcps0v`oedT}T3kAgyQKghIg!Gv2rrax{Av-S72`&3^5Ah#(r3$; zPbkRx$*7{owB1WTmSUAwWoq#iI}Y9-DbHBUkRI_Lu^aIm88cL2m#EgM9x-e(jBA=$ zNLgrTBDFo3=_(N8N*136u>{)POs#3tY<&_=5nd5i_Bh*tekc1rJ&8A-4BsE`tP;uV zA3vT^o`6(%nbrbwOAg98XO=1grG8;*hYVOLrS%QVZ{!8VO63K8G0T-|`1~Sl;>m!|opbMkWXblV3tnHdxr?$+DXg|cU}C9*5CI~je}8`ZO@G|{V`e8Nx5FT~%(Ut2<<9+%tY<2!lc)U4J_2)WygzgOldglx0zISm}eC9>P^zh~(E7dlosfeKv4waY4qFaH`h`Zs=)bh#ne4oL-@jCRtVmD#A zezG`G&N{4arlF?I!Wd+%56C0`i4MRhpqBeCmPNyK>jFv&;?QxEu)y!$kyN~KlKOnP?EC>LPW&D6TWM`;<+;P zCG(jL0q(Ph3LSALkT!W%Y1k;bI$;AY~&n{)6om9+K^mk9@*6Re;8rOPVJPupW zx6VTjW!$bd95N?GW^I9s&{!X zp}pCWA^r~oMSc~3GWw`H&Ux~P1P7TQnt+p-6D2BZBzrwzIv_W2*CMu6_DYz6%Tj$X zVrqQqXo^5Fx=0u=HznTFP${`YiDL5fJ85alVAUI+`kF8xZVNkQ()}TPD@n3r?rm=P zH#2u-^O|$TiR|@s-HcNg&65J6sA*DV(j`NSwl}bZE{9*cfYgH2qf~x2o>$Gj1_;-) zBM@sIaU?6b9(nb!$$UGD*>wJN?{s-(;8@)V^RQ0~qm?SC2Do1V&B;X%s2J8BNZj;&z^ZdU}C zziyb_kO|ukn-3E+vI3UR4?;7#PhriNkQ!1UlD&B~XwBTBE~S=nOOJPd2^ByoL3u$L zq*Up(y=&ZZ+{5v?rWv-_UU{~)&pdbRQ|o=u3A%%{8&ny3fA$(-y%*^D^ip!NwhF-d z(2j;p@Vv>`aM6S5O5=5yvRt2eb`J&Xijth=uMceshOw8_)s^)%3;H8v9D?^^nPWT8 z*;iU(*FN`CsC`t^$>tSmJAS;U6M(1FP-OLyzpc5Fqo(H6eHvY8P}?bT2P8m+I*ms!KiK9|bye5&Ew$=>Doq&74yut?@Ay z@q_JM!YQgKngp_)W}vQMk8Q8gC3QX#fmx_$o5}3zg4U97;i-S7KBQQr%d2K_eX(<1 zyt1>2u42t}6FOSs7wk87puFE55PxcRzEYu(rf?BAO-(8`;iGjH(ML0FGHS932DLkh z#du$Sj95B88jF_bKG_g26lL9>JgD>r{GdrrkQLA>d zca5n2JokBV_Gp&QX{LMH*XU;S(4$o8xI>PHi8{N3dWqkm z`1iT|9VWE9e_cmMLyNFQ!}zC-8tQoa7ms?~-t+enJrDg~E$+R{yZf(m^x)g3wc2+1f-f2whz{{jx-NG3&zo+zoRe7%<@QSi{ZPyw6yO5ZD;3LAaE4Q zoQ6N?w5l1ey>o7ts7weYs~s@4;qxD!BzX_J{|_3&n#w{WqvvZGnm7A{ zAv_HUefJni)TVqm_ zm|3ixnh|&&5y&-6O5ekNBm4|74yJC#CuJqLs^(2K+jTow>mqEdXuKZ1dHo9$ zvj8brV-I2Q-D$vIza->c6~*zL>r!&7I~+x%9@8@E*&?&A`)_b@WDzdLYg&Wu3pS47 z&*DwG-r4D-9VQL^{QvG#3%FnA`0Wc#*1cA6ve&CM&GxM1 zHHmmg^*t6p?p34B2Z47N!Q8DFVh%JMde6?Il*fC{RxB8TyOTEvqe1&1sD7|sa`V!B z;BI%Gq&rQ&hhw{}6X-187!WL*HA zMlmzv!IFCNi})5Gc?--3G3 zd(!0_jl=eMyq6kpk7=b;NW%V!2yz5ACP~Hh8h?O($-HRHZ%>)mvSp_J6chzf@$7Mb za`Cg@dxRtzF3Q-yibRyr{-Kcz%GjA>S(W8}A8&%VNl@+=?e$Po<`0clZ(WO0Kjr;D zef@7S(vl5@CS(Vc1>t{a)JK4NnqUpvZ~X`*#NaDb0OVd2lEwRt%iQ|+d%E#v!6?h} zza`OW`LsLVpeiF1V$fiv>fyxnH%i5)q9GzWTGLtwF$HNV{O>pT{L?(>?*Z5SNacY3 z_kjPm9^DCI)-HK+t(wU{g2at3D&4>=v#8v_zk~Ms!7CHHoklq2HuU|sAN>2;REK0= zlN7hl(HkDy@AS2!2>aU3<_)hr-0?Oy>jujq5-$x4Sb4?V@Pq;l%)#e)V}$3R<5;a> zSqYG>Zo zPZQWN;Wm18aXgYG6Gx8&?Y74igHxzW{w}>&__yMoA{R8`}ouj3oT9u{m%WdRPyObJXXU$Bjh}` z1ceTJiALVuxvP@OVREI&@3iP(8hGt-ykK8@(X&-XeTRYRp!?U&qPP=Ei4%wQzNdD_ zKN8h5Ja%S?EoD5YnR*QZ{?@7HCwrUx2ujy?D1^>Nq^jRj6cX#+y7U{Dy6@wsnohT# zAf@%q$4Dl^tk0<;hcr&~=-VgHU0C}pt8<-s&%Fk-&*;aCeg~LeCld|w#y1;U$Esa6 zhdTJ0_?p#o#W!{v#(>QezAdmu+eCwQ&+3aEz^`qOi03S&NF_la@YkoHyCXsOskiVl z`0Vwnta-eA=D~@s%%{f&S*OXzAnkN9F#qZ9{G=aEGg9^74tP}J`ec#}ccHJdiz_$z z;mubMY>qH-j7Lmil6{u(N$ACdGx?cEVWg%{TH*8FtaqdYsPga?a_d zp$313>2u6m$u_KLDv=rgRia!h*;4!2nvJ)2A9DFhweB@T(AN_7g?6eMqGzl_xNQ=! zWWpaDa+?;U6b}ZF^%YCPZ zcKaUP)^kST8%=j{9~$K)qQ~o zcV4k-w!T_!P&avT7G{Mqj-bP}eq=fwq}lN}HaUXY_uFu`$Sh=BrC(WDDe2Nz zZ~L^V$dSD^b2HU&5$WJ39E5VLZ+>1H@@EBdQCHS?l8f~6aijy#FT`{EK)@IgK!B09 zpEj$E#=-ZBOATET2;#otRwb(?H8=?QzH(wJJ4v}bcTB0Xi?MFigBi3nBCvGQMLz3S z_&uUA8^>{>F|uQ{A7z68cVQXh)Kw~CHnKYy_1N^)5DMmX5F%K&8yEoIYgR zgGvCH)$-EvRhh&dWzhnj zztF0kjyj@Dv#=vZQ@**vcTzbacmX(`s#cMr2_WCzVacXjf2;%&V?Dhb9LQ)zA>AGh z(~DP;m%#Hu{jOEr`ATb?mG#CF0u#$3jL4)HNMKvK+#Du?8)>gQG<`KRKvyey5oUbc zrC?hDAatuwwfKxDtOs8LsvHVvc1TYZtYsN*tY#6)<0R)5z4B>JDTVXaZeva3!q4^~ zowCl!Cu)eNH4z!k(?W(R%|6$cr`swNN3a9CIrT#=MV4uUitVhV)(Y=hgNCmVuZ3on z&%XBLmTL66dztNOx)eou3CjF#ve&MzklpbYgaLQHyN88Ns!PCzLgPQgl4k2G-V=)8 zk%FyPo|N+GHTmwh74c_2{y{xT>5?ktb&A#6-!Y1rDP+;2F-x1>gCk4>eL(1kr(2M| zp`G0(6Y=o0#+GSh^Ee^7E-hEM{&a>U|-O~!UqFutIiMP0;_Dz&^$>BwBLp(BMzjh(e zmqbIC5v;zwSPe>7rob9}q$i&jtKO8Kx28SD3BE^4_hZdsw)VlxZ2JX0G5al)J6?Yu zwXcP5bAAOij34VA4kFqV5Omq?!U8a4V@h$}PFw|WS`Z;VBiMWxn0388s_tcVN4HqS zWmVScnaM2dK|(9CHhw4c8R4eTJml?Ew?(c(nCRagn#;E$;1#5A>eDy&biyU=%{K&S z*u*R0U=pkjr_zx+$Pq3vV)=pe*W2FwOuwI5&wl2?47r(X_#TQ))G=`KV9zSP_trrR zeFd{=Ym}QoX^tH^wbND&ITB5Qr&s02Mq`fEhD}G8$yTf3(m6x8ZR+hVc@#mew~IH* zGwB=`XXUaTOh%Ru5|ht7UVA!?X6U7pC|%81_f}M}W?`k+`m{w)MkNEkHuJV;D;&=H zo)Vr-X{*nFt_wKLD+(py(+WHu5m4ZeVYrSH-ez(#ZvBx(?VmJPtwKVPWp8(aCxz4wx#UI9c^bO?rrr8;d6 zB{7p&ceBPGX#|In`=>Y$3ew=v+CZRZt_AqN|mpL4gi7ozL6R6lA&sn0-k_v42qo zcc+@*G7f2pvm<9sJU3(BI{Y_;y)UJ}3mPfX?R```k{gj%OLTUcDS)yG91i(92;{6IGP1=u3% ziSISKFwHo%N#HZOEU`uGBy_ocl$!pz@Cb4F#b58^p+R2>Pp^lqpCEFga8)@^khkMeY%_i^qPnFiPH)8Ys(?H-o-^u$QWGjR2`<;*AVm=R zvFS0&3I1&|RY;XJHX=-D>6~7uliLnQ$O+c^;}W_ynyBsty^bFfPHWcuBtBctx$SH6 zPP=P1QaUFQH_|%ccmbK80vFG1LnQj=7_E(_{@~Z$sfT*;ipgw&&j!>3zAr(GaL9>| z#8XhFxA;NlqlOe>+1Z>hut#~0VDn;FzV`80h~lDvV~6r}+bx zC^hSMJ6hjf%y_;#wYP9tIv}8x$3~O&Q-()pBA?nH2-MGSnE# zCNV9;x5A6=eSmT5Gy;*XWj>CK@4=_*L4+S+d9o4+Wm>PSlBP-4Lv=@uH@J$sUb=p( zdIp8HJnmUc6FS8rx|sUP813p!z|2Q163FFW!#rb8rtegEZ*!J&q1K#EK1yiz<=d4> z^Z5}(n2zn4dHJ&P6iH;I$HVt59}m3j&#y36+U^_U=q3r!b$oX%Yr>g2S*p$%HPTFm z`94~V<_p2(3;U1~{J`ma7x33IO$7>fs@YjDrO+9Vv*J|KBY8NuQUa68E!EgHa<;mH zNcY;P`O&6tiRHGOA%JX4xZE!R{^OLN3Ms9HD6T*Zux3nbU-ZJgABKNXMF+PXI=zXv z7153F7q7J!PUcq?{^6F*^g~Dp?%i)-TJq2OEQ;tC{bqUSu@rz)9>iQhcxHE(Yde6r zzbqc{!Y_d2QoLGLhd4t^R=sUW%4A)x;hpN3 z8V>S#-&u6-h9YzRg2M^;0~eF;yMtNxc9aP)iQisK*9NSQ6$ZR*C{cO@mz32pFXEOE+cUx+=O&m&B}Q@H{JiCV2ks<^gi2unTDK9CS;0x)k)r!#D+ za(MYHWQc=x2_PUf7ob=iUPj!w^aH3oxR9`TQ9~!%sl*DA# zJ1a;59VWn=ba{Osq#23j*`;;8fJ`0rp@QJ-lk)gpXk)d6tm3IG=R$Wq25nnWVKH~a#}t*_yPnMscH8N(W!1{S68bM8sY=2eP zLiN}9Avg7`z1Vh|)hgBjpTX0cWniIFf8YjB?qL^B$H{l)kv>wuF6pz2yp-9poe^~MCCAJ+n zuQK+4K3GYEdCMxRTv*aQ z=hmS1k%Wtls{5%gn)eYFeY)uuXI**2iXf@g|26#bRGe*48V789lUi7`7=@QnUe6f> zpi5xQ)3e8Q%~Gd;&;^0CY~JmxG8V~!q>4kW{SMSg`?a6~lhq=lKaF$!R@p@M1Ku^% z7-sg1>FqV|fQ4UweQ;p!F2Yv6^q` zcqd~1`&q^Nmk34%(QTOFraWzaJfe<%u~fILKL-I;u&yA;kKbcE?O?waO&dE)xdaz& zJ}ZWA`RGQ@3&);zRMleZ^aMj5%0YK1tzvF=;GYXkU) z_E$80yQ}lbr`9jZ@Nr8T4m<;DjyD?0uQHR91nLRQ8_! z`Q1S18(T=b&*`-OwWrkXVO8jqbO48qC8zGzvzuG4 zRrZR2wrhK3jY_+z`kmHsY`P&2fF{S#vCTcb`B2cQLJa=%Gswm6PX{tK&r6FNFye70 z+3LfF^a4e_O6wMdS^G@pDrBWmL_>B7!#=Ag?Ba@%KpjC&*|h)jS_(mL$=!}9DZ6mE z6ZTUOv9J;A1_}Bu6u)ylXA-^_yJL~-vwLWrY8?m@Trk({?(1@rujbkRD4o@SIs|-c zHvTF=GBwdwv`Lm}Q?XNA@k7U>Q!xT%3yPx8TY7zxhK|$iKaAaGpb{2Sr&~o$GGUyT z$>s$JEZx^t*36*vve(?O>*u6Ih@8~@ITZvo@PK{aO^sv6y|iw#Eqs2xZH=`F!iUQ3 znNc>lBgIGS>qiQC@daQqfQ<@OU6Y;Z@G`rBj{v}JUM2T%as+ytFPJ~G1s|Se#U5Xg zA=*SEk?!CrGmTB+9P;FdFw$U~7`u0WR+V~^=p~s=1dewQsw$vwu+$zowuchCd z5Mmz3&`BSrY{5h~de8E$EjdGum9W+B2`W0BYi#6xxjfyO44^&$GlkHzY=vpKG>dCa zapU7VOB8Aos9lW zs4w%|#b(#z?I&ZK0lREpccOPJYK!5qW9}~awcQDqxGtm3*)9l~=5-Q3|F%UM=$_sk zR>b_LW|=Z+J>Uw9SB^Az?;?AQTj?|_OFfHQm16UPEq7B7(Z-Q`!QI#Pc#UPn|K(;L zOS)q_Ef~=rIRf8M6o4)wc*U0x&VEjc2>%pd_R30yodVgI($j8Kf(V^YHMF!k>Bb!a zQHl&?UMuG%oUX~+CMMQddsprFSAw!&l57>+D@N_G(&D}uf{dm#RiGVPPxj1x=p=HD z6^g1mVMpmmbt?tH8I19@fzoM47E;Bmg@mKKLpJ&NW+|Ei_mf|_teN){@8~nEB?}d( z+=qOtRQ;wmZMgDXLg`I2HUwDUn{{ppz6eb%4W%`z{;<&agwHN%wkC|)@U(O|k)Hdd zp+$E@OHEg6DuzJ)=YBQX@n1H%`4Qj>DbS#CR zw|_SwTRiu4-bV+N-7(EiE$}^UBmDQU26f!}@wok7o-Q zrfL=|%+F^6-T{L?)W-w_{U+RH8k2t=OTybNx~(JwFu?(1rj8oJ=TC=sw@j<4pO{ zHQL88aGGpq;Mv~T<$sV_4Cb(`|9DWb@A+5O?RCDfPy4~5iwXB$i^>{wCn~2H#wp8} z%Pm(ZO*pph*|uPHO-v^?R1*Tgc+Wl#o?|t;7{J{sHo|ML#%W%(5_k>)o!3ocv<+!c zFg9ZZG_#-}R*jV~_W8pTyBhcj>2{h6wO2;2GjVCwG<@};JWsD;DqN$I1T3KmiJ z>twn-{%8m3lp6TTa>}TFrmChCHhMEVt5?VMcMjMr-M)_vk2dszwN1pRaCgO#wFOoA z3TW=0I&>!@+;w{&6BWP%O13W54vHv?e(X0~A|k$b)h62A>tWF0U1t&#={qX?BVOj} z5H76bvgAH%QgJ-97*|k(r>Xb;HS~HJNCRubEi39~=gQ|Ng+8+W)pq=RK6}W`wS2Tt z@LywF1gd5q0!28-wSSc1KqN~q_9q17dUiKTY-YKA$xM6|$iWd=T@{M^-fxL*+Jl*> zZ?5k3^#ssY{dR^XSBlDR9eSzdPywsy_S^@MHn~Ean6a*uU;&S1mtd1It&Fdwt!3;LR99F88bjmFI}r zl)UDhCV&dF)WnQHrOV~;%-$H^+Bc5Wr6ZD$WW5!H%Clt1;&{T2U73a&&Xr+VuS$37 z`3Jmsv!`SCbSL6DS|jc8@bKV_m1Qe-lSAZ#!=1Gyka*NGt|&^mWTiN^)Q?6SRmr`! zZ(1$eB+nf9z&uJ`TI-WEZq~CY@yiD?UuE|+u(vDLI0vu_W|CTBq~EdBnYE@k8D9T7 z|By3cNh_=6%>ETD4*G@3_5EOPsxtIi<6%iMd4#~CcTW^JC)Xo(0c8{OK5JJgM?yks zSG?-9{}=_S7lpm0cxT*pwo0Hc{$wh#Z*KG0G)q>a^U9Y-$~LGzjt`CUCCG5>#lDDi z9k-&Zi(-`F1|7->qh)SWE(f@@#3~-${X&S&p}-tizhANJI+# z66y&9c$QfQ7FWCIW`W{2NQCv^P|`dPA-Nu6^^cme8Mk1Qo7;ANWx82 zF-73AK?=XSS?ycVS-Xj6+cirNU~i=Cl8|BB)OCO%h-v$3+~rlI6u!{Di#bH{-2w^d z^D3}(`_XJv4)yycNIT$cL1Smb%^;oXWmz@WP=(`sigF?KF)wTgQ5n@;2rYf z-aDOW;QlD;E|?Z<1#`z(hcUWl5BN2wL_3p;|5*OorPew_K|E zcf0&ko6a`!Jw>WNSeZ!d#|tjaA>n5hC+SX%?bBy+0S71baqm)TCnbX>(0A&8Yn8U z(f&4v;$*$4X2o}O_P9_QdYy{Q2+{ruQhUfz+zR?v2?yZ9z!C^YRj&9hqi}p9&U5Rk(j_6Cy6yfX0ch0L=TDE-mU~dkgZ{ z#kfibF1Z7ICjSN_#g?&pyg*bm>KuNw7bxa5Z_P1MTHEGe&gmuew_z>7^uPq)un8Y9+3-6v>evJGTBR&#w;SJSRZ z+CXKExyU9;fijF`RONR!(4)Y`uylk{({{)i`<~ZLD~$W2RJtUM|IeU3$FoX7sOu2B zJcGN#6|sVSA=w*ilYii6jty3rY=#m znbA+pw+8emYabK0=9>($#H5;mZ;)#a*x;A z&o+#S?=*G3uDrxiSw89Q%&{fV><2g41a^p+Ku_C-oM#F4AFAtbqhgbI+gX2%wYT47 zHK%CywnWR=(+mZK1ZHOk{Jh=~8oGJRsC1nv;FRNquiNeCU!n2I#0zHmeCRxL=vdj9 zG+P2+>?FRMs`+Qgs2E-gE$l3;_5xngFr>IDkbBJE(Pg|=y3LsM)EYIoqLqCeIT`F+=os8?+Z_` zbU@F}x5lcn)BeB8`6cJmtF0VYS{XK#7kMi-V~6g`BzwK4G`$I z6#Am~#6*$|>7CA17IkyXy{}v~21=D&x|?!Fyw5d?vq*56)|b3I(L|~Xu?An`#Mh-C%URyz!IEfRvlp`ZH`_Hu6;~0^tHK9$>o=}(PP87eNcLr(qN;Qu=pwA z6R#VUp@(r%4Zo&F-`BMJhQAy9_@K5>?^0LGXiNfJ!*rKE_mQ>4j|Tse5e|)SH$z<~ z%a7SlvnZqG4w0+kEnl;1&y9M?T?v?efT{==OWj_WWvpUvkty3gs4!LJyH{4xt8#E> zCGD@-yWi0K1kvpRwf2swJm<_uHP)I~QR&Vvd!rbPMJU?wgP2CQN59)tK+KrudEtAq zWj>V?f1`t0?Rc!8S+Ko#Tdl=`uoOf|+TM~Us|D=;W-8{fVLIGRIcs5~Q!M%q(f#i< z@f4ozPw8bYOf;p_*(qz`HA$eVF*l9wC>BTKE%|9UM-0Nt%j+GZBIiUX^A8*NDIh2l z2xeX~NTdEgsfT%(m^0Nzq&DsyUI&Y&;flEOk-BsmF6hLwFa7$kiOm1N`D7BgLvG92 zZXzA}A42}`k9l*qlux6y^*`~O=dpE+Dd;Vqzx?}`?6k~|ehgTBFH$tkd^L+Ae5;aw zocN1jID*+K!7E_?au3H@d}_bTdg$-&l|4pr6Im?P3Dj@J4XP)6BIesjChp%_UR%pq z=}kcP*X0!A<(u*Po2t$Z3_+Sf`@lyOx0g}su;Gv-HX2cV68xKSza3Ux4pgQo`M``H z|NqqA|3NLyKv7q}Lqlo*lJ&p8X{_H?-Yy_BrEy;#{Q+ulp{-nx;JqxEOUl=}l`abAN~lh#&pRhWxOMvA0<6RwWVy@B3H zqLCuS#12qB2zi#p^D>R|lItrb>1bieYZTRf;LF~ZzGgrda z+P<1FfV&hjU8#;`)a$T9tWD= z6J4=*Z#M*yVWYT4|Dogm`IxtW$x`vY8pXF9b>E$vfIP3%uO0PS;sWpzqf|l7M|C#~ zUzG$%%26Y~0`r!qSPjNS{JSR=k4XhaFWmJ9&j`l0I^QcdDns+V<%dw39aC2AN9{^T z41yoGy7YimH&}RclQ((9jC~E`|fm~(O!x!#RwE)og$1=^;@vZlgDJ?2zhg|HDPuBbETxK ztBcLk02u%q!T#l@_>{xxmsN?u;knVx$H*2_+l5A_H3X;swh7PXtor$Nn5R4C_kKWc zvmBfPcVDnIj?D8r?M>sJu$RrmgM{l*;V+GQbBj@9qwJ7xPY)3fsD9hQK9aK52MHD- zKiaQms37TTo$Z)b6rKxDBtnXiv@$BQ;GCdCSoVXMPw$?H72fPWnB;;x2aaxb`NbIs z*yk*%-~WSa@RH`?C2TNa;=|pRB?HOsstbNQD7pI|Blo{Q4&M67v)u^(JxDqS-A)I? zELCS9!OW*;zaK-%yhnE`=2&Dodphnur*zmDHdw6kt#)ro3<|k2&rGcum>YeGyb&AD z)5hmJRS-xsfp})D*ZSL#EF$YA0$XJcDZRgZE}6Y^S^{cOv%2mewi*$M8maH@pw5{( z(5GOQ854vu)rjyr@CZ9OV5Ccv0#na_5imWD0%_SK2Za2x80U)1d3 zT{R!fOk}xFE}i2Q+rRlG6OkUY_K=J7X3gpDWW{D)clMhziJfnse&*0!X0AMsdja7{ zH_N%+Fkytg^v_j~=3VOo)!0s#z+V@G>+q~x2A>-V!ehJnvXP!~Sq|SqHLZ^2`ZJ$* zyTAV7eed@m5wDoXJS{w_6Fp>Lc73J0*a(X_;geyEJ==sdI&?1Wc}8Ei;AU9Hwyq`5 zyZ+EE&AfRY>w5qBcbL~nyyV6^ld^Cx3HP$S(*S(rOlc;n9g+L)d|#G(Pby5R#4%27 zgj-=3Bcz|^aT`$Nh6v?h3&R8=F}CYo6G6X)Qb|*Ef7He@{j*5@j>`}5>n^k9HrCcv(_c_*)O?J3cLi$>XfQb4Knu`q2 zaee2590@aZDxI2TlhK;CYcrp(YBSZM;VoLAs#^*1%MsYI8foY>2((sdTg;J^^JA`5?zqgguYKRD=Cqzm)-#%vZg!Y4PbYFkZXY?g@_q z?=H+Jx3MtedjBQJWi6cJu5a4p0rI}vmcST)r&i1WTzK@Ouz&C0@o&FfKky z1Mc}LUvD?@W_De2<<~0lcF44hULJ-lkPkferN8Ryz4T$7tf|r6Dd}j470X<0TU#?L zi6Qy80qZj*Ht{rvX&*wRr%>pvo)3I=M zyhT>+ji#Ob)Bedn_=z~WYWecTa9<-CrugM?rPT;hxuaW7y*txo!C$`Ft?S!2>n``n z{rNgpSlOqaGmZ=A*C=~DX?N@&9f6>f2Fcf-mF)IC+g+ISf5lQrXOecx>6MvW-mF;= z%xyYlHCT?gGMTao|NTTHUN^7&UEqvj`cwTNkJ@1#&Z3)oOc1ttcfH2lJ>^NAKFidG z)!O+~+fvmduh}yyQwkiF*<(mz{@{tpS@C?Uo4!DLtod#1GweXEI93kC%pgZlZC*D z(aPz;LUWIeZx}~@`0VtuKZiL470S*yX#^TZ))s%^2tK$Q?T+H3+<1DIZQOk%uNTTR=$XJ1hz%vV~)>W^u1>dTK>S z4q~?jx52oo-I0YEF&V#>0e5>0TO2EHSh<3!e{b8|SSZHQy)273-_5TI!+9=r*A*p~ zvD6l$zCSaqb{67Ba;8#g?I>XZK_56cC^qj?7#@H=NxEH{==8Fu)xhR0= z-NNn<@KcMj*zOnj5Q}e=Z zQkG0QUHboG?>*z1?zXK_MNkA0Y0`^IuY&ZBNbg;`joxeM5s}^$0tg5J=^#XU4Jar` zmkyzc^e#2Dgu8h5KIiPcf9LVu5BL4{enb3+By+7b*PLUHIVQOK(k||>u@RehM1+Q^ z@hKl4(EEWZEKpNNj(5X`kB84V$=+r>?2S`{Bme zT|?=enh9_(%p&4INaPE^3MflTmU^o6wVMKMn&MxF>Ba6o`G7FEE%~FW*(|w3@b5pJ zGKj1m#)lxk;B8EkIg)*i^9tYgS~5ON8S9PdhS~{pn>n#L9X8I-ms-#DK+=e6uUK1P zX!i!5yS#G(KG-sD+^yX>mG)Zf?0U>z!R#1GruT^6b{boAki!e>7y-?h#%15Vsgc@H z%IDU=tvjk$-}@CdUBstlafC%GQqu`41wCoX=)-ocr@G8od6yDee;(gC z`(s>SU~X=H-%5OF*y_IX+HjHe+0l;m>EY%Qz;C%is90!2`%a1OPt#tdvZ8V{um0j_ zS~Iipc;t-m?TfLr^FcrQ={Lo@#U;k)Skg)-o%>gq?d_cWAwq$1R8MQT%^ifroDh#R z)^9q%?Wd4KpFvTenE%w!$&|LbzJeu5tiq$WW9xDt=b;gSrk$KL^Ve{IDiE^wWZzZW|^pF&q2X`j2rK=>e`Z`@R_us6pCj63Ylys@X%V1MeIA8X1UpUU?RAezg zsEX|&75sPr=px7ezJX89^!eE65<}(Pm$Dic1PQ&y^jL)~D_q5R2B$D$MrY91Zpw=D zks|mmzN;DKj8ec8i@2TmxNpF1INE^iU+g8(5xNv;6%rX42LKD+(K$VdDMML!{u{R9kyg z|6@1&>p!#J;{w3604ZnoufP3|eUinDlrxD8`hP`q#}UP{2sY)*9r@uFxnc)76ohuXC45q9l=QAs##107`^eN0cASL7)v z%~ahO6u7{vcc`6StNGSF>bQHVeP~%l!ke^7N`JZ`Ke0WaSf^j3=DATxY}KMfJEuFr zJ5b&)4Z|=vflqtf)S~2I#n|O`8@$}9;gO4we2EUInHIYtDm4CJ(KkB4f5u40{0T0x zCoe4Itod)v0-28%NbzONmw*BNx}UmHd+a7+r`mD-z#3g`EaJC;HO@c$yEXDE%s)Jb z1M^A!hxuGPmoZW%T;S!E;N|v1EPf@_Cb9oGgNE~A<=~TROXKJjXbJ(^hDh;)gA3OP zk02q#CAjsoj`vc$afv2?zt+4tX!T!$J$>1y$HWWgJ+VQp+C&xs>Cdy0tPBNx64@+; zizar3W8*&^*Q(cGm-1xyiT^1nR{+qFolcNp+#ehm&jpyJR#>U|ha+LD19q|r44(9N z4j8PNtQx?e21(aGlKsIEn&^WCyuE0%_=iRQK?=@R)obzfKdtg@3V@vb|6?Ll%?j$m z)Wfg;RiHq_k&o7x7Kd)Ex*QH<*MJ*y_jp!}x&=H>ET+eBiS_gGn{+b0JK8rc_q9AL ztWd|jRjBw6jI6}1ZJhP*tQm~D{SH*;2WG46hMHPXqfge`aP-S5Zf7(8!ED7Az-+~{ z-yE6#;J{zwah4G!{I^r4HUmz1Zj+-M%OK_Vj)+zmW;GQ7a8_9D%QD6>Gmlut&Wm0| z$={!^1VM`=ns;Jd-dQ01d`rxMz(_szWL=FOZ`9~v@a05et9l^zo(q-CiF z|8qrrB{`ZwH`@SB5(=?(Nb_FC_cmKeSYX^Ep+|BWuoHS*@}|P zZim6M4$yM-L{oC-5#O3i(@xm&JmdM}$aJ~)B)|Uyikq2@a906MC*qLqvz%P^;C^gO>!A6-i$jd*e3Y4KCW>ILB&G=ksH zjyhy+K9XBr1dXqIrE}(2i)6i{}MYSxS>LM^8&%_sO!A55r26uZW(qG0i*=st>_VgZ~ zENdC(Wn?3xzvKLae$d<2`f8OCYdC|U*2HHLhz6ujl-TzGIyYSX-9vDHp z5^!3q=jZ#z9OZ6+LXmPX^f(2|f58lD=do;-bWc;I_37d7@X?VzS;;{aD?LBH|w6HlJg*)7yxRA}60{U%#2u&G`KKq7*g3Zb5qi_>8Pl#4njw3n0- zm}@>E`=-R>Cpd0v^oW zjxmatf(33-N&0+Zj84=P?*y1=uqwq0^z3qQAw;}Tdb{WC@q-!RlgTDmjVH$YOxkuh zD({JtYI?s?2CL&pg^2{Jl&zl7H(KU*QilU&rt!7s)o(B4ENVuq;|f_L0LiD~Sq=1C z6vdJj^d#{dz0<+COpdPGTdZY}PB>qgTw?8F^ZZhm(9q&$0<;*AXqwqh;m}H>HoBAnZTAHtcwIOP1;BWrG5* zmF(~|k=cMDI`{8)uJdJlyQA$F{DqC~N%HipKK-M>V)3MawpIyvH{^D{5-7_ifWo1B z8}JAGxPIc)E9uD}_nMiDBpSYOA5W|CC%1Fs>({(o8>rp%DpYk0)zcLFHd_d^Hjby0 z2HoakMNV|2R!rDZ+Lyp;H#qYBa!_~qMZbB-XxEg!PY&fsgQ619bO)NV$1JF zOKH1jECH3sf+92tY4Ek#@S>z)+i&SLVi3#%vGPED zaz?P9h5@96LBIfE2lOD2(FF|BMrCGp*t2CBTA>vf$9IiQh8QaT*2eNe@|ZQprtRj_ zo(s*3ev_5MW5N$P)_D58$$f0-%dBK!0{X0)?`=V4rRlk8Y;u3PNdMU!G4wuX=wcXi zyjDhdF{Rkh@m86{?0WQ))X$e!n!@R=u*D=|fe-z+k?4l#yhe3A;T}sn@q=||@q<-s z6w!v2H?LDbIYK7?OY}~K@t!(HCw6*H!`5i5&2s`#p2iEA%15W9O*?#0V>+a&ZLyoo zL!y&9Ys9$JYwv}p&V=6(HotZ#OiNkH&y{)ndE+M`c}n6IDFL~=bQS%Nwtewu?^cC# zYgfk`OD2$kDHC;1k|qS9NykUkp}jR9)=A_w!iPPr5&RCBKD84*L@S=I$kq4ad=#US z3{tTo2~d1;ohP5mW6>{59fVUuix9X}S*29i| zE-IA=S8vM_<6I|PK~|a8I?w28No)#2SN(#<{3~XzJ3a<_2qKOLYais9NuQ~9P#(>(k?HXgit)o{8WAZ%mp$!x=870Ly>UOSk`!bC;&_<)GF4|O?_IxJY zgax5>LqoB$^%teWADKEhMYNs+lb`M!xo3q9b|i4!>-0PwSULn<02* zYDv7LsxsW#sj&-P@2Nyxvu0f@6jxevukoSvnnBgI-$if+?rRyI{PcmCpt2?M;(`zE z?2|bUkO@(^2m7)Ec&r@vV}E7W&}{f6<$NT3A!>UHyHpa+X8yGW1Oczvc23UMTd-Vj z+;V~&uCMG#3E>_Ls_~_+mo@gK*ZkPryWQH7My?$OSCwLKoBLSVw@b9)3Vk`0EiT*< zOS^o7U$LXQ?;g){peZv0&tNK=*P|{JnR1mM-J32Gx!Cg(2g7=?D3$WORYCPJ`V5cP zUAG<|{tCAq?+kx;xd@?rdv-5j)qUm3P=27q-p=lUH9)}{nYV5qs9HJGdCsv-$yuOH zTl@w;`g?m<&e6F3{??ItI4z#a(%&zf!E0;JZZUsCC;1~r)G5Xn1H>fSjid*eaBx^C zBRr&Uoc{88u<^CMmC^b2wOj#p^3i_Nr!yy=@ZK4XNz6d0-tzd0n&$75&|->G9pKV|F*IRD59>$^WzLWLJ06Qy>gUKdZx4xwO?lo& zQi67|K#s*Yy%RIh5N1t3L((nI6^9Ulhc*PqncF9=z0=MVGdFDBsAo!w-PgF#V!A#i*N8O z0QO{?m3fWu=472|&E|3c`B}ep>b)(=1|JLv$Ar5MG${8!XRigf%C)s!ubZxW(AHE z4#&Hwzc<-+od4~~KfOP&rmxs>ZDw}2Who__f2Hn93{AUX>rRtQ%Tq&S<#)^8!oWxu z>?QGA?AfyK_p;4X;w)~|x{N~VUMqx z-FyIty0wg{d4pcnO~d}YCS#i{rrUK;S=L2r+ljX0N>cMn&Jf<(CQ+iBGm^=(;x}(*B z$HxyV*{a zKtN+^UKc)u;ww*(ls+hG=;N?@Jbofg!H5os_YbV!sOZL_ZZ_EhMC@&IzWq?DY@MvB z_;vcCn42t$UMm9=Rg42;!+ENBTpxq5@_G>WJ>8vHQ!Cw(0&XD>G|MHxW#3Gh)Dgq< z1+EBHE}UB&7EGUo&c~8QC4CxoTey_NS%*KurX9N+LK>HnCqORJG5{MWkgAFU`^a%w(W?h0}(>gM^0-BPGSe!3KZxx*0Z`^Cs10gIM7 z{!0Jp+g_x_+F4Wm;aH{ZG(k$zgHyWJ;%bN*BKIeFVpq zM})f7X4B!qw-+j?Uwh-Vu?aOV7jhzun)!Qg3ac^rPR5+}6Q0G;Kym2}*tE-*LuTp? zR81_U0L|##oo0tI-b(A3Y{N#TGNc#evh*GsI@T^Z<0g861#Y zS|o!e-j?A~=;OBrS04@cVz?}iRWHq>Th5W^mv(`y)?kUAzNIgFA#Q}UuYswA3In{s zd*%J0*zaDKprQD9|7OrwT4*mVq7Kv#SG4A!*kx!8iun$e-t~@y1WM`s;#zU;B;}I9 zR{IDMbBVhu8+u9j-VcG&%&aI|D}>rD&%g|w=MjL)o*8K)d$pXY$&>opQ~^xo6Y<8us$ z4PxDa`y;0U%7U_+s!qxVLn~nh+uXt!MPkiBB7s5fI*c&{wz@8O)a*Vx7M=Flq4C9R z3TI_Tj7RKb^|KJ;{b7F#gEwnz`Uu(jOyXJ07DURkHj0sgQ~$t-26BtuH0;} zlEB>N$RUnc=EjU=TX(!ibBSzz@lvhaYJhOaqwPayko?`K{*pg19%RsKHN>rt7bKmU zCcd0xQS{Sr%qpdq4=3pY>c{ctIHNYxFWM^{sblFCngO|Dp;;Qznl`-9ux{K%B(#OhE?Z&Wc_P#pS~0_YXQP(*ya` zwn9;*AJiXAD((%JdNZ}A-lHkI#)Bcb#jY>A+z*JY$oU~&wav*oVjAx{fy>iboCm|r z5kx0x-9&STkyCDN4byw(9WCi{zcRPo5PUV{8Nc!qm@dS-x-Ol7?4wZgAs&9An`iZT zb~}n9S#t96fmZp4<~s)?s-ks72Q^xOy$@xx@^F7;5^w4{MS4ynT2|k6{dAZ`CfbcO z7(5|Ed9B`BG3wt+qU|+p3FxBpUhGsfaHDq{v6~T0zl{)z-tudn*uNp0rH^xw$Zw(z z7;9UL6bE`2XkB}PdIgk|a|Is2 z{w>8jI-A57S?7Q-dmSFv^y+FEPjGS&yarXDYcpXtk8P-~v8A5q3l?2IT^lJu?#r5D znoQR(#C_-@P5|bzfexQPERex;G8SwF2q^38Mf5W5P(HkdL&18nHxPtk}(kX#Gem3;uQysFZ8l4;@PZnE;BVCEpDG_LOoP08*^IU|L4nUf=$*`BWL z7JL57;tInb4-gvK`Yi-fMOD@5-wQ~W(q@ElOILrremLVY-=x(M`8<2C@I})gm!r0q z1duG!Pr4-garp{UPYbL>TU>vJV9J!a;W9#qSWA^?prV&hqOctGJbiC8Fy? z5+e7$jv7<(>SU4bz3!s;5fUDV-{sv?wP08bd+ij#JsF}Vy)$g2rxIq?j}{%Htc~LR zCT4GbEXmGNKfPGzxTsj8VAvQQaoT;e=V@jUgo@y+z2fvM@%|5FC@7Qz%m8~{RFJ& zSjunt4@l{HlD=y4NC_<=Z=)_Z^uI zr9c=Y4KoovYksqS>NJJ6gPgXGK$Y?&>V_t_MEA@AL}nrW-9~zknom9#2+#&UdR%&1 zVu>j>azdCBw|paGAKT+ALffH{f>WbPJNkR3?sdZCBah$mhUC84Gw;^7jwx06^+TRm z$Oazh%~S#OZk4kvSMh4zdQ(^=XBVFsX}4|FT=IC5FDT`#sIG6VmNr2ZBWnywvk5=8 zv@`s-C>e|_1FHutMa_H{la?r3jzUEq6O~P>-!gxr7)wK;>{tyyM_CnimFB*3R(1Y< zaHlte%@iW)W+S8AJsRN6kd5hAq`CeRK~`e z+q5eM*MfENS5ik=H5*2LmYLNLI!@N~*0sU3ZA-q?M23Za9SCgiJGe-|>}ZWn>0C~g zVyK?Fs~AN{zzHH7oNi->WH5=T_n*EpN4ib=>|7hv(Zg|@E!aG^EuTWE4&V0`yJ|2m zAH@V3sKaM4{-dxm&?KP)+C8-?ynsU z+nf+f{(hMu_}esU{y_lp`@zXC>t~#U7x5jY4!RRwB91ubtgMqGuxSgWdsz=;uF|d#z)08!Wd||2qoe zmVphe5nGO`?a|IE+F^a3@C>(3kJ!-at91N5Hza*w^p2z3v|Gf=ULXBE-p)!a^vGkJ zC;9iuX>4n6pCxNP=}i+_aFizb-;1OgHziAMJ{2`~LPG#-Im4#oIOXC#~O!R70AMens~J%rVW# zz(@7ewPZa_0#eraxPhdQ>T)wc&y7}F(IU`2k>J<5=4Zo9skBpC1_l+sKszs5#(c=e zj#&CAOJ|kzv?x8pD3wbk%=N(X%C(zuFMd zI83z2SZ={=y2R43>UG|rpFKQ+#hl`WC2@Y+p+=wVcF14{0v5R}%XJP^eTy{pkUe$8 z(pX&3A`;ia>YZo=4A+Q>h*tIM_&ow*_E_!z~*;5Nag0l4ooN3~F? zp$&_X$Gtx`))|G6E_Gkke5B9T3sNc1SDh>U&D|#PRB2TdhjV2wDo>N8?c+nC29-;x z*>J~?G-WQu#r0O`bD{gIy9GAsPuUoMSzSV{8aCB1-H+XzNVRXY0Yp3vc*r$B0}m&y z40*Nl-F$v0lXMI(%`%+L+b@WOJ@2Jyg^7?Hd*OZ+QJ1ocILL8%76MW2=aFog_yKrj z5He&67r!CY4|=>`AmhY_hVEr(;XN`?cq5PwtN$Pq$nn7O@$XFPB<*zsEH3R<#Hlnr z@1;UMUgzfHr6w9OKA}$niU*6)81Y92MtOvxncKx({pKl+nLr(WYV)8WsmOOwh3$Bi zMs@ZgwM^4Uar&&IL{IT<0o29t_lH7c^Y8^J-j=|qQrsjB9-2~C2fPwsnR@?>MKVvvUjPFyMB&mx~5U{SrGbnN|SkmoD)D^E>Su#2vn1B z_DYmSoa-a|ds)XtvdAY>oTqOfoG&BqPiSdvCa*P(ur*8hA99z>KLAJ@HS=8if@hx{ zZJR;J#O89XIBrA1+IzU`>0+=J~RE1U}ED1+@u9-p7lRq~85H9njk zpR+zYNO|`hasCQ&^M+QEU+sMBq3N5lQtBvWT)PHPH!<9cJA5-+e| zF)SNgq~rXzN70`B>xrs5ejOD2-A!Co_N<3d!sCZ>QwUB_V#2sNEq9|u`c9qhY!3+s z0m<-YH?@t)Ilr1Qe`o__y>4$c&^+(Nz`RaC-LZPY1Y!T}Lg3z!{HRnX_#rsycti?? z^Wz$NTq2_v_4W7!0)<9P@1uLV^eXSSb;fun3Yon1>p*?|-sb)cVoxaLr}ZcM%-<>8 z^#I1W#eVGq#+V}XTS)~h0bk(0@A9!W++USzBWlntvgj-9A<#Hq$%*%~%&*&fO~%oN z*{Vuy7*UMk9WB0hzbU4WR(<%BdbbhlH=yxGZI?|58NW++E$OPZkiy(olSa){sl)N- zHMJ8i&68t}mv0oB1ph9llRn%CYaFVd_WLw8_H<6McQfF`V3kPd2SZuQm}cVo4t1Pq z-7GKPnh03w?t$g%8o>&z`17KJt5iCJJhJ(=FTmJMERD>*;Tnz-LmBtCdkiiR+bT?aA>fo@lS%d*`v zjkTLb=1}jAw8yk<0;(=CR61wEklpP#WLBs~W-!p!QV;6<>8p7qHPuVmhajzS4h&DZV;J(J(3!be$s8N2j>lo7Q`K+)lVcjS#uIm>tfs~RHHR|CA-uMeYGD(_xx^+gbV=Lfagxhss}4%=7Bmnend`J z{L62*tK&1XXL*MWE55k|j!dYyFPLdfeuDu2m96bs2 z^wj1`IA6nTQDC0l_BuI|wrIE|=sJEb8PLM^8!psQgmU`Omici_i<`I~#Y4}YBi8J{ z$x#dGY#!9@IIQlOuO`@E8xP|#t$EiUbXZw4c8=U?SZ_jn6O^6Iv%Y5d@$pVM}h39;PY|25z9Td%`s@@zj(WNf&mvivVrQZ>t8V-VI$ zYfm-<3-hl9>WmJ8bjbPs1)D`n>Hvmbj35w%2kdrQ|N0u44~AX@?d$)PD2{z*P>{#j zM?UQQ7DdFn41fc%?TqAjQ$2cW9!AP%7Xj_Rur#&t{=!MF1-dmEAB{@{3;X(Mi2mrO zGu~I%OENe3)cIdiPkM1-JHLOo5d-q?g^Jrb9J%+hwz%%_oXJ2(To-m1|F-NW%3I~n zu9rWFWJ!DcK}B7Nlb=(E>;P`NzgX1yfWMz0`DkPME0sbll8_zeuCh^-F77dW_9qIm z)qMKiqrZMR)4OGTPizBe)8CVM+&43oYFs%A3w`wnZ~8@|MnJuQakX+iSqdOYaOlQ; zZ_}#hQu?*HOoQWw!>;`6QC-+2T&7Ex@ntXJ+f)|6))S?PK=SE~6HzcsVv4lq z(0STy^XucJF#Ugiv_aAz7Hx~n=ox>61RyY&AuNz)V9biy-tg>NwZm9L5|>c}AR9E& zI@f(c?sjoSDkK}k1mWWrgJ~Qb%K4fZYk-Bc49CJ@IUR7<%ydau&YwQh;tcV)W|KpYRL8qEdvO~ac{B8g3H$u05o|c3e=H9&ZQkEaA3&&Nf%*(;7 znomGz{3$#WY9%*RK7~H~H_EWp$Fs$_*~0y(f_WuO0rsKKt_3YseoTxD?E)l%>Ej;`9B@ z9p{DbZ=1hIQ}TI(F=QW&c2rVguJgKbv_oL(V*c#gHUjtRVAoO>bYBqXVG^jn1@KL^b!) z>!pe~6nRY4Km+h%rCq`eN(@I#OReE$~C;ucMVqKZ_atqH6iaSlL!nXS;w4m z7Z@nz4+c`R@=)OoJk&->rIMKaOz1w6N;N#xo~Z!eu ze@p3`C+cPs-2IF;l8aT)0oyu(^z%1Em7P7;|MXq|zVB4!z#--++*AL5c}x{N_J9A{ z|6Dl#pY4{VpaSn}0}H|`_XNaFWtJ^L&VU=H@u6A2!tTQD(QK;otY55Y(EErHL9mp9 zvEKQ~2lqaswPiHFzPj*@rw+gqUI(uJUa<9aBgE1umLlg*JN-x1bvjTM)NHv<#(HEq zlrOhAkLy}a!PYADXBTIn1y*@PgrDN|A3ZvgX4bDmCLr_l4?o`h1o-it6IXLp3g%?hb|XlT3%ObkXi*J-gbdTDyija(4j~eD1(&YsdWUlxk%*@fV_;Q08W02O zfB;n6W<@uz<^jJk7_9|}zx_?SN*Tuh%J}STC3%s-I+v8zxNlC@LO=|-?>6?)cz&rb zW8K1Ul|{t=(6JVbx@rLGO(V1Ef_4c**5<2^q>oK%oi{-Oyagh~GS7iEin7ZZfF!f_ z6$6N_?z(RxW`AVM2TF4qNfRX0I88Q`*3O`o?<^{3Q!vvgtL)ONAAdc&0!)$>dCRu? zIJs$I_Na%;n+cAIX*ZzMs%d4@}?(U*9JJT#Qe{7?o}y)83dz5d`wwJq|gr^7)- z|J2zS+zURnm%`4y`eN^S&`N`IZMZ}ETs!vA$YHFmf4R^70b|`j>AMp@-30cJ%WrM! zZep%B)=c{=JXMuAUG<+%IG3aj&6BX3DN3jH={mO1L5OZ+w|YEv9731V%M4k~U_!yz zO;kNbWP8p{-D%Dkn-arD z8=2H~?8yv_9g&;Jcmvf=v^~>X?R4OE&OaiPUhP=l=+1=o8z+0>aj&%D+-!?eM( zs1dB_6sXX>hxLSeZB0#N077X{PvuU#&}>LMx0dA2>qZcplMXGVmEAc|-h20XyH`FNv;UT<`vM&&cMG0atwa7Ie3hO*3(OEoQsCgCSCE3k;TXPSgS@8v zs@3eX^J_&cpZT}QvvYRF5qYZw(wyvFFdDFa84i^`p}5;0mR!U?Sh5)>gY`M56?mci zT=JFV9pJYZyPc+TYPE7aX+6K6iOdM}h-Bm~ zKc2z8nt!{_Of0|%@&s-HJ``s)jOF>M%N*-gZS6WKyXHqlHpl8bT2!?M&tk-um+f>{ zV2+Cmqyu|ew?$i1zA{kmz^RVDxq|e~r5otIU4$oNTII6Li?ULJoV~>Aoc+#SR-|p9 zMNf36i0H?$$CVMQjNDV%RT+EZ&YBebX_t*DdgnqolW%MARjIZoPxn4x#*Xp5Bivp! zvjbJ2A>}Vm(Wce*i#3zZ5+L6`Z5epR(OB@jB?vPG`o$@seEJ{1ubC142>Knucq9;N zw_z6j17;XK^ALR8bw9u_DKD&!JI?K{4XS47!NX;GLwUKkd%Q`bA!iBq)?XKJp*oI` zngeI$nU&7k1qSC-{_VDf9KYlEee}sXLc%!mony^}wZ%@hgKR5Z6#ZqJ*KplX0T7&YAj^AiuDb$PbbqOMP1k4Bj*ICTnS z5)WbxHB#T*?I_z5<2A1MdXatT3}$$vI!y;2T|SUBE`O%*LMNwz>94p-yAwA}Ary{A zRXR`XL#Cr(EQ;OU^k#@F&5J1KhE$`Mj$SAq^vpJt{9ARRRb@eAsEhQnVbA$^DJG!a zLF7rqy11iOt!?r`M6D^rZy=E%uphL-`%dtkw6`a>;t-mn+GY2vlE)^LM<%fxxAd9*Tt z7q!_G?=TA~$u*^J+toYJliE2U_!-PkE_ptT9wt$-VNN`eh*9&1V8uI)k0DD+9d;Q+1^d(;w;^eNr-}(3wFs zh7BI!PRrXIzc;_Z8^Ub@7Nn1#g-%x5Kp@K77T6h`BAb@`F2U)^CUT5j25pe|!DeA- zw*MWgBnkgxO6MWipjA9fNc9xv&iX%lu00 zq8t|YVx%?P`puYw- z7#L1}CS_c`0k-WHz-=Q2Rejx$7gLn%di^Zzsq3M$QKjghl*4aIJ zeh3W#QEdA9*+E}3xx2Ln`E+lO4}p&0V=fsEkr(yZ6gsRPOFcVLG#r+L$0JFn0%SzI zT`Gc)<^Ia7vUab3!~_(b9;IHJo?_c}U)L=wS2xVpoC!Rbb^eVggV1_!EtT?^c&=}b z_LNY&Ht+Ar^Z0q19e+u8#@?%~$J&@}l&T4Dz)a+tR+pSLRD+)lmZ4AZE;$$>+!@W# zT!h{p%Kwjqhl)rU<(Vjy#^{Qh#VzBJ}($ruI zmfGA#e8PQ$8hg0R@hys6_8=)>Xha11D=G8yAfHj=H9dl;M(Lv;JSrMZuXnfW_omJ_ zgr>aIG`0>^I8^KyNY3{@p|8Re>c|bTpeD~Q>tNnOHJ(VM7cwX2|>cWniX0OC06x}rLFh3xqluH z*F*b`zZOKFC%QBQbW=m6$CBh_{UP6DM}e67`ZR7hOA9#t$Wu!W`WLBu=th*$k4FTt zb&|kMNUs2e_4Ha^u+w4_t0AI&1HS|#xu>k=f43>^4(cs=-kQ_&Xfh9T#AoqE+ zyb9wznWy*0<_YRdFjtTdV42{_=<|ec}Q>hbIcWiT*9t+#IkFT>8 zngRo01Eh7$Iw{g-XiJm3nJe@Y8ZV950oc)EF0Z0Q-JUX31`zU6D}Gu;eTKB0nzww= zHZ-qj76-c?Q=6Y8=T~r!MYq^YP3bxRu1e6ka%_|7+ivRADV1r+$w?gOVPx)QKtD?J zPVKFIbM=VDN%MvNsJI)&k00(!Cz4#RXRM6NSEa^8__{@rIj9cyL_TK?!HB%6V~$ep zE2pDKja8->%w8?jn?(geD~@_8|)z~dHrdEE#j@V7-@T__ssHFkER5x zfkwVY3PL?+vGpP*u&_0|t}RXY-`(#GS=>Pl&HEQ2A2PdlP;e>>j4Z&50%dcV-tMbm z7@Y|cW;m=OJ4*;DC+s`}#Pb&J`+P4VxuDPBs2Oe*Q@Uh_b2xZrfOws|o}x%}C4=GYPSDwpSG7Xq%f zj7qWH56gGn-7e`&$Zbw=X;42dD6z~JoC^7$RORtS`f_;|SA#0kwe@-s%fRJpbU#bQ zUqtb|jb<<9?oz0F*s1@xE!*iOSeVFa#+vWONsKU&EclNH;lG?|U~*iuDe+koEu)OK@kGfP<8v|+}eWMrt;guB%H3w%x{m?JLlX) z7@YvG$mMa@fIRr8gR6rFyYK1nLxRM`qHkoZjCje+=46LLtGDZLP2Qu(Cm+#vPFioF zgGAe2RWj^pq_~Jx-j2Yh&|sSCcilvtKuPAB<4``+j|dahtEiZHO=i4uqXG8L;9+VXT(n{%Dz`YqNJ3`P}VFt6{-U{6jI!prXWI?wwenzMVyGtLoBK zmh1U?gq10pFA}9;$Y`&I5$xo{i-b9+KI$T`E_yU-|qC&a-3H=0Ehx=l$e=yX}f$ z907xrEtPgIMgwCYsa2{&gKn>78-qgb;ls83xy1WD2lLOLjEPhSH$Li$ph$E$Y|$Ox z)so)jZCtQdORqzi>sP`J(8CPOtkD+!?V5W2F^)7DQ0y1lvduTsW*u^k4L411dY7bd zdv{xFdF-8g!A%?MYIGl{!o;b4TKh4JJurtdgmg)xiA)S_=5ji3PsrXH)BQTVj>5a! z0n_JEID_wRtc?%Q%ebmRAsTDvJ9T;Adti7GX5O8lNy2XM#)mhzM!UZhNhzym9_KDi zk22h2b;<84U(YwkxVSEBYDU5Aijdk{aQ>lQ!d>07fFTYi=|z3EN4*O3QF`jU>vE{lTqTW z8AjY-ne}|iu(PLr5Z$pzgLBK4>N3XC?V?aFc9rMV$dS$r<1a#W+Cy^PzqX}p`E`I+ z-*@vG9w|?Tn%2uEe6Loo6X!@#>M~E*EpLJuCKj^J5wH_>d&0hbiIdn`p%6){x*;Mt z_O;+qS#XuyQ}#5vBtoW1b?GLNfFoCz)ocO#B%c7LTkXAzX8prjcT)@s-n*-gF1Q=9 z=-4cRqEW;z2fW6QZmpebE7ohw@RP{!da1-$E1-8}-&j?}+WK_vL92%oihW?Aa!NF` zN$7LJFZslQG|~PS$9JtFQ0ri3%E!e5<8&F;dN#st?T;Sy5E?P}T29?kLa zi<`=_+nree7k+sn%e$G>3pNgj22Wcy4Ks4c-<=pPTHM*!D3yAd>v;d|pxTEo$B3W< zE`)Zq|Cl)>!)RgEJRwv?oYJr!_F#57R`qyX_$~48qb_A+%1Qn&_oY;u6Q&WZD3;?b z;kOTegYhW)QAr@jO6mKB!l+6ZcKMsznHgAYidC#0u1_nMJr?XQ#dtn_CWN{JeA3YpgXV!?cz zuh)DG(_2;L2q2DCvb_D#1a?=)a<=`tG}Dn%pq+75F*F|=#j~busWBg-5N*#@!dJgQ zI;*5JYnohUGM@X5SJ%3bu`nq1knW9y0a&{*#uqA`?n9le1sf@ zgJ{K#yD6T@iXCR_l=(b|Vzct)k$X+;tXX)Utex_YiDMhB>{#;(C1qiWzcERA4%)W? zvNd)6BcoK3KL^*xfH~ZvCM3au16ZqWo9J*o+Y-rX%O z3GR<}+6*2al<#V%wco0562OZPMiMI!;2YcJCO#Y0GQ3M8sv`J_FzFtF|F6h2BBP;t zDm_UuqVZo&`N0_+F5DJHacPbz2wO}K7}3*}uv+gnI{-bKXG9Ll+r6NEtMNjL;{0%= z`JxYB1wH;ezHoX(ST{G6R9YtSn<|yo>QGYUo&KR2QPv%IPBYcUBL&d4clFV zS1`Z5tJp=-nTKee+fp+Qc};5a$~K;K@f^xwWD4~=HAk=X7)uvtViL1M%vTz?W<9&^ z!`;KI07-dPeqKlB{4A}7cn7O}q|c#SrL0i)QbX)6O9vjM*-r)lmEA9v8C%=F80>AD zz%EOcsrz-j?qOh438J~dP<+wpgT_=+%ZYT?>>=rJ+grOT| zC?%v3hHgZ?rjGmNU10y zUjCP{wzZn~p)J$|H*l=Hx)W?#O3+slw#OvVOAJq%Co8|j^~V2PZa65k?5_=(`~>Q5 znZ?5O8OA4eqqR)LCB;Vl{rRJp_znX=CP;%aTgt(k(#jkDYAxWnzj`gj$tOv8m5^^` zQ&hTl{G&je%P$JKN@XR~mldRIkJ28pg+>)F3(UrAEDyQKE*(}!d&{L4@yZEyL7 zI4%9Wjpv+&d1TIJx*xp)LZCxv<=MsJx=lDn(S2vyT&1(dZh^+{{jp=>jp5yBMHDf# zncXFfW!$z`02*-L{b#8NO37=7I46yE)m21(l+PvHNUZ9&(T`w` zBq)$lFKX>}kqBv(HgJkd$<(At)$l<)cSj@(&s_qRDm+=E14wY}`hAP0&Jjs9m5029 z7Ne~~Fi&yKx!otoM=Y<-#Qk6D_?ryZWmHuj;BWb@>?C~PP8O?mdYlERLc`oojEN^R zpKrhFfi(^AralkiWRkJMqV^JvgYz!Bs=n{w@jJNLFCu1|;uw3eN-==&o$_g=^U%*t z4s0*CM81)DX2|_CNNlvfy_T|WbL%Cm#|mBb_tMEHZ;wuk$dkS3+1wB8CsVgAw+3X% z9+dQW%oZhFlun06Kf+X7USF)fg%wv+Jzeq`rCYMFET6lMB(*oKRZRij>nLRj- z=4y+66uVkByoW_(5@)$_E?I;=IkD-|X2ma20HVu?Zk7vm?Nb3@2C_elE6a z^Xetk+A&i^AqjI^RW-3PTQyytB%cSe9rTH(8OJ-2yK=1LB)rl*N*F^F74sw{7IfTK z$0a(;$rk;-HZ-~T%8dTrGK)d=s|OhnU8KXnV!fso#HwZ6in#M-s-H;p@G6&`5)t$p zW_RsSDaM@8>SuM-9SRHJ63f@&-){R8Kz$s%auS5J{M;gar7zLX`c{717AFFUEm zET5o@e9k#F-xzM z2ihlBg||Y_(A#!x2a`0a;jD^Gz$OY{M_Y$}R05-v0VBOCP4rWylIZ<BqVU%?ZFu-BHLXLqy5%%f)4D&w1dt()8HNLd0yk6`p0hZq)VN zD$#{y)S@0b&+#fj(-O0ij0%-t^I{+4fsBPDyy`&v6OJ`9GlJ+Daekuqu!Z^AK+%0A zW`FvpY@$qb^3B6*M?a6!JqatsW#3(fh5{iu2duOhIGbs-p7MSv8df=$pdeQZ|JoAl z%7&KIt91yBZ%s@2HjzEHkEa!y7ZSx9-2Ik1`7m@;dUUnWByv8MS-xOzkHr)x2InPz z3*^E9McB$G^)jB9|icyBboxVuCY$eMQt&1A(Tj^{nM!p-fYk$zNTEn_HbT`tZ z(>y0dQ|?(tjOwzM&Pj%PoqDso9+UN_PB3})vUG9UuSoHiYgE0Rbw3JB8@A9m{f*St z?t39Sl$UmRlD_b8@1`pB<;T_R+;gT6l2F*kO6B5mNzcs%vMOG4-dwD;8KcKNXZ=JCjVKd> zL~=ChKg~2vTufr0g-_VaIWD?0-giZAhp*oYY!e4G5yP1T%PnrUi~+-9TdXG)85f{0 zl@i}X@66pMlk?+7yZOs&RiEf|#mJat;1KfVB!|>uFNj_6-8Qtc{De?}`qk!bkHZVe zJd{!I(#aE|`*;xQ=~;bKu|zmNX!zcjga+A0kRA)O^zi~S+*1gNbYx8E&3!zd_f(EE1~8cthsZZm!Z6K zP4tyY&m^SSAIgK)7lmMvBR958?PYuRCDyOIg|<7po&en=2>m*aOTYwacJsZE?u^04 z@;N3LGn-7w6c(yr=%|ak_$boJ)y65+TKfXOWSNPafj+zblck`|uS(UHVnAdCFFYn|yw(qlGj}~fEVwY(D3Y=Y#bPT$v=&$Qsi{5{~>3vj5LqF>fOVy5||D-m` z-cLz6LA)4{CoFQ0IXm}|`BSkqDI*6AK_49Tb-)iTa+_@3L9U!{G}}NY)T6PsZHIr> z;VAYA>ywojx$nRp6>{(^JYz0E^z`LB7Nek`PqQ{;KTx`!Nwl1JQNL0(KO`Y2@H%%i zi4Gp^Dwy`79OUy2vJWvePh1J=`-780axdZZlwmt< zUNYR=m_8Vyc`Y{9XzoUbII25?O^bFS=io@t&+ed4-ct&y7H#FU8^<8M3rWIfkC z8bpJZGK~VFY0A6<4n)ip^DitxsoJBF_L#VY<(-nDlKYNVL6paJYBV z9td>qg?$FN$-5?$q5GL)ihp#^eqt(3V#Ik*tcjBnqd&a9Rvai{pO6U|qt#M^xmJKi zP#tKk9QIt{@v$g~sc;iyhdY|M9;^l8BAMtLwQ_&$Ui+xC9*ZNbxB(rYocCl^Ot;a?HaS7 zBgnhof7=!A*B3nq$xGQ6iUKl>Zz-;?LMT!#OBzOOhWSUTLC!QYtYxs_X|?W-FNIQ0 zy4tta)wgm058aZiq)CgA2pzQ)#XY|+n1s9n(xO418JVL z?H`h(ugcGDT8f+tcP(d-ZSc(Yxg2CV`Rq?Vhtcex^b`&nmFPJ#og$Si$V}@=e^SA9ElQ$!mo9=i{vSDE`TC?Bv2eUE2 zRKeTt+sivB&0HR0D8qiZrsHQAEU~D%l4w~RXk%_gVna*Co~nlM7+BJ2%2me5tzC)l zfXX2TzI0}&#g_486|?|>;%b40ZVeT~GVQ)qG`rO`Z~I$u=7XXRx02SqYr+w%iV_~g zwB?|C*Ey$st9VZ*fswR+Ktk3Jbc5d*W9aduwqz}bw9y@04-~?*ZaKu!dr^W7K~4}T-2l~G^)WG9DrNF zuJX!4E#t+-d8k~5(1TdWd~c(|&RxTFNUieO<-+fV zDcXVr2sxSRP&`{;+!NHBvhyUOi)C_bx>@85eZ^+=wmZ_P;d+fiHPxIqJZIRjC4?<# z@SLv8z@5H!`6?EY;7(toCn8+AcI$djh>J*A_hH9bue(~tcc&tqqg&I~YUm%&ZFjr} zv+JDIHlYf}{hTk?xEYq->zb#Ow?yYK&;yM|zu zdcOB#6LZii4Y}ZXkwdFMcPE<=@#lQM1w7CF<`DBY%s8QAvo}a7wox7TB!aFG@6T4m zKZw_YCmOHWZ)EU7hvDIe7=Wk>#brxMsQmIJ?ex+OS-B;LaXvkWkTv!shVa%{Tkb5 z{ndqnjOIhtHti!)8x$cEY-p8lwl-a9_OYi+F+?q9oR$4&>hQDCxz8P&IfDN02#~kS zzXZ;&r^f$)z6_w#|0X`Pg#jF0VcnpLupYEQS`l40%IBJ(mcNfME9gad)KjkBAxuqp z6CHkVt|Q3Uih&9#iX1I=2dX)@IP<9)dybZol%B!&QYTLes)pR3dYv9tKo?=(Jkl7l zUgmxcS8Z#Ac&_7%o_-qqF2cTpWa)a0yj0<=wqGv5+&B-kAIGFe+k3ivbXeOT$qe)i5OI z4HFaEU{}9L<&7^YA}r1Iv18K#0%}NaaNXZM(|09d;D`PlKB3;&(32&lkLLywYr;43 zcbA)`Y+$l?BNP`Y*PTI;(kAuzSqh`G;z^(0{;|%t1KfxVTJ_LV`w=VWdC|1uD8OKWjtNkv|JyTu0e|>oJO$If>qHf%3Lv-M}_zH@O1+`N8IEPz#1_Qe|AV6DF z60<2;uqS_M;fm-R^V*z3zI+VIMxa}*{OoFC7AsbBspdGj=TwcImtU9w66hD%PIk!3 z-|U33;NhQbk6iV5c%bk;&Y(Bkotnv@SAT?AS5fBi4LFz^2cNwmiAUG~74M+>9=^OI z#1ha*1$`@%#}Zr)E^Ob)RMp9ND4d7E@-fpT6Vj+f_QyJuQvqTESZsA@C$RHwl#vGklR~EQ{h0jDk`p_NtX6fLwiaN{lifwI$9yrx zuUArmO*gxX*q5x(f3w#9TliH_ z##6!RpiA|FEk3B;WVLwaq7B7}R$_a^(}7vVkU&ONh-3kY6v@%bQf4uP&=e8mU2EyM|EKNgAMXovo#1E+zGA_$1v$LqgUhbLWNi5r8EX2V*V29C zJ}4iVXl5+VtIP67$tf}ZhohsS#9FNf^i%IJk^YBQ{ON#+kp#Axm?2m+>3{ene>gFG z-V%WGN$|n=kLB_|*)zoG2y<(MWtef;O@Nzds!08;tlpjQYYY~XQFrVck& zBL(iB{EWMKl0HB)PjZ8HT#OnY%ftJRGuuZCB4P8$9>uJO%DPzZuHAwINSvdv+aBZQ zJJ)+x??qhNa(vWGw;qI%+1n{R_o0XYW{Q9LO~Lz1vj(I*^cuiPbuZ=;d(}Nsj)eby zX_Z4k-6YzmK$-q`O7^c#i+^$sfw#kreBLUz{GU$8ADWivN8nCb8e@*e`R}LrIo+GL z2$k(fP&EAGCiwSnyCehdDE=y3lehnn%>0{=_)!I?!fa>?FZn3^p~Ms*1b7zz%;ZGj-mgr9Ya2F23r97K6E~s3!rj(-LS8TB#+zq ztv$u8a6UmaeOYqk)d2PRoWmYtC!(C>cAIng$LeQ>b(LB18JAff^=S2LgHa%lD>F~U zP}!|NeYs{coUdViHf9ZmTyFv~^}%-I;XIx*Ag|QuIgPjGiO_>#D2_nWpP+S)A*gu% z`f}ZgWx)=D`PBY8yhUg%d*1iUiIALbKcZN19v=fyxg?Tx_WwK17v{bGr(b( z%)2hju+uqO>u6c+aRhe;;+U*p%@SM3!;`&LHHJ+9L5hibD|zaF`@!0-3UWs!yux~N z#2P62Mev!Vaf_%|$4WDMPe2#FNX-C?T3H6`xcGVK{nhdz_YZFo;SQa6f9@SV@Q0tK zohFfkih@01_UhRfuQ3KS4GoS{ss)5eK{m1eF%v+32u)2dZ3pn5xwHq^UY-MW&aVLj zeTAP5*RtR6tPf_?knqH`w!BwFkaF6}* zuUxAM=4c$_NK{!&J6&W@T#x~An3)h3h8X6WcZ+x2n3xKXEJ{u?>4!GL^6AU~B3MmY zC*#}U6?~!Zr1VarUP7n8TBctmS(D)(JlN~uo1I$m2DvyAn5?CHBO|F(-b%7$fuReF zyTI*Zp5kGD>kwSxsoh>tD!RcpVkm?Kapfc+=Wi8cJ)s_S$z`_GEW0=zZynZ0z*f!v)6ooYxW`U1a$=y zh6KDhzv$;H-@jW3X zYk6Y@ngXICE0nQkIjEz-A}eI08O4PaV_Bi|`hdyBxC|QD(Q$8$!K{G@sgSj|Vjr1^ z!?9zS=6;SvyDB^XwNK^;eBScDa4&h$QThBRJBsvtDb9d0M5P7*xmI;C)Y zfo3T{7cHyrxv%lswS+U7Orf*ZASkkny{eH`ThCfbLzy-k?6!w2`*Qy+=j{9k*IxP=(tzZYO1I57Pp#EN!GywAEiWhF-l zCsyXceG~@Qtm%}%7dFnR4CQD%%)rxovH@zG5hrXZ?WD9^XS_@ASru&Rx7%Pxo#K+Q z6kzm6aPvxc!U8GJT1}T5okyxvz?Eb^PMV!-}xF)Neo0tBI!^HLp z!^_0VY^DX8e#w)q22i@0jRY+xDYDmhH=m80rtPC5f4u~vxeE&Y<6TSOhj|(3Zw)cvXS@Jz>z%27AI4wa0dPT(6{i(yr5>)3rWg=abY zm3DQcC@G5JawqVBQM%&F1j*gGO5JCRrHYVUWY!JVA!mav8khS2aql={V)Ktq$v~h# zs87vR9lig&H&r-=gb4QuRaF@)L{*lS^!Mb8MyE;(NXp`uch~ExXT1c21Ps5v{~?qz zAeFMD-1#so5L(uuDtQw1wKbZ(E0!&I7QWL}FsvMusaVIVS`n$|WyABBu>zybZ&))H z^gMQG(vnM|c=o2y)Oa|P%aWP~JL;DFTeC_<`=YdH^?S)O%^D_#6#DCpya+A#uTod| zk8W%JtGv_{>aI=H?Ch4Pp!z!v@cJ-MlUkxxYMtC4%az?2e~HB zz>ELb2I)rao@RZw$w?8#Dt` zu|Hwo>H9`L&rBjD81?dd33bD;5nkw67^*#ZQ6wgSne?F1Zd13hoJLKq0*i}uNCPg9W;zr3@(;t)#V2|X~iBXG8U;3udA$9|>CN*;W|T{BEA zZ2q0qFXYsK0YZ=6iRloCkGe8v&X6O6F&$!0Cm0Uta{7fc;**-*BANKo6BW0Z-Q}d$ z%V%7S_y4+FjCU^Y$LvIS3_#Ohy+HfZzIHa&XJQu_6F@c{Z^o(aDdou(1&AFJ=0%xp zY-{DH=I1Bb$$&6kxoHm!%p|FA4*aG5ybPFD%!^42HG4<@%31@>N3$n0Xx-iAo-<-f zFi$5rjrO8?jaJT_&}JDF{Y-L&rQw7{wxg(Dhi!(aOz(?x6;0J_Uqg!XBK?L57UPNu zJsPPuBm`BEBTPes-m(v=nLqipklwPzN2d0}(zotHV|7g?H+3gJzo@UHC_d1xgv z3i^A#NpQ)HVs};fA9u^n`<=}j3)w;*nD`lQRn1h>t}_Q)wi{d=kM_HB$lZa`=UKtF zjZuWbNe&gxa`)Axp=}T*<_PSYxHYsEzJG;q%1l=aUuW$k4i_G~u8npzYkBe@$0F&x z8i_&|%9dW9DYwd1*L)-U*+HXibOQtze+AqhUt%yE9}H54);dsFVj|{CSP+^xL9X_0 z=|y(Pk+wccBC3);k)T(~*zRMX3X=_Y0)>rBF%B${UUj86&45KmVIDOdYE4fyb01i5 z4I+xUELvS9t`WR!bjvQXi0jG+qiN{sQ(SCVDvV3*ft_5^u3}BEV7>*i`R@eRWVO6_ zX+|rs29AE(qgh}Tg4Hj5lL^9CNVF^yj#>(ierQnw%FdrgBsKNO5hZ6oZ z5s##grDg26?dHF>dFZ~|8M&l6n>@wR@wQ9S{V1L%zWJNbuDrJ#3!1(5M+R&&+t`Oj zbV${~ER7(z;A-acke$`NFb}16E#~}&{bKsSd6);XR(2=gLH3~F3t0lD*@{}_&1G8E z@Y7A_Cb@zSIJ*&932SB<3KGNFsxVa0^C%nz73S3jo1hJelwdi)D5$A-g}D-c2e6QX zz&OQ)hs4M`F>)G%0w2_9rIlBeR1id(~V`YNqJy&OT5xK^+u z?Y*wCrybWl&U%6MOlS7`p!lcb+ADa20@7ADX&`G_;oh?>HAG^HN|+bD2#(Y zpH1QT5*Nr?M3Aiwk(?ibd zH8MdlHSsY4&6T+b5%~GhigbTuG!?Mrsa1^1)DW=Bs{1o|;G2vwlH_$_kP%!83Q}N) zz#{nk7IBGS0s57pvQkvqqbbZK(P1?4;|IB1R!A*X7?pmPMyTff&IyUA>Q}W7nB|&p zd&g_8z^03FyqL_58wkjg4#NV-7X&H_A!Xme5INZjW)?lyAeE**DcHdBK^gAA%%ieb zeb;6ZBx5fF6)acQlD;0+e1c7sLogd2Co%F_xRf6g%}+Bj1E69>wnqX5`N2qp+4q8& z_ZY5K6Z@WMde?hIkHkgH#EZuc3*mbnXWoS5Nvz5)xxWJ27l6Z}BjwG(LEe^RB0SD< z4QiSabMj8+vJWmbDBfKTQOB10aFNEs^4+#Xf=P5yQ+)@6j=XRvZXgd6+8 z@|*#0g6I}XeJ-7=^*BH_PSH4vCfGHw&9tO`M>ZvQc}9cs5~bUZbOAKZpUVh0@8vVS z4;LHVd-7~U(e1=nv6d7;1x6LhkW9j@z zXkPO7Nb1@lWZnnU?^iy2@f1k~^m4~HFGUWJ(sZv8m*MXAEQS`w@8jL|x4s*zu@y8i zG9g+|o@$wP6JdL`LRyKpwBZ#=$=0Y10asQ;j31K>f*?YNdE-jPnIm^;UfPVpEq@GE zSsuFN&>Kw-!%3ip#2Rk9jJw3sFs6oL{JWw+fEwO4+ph|?=vW9wONIg?E*MH4_g_rj+gdfv*nZD?W|CggYM!tNI%C0P zeP)~rk^Ap?KUUk#V)&p;f}4LX)AvH&EKhga%Vi4tet4*i1u#jtH}uFztCV~;@azuf z0#43EZa@8g34{*lrBm*~Zf4OaTaD_2ybg^D>GveG$4Uys_4jU$Azpjf+jZ$&xl(>R z!touw77u@u(*}%6>V#beo-nqJgL@dJFp`}_@QwQ^)2p)&nfdI&ezc`!{v+a$ZRTgs zXvnQJSNeL?R6S)Mka_8>qKLfgK{De~Yo_92W|w}7kz>|jxH@cAV>D~pX1`dm5$9=# zVBUdhxQ5SoiaTz#h}E>>gh90^=-#O4_`apUtBm>rRNoa!=CAIcPQ_frPKc zG_zDqK&8nRwBCPJ^V}}y-aZ6$fognJeW21Txqv43Ev<64-(OJIM+PgDQ2_xIb~<{OhEgLM5Bk$V!sA_dZwX>T=oAkS#J2p#8p5IRXU?NYB6fJRS4;~yHmA`RG| z8a?ZR;`zDOVuKo01?yyEsPP6NbKCsVh@*gI0-`1h*B!`QQ@moR_f>9~c@yqxodFjR z=Zb~7niA41+>Cf1lYw>a$fw-ARk&1MOJG9`&}EAi+h(=H4~{j%PjS=-+*7>SAW$nT zNP&N_p1((GJ31VnXTTU#5Hx)kT14T;$I@6(qn($VmHCR zlDyE;(&!yuG8LUm#n@jCa2#KMIThKvSG7ICBv?i6bAGHbbTALK+qgvMBECf}{8xj( z=2cQtpM)AbKil%=i^*5*rGNfLVFGXHds)Y0lh(J`c*%v_v@ob~)EMkRYOqa`5- zDBjS1e++Gi&S9!#y*T8&|1^sw3d%&wq%?nIr>BcGSAC~ewIhdQhvN_FTH-hgmk9#I zZAl(w1u@Uh^Awsd*_1xFJ|k3`(JEDK_$tOy1EZ?OTtv$2ry>J4Dh- z`9{jr#l+Gb2 zjR{Bugou{*F(4ewAU}hy{~;B#`)8?GG`~yaSldkE`|3_@$LyBShAcdWQxg$N@+Wv< zV3t=GN+N?)(~s=vCl4g?^Z^h(PZv9~N}h>pX+cm4zkJHZI3dhAx*Q3e8PV1=XqegGr}*4}deV_eV1EUu6X9J`x3 zn~Og+QH7D~Te4DXX%U6o!WcAvRe^agXZ5Y0uquCSV616)Y)}iS^W%A)+2hz*JgK0# z!``;UAZ8Ym>Cr~#Kd=UWq{3$)Ys#a_`A`Z5LT6vLO8bii@Ib+=X}gWWt7Yl2550Pi z#=vdCp9I#Q$lLmZvM|h^5HOwZf#Z*HAk@2Xn#WdPoMEPKWd0J|>3B5FRz0O^D&_$mT0!d{=3a=RYpPrmA9V{Z4IX{2I^5@9 zySRb85@lABJ_}Z>^M;|5Jg!9}SIx8)qJI>)A@dhiYSZjP&PO0zDcpB;~B73 zAz!xmA34ZUoU3brsGX4t3)Yd#f9*`1gXFlWxtV8E{ErlB=SE@mNl`sKP9bnVzz&c` z8--Z3ish%$B>2)?m+w~hik!G)1w`XwlF}jp->5|=iIa!9Evd$_MNd%+?;nNQPJDp= zmIO_dsN$mU%T%vcu<|c9b{^C!d-1Lo>?$MnB7!M}rT1gJb&H(J6h5}>KGqvRo|2*r zrO1fZWI8ItJB86x3ux>9eb5X`KI*GHal&K-gT0a`wNv1@=Q{w|dLT=o_rARF_18zn zhN~FKo4Gjb3M~|2*0P}tj82#N0PuoQ#(l`lBw=1Qp&W?Xj&E)C0Fk=MPLspx0OKu& zC5i8#I_&5T;MZs9M{*@V%*F$+d$CEP4uhKbWi)tH5N%^d-ic0+I+MUYfCZ2EC6Tw+ zlwCXjS>#tu!UZOdByb)Pz}O zrv*;k4Tw|{*bj4>aW!SY4xq=3O?Wn2f_LIjR+jeorT8IZlii7?j`b2dC>X%zoYMVX z#_7TX^^P-9lm{n(AFH#G~>g|lTR4+uQEN6@OzbO7V_I03t}l$ z)Fm?7TUO-Iuy~>K!v!bUN-pW#tJtCj*@2@PAdx9(o%Ht2MS0Baumq z`Yn;kj`=a?+c3}@&zY%+WD`T(VQFfX=ckbhzJ|9P#kc2UX}%z>Kwr@P%I+n)=yvVx z>$jamr#bJ}cR0r1vLG=)f0gW2t%1}h`{mApTJ#T6*bZT`b@}TJzK6Hl)J?dT-aqYt z(~5jAFAHdQ5pH%*UQwj>xc($7*1!}hX0GwE(r2dfm!5j^;j4AkHa}V7BJ~Pqz1coM zhSHS_d}(r{$r4Y_xdJVN-aqTg*-z%T&$xKBcOR+)Is_&vWXs3junHBODt;Z7HrCIt z{u8qF7F~EzS|s}g!T~Owe;xre`%!oW#EMV9*hoo3XBqbWhDO~$#e3?mX)+-|=^zfB zIJ^p9PaU@fuk-?jo3aa*N0^_fY$#?u4|?_yilTX;$4RN4Yx;qL?^|8^0BxqG;v=4` z6>AVOO4Vy-STnqy#ex05o(N0Wd_;KQTqnHMi~PlJhEbE4m9HI_F>0JG(krlssgF2l ziuy4~hWgP^$61uQMbb#TTcWLYnJeGZN9{*T()NSN*IRDr&5aWun2-^>UpYN3)?dA9sYfqT z`71gEZAf7i;=ewY(Y*;SDzi?U!pjcaZ%ftXXnO)LafRb5T%9zwg@33`&&oG2>rty# z_XXa*TOaoeO3Y@HY`2n*vn|c)f4Sd4*FNJPP%ir$UiuMs12d;pvFSMISYnLYEBua!>@HZp}UA;;_Oj5p|6Z&BQpf2uD0ORG~M z5Zv4fd6juApv;Q6foaaXe(DAa!h&au#C%h|k|JdsV6Y5*t1s$5Kqo)nc=61T_9^Cn zbGfi~e1riH&+L(_TBr;s@Uwt!R32?{WB$!2!+#N7|K<1uxyo3irq8$>*VJ=vMMxMN zlcG`$F)9T!bu87l$)I+Aeitw#9VYH$BuJZ}Z(}*M@*kA~%syh}o6~hA1-@@ppZ~q{ z{#DHWN8=2WAt^Ir)r>KdKz9E9=lU~=68mU~*;(VWGd})(-v9Lr{P{wXAhFhsXR5hD zQTX7!g|I;X!wxj$4&1MYP>D9W;4ec6%p?KXHRMKIAxkI_Yqav*#kP?IY4gAQrkDn3 zKs1Kp)vG1zYI93pTMOng`Z~nb7|K9HY&$EI{H1pqIa5eEh z(1$1#cji6*>tXu$rx%r7jLonJ`O!F|f-eud64-}o;NYflT6%_$$XCN&y+rK(yp}7XdtCU z$ay)={r_}4u(DWKX?ip>I_05SZB>tMr8t2k6A!pldJx zl7Ts5v{A*7Jmo7Gp6De?NCD=F8RlUk&8G&>2kDSD36O0uGF{fSiXjoj|L>&dk0cmX z(_4Yw|4s${h`_w;f8XuzXYl|1d4omotqOq%%8cmhKf%6-XxHTElCE8zSL6N!AmnDBqR(-o3FgSN=ZUJ{rN zbireNZ%9ND2>R@3bpJ0Bw|#Jx)jf&Tp8dCn=+f2s-_UPPqqZ8%)7@~hEsTn)1b@`z zIrUO=4@PV4D7z0-8?``NkfZ35{RV{DgR`kZu4Ou(UOdarHQ(9*t+`@Qci9B&INRNo zUL}e!ioZ`S=1~+Ir0pv;l1767oGfccugbvUYk(590iuq5G`&LN zVg*!7AVR4T3|6dL>WZra6+9Nb3OB!kmf0MoGy%IN5UC`S(9ZKY{7_B{L&b!>MOaT( z*?^e<2d*;ws%F@M*BB!WZ)Kmh9A3xTr+xh5^ChZXkXV+O;%5BSGr8n5Kr{y0eN(^* zx!lgr+N{o#?gzhnf=-3M`SW1FvMvyZP63wMRE7EA)X_>>8ZTgbZ$RmvZ8j+XW>*)c^}R&*j4troYFRdBi*GVLzI$QNVZxh9Rbqc>@7@l*%23-`7;x z6(ht^4Sf$rR1)(6hguHKAs89b0uE#E7=#3b%Q^+#@vi|O#a}ky>1FDnS0FYNeG*2UkulA}Cz(bW#-r(fu6K1SH%#CO)iJ&nuc0^mbI`<#!2TaqZ z5VdZOuH@csW+|yBl9~oL-P%o&jHJ7Y#*G$aJo$M4D*IKZ^1-yfY?7?2I+2Fpn>mA4 zN6iZGDsGeQV;BliToQPRnEFA93(k`!Fq9#4JCL;-TrZU-np29|L;uN_7?>s7&IC|V zP2q9W6VUIkxM>a?D)Jcs?5@Bzo7f*Z5uNIeHT|FmY&L@~7`F57f>>~Ykwn+s<<{TU z`pd2>eXr-5{k$5V?@~}$S43RcRJ!Z~k7756(Vz4}2&REcaQ-LlvMjVugdC&--qGdF z3ZPH$5cp8lSNI)z5VsrunRS^3ImIuHrYM{0lYJD$Z@=s!6%x&{dOD2qOn@Mv&&)o( z{nr(FSWXOu6{xFgK9|5cFjzEmo9RBNCiQ2LJnR+P{m|41?3_~o>9#QqHTRZeBa6Cz ziI`0>sssBMm?CQRWfN#=oXB-;pDkv)0Lxt{Kbk;Xv!TWmQ?EugsA5%Pwt$>LdoZj9w79f@Zz07(T6Iu~FUm$|W2 zux$NuP5!+fh%I2GBGkod+46Q1c#`b-#trEjvZ^wS-SQ>FU+`n76DZHX^WYj~gX|oj zn*2*BBFpusP-F>6t4fyEAhN{e#t~WX4;TW2ne-M5_}Ehfoe$ho7()d%U~E|pVig7` za95Cr&3v~kjpn!1%~nd=L|X&~1dNuYMreeg3Vq&_$j^x}ez06Yjws18A6<^k4UzxK zTd!I3r&dI4<5s!{q9&4syMYg;5DPKRqqW!ni{Pj}WmIx=h+Afuk15V#=TVWc-%zR{hxgz;^?-~}doT>3-n|Z(u4(E? zQ`S>N0fX(d@*Mwt({%~|o7=eByU-%jyqjQ0GmQ>Nktxk@2%v@Izbpgw{gblE%24l% zli4%p`~IuCjzhk_-EI4!C@jTy?=XAF%tc)5?jmS({TXW-(|p{HWNrT~8bLpufB%R} zDr|H7sq|`#SIQKu(=(mpZ?!cXsrBd&grWl*2BEl| zA@|a*GslZrXFv>+l2PMr%oH(iH56DD8XY6eqR4%>=yC-8_<}iW>I_T5tYr)2*0qJ? z3NA$xxx}Z{LQe&@YQ=B~8Z76;CdS6z=mx!2ewMMNy1J(i38Yy{44hDAImZkBPw{s@FsP20m$f3^>gey1JL zqCRVrY<0ffCi>PqhESi>z{1tSTDb}Kj`Wyx!G;CACF@0qC7&A zw%dBgxaeclBIHbrdw7%23PxC`Lbor+OywlNB~8@sYG^(gANKY5K~Jr(UpI0U$s`@E z`A*2vNX-eV8|ugK@ihQMRU)IE(j%XpT=z4?Rb|o?$NTg+lu2Ey2(|xRIch=eka~Uu|N-hQrn{>|A~xeLM@xB?%%+k4M;} z3mm}s>m&n!A7ra`Stnt8-znYQS~dWiRax<4%-I37VV`E=8{`TWQ@+0!WU(beZP61A z*CqBzqJl>Sp_RI;9oUhQ?B>nG5G0BI1J@-ZSEeH5mjPrn7xF#*PcU9Vx}+uof5x`O z9%&ls0YW3kZgHM30O((p;BnXu?4u_Tw-}XzF1%7?-OlI}YeTIocae-JdI0H*X#EDF zG6JbllylLsQVw@Vj@Nv8nj~%pX69y^9E9w4x5ta0R7n0vvrqKs=jnHgr+6US59yMk z1$dbrbTu2G5@j~_!9zB(W5gOK3)$?9+%fz4xM+X^1L^xfzrvuHJT?}_YH?on757Zh zQcYnP8bknn*?}D=IU+PctDd3owB=bzv++hcT85}PoXaF3`cc#Ia0!i6;k>@{w4**# zZiQ+_N2CJHw>FrpL~B%sknX!f`QKQ+Nw?HBGFZ7xsq>s4dF`v7MC2b_zE`M{ds`YO z?s_5C&r|M&fh1+2lx_uuG1w&X;*oogW3h+eS*Zj~z00S{7AZS6OV@>W(lx%$Y^-KA zuKWZEHW>0A7<+b>jsda-j$paJ5xK+rhk;xIutMAMgIH%4}CbQoo>9N zb+=7UU{n?!2+jDRTM#YZJ^#75{DDMQc#V{w!Z-S(*_ew-+NJlYIXx(O?otEh2s%F| zv5HksMpdy6BDxfka<4Tph!1`LX9mzhXLV>Y9(jnX#BlFZ>!kdHCu%bYIjurlYcr&FRQHHN}0_wQ}$G?^eM3Xw_9aor@|fb=_K9qp5M5KoFQQ34~_SdyTmYJ+eJC zy1>8Yv^L!(Medp^<7z}^saoX=t5S&_~pF$P# zIKPCWvtKr28)sAZUt1^I*P)k>|8AvgLRO}!ioAzWc|VdPViH8;ezI!?>ai^li&_Nh zuje*?Y`e3@VcrDUN6Rm!%Hf%=u>jeq7YWbLS?CK1l({R(Ne5clYF?;h>?*et7o?i6 zaGK*FVyoo0QimGg;6G8D`;G)FSy+099(qyjdlm{z+u_8}LC_1^EtW<8k?TxQcQg2) zW@!K_(jkao$%us(gxve$x>oa|l=>gm0gB%E%fo8Ps{g4eNkk~_aNdvAyV4*}M*mXx z8=jKbteS3f$Z(~(JEN+X`8(%Z-AitBAP)LqvsE#uc&;nk`-|e{>^SY{?R(KIA)3Pe zTbj{!p$zGkI7rvN&-x=YM1qM@NyVhn#kGL8|8eeWg|mu>iG8-NNs1dVSDOSi3*S&@ zz1$cOWL+CcBBbtSwsm_0FR#?6P}B=B&ri7g+}(Wrh73uN^IU)$HW~zI;`@#Wp@`P{ zdEbnXnW(n=Ab6=hIqLP^9JIhjJ55?^nfl1ZhkXMY6I923+#g~Sp`fm6kQ~u~8)hdBVPuxvemETwUc*u6 zjN6q!cVc{a@iXOmGTHF(1&8Kmc1Aqj&;Hbm+MlRtR8*qx&>bXdh1@$yx}y_qMzl{g z6FsWLS`x?;#91{)YW4mOp7s@*JA@PsdFm?Xy<3q_+|$NgCpODZDz=V1oJ_$C6`e-s zSI*0+?%zt|)-iJ{%TBC+3?2YCgMy&xb=6$RGeZ+?H>0YTo+)Yt4EBMA#>(M~8DCv* zEJ}-AP~jel!ek42PTeHgZ*Zqx>Xld+AD)ky6HI8d3>8>o40{%=)*UoO25)U5mFLfJ zU=jvRE8>Usz@v~d6XFCGaA$DUksyU*5{LtNNGG|z%NI;(ViPlKxVK=;#t!d$ZurnQ z0CHaLuGO}?6;&u5-Bh}9bKQ^%T)W$sk*Za%=~{097k*rj+T$!>v&1o*=^-PDc2zT{ zyoyT$bm!E%<4?LWn%}bO=)MPSqp7-ffnT4mOoOI-WWyWZ^6Uf+SNgepM};6V<{&~E z?7;Kf)wEiyz;Q%w0;0W3UH9fmZl7_Xu7EjwM$-`bd0U*`Y2J~0e~dn}Qk4~A%pV1T zm3gwW{Dp7+_lO6dWb=d@V$gM_X zRoU$*8Gd&#I66*laA4xgZk+$ScQk~*^)KBy9rE@cj&$WHZ&c8N3b+)a=nfuldQpso zDveodB-W{UOr;lYLU-TS+!%%|Ur3F3K4*b6DO#KbvB&w5R1>!Sf~A-At1vrk+J<-v zm$Jya!VZMVLJf3bORr=u-wT1(Z_1DGvQ0PjSx6dT>z)?&rL`-tmq5`NlWK_um?8;Bu`wk9iz>{Pu0b!NZ+MuLP%#L-AX$o63vJ%1 z&Ykgiwfs?Eg-va7c+8P{>wISG<_eeGx3cie9zqg{jlmBRT!%icpS+ev5(!+>2);P+ zcHMk}Qd*tS-mZ?Ah)~jPl<-Aw5L?f&M-+$;QZ(CoKBiRoMb#hqXmzG!Tal91J#BNP z(|GfF7-lUd+p|BgFYi-mUCZ~yU_Qt*(aKjl;}L?Vlruq}5ptrD?0p!4)3u23CjtyM zCb+5!Z8ZJ9Li(#{g~vo> z;-Wf}9Ex*jL};-U!AtY(iPM)RG+(#v&Olwt{C=z&{fl`}LNAFaVWSPbAACvgboucNu@oMM3`dW2UgbozrqTVkzUQ$e`Ic9ctkC_evO>ipBU3={A^6@xr28 z15O_A^GYtS2BDy!v(?0T3JMp7D{QS{u*Mou>**56$Wge&>*m5$8Ja~)YmInr`Pt&q z+?|-)43m}gJ@jqBd5xu#8p9cDG3oGv_htJiz&=AT2u2dCz`3wX&D0Vo(Vb~No4%XV zvs8l4(~`;|B@ug@4I*ycr(xoh$4~qrj3a73GeDT-&VKb$gGu$1jTLqnM;Y~k^4sTE zrj(c7w|7!EX*H}CnBGQ{r8bZs5hPN_C&=KN1%JN4K>w;W(CpeFn;a0^^8XNb+Wp+V zOaQ4fyRADCwsrJtR5_J{Qxw(hYH){2I@k^zj)(GZj9B!s*ZbJFjND05#CMRYAYUSC zvIAgvMSI9jKI@wNwR$^F3Hy?6)$L;CFs+a1%rxWq(QQe%?X+k*-E6qsdowsZ-)2VU zrrFS~mIy*6W!m>aJiF7=FW(&BUkP%z`Q|6Tq(h1Q;t*IQhsh`5Io4KH$?}s<4Uri< zlPn!$8Bl~7Ju{5B4Ii&)=~38k7&#x#VPhyG%$e->8JRDW;2VAL_~hBZ+{if^$HaD* zyZa4s2h=Q_KknvvjNXi=3K5pqH-an?WgGf#9E&t8Q_TI#w=5DAorGU4LrRjiLGzNl z6wm7D`lKHvU8sPr0b3ZQeX2pbsEzXL7g~aSUTDMbnRS}3ZAlQ$@lTn^u(qbVqFi+% za-F(0cN%&!u~;_FY>oHT2W?m}`V*kSQj~(V8YZB!yJ@LvLpK_yS8X%}`rRYWoChzc zbN$C|2?MgV5H2=Aq^~^sRH#v4iXWwLlv30w6ig>mOGMqX0TmAp%qe#1fJ?5APogq+FBZAF-}66bWN{6 zk#VklHJfKDle-Rm2Yl=2md3yLETne#&Q*9mC+opSt<2eS8Ff>;YtAa)LUi?mCXq2m zcf0v*kVmovx~}kOk5r6(rb&A*6#xyz&RwL_fb|bNV;c^ z;hNVNy9BG#pnqS1!LoSydKlvAw?t1b)3rAWF7VTckj>EuUUj5#ViODwb}h>s#btO) zd>u=>@p#t1p;LNL;%m|yC{STBiVP|aGE{GC#rKBUr4clvL7)8wT3fN#8dm=s&&C1T zL3{Og;nwgrH2jNBfpT*6Qw}v>ZmWsLfK-W>w>qLOQ|8?3%}%xzOEGDu}o5mPn3Bx)C+I3f=7*jpypol1>>5JP)hJ4jCwsdVR*s+y2cY? z;{tip5`u*YGuL(?gda??n7+qSEkA<{F(z+LzkHFwkQ(!0P&weR3Mu#>7c+~YEAj3j z8m0N1eCvX2aR*QBhdX{H%a0k|s)!r*9?qDoT_?5wqrmG%V8zmUGSeT5Ti#n~q9yw! zZE~vn6*uDXjVPP-MR~+hoETBZKN_1Cs3dgtwkbZy1t0F8~1?o<(QwpqDW5Zn7v2&$r(5Y$(2 z^sLjTf-NiEXqc(vTx(@X-j5(WiojxN6jinqKiKB365SL#7EXf7Mz}q1B0Wmp%$3OB5S6 z(VdPJ@^~?MsEA`Yh8?(FtZG)C+U5La_5xyKMJiLtZ<-rT3Gx$;PUHTK6<3~jgu@+^5;JNPZH+m9|~W; zZ^D>3_b69 z_~-5U_4WSo`S+h&oc*_7`WNSL-x`C4;e<%rvvb5x_z2EjVAgqhnbqKV5HYLC=hrmT z=hYuQvL5Oi!aSEj^>*$4Cr|EE%Utl82}pj$jk8JG-ihIGs1ki^0~(Iuh{i)|;FX0Z ze3<8_JCc3ohRO@)KIdy=7DuP?lX9Xh&ds~rQdPxpxN2nlX2#SGo$GA>jzvicd}epA zL)YLc+1oWmjqy9iP>x$g$gfr6%PJ@S`m+D>8~IoeV`T9MD8k=gTlhH76qkl45q~yD z|Mg?r#UVst#Z&V8FDBM5NH=ISKT-Gh_lXq`5|TEI2(8~Q6>3d%<1q8COC{O*pWvg*VGW(%h4i@UnG-Yp7DdNDHxm>pVmosxInLW+;FK6ZrxN^U&tN-=N zeUWM00!C@*)eyoc$;7CII7=7-Od+qRSXyw2^Ikl%M6X#iQAC!x9qe*|GxKd5gB{j@ z2)+a?jIz9#V?km7*?hX&a~ef#gpL;HL-}^RGxIt;L$-HCeQ2H@`=p6^not6k87QL= zsZ!KQP5yoBCTgMn)_Y;`jGa=$v= z|JYpq{8xM^VERy)wzL25h@kNQf|OvxE-ZQ{_V(}ZJ~9-wMuRM|Q0GTU{;t@M5CDSM8j^8FVi9 zwmabfId~Y6|JcXb>;iaxv)%BS;@tw}%a?BV0xo=YH;Oq?6@;9LFHbf6ekI6p!!MWT z{a|zM_gmgA4?q7q%sP$dZUXB_((>T*>xV0c7HU6inE~VIO^`>(2Oxgj(A1E>$N6K>XQb)o|l}kLO&==+0 zXqbThr!5@z%gynKun3|>C#gHUxi~y%iWn~=uFb}|>rwuEF06EH)i357S2L{z|Gws>-sZZ62;Yl4*tsn`^ zsB6R&C+OD6=H0YCqdGEJ7F|FlQ`B zU?PMhSz2xULGw=vCLA(4I~Hdpsjxu)3U!A;4vDu*kf|(&D{2_FA09t*>n)6@IPn|+ zN42Rckuev2zgN@UwG@;*cF9rbSDojX@@`(o!bd{HX@;6dMUbLcYaSwO4~(u6 z^-xgUp~Mscv}qWw`Mm$$Y766d9ihuU+}JW?RH4IGrc*dd&NRuA6S#iY()IHjVErkt zN;D&N9&7sI(R-4^FJf;XQ;Ut0{u@7?P==9PHs&{dS)9W7yi&;Y#}8+zA;0&QTHZKd}ztmVQ`baK|xZk!wxx6ZXyNc7k;dK7|<1wGw#u#zID zw1c>NxdBF!WO((1dZAOV=mzR#vtJ*mm)(>ireHQ-je^u$zBL)DS4~S{PHXx`C@w|w z^M;RreGYH0j3>VYl*>37pIqhHLqfLM|3SU*k>YtE-K&mLnKUj@637V=ilsoe$w_il zNo3T%Vj7wt&?n|p#~wvz&0JO!&)ZPHJ-PXMw^F-PJ(h7G!4pM$)@jOW=F?A zPyd6vaMdm!fU!zMHsoNE(cRFB8~;bZM2{FD2ERb~88B)s2)zH&AD}i?8s!;E#JhSS z&2(e+N`+p?OfjG4}ulqzSAqbCZQmTQcG);;u5?esuVvNjA)${ zdOCm*ZjRw!6^kF+0y!>ZCyzr@t8~EHKA6H)Mz0(r0)dAZZ9*~k;m1aVu`x*~Y#~0F zW91HGfT7Q=hl-e0%%ln5K^PHgRqZ@~><2J!WPt0zdoUw)I=Ami8}L0}0y(~2ppv?h zqgraW>)d(4{>y1>DzxuUqe>VYkYryEq3G~Z%VU}(Is2xL6}`7tXKMhMi;9T)rch3k zx7|HE0i{Vj2o>?kLffe%A6oF=^2AgwC?S_q%in`==nju;7owh;I%L~mrt~>{5M;d1+$7Hd&Z6XsTW!FRjVpHr>LNhO#tig0Hn16=JsU`| zly(ZqDlOtS+W!Iw%?4w>69Wu`h4fuqj_3|%KHhbCs?I;=_O3TqA)%pH$RvF08^ z-{NONB6r;bnZoimcFODB5~bX_HCtKzN#|8A*8M6~Ljnhsz$h6^L0ky2p8D99b@5ph zLtbqYkkb?73FaRT5BBz4R(m}>$*Gu`k#yrbYvy;0+{)V)6il`wS3roVUDXx@G_F>k zh~N1mtg%%J6$J zJ1l=;HOA*m7f~sO8myi5S)T0&Nw{xU2`hSjD33G+s5>Gq>v5)@4-^VC7yjp4Oh5Zlghx)e!zLg0!qUEU&Xx!4|fB`oY+no1#JDW*3} z8fnhhSa|Dkyef&GP%{dj+)6uLUzyo#sEk#Icc)3}1Kn z0f~Z<>goE@you8koLBj5V8q!Lx=0UI?(+>ZR+OHE5c_b-{V@GY4b#Ke`9H%T4TR<@nqo?I`MR!q<}I zrB%Fh!&fXjXdLiRvi$jvp0q?VZqbs_ZNI=rli^c(z6$v~#hYxAJ(Xv91k$+5iaP$W zS_Dn8QOZpjIWp@R3!*sVSxRn$>}l>YWpt_~twf1)63R*P2K5ciigXe8CwSVzu3yrQ zTFs(c>8?szOZ3GQ(7K&&$T}tb(6RBF&$hD|p|S|J zxU7Yd2|sUp0S(jSQ=V#F@1(N36%9J-srvkPKBqol3U1*pzrU!U*m>DjrRN>>Rx-oZgGfzMx~of-1z$ho|<3u);Ar=7KRyYm)u z!qJCr@MM^mfl)7I7Hv)ndz8;H<;VJ~=kB-8g*20$hBY1Vh_J%&P$+51$3= znX(B^*6$IOLiWCKv+Z-t(6dsDknN3h-ZkwuvXdYrx+|Anr_te6phh-{Tb>nSK(>n% zBnymFtFkSbQKw;9uiPlrmpK<}(?dDNuRjGJ!}jTZ3s9Po@UsukPhN?Pr`QXP43);dn7EC)>^9YOF3`4!{X0hwafrlbRUbEm>ZV zEr^%!jG*wo5?C`OlNE_J2`C)*7B;wuTbl8@>5E0uaI+hl}tVSQTtae^Yr6;A{grfl&9|I#N z`s$@b6325hd#4`_upG=iL)hNUA>_2@Y41i{i2m}IQ=XI96`u$;5yC6T9O+}FvnzJR z0!RErh9d6}tGv(Gqwymv(@e-PRoHPtP5P|N!kK5c$Ah*kx$*rc06Ty7diuI58HLWa zxYr6l!mCr)EC`=ZH`YPJ4=j#lw8`+yaB_u^JJbYno5}Gwa#iwwJ&9DvTpB_}

~R??$f^C^gc{HG0U>`LkCpJFCBO3xv93v0B}4u}5U*3*fvp_$tQb!L(GykkqKGVCkqmur z04~eUi*QddY+TywIgilK*6#98il=E!sGPD5mB~rI;W22X`?DV9Q-v=4G?H3q`c$Et$z8Hg<IT-eLz`Xn-rXd?Cl6i9$p|oH9f9?hIZ# zNA<{)Trvf#p&;XR!bid%j%6!6h+5kg0H*kA6^459alYAn;;dMz83ytppc0athNXz< zQX=x%!NQVO)sm_8wm@i&3P)no4m1IK_46N%dyCI2_16sy&^Xl@3WI5xPDsRjyrrCK ztGCJ<_1@lg73w&lhVTT^U>x?jLWQ$oG1Nds99Q*7-}KIX%fF>^n@D9tXUu$DC4k6h z`63CRbkWb{%P3Lozq9}-C11YS;G*)sn=rIAH?|%kqZ0jSF-y&F<+VgqSkc3{h|g1w z23XC-iYGtaU3dnJJzdsm-)h;E7dIxoI%~^ZR3@t)yhEpoY>dLcQjzv*6{0;s(^I2N zq0Ql!ulQC!Jlvn+-8*n`W8187X=YHkddQ3KPd*t&>j4eZy`Gimt>E>A!BP{2mbLxx zId$3og-%2cq&1x?>f432@(8YT1|rDX6IQiE0HNWGtLBn*ln#VG8|f35(m4pozhbYF zmwxE2=5gH>h+tGH3e97M%h$rF!1MF+v7oi>ecl(HrcdfN{kB89aY|1AfDsNUTe|>_ z9xjg_qd30cV?VhE_R)N+e(liD1!O3JqTRRTf81ce^i{qfeC_!{>R@h=IsK!AF!u5x zV?*4}x4?+`lIe0Wou@VhI-c1oF!0;8qmR; z7iq?$^)a%ZJzT1Nd)`ETK)3RQwVgYq)vf!ETE%9|vvP5N%Np`v3g0-@ z&f9X}P#%ZDWNP$p9HjfsT^XKbr@m(ZqWnmP_&VldDJ2ivSEB-lm9fUD>}>Q_%*fbJ zMd7u&(6?SoXLB@u*G=z!VSRYE#QLkkorcg4=+4GuBb1IC`R61@25rB3xmVgP&~Xeb zLg}HyEtgo?Q5b)s>NBpSS_~$iQUjP-U$}a2uWnj%+6X1WfhQj^fJKiRGSHtY7HQDQ zrRGW)@y^W>OKFH0^+ymW(Pb=yHO%#a(%2izBX>>`>oj#Jyc?0237&a;>y4s3a18MW zvQpe^stOmUEoVd(Q5GhrhZP=Fm6FsmOqtx`RD9Un=w&t*`5FCnO@*qY%bMRPp^XaOU= zd;qI0@qMPQcSnxu&AvQMUi*n)q1zH~257ui#v6Q;531GFm7@^d-_TDj_b-xZmLh`` zoFKkMy14L#M)J*>JAQkc)gqEmN}|oYEHXYs2(#n z)cs2Ky1l&26X7NuGLovOYz4m_-pgm7X|rp-FR%&DlW9VVG2QHV&mI~WhUw&MJN6R> zy#*c937k;p6VKv5EXpHTLhDs$1y&7Eqja<>QOwg=d};mBH_#lkj173JwYORjJ;?Q& z(0|IgkV zt{&=I3+viRWek3ouU+JJDpF)H)O@MydR;dF6%%$fQfmXOfL!sL$aI&#yff_K0;q^# zoi_Ud8#eB%H!|OBpj3JC%}v1=hTax=wf+bN>XU-kmj{gV9PM!)T1>R#(rE;1dF(^~ zcw;ME<0)IUlSZFX@}X2FeoUIMuV&sjOiAzT32Y&&cg~$|bouN1gDR7TJ~iuSl|VBd ztkJX-K+4Byg+thjqP_9=TH6hDWISjLQ)MWP1g~5QAc%YPCfGzb`#DS}ji^-VVwZ2z z+cYUcvROSDisUEoB@_vd>5Ae}bO5?Sa@>fmj#r+EHsIU`LkOP*`7{R|1r)ncKk4+6HR zVe*lWTI)+tC)>iN-{I@kab%ZXHn+TyW|WK)`pyCzr;}A)anorQaxz1gv4}GGLwrWh z@T$KP#e|T@XJq~zs*rzb*a^467>ro~hPq{iO%ZY`V>1Cq|jS_Nc7eLWQtWJmMOp&bm6oxl5iV z{zkP{u+o)I>_J5R5QEiRYjizidoFq%sSM|D`lPs8N1%NS=#6w zqrfPVpLTYZ{H9CW@QGh7d3cVCCHb&%sv1hoM@Ja#I<;~TD5W>Q-TjmtJzAT0<763^ zW#iyu!dJ>KdomYTi68TYpZn3WC~8#YJ%z!KzH#`VR&J9v4L?D? z5uWwO$iDlC&-OfYLu{W>RsCL30&G60g;yU5fQS6=`s(ea5csgj)~)cO7YpK$L~QD#<_s`7Q$)R=#K*57(0KVQCu1`pxQKgCY| z{jb@C;4p4G%|Q$olP`G0opo9B+vKjA}%o)rc)c@G^VJ<-HY zx8wL8OE+*{8lE-(@eEv|<70!B2FB4a>HiGWF*6&F2RB0(tVYA)3Ia>0Zs zeE7V|S&v7@wrr0*9*#y3fVI+N$Iv17MEk?e7=ZxVM$wOf)K6RuZf&{|9H2>vh)U8E z|N1{srhjd;-~R(SR__Ee|K=C|I(=!3$_(g!cPWmc*CGAP3-~BxbnQQ1HLw7HKl|VO za>jBp#?UUC+1*-Nis3RJ;j)Kv%C{buT(No#qOzh7)?wlt_B31i&>Igs89AXaA*s6` za`9biK{tspfeucMp6E6{b(FDY}h2y!l40A2fciwP%*1KksN4wr;=WT(gK2M zkof4fL`>$8eyx~LC1S8J^qr!PvRaf|`~*+{>MTQ3PGfBIHpOqC07RqXS0^8oDpn8T z#A)ICD#Q2fri`4>2vvCoN+w5aAFQf|`Wi4L+skY>#gH5eO7TI2bEQh?h`f#(+`~_FAxoP$R=@GRtWd3@B#TI%LlU+Ad&^;*6eW^A> z=VHjY4eMI|W{OP)7SyGp|K7p}oeVB_0#+r~zv*QB|7IT>ZiC3m|39?Iw^oY8fI8@W0zkUKyMTi4}ramF=3FrJf8S=~wC zIJLabc2d3>R%~W4UlydJ;XR+3c7G=aQ!McX`bO5f7eQ#{=#}ZE^`9acKf2!kapm9t zE|PI@uItY4k0=nyfTIVoSproG7rMvLkg3~yZy9x7xZJ`TGBDN03W&FWS*;h=>CQrm zdC08~*8#;In(r?x)NOMxgZT*i9F=0Lr8jGVF>J;P^)4?T@g-uoL34J`c@FxtHn2Ns zBu47Dxg*1R2<7|?6vDWnIIp}$XtfF*nN3qSCc4yN>?HQO3G$H*wByE zZ!Qd0LQprMzC;;g(m8D&^M>}?k4e=ZCpYX->7+A%1HkGfi`RWarFi;tN(PL~05ZCG z@EH-xL8KCSMu8kaW)Y_Bpi-HB_`(Hhac1v4F*SCQBX|Cn0RX43qyL|@|K)C?4NoD$ z7O~x~Aj6@9pa47R;!z=Zfz7>zInHHD*timx*1NXvMr&mK^hsKY8n-*g>yE)=)eq@@~*${AXJpSESpMdZ8)3RL#V|Mh4YGyr6 zw*Kz=3?zdkYe%G81ICP7&9r%})01c?uOL7)cl;qJx9#OncC&rG*bH37()t)}hu8*m z%p*1g4?z^f9+VuEmApp#a1bs1#g-Z<-46lEmQ;~K-k3t#;YZ~vCk*XBu^Q9nJje(? z9Kb+ufM5Gbk1&xQ%1fmX;*Z!HuTOV4N<3G*e0(>Q7ma(|efvGhJ|=Jjd0i}ie~a;0 z;~pu;G>9n~=M<}fmBbLB4T}U9Wg;d*XmiWRcI{*}=&y?5((~_anW&M9zn9=?FSyWjG9FZ(V^jHtgRVw%6P$j6Y~qJ$gblP+~d<9(gCXper~W z3k}ta1RP)4kgAI}Ui%yWxQA^~UPzBv z3K@x>RenmI(_JDzfxsMHK??qJsk?xo+gkNskCd|vPW3^tAlfQale~NLEP1D-U1bJd zG)4<3P{_R0DXa#f)r#(Yo0q5hKHui z8rAdEwB?m+5$K)$41~JT(OjLU)lFu*UyU$pVxL3_r3kc>(W6-0;JWGwt|XHjQ18|^ zM@aYXLDgJ+-Bi1GZ`Z7gzZl`!o3MF8h0&NT#{{;(wPmpBlJa+}l~H48FXSAZ`6DlU z^=_^wg?aT(TIqV<&16EurkF>&8FPnoHHWls0$d>=JcV(FW8xg|l&n`0HTw5&)%+Z} zTBn;42}T`?BqH;=atGMgl0(AHRzKiLeKs4|gv`!9(Kzj3bCA)hCiS4qQ-E^lZ%hK6 zfKGV_7%xyCz-KJ`U8)iW2bSzl%uR@_hQvA#jJWo)mLPp-U}X&Zi+xZ0RUlHiW&t}K z`}8a__|S#O*-(|h&0}_i`>wyb3YbR=40g2JR1l3|1bDB0^cGE zMy9)8g@*F;8-DXw_=zzfjvYK{PZdaJC>+6n$_8u{YLc=MLz+z%lsfo^&~T)%GC?!d zkD5nBO?+k*S_E}c96NnIv*eQPP&s{LYDo`m-J3AOTnyk z%*Hh`OxfJC-u!!16yZEclRgonePHZm9%q=g(JCVEa3(!YUTvJcddDq`;JxrxQ2j0fN}&zCXRbX!>_DdaP8KdQ z)?Mptuwmes43pje@MuHzQx6meCls~ZU=VMlxmC?uS=nkOfy>FRhjHhimpilOJoX6^ zQKtH9bV0Bne+IySaX>~>g z5JjhF(qX2TAt7oIK>|;!bmx7md50f)U&)L`zM9a4FX*?!S=QO2WURa(Pj#Lay43x@D|o{Y5*G$2nF0b6(1?SR1>aV&q8P+=0W& z^k$o20ZJk%^c69^9#h8{Ej(t_3}|)#uw@zhJgck9m>%uYZL~&mwA~^8DM>FCUm29xn&pTd!G zgE1}vT~=Em+VKVLd%XnxTIovaR{DAh%tl%G+(wn1wIW(A=7aU?;K>5{+YXsc6-rEp zLdPZBW#{ghR7k&rtpv2QA8gWyaoH{z1hAsqg<5S@l%8zXeW;gcW*&YllQ82XYgd=| z^|Pa7h5q{iGWShY}+8$m#eDu zVr+$4GH;T~_~#XCcI9nG=MF>01h;&4>9=rq{P1s8=u@b0r|#Ou&-R~PVhN}3C`>0% z*bScU57oN2H3_lfv<}+!j)Q@2%Vo@!U$$~k&?Q~2T5|m~BLo&+bcUfH2wkS%jIw{5av2Mt-%2(z=*-67vR#9=P_R*BpC-UIA zm!KGzs-8)(Vzm-J5oiF>?KI0xs1v#4*~k1fH~#A}9|ZDhgj*ry0Ej#qmZsLkA~X?NE=>O2tvV&q4{+x6 zxu?vfETW-|DV(lCYmHUk@3!(4b$9}$6Qtr%EsU-PbLPR>ru-DaVO)9?=`93eA_pQW z4=GyCqheCTL&77+SP8VR6tGq*ONEcS4rddmS)9_j2H6qjnRFurU7zt$Tk3S8>fH0M zMx%ROKBBwsn(!IT5?Bql@zKpvesY$0&Aw(Yw)FL<;xA1M z-IcGD3Fd~|svp~E_#2ue26%q-Aq1{s@1wwI;v^Z@*-2*HqGUp><^7(qj4pkM6!I|? zjOV@8BBS_jd1R=u`$q5hwd%L>zoU~5lg)Z9p~H6nsaM1`OMh&MRk5Nm6a(|5q)Z^S zW*Igu32l%=f8Figlspt4tMp|*{B!*Zp2a#xIuu$Y47GMth5kVbWL@r>@ z!R(Aj;fSv8>z~;%YxtwXn!2NtdbHM{TQo8* zQo{A}F&_sqB{m`5{vm-9<8DVLdCs@e?c-m|)%FN4UzhXpqU|?LVp8Pz>ZmLud=0mx zOS~jp3eoA1(e%K1-*n(`l{j+MduSKDVFq9PEBBG-a8CFu#)Qh9(8Dp>)Th~`fJ?m1 zAl+*WBQaEt5*||!k^V+FB>hLC32wz$Xn|A`!84H%9aKb^lwtX7@!Yz-ARb0yLFY$r z)x!16Zp%}9wLBPpB7ezfXl=$6kUkfHqOmWw;m*0|dnyMnrd8(w`rg93?YFW8`Q5!m z3r2`Vse6;@eAmL4i8XLcfrx5uAH%0F>!^$(jMNQ992=wR3dY3hbA;vx0P1d{RatlE zckK-Ft#+SK=DUhkbm7d;`a0`Lw6@CrEf?!Bsi z9YV8rLm4S9)X?i_H8eBy_EP$=NSxB&Q!)TKY@v-owT!xpN~(8_6XCKedU^^le9r!) z!hN3sQS;xOdh2NtJsG(#J6A5tby-X{rfncIY@u|DKA!!;n)s)?*R~|LZ&Ila?zj+O$7F&>OYNSLiuRe4irc#>=p)g1i73(#c)`sK}J8AWZV;J zb^eeytVOszP=y>O?fjER_Fa2_KqDppQ$wSPH>N#e?-J^~PEI10Qq_aG^yf`~lq(jj z))Ea{u-R)X1ksp1Qn+XsA`@}l=@omZ8Kz~Be`}d(r)*a8dJsE98mVu3=|n!I&g7Y< z7j<(VbxgZD4{#J;8U}>Y`I~T=XmN}XaemaH*Pd#5m?iJDi@GU2bP8qNBr;ctx=qU(&Di@1OBX;(FSa~ zbx@~^%?4YU8DL5hapGMv<=^s#-gsN4;RU`j*d8fLq;~3QISRI7;43q!k(HavKtn0Q z5z=D9RdK6WJFCBqSivFp)!x?zzUlhr=F{UWO3@{C)A1W(le#kP(=W;QpEq?=7XBeB z6PHcnJt{$QL$CEk#;Kj$!^}VR(^VXuYCHUDaFDZvH70WhTo*I0|^Q)-eBk>lW;Hz^bKAwyY`GMC?(bId5 z^Oub}Q$)^Zi;wb`oD%A7vJ7Uf*9yxRg7PG19L1F7w!}4K2Wy-de19hWhdO_?XV}D{ zRvmmollCJ;^tQ|FtMnupB1VmQeCqpTS;ws35$HC)PR443mHRQiN6dDpN(uo_Bxz{W zt`WqQKI)2os%T;4tMTzYk!cHw(hg(-@4lh` zvlM(k3S&N&UUu%&t?>Ye@UEuWlcR`2+~zM!64A6*tir)UT>TP|#apgZB7mF_)tq*3 za?LMB?MvQ|gK?$NSYRG`Dn~dz!Ndw{r20dSo%y-Jy9{s1cL}RtYG<`Pfa_O<2U6N2 zB)2?OS__5aBrMZ%f8UeGBdy-6QNUmU6*k5Ng`9AqU)mbjR~_2#oD|HpL^PQ7Huj?T ziZh_dNfkh5(E#Le%BdQ`9EJkdq^~v-;g}bPr0mD9@KAnNm zv$*94(!4$9DdbK7-V)r5#x69i3jLC1GMA`Gs+)??vc?I&nMs(}FP z;&+{hd-!jLM)nBIR}e!KkUsF;O}0c>7Nk-4bmk3&;p;@VM_j&`^EpC`Pt+SqJ2!H^S%eHpHZIj@ykUtF z$qGPbc2Kv<@lX4qCCJ}>*y+<~*w?vo^nS+R7~PGuw- zkwtmFdN~Y{s@JN7h4ZzOf-cpW2CvWecSYrCa+(h!*~UzRfTg;LmNS%8D<=0Tm?m)3W6WF@1=7_{c90%mSIebOdesg$kr&KF=KHA1lk8ph#yoi-0 zl^$-92!|!yh1yORP|Z>3=GMnfOp74VaED@}Om72#s2Ay$GKac4+piOSQ>EX@NN`e(->+i<|B#ngZJN=EMq zcH8}jm%eHL7=~$%L>xS>#8^yjK{b~pf*op~`rmr|esC=g zct#*}A^sR~r}3U`BY&udseS}b;rh+91h;$LbeSiCY;l^osVJD3HzMwhv^hpRYXNTI znR^`g{_IK4c*DzXUXALIkyF=v^!1&UsStS+E5puK><$K26^aH;k(Rj$z0m#W@xb^4- zHFy=Dbmg_&sm3PR?5=3_SpV`3;(Lbsd{SWh3~ob$_a&89CXfl(eihKLvK5{Z00DMV zC_$yjwmKP+I@L=H&)C&Lm*ygzF~{NuRB>rhEqs7WkygVmTMmx8;G6z38&YPSNa=nsx@k7uky_d)=iKwj2)e@c{HrGjO#=^U z-9lzV%@?)G^9=&+Wd3w@=n+Z)_3*4I85i? z|K9FX@O#;q+im{KpuQ8_=~?C1KlEb$(?{|>LvqsV$0ct5enDgakDv0t_|=TNmm-cd zU}RDK=RJpc~TU=K}-Y|B)7eCj^Eu{jBoY?By@M%s>nKGY}is3BEe2v+#) zldv;v9#AF3`(kO>gDmxmYpHh$pk9#YdBQ&pHYN&0z$IiX-RjSl%fCMRqIVz*KxN2M z{r7cblE zdm_fjJxHKDB_7AsZ@Vzi(-zBFO1UdWW&9YpKGOh}s@5R5k!~*=FVce4`ujN0w7vF%}CGsm#_}iUN;5s!AOswh=p156$K7GK)NG<(m&-!d*Yx-EU zdq{@3>*?e3Nyi-}Cn(#U{OzREQsZ$0xIEvT`JWev)t3(jFNR?32GP~%N_YuvC9wDH zOuT!t53FQPOsdo(dB=BMm{n$u480jpdBx-cb;`YDFP?e{ zqXW6-qtzY#AePQqj(+$1;hw+_JEozBrFrqLQSP9$bA_a{*__7h@lW*kwcpbywC)W^ zltQ}mXUyKEX8}!T?O8+9jSSsmt8b^g_B-g z(|X+l6kp)KODIBwqmH|m_o|pa>lwZslf4A$%*yWmo4E%(!$U8bLg`)!mdY+Ua%4*N z(pzRlPLp%~ABTVk&2>`2rzjy1TbV>Wk}GUx#+)4o4AaAlJ;`lyD0Dx9wc`Emj&k@K z$*cI=Z}PEmQL4EWvzZy$-$o2)cB3nK!$3q1F8+7T2bLS|ds0%BjHBw4@r9$O(<@F_ zcJGx8?PMPxF2uqPu`S85wskgLVjn0;HtsUx-jWw>Vm^95v$z(#R6(#tlv-RMF(sik zJTjbA#HjJ&xy*+mE7dDyp>yr&{;FKoi7`xzql^AjqkgOS#zG78MW4=?B`@5rDDE{L zCv;)$YKvWtiaA^#G?b?vO{+A&oZ9AUuJVCgRD8jPqgr#;o;JQns{?myhPOVob91Eu zhthpfC0)rza>KZ3C~tV8=9z8Fl*>#BcfNbGYk$Pz9OJig5qH-n`W=UoPb7ylUg^1o zw~Kkr$I{K3rq+h_POe)K+t1A^&>hsbIgH=kYI>YEXG0!)W@e#x#G)rNdUN<@P-k(W zeDiSclR^IEG?)HhKZH1^(hb1A6bcH=4qBIo4d}Z@va5x zYD2d2&*Mab{B^%xR&__pgYCSdT}I7l{NsN49ZKGO*CgO}#SVdPz;{mTcod==f)IO) z)q9I#bl(8l3+(Juy6(D5$wh?|f~2jEs!rgiv1tiIr=r=LAk%_q2#OArKVu(g1PKmH z9@DW8zGk5k>?>-B3OIa_*%so@j3iRlGRJmdM(TYPz$Vfcy?fJf>1--vpCnA#F8si&C3E+S=cTfN}MaI z+H*Wvo_lg5aMeKnan3+xn=IZGci`OA$YG6sR~T{3=5YPSvY)qnWOkLCap}evp5S6X zeCF8A&%LJQnrF9W1?|(r2g4ql>7TV4yb^M?Ou`nmz1JDKTN%k%-Joo-+B29P-dkT+ z=v+P}ReddIS7LYRd2^xY#Uwl&S-(I`67is1)tv=<>3AEBW_zl<0DF`Hc|$;bl0>Y zKRHl3VWk!9{2%r>{9Ax0*$~kBIN2c}Yk%N=iFF6e5uW4P%@~j!Mgb(7v{ZB!KisqZ zs?&8>Zn9Jf>)ZwUUx>Xib901G z-nt$d*v|pJS=bO_%w(!^`M91b43Bq4?pthJNXxC(OHoyHiqa_&sPM6C|7eOFOEj+) zUZS4on=EyUPp)bH@JeTpdV!MD?!a_`t~Ba6<-iftV(txT`u zFP3y2RelsG{2HvUp$%etgwYIou?{0zot=+NL6SLM`x-ijy8NTep+WamXcWBakIT#- zC;Vf&{+hn0peX4M@rT-z)k>EVof#|B6nQEn?p$uYL(OJ&bN}G&>Mg(q?!$cWqv7B8s}p%kL6Id zsuoX3wVQ=#D8jRfL`N(t%}D(<7PSu_0?a?rL6J(Ds~~A|lc%3-T$`gqlvROs50jwP zRno)Bdu$ER{9VU9Cunw*3N6i&z(!LT9AVYQy!ldFIDgNlVy!FsQgPLHu>Ir~S@VfuS5es>%!(=!P>}G<+-Y3#;HU4Q5Ua z(0mElavC3E__>O!M_7At&3Z5hd(XYfw8Nq__pKldIeKP~p{f2&^EkwGiIcsM$wz8I zwa9fSSL3{4$IYt^9X12sDwp>~4sccP`jUBjq5wT?5{jZzkwbdh* zb8b0ZCt;4$V;{UurcZ0{G}osI++MF>iD;S?u07OB<2x)hnD9ZQEpX^W)1#j3;qQNI zE6rtjTywooNcojTqTLxOEb#qfme9!g7fDiel7magl(V+gBuLN1klWkZ5vtO;n$rl} z;JP|iGKK27x@)KNN!u&-n{^%~S_@Qa7cK7a!{e3T=S2kbVq(t=(oaDe0~6|KvOT&kA*P%UBB#@YPcy4TH&j$w8WD8$s}OOD5jm}*_fBCNuZo(D z>Jv&?q*V8UU38HvERt`G-K=sSa@jqEki*%OubtW7^4J)2fE$tC3?af*(B(1mUvux1 zkDav6eel(6to*W}+D$DI;SMY;EPhUD2{F~vVdduGQtP;488p*lI2-ANwlaGvl$?EQ zVFlHS$dyEoDLp;P>E5D04ef^Iww>Qd5Aa-Va<&Xc?;Lv79a3u&*X2cwIrL*&fJ&ns&`gMq%9bu~FH$Rd&@p%$AkuK@h~{)Lr1%@d8dRQi zNR-bE`xy=aQ2Ru^8TbW92xryne_5SA-e9L-J+cRKln5(We@G73*UrV8 z-SVs>kNHOFUr4t2#-no%qjGaeE9E;~3j?aIxzJWkm3d~r-6|c7;bYa`Xzv{$Wz2V! z5xbe-ekL-Rs&U-6xu$_?bF$w&*}H>~?hcC%(vNYEVP(iHI_4Cp-V*WIuFB{%+^yD_ zd@DJ3*w4;Z-%_L2{iW_Y_uPm4k`jfuJm!uEqudMXaw1ccnldXpBc-&VA1nW-U{CH= zI@av1H1~?A9;QmN1i;ovWXI{Gff4FNP$!6ZHMs#%@=3tQg36L1)opK|P#i6F|M1n%`AssZx zIh-^^CAZp585Mbqe9rN;| z)|V*fCYVV01^ZG5+PWj%@Lt^#K6_f=N{i-$Xs0RmR?^O=2gR`+X}$ZM6(oIzwGy@x zP0l9|o6}ZM@1xm@8BL?`ztD8U)=;I2N=K1ey8gK*o_`>8%}3b8J|}3f!#CJJcEZ;9 zRBNg(`nIl(l`7i;PwQaRX_7BsV>QZiA@+AdiK2c+;2BEyqhY_je1+Ib$%FJ9_3UHLQEIXnGIa%VZxk7Y5j5wQJI+;&KO2qZv9w zCAZV|$a_!6EX#&jI|50lEs<8MWEZUR_{P~9n@WWf6V%(K_M6FA9zPd1if2#e>+HN! zK9^$=(ouQG@|7=Jw0p5*tS28zu4#e)-e@uR_|$3W$z)ByIvMFO=R&YWq8snOc;l1` zZ`dEV5+CiYue}!+!+v93zry4Ml4wW_=b_0s@Io5Ki@zqi?~}sYqUkX_n`={z$fWzW z`p;c9ry4Uo*556t=R-m-WYjzdb^YvPYV4e^*EnNX%y0aFubah*+TySdaW=Q7I#EoF z?;ej{K}@fU*y>zZPmWzWX$}huUursYsp5)Lal0gPL!c&wSLGYj@p!Yv>MH{|ri`VY z=AK;=;b=#$bsw^Ft#+Kx)P?M=e&q6eMuKkk!ivMuseH?Dl;I+LC6*1T>nRakJSQfY z8+~g%(}2bMb4y2D@96+Xd?Gb!u1zY~Kq%upNr=f%0*)hDuXcQ_TT*nSL0H%ThfC`v zS-AWL

Y=nUch+OSA3dAVw_#-l=bvKLI%PwE^ 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 Date: Mon, 15 Jul 2024 11:38:05 +0400 Subject: [PATCH 124/144] Update xdcValidator.js --- contracts/validator/src/test/xdcValidator.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contracts/validator/src/test/xdcValidator.js b/contracts/validator/src/test/xdcValidator.js index f8e837e8391d..7d4cd5581fa8 100644 --- a/contracts/validator/src/test/xdcValidator.js +++ b/contracts/validator/src/test/xdcValidator.js @@ -79,6 +79,7 @@ describe("XDCValidator", () => { expect(validatorsState["cap"]).to.eq(minCandidateCap); expect(voterCap).to.eq(minCandidateCap); }); + it("resign", async () => { await setBalance(master, 1e30); const candidate = await ethers.Wallet.createRandom().getAddress(); @@ -115,6 +116,7 @@ describe("XDCValidator", () => { expect(validatorsState["cap"]).to.eq(0); expect(voterCap).to.eq(0); }); + it("vote", async () => { await setBalance(master, 1e30); const candidate = await ethers.Wallet.createRandom().getAddress(); @@ -148,6 +150,7 @@ describe("XDCValidator", () => { expect(validatorsState["cap"]).to.eq(minCandidateCap.add(minVoterCap)); expect(voterCap).to.eq(minCandidateCap.add(minVoterCap)); }); + it("unvote", async () => { await setBalance(master, 1e30); const candidate = await ethers.Wallet.createRandom().getAddress(); @@ -188,6 +191,7 @@ describe("XDCValidator", () => { expect(voterCap).to.eq(minCandidateCap); expect(withdrawCap).to.eq(minVoterCap); }); + it("withdraw", async () => { await setBalance(master, 1e30); const candidate = await ethers.Wallet.createRandom().getAddress(); @@ -219,6 +223,7 @@ describe("XDCValidator", () => { ); expect(afterBalance).to.eq(beforeBalance.sub(withdrawCap)); }); + it("directly resign one candidate", async () => { const oldCandidates = await xdcValidator.getCandidates(); @@ -230,6 +235,7 @@ describe("XDCValidator", () => { master, ]); }); + it("kyc upload and claim", async () => { const kyc = "0x01"; await xdcValidator.uploadKYC(kyc); From 287812cbcbd15b334f94c1095fe94f5f47d745af Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:39:36 +0400 Subject: [PATCH 125/144] update --- contracts/validator/src/README.md | 2 -- contracts/validator/src/scripts/deployment.js | 2 -- 2 files changed, 4 deletions(-) diff --git a/contracts/validator/src/README.md b/contracts/validator/src/README.md index d11bd8c46c12..3874dd7e51f5 100644 --- a/contracts/validator/src/README.md +++ b/contracts/validator/src/README.md @@ -58,8 +58,6 @@ This step is recommended to complete in python virtual environment because it is - `maxValidatorNumber`: Never used, I don't know why XDC people write this... - `candidateWithdrawDelay`: When you call resign() at block number x, you can only withdraw the cap at block x+candidateWithdrawDelay - `voterWithdrawDelay`: When you call unvote() at block number x, you can only withdraw the cap at block x+voterWithdrawDelay - - `grandMasters`: List of grand masters - - `minCandidateNum`: min candidate num - `xdcdevnet`: Targeted XDC public chain devnet, testnet or mainnet node RPC link - `xdcsubnet`: Targeted XDC private subnet chain devnet, testnet or mainnet node RPC link diff --git a/contracts/validator/src/scripts/deployment.js b/contracts/validator/src/scripts/deployment.js index 85f7ebd8d4bd..b1061c421664 100644 --- a/contracts/validator/src/scripts/deployment.js +++ b/contracts/validator/src/scripts/deployment.js @@ -17,8 +17,6 @@ async function main() { deploy["maxValidatorNumber"], deploy["candidateWithdrawDelay"], deploy["voterWithdrawDelay"], - deploy["grandMasters"], - deploy["minCandidateNum"] ); await xdcValidator.deployed(); From db0a9161fc2e956c18c00a00caea2db8e6dd9a77 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 26 Jul 2024 12:40:50 +0400 Subject: [PATCH 126/144] Update XDCValidator.sol --- contracts/validator/src/contracts/XDCValidator.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/validator/src/contracts/XDCValidator.sol b/contracts/validator/src/contracts/XDCValidator.sol index 893fba7e56dc..39a75ddd5a4b 100644 --- a/contracts/validator/src/contracts/XDCValidator.sol +++ b/contracts/validator/src/contracts/XDCValidator.sol @@ -1,6 +1,7 @@ -pragma solidity ^0.4.26; +// SPDX-License-Identifier: MIT +pragma solidity =0.4.26; -import "./libraries/SafeMath.sol"; +import {SafeMath} from "./libraries/SafeMath.sol"; contract XDCValidator { using SafeMath for uint256; From d04bca0ed6e14be0d96531e472b24ce9e150bf86 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:21:56 +0400 Subject: [PATCH 127/144] Update XDCValidator.sol --- contracts/validator/src/contracts/XDCValidator.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/validator/src/contracts/XDCValidator.sol b/contracts/validator/src/contracts/XDCValidator.sol index 39a75ddd5a4b..47664edd3eb3 100644 --- a/contracts/validator/src/contracts/XDCValidator.sol +++ b/contracts/validator/src/contracts/XDCValidator.sol @@ -364,7 +364,7 @@ contract XDCValidator { if (isOwnerNow) { uint j = 0; uint count = 0; - address[] memory allMasternodes = new address[]( + address[] memory allInvalidMasternodes = new address[]( candidates.length ); address[] memory newCandidates = new address[]( @@ -376,7 +376,7 @@ contract XDCValidator { if (getCandidateOwner(candidate) == _owner) { // logic to remove cap. candidateCount = candidateCount.sub(1); - allMasternodes[count++] = candidate; + allInvalidMasternodes[count++] = candidate; invalidCandidate[candidate] = true; delete validatorsState[candidate]; delete KYCString[_owner]; @@ -390,12 +390,12 @@ contract XDCValidator { // Resize the array. assembly { mstore(newCandidates, j) - mstore(allMasternodes, count) + mstore(allInvalidMasternodes, count) } candidates = newCandidates; removeOwnerByIndex(ownerIndex); - emit InvalidatedNode(_owner, allMasternodes); + emit InvalidatedNode(_owner, allInvalidMasternodes); } } } From 2e83224a949fe4ee1051eb33d4c647ebb1448891 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:45:52 +0400 Subject: [PATCH 128/144] update --- contracts/validator/contract/validator.go | 476 +++++++++++++--------- contracts/validator/src/README.md | 2 +- contracts/validator/src/abi | 183 ++++++--- contracts/validator/src/bytecode | 2 +- 4 files changed, 413 insertions(+), 250 deletions(-) diff --git a/contracts/validator/contract/validator.go b/contracts/validator/contract/validator.go index f010a0367858..e8a6901eb08d 100644 --- a/contracts/validator/contract/validator.go +++ b/contracts/validator/contract/validator.go @@ -7,180 +7,19 @@ import ( "math/big" "strings" - ethereum "github.com/XinFinOrg/XDPoSChain" "github.com/XinFinOrg/XDPoSChain/accounts/abi" "github.com/XinFinOrg/XDPoSChain/accounts/abi/bind" "github.com/XinFinOrg/XDPoSChain/common" "github.com/XinFinOrg/XDPoSChain/core/types" "github.com/XinFinOrg/XDPoSChain/event" + ethereum "github.com/XinFinOrg/XDPoSChain" ) -// SafeMathABI is the input ABI used to generate the binding from. -const SafeMathABI = "[]" - -// SafeMathBin is the compiled bytecode used for deploying new contracts. -const SafeMathBin = `0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146060604052600080fd00a165627a7a72305820b9407d48ebc7efee5c9f08b3b3a957df2939281f5913225e8c1291f069b900490029` - -// DeploySafeMath deploys a new Ethereum contract, binding an instance of SafeMath to it. -func DeploySafeMath(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SafeMath, error) { - parsed, err := abi.JSON(strings.NewReader(SafeMathABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(SafeMathBin), backend) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil -} - -// SafeMath is an auto generated Go binding around an Ethereum contract. -type SafeMath struct { - SafeMathCaller // Read-only binding to the contract - SafeMathTransactor // Write-only binding to the contract - SafeMathFilterer // Log filterer for contract events -} - -// SafeMathCaller is an auto generated read-only Go binding around an Ethereum contract. -type SafeMathCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// SafeMathTransactor is an auto generated write-only Go binding around an Ethereum contract. -type SafeMathTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// SafeMathFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type SafeMathFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// SafeMathSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type SafeMathSession struct { - Contract *SafeMath // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// SafeMathCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type SafeMathCallerSession struct { - Contract *SafeMathCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// SafeMathTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type SafeMathTransactorSession struct { - Contract *SafeMathTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// SafeMathRaw is an auto generated low-level Go binding around an Ethereum contract. -type SafeMathRaw struct { - Contract *SafeMath // Generic contract binding to access the raw methods on -} - -// SafeMathCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type SafeMathCallerRaw struct { - Contract *SafeMathCaller // Generic read-only contract binding to access the raw methods on -} - -// SafeMathTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type SafeMathTransactorRaw struct { - Contract *SafeMathTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewSafeMath creates a new instance of SafeMath, bound to a specific deployed contract. -func NewSafeMath(address common.Address, backend bind.ContractBackend) (*SafeMath, error) { - contract, err := bindSafeMath(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil -} - -// NewSafeMathCaller creates a new read-only instance of SafeMath, bound to a specific deployed contract. -func NewSafeMathCaller(address common.Address, caller bind.ContractCaller) (*SafeMathCaller, error) { - contract, err := bindSafeMath(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &SafeMathCaller{contract: contract}, nil -} - -// NewSafeMathTransactor creates a new write-only instance of SafeMath, bound to a specific deployed contract. -func NewSafeMathTransactor(address common.Address, transactor bind.ContractTransactor) (*SafeMathTransactor, error) { - contract, err := bindSafeMath(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &SafeMathTransactor{contract: contract}, nil -} - -// NewSafeMathFilterer creates a new log filterer instance of SafeMath, bound to a specific deployed contract. -func NewSafeMathFilterer(address common.Address, filterer bind.ContractFilterer) (*SafeMathFilterer, error) { - contract, err := bindSafeMath(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &SafeMathFilterer{contract: contract}, nil -} - -// bindSafeMath binds a generic wrapper to an already deployed contract. -func bindSafeMath(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(SafeMathABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_SafeMath *SafeMathRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _SafeMath.Contract.SafeMathCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_SafeMath *SafeMathRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _SafeMath.Contract.SafeMathTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_SafeMath *SafeMathRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _SafeMath.Contract.SafeMathTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_SafeMath *SafeMathCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _SafeMath.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_SafeMath *SafeMathTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _SafeMath.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_SafeMath *SafeMathTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _SafeMath.Contract.contract.Transact(opts, method, params...) -} - // XDCValidatorABI is the input ABI used to generate the binding from. -const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"KYCString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" +const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeCandidatesZeroAddresses\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingKYC\",\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"name\":\"kycHash\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"validatorsState\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"isCandidate\",\"type\":\"bool\"},{\"name\":\"cap\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"KYCString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"voters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getOwnerToCandidateLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeOwnersZeroAddresses\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"claimKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" // XDCValidatorBin is the compiled bytecode used for deploying new contracts. -const XDCValidatorBin = `606060405260006009556000600a5534156200001a57600080fd5b60405162003dcc38038062003dcc83398101604052808051820191906020018051820191906020018051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091905050600085600b8190555084600c8190555083600d8190555082600e8190555081600f81905550885160098190555060078054806001018281620000bd9190620004f1565b9160005260206000209001600089909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a60008154809291906001019190505550600090505b8851811015620004e25760088054806001018281620001439190620004f1565b916000526020600020900160008b848151811015156200015f57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052808873ffffffffffffffffffffffffffffffffffffffff1681526020016001151581526020018983815181101515620001ea57fe5b90602001906020020151815250600160008b848151811015156200020a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050600260008a83815181101515620002d557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816200032d9190620004f1565b9160005260206000209001600089909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281620003cf9190620004f1565b916000526020600020900160008b84815181101515620003eb57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600b54600160008b848151811015156200044c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808060010191505062000123565b50505050505050505062000548565b8154818355818115116200051b578183600052602060002091820191016200051a919062000520565b5b505050565b6200054591905b808211156200054157600081600090555060010162000527565b5090565b90565b61387480620005586000396000f300606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063012679511461019b578063025e7c27146101c957806302aa9be21461022c57806306a49fce1461026e5780630db02622146102d85780630e3e4fb81461030157806315febd68146103715780632a3640b1146103a85780632d15cc041461042a5780632f9c4bba146104b8578063302b687214610522578063326586521461058e5780633477ee2e14610640578063441a3e70146106a357806358e7525f146106cf5780635b860d271461071c5780635b9cd8cc146107695780636dd7d8ea1461082457806372e44a3814610852578063a9a981a31461089f578063a9ff959e146108c8578063ae6e43f5146108f1578063b642facd1461092a578063c45607df146109a3578063d09f1ab4146109f0578063d161c76714610a19578063d51b9e9314610a42578063d55b7dff14610a93578063ef18374a14610abc578063f2ee3c7d14610ae5578063f5c9512514610b1e578063f8ac9dd514610b4c575b600080fd5b6101c7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b75565b005b34156101d457600080fd5b6101ea60048080359060200190919050506111fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023757600080fd5b61026c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123b565b005b341561027957600080fd5b610281611796565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102c45780820151818401526020810190506102a9565b505050509050019250505060405180910390f35b34156102e357600080fd5b6102eb61182a565b6040518082815260200191505060405180910390f35b341561030c57600080fd5b610357600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611830565b604051808215151515815260200191505060405180910390f35b341561037c57600080fd5b610392600480803590602001909190505061185f565b6040518082815260200191505060405180910390f35b34156103b357600080fd5b6103e8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506118bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043557600080fd5b610461600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611909565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a4578082015181840152602081019050610489565b505050509050019250505060405180910390f35b34156104c357600080fd5b6104cb6119dc565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561050e5780820151818401526020810190506104f3565b505050509050019250505060405180910390f35b341561052d57600080fd5b610578600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a79565b6040518082815260200191505060405180910390f35b341561059957600080fd5b6105c5600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b03565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106055780820151818401526020810190506105ea565b50505050905090810190601f1680156106325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064b57600080fd5b6106616004808035906020019091905050611da2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106ae57600080fd5b6106cd6004808035906020019091908035906020019091905050611de1565b005b34156106da57600080fd5b610706600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061208d565b6040518082815260200191505060405180910390f35b341561072757600080fd5b610753600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120d9565b6040518082815260200191505060405180910390f35b341561077457600080fd5b6107a9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506121a1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e95780820151818401526020810190506107ce565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610850600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061226a565b005b341561085d57600080fd5b610889600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612653565b6040518082815260200191505060405180910390f35b34156108aa57600080fd5b6108b261266b565b6040518082815260200191505060405180910390f35b34156108d357600080fd5b6108db612671565b6040518082815260200191505060405180910390f35b34156108fc57600080fd5b610928600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612677565b005b341561093557600080fd5b610961600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ae57600080fd5b6109da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ca2565b6040518082815260200191505060405180910390f35b34156109fb57600080fd5b610a03612cee565b6040518082815260200191505060405180910390f35b3415610a2457600080fd5b610a2c612cf4565b6040518082815260200191505060405180910390f35b3415610a4d57600080fd5b610a79600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612cfa565b604051808215151515815260200191505060405180910390f35b3415610a9e57600080fd5b610aa6612d53565b6040518082815260200191505060405180910390f35b3415610ac757600080fd5b610acf612d59565b6040518082815260200191505060405180910390f35b3415610af057600080fd5b610b1c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d63565b005b3415610b2957600080fd5b610b4a600480803590602001908201803590602001919091929050506134f1565b005b3415610b5757600080fd5b610b5f6135f0565b6040518082815260200191505060405180910390f35b6000600b543410151515610b8857600080fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050141580610c1c57506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050115b1515610c2757600080fd5b81600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151515610c8457600080fd5b610cd934600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b915060088054806001018281610cef919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200183815250600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050610eb834600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5160016009546135f690919063ffffffff16565b6009819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014156110185760078054806001018281610fb6919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a600081548092919060010191905055505b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611069919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611109919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1338434604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60078181548110151561120b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000828280600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156112cd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561140657600b546113f882600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b1015151561140557600080fd5b5b61145b84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061153384600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cb43600f546135f690919063ffffffff16565b9250611632846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180548060010182816116db9190613659565b9160005260206000209001600085909190915055507faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2338686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050505050565b61179e613685565b600880548060200260200160405190810160405280929190818152602001828054801561182057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117d6575b5050505050905090565b600a5481565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000838152602001908152602001600020549050919050565b6006602052816000526040600020818154811015156118d657fe5b90600052602060002090016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611911613685565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119d057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611986575b50505050509050919050565b6119e4613699565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015611a6f57602002820191906000526020600020905b815481526020019060010190808311611a5b575b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b0b6136ad565b611b1482612cfa565b15611c655760036000611b2684612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160036000611b6f86612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611bba57fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c595780601f10611c2e57610100808354040283529160200191611c59565b820191906000526020600020905b815481529060010190602001808311611c3c57829003601f168201915b50505050509050611d9d565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611cf657fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d955780601f10611d6a57610100808354040283529160200191611d95565b820191906000526020600020905b815481529060010190602001808311611d7857829003601f168201915b505050505090505b919050565b600881815481101515611db157fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282600082111515611df457600080fd5b814310151515611e0357600080fd5b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600084815260200190815260200160002054111515611e6457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182815481101515611eb357fe5b906000526020600020900154141515611ecb57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008681526020019081526020016000205492506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020600090556000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010184815481101515611fc457fe5b9060005260206000209001600090553373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561201357600080fd5b7ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568338685604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60008082600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561213857600080fd5b61214184612c36565b915061214b612d59565b6064600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561219757fe5b0492505050919050565b6003602052816000526040600020818154811015156121bc57fe5b9060005260206000209001600091509150508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122625780601f1061223757610100808354040283529160200191612262565b820191906000526020600020905b81548152906001019060200180831161224557829003601f168201915b505050505081565b600c54341015151561227b57600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff1615156122d757600080fd5b61232c34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561249b57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480600101828161244b919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b61252d34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc338334604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b60046020528060005260406000206000915090505481565b60095481565b600f5481565b6000806000833373ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561271957600080fd5b84600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561277557600080fd5b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a81548160ff0219169083151502179055506127e6600160095461361490919063ffffffff16565b600981905550600094505b6008805490508510156128bb578573ffffffffffffffffffffffffffffffffffffffff1660088681548110151561282457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128ae5760088581548110151561287b57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556128bb565b84806001019550506127f1565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054935061299284600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a7243600e546135f690919063ffffffff16565b9250612ad9846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806001018281612b829190613659565b9160005260206000209001600085909190915055507f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d33387604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600d5481565b600e5481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff169050919050565b600b5481565b6000600a54905090565b600080612d6e613685565b600080600033600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612dcf57600080fd5b87600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612e2b57600080fd5b612e3433612c36565b9750612e3f89612c36565b9650600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612ed757600080fd5b6001600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550604b612fc4612d59565b6064600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561301057fe5b041015156134e65760016008805490500360405180591061302e5750595b9080825280602002602001820160405250955060009450600093505b600880549050841015613357578673ffffffffffffffffffffffffffffffffffffffff166130b160088681548110151561308057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c36565b73ffffffffffffffffffffffffffffffffffffffff16141561334a576130e3600160095461361490919063ffffffff16565b6009819055506008848154811015156130f857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868680600101975081518110151561313857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060088481548110151561318357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160006008868154811015156131c457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff021916905560018201600090555050600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006132bb91906136c1565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061330691906136e2565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555b838060010194505061304a565b600092505b600780549050831015613439578673ffffffffffffffffffffffffffffffffffffffff1660078481548110151561338f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561342c576007838154811015156133e657fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a6000815480929190600190039190505550613439565b828060010193505061335c565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156134d15780820151818401526020810190506134b6565b50505050905001935050505060405180910390a15b505050505050505050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816135429190613703565b91600052602060002090016000848490919290919250919061356592919061372f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a15050565b600c5481565b600080828401905083811015151561360a57fe5b8091505092915050565b600082821115151561362257fe5b818303905092915050565b8154818355818115116136545781836000526020600020918201910161365391906137af565b5b505050565b8154818355818115116136805781836000526020600020918201910161367f91906137af565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906136df91906137d4565b50565b508054600082559060005260206000209081019061370091906137af565b50565b81548183558181151161372a5781836000526020600020918201910161372991906137d4565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061377057803560ff191683800117855561379e565b8280016001018555821561379e579182015b8281111561379d578235825591602001919060010190613782565b5b5090506137ab91906137af565b5090565b6137d191905b808211156137cd5760008160009055506001016137b5565b5090565b90565b6137fd91905b808211156137f957600081816137f09190613800565b506001016137da565b5090565b90565b50805460018160011615610100020316600290046000825580601f106138265750613845565b601f01602090049060005260206000209081019061384491906137af565b5b505600a165627a7a72305820f5bbb127b52ce86c873faef85cff176563476a5e49a3d88eaa9a06a8f432c9080029` +const XDCValidatorBin = `0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058208aa2ea0f8e87fc68507f275418a407fa4ee47253861d6f224fda4db207eaf2110029` // DeployXDCValidator deploys a new Ethereum contract, binding an instance of XDCValidator to it. func DeployXDCValidator(auth *bind.TransactOpts, backend bind.ContractBackend, _candidates []common.Address, _caps []*big.Int, _firstOwner common.Address, _minCandidateCap *big.Int, _minVoterCap *big.Int, _maxValidatorNumber *big.Int, _candidateWithdrawDelay *big.Int, _voterWithdrawDelay *big.Int) (common.Address, *types.Transaction, *XDCValidator, error) { @@ -597,6 +436,32 @@ func (_XDCValidator *XDCValidatorCallerSession) GetOwnerCount() (*big.Int, error return _XDCValidator.Contract.GetOwnerCount(&_XDCValidator.CallOpts) } +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetOwnerToCandidateLength(opts *bind.CallOpts, _address common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getOwnerToCandidateLength", _address) + return *ret0, err +} + +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) +} + +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) +} + // GetVoterCap is a free data retrieval call binding the contract method 0x302b6872. // // Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256) @@ -727,6 +592,32 @@ func (_XDCValidator *XDCValidatorCallerSession) HasVotedInvalid(arg0 common.Addr return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) } +// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. +// +// Solidity: function invalidCandidate( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) InvalidCandidate(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "invalidCandidate", arg0) + return *ret0, err +} + +// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. +// +// Solidity: function invalidCandidate( address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) InvalidCandidate(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidCandidate(&_XDCValidator.CallOpts, arg0) +} + +// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. +// +// Solidity: function invalidCandidate( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) InvalidCandidate(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidCandidate(&_XDCValidator.CallOpts, arg0) +} + // InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. // // Solidity: function invalidKYCCount( address) constant returns(uint256) @@ -753,30 +644,56 @@ func (_XDCValidator *XDCValidatorCallerSession) InvalidKYCCount(arg0 common.Addr return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0) } +// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. +// +// Solidity: function invalidOwner( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) InvalidOwner(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "invalidOwner", arg0) + return *ret0, err +} + +// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. +// +// Solidity: function invalidOwner( address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) InvalidOwner(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidOwner(&_XDCValidator.CallOpts, arg0) +} + +// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. +// +// Solidity: function invalidOwner( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) InvalidOwner(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidOwner(&_XDCValidator.CallOpts, arg0) +} + // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _invalidCandidate common.Address) (*big.Int, error) { +// Solidity: function invalidPercent(_owner address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _owner common.Address) (*big.Int, error) { var ( ret0 = new(*big.Int) ) out := ret0 - err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _invalidCandidate) + err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _owner) return *ret0, err } // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) -func (_XDCValidator *XDCValidatorSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { - return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) +// Solidity: function invalidPercent(_owner address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) InvalidPercent(_owner common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _owner) } // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { - return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) +// Solidity: function invalidPercent(_owner address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_owner common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _owner) } // IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. @@ -805,6 +722,36 @@ func (_XDCValidator *XDCValidatorCallerSession) IsCandidate(_candidate common.Ad return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate) } +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(owner address) constant returns(bool, uint256) +func (_XDCValidator *XDCValidatorCaller) IsOwner(opts *bind.CallOpts, owner common.Address) (bool, *big.Int, error) { + var ( + ret0 = new(bool) + ret1 = new(*big.Int) + ) + out := &[]interface{}{ + ret0, + ret1, + } + err := _XDCValidator.contract.Call(opts, out, "isOwner", owner) + return *ret0, *ret1, err +} + +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(owner address) constant returns(bool, uint256) +func (_XDCValidator *XDCValidatorSession) IsOwner(owner common.Address) (bool, *big.Int, error) { + return _XDCValidator.Contract.IsOwner(&_XDCValidator.CallOpts, owner) +} + +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(owner address) constant returns(bool, uint256) +func (_XDCValidator *XDCValidatorCallerSession) IsOwner(owner common.Address) (bool, *big.Int, error) { + return _XDCValidator.Contract.IsOwner(&_XDCValidator.CallOpts, owner) +} + // MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. // // Solidity: function maxValidatorNumber() constant returns(uint256) @@ -961,6 +908,82 @@ func (_XDCValidator *XDCValidatorCallerSession) Owners(arg0 *big.Int) (common.Ad return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0) } +// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. +// +// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) +func (_XDCValidator *XDCValidatorCaller) PendingKYC(opts *bind.CallOpts, arg0 common.Address) (struct { + BlockNumber *big.Int + KycHash string +}, error) { + ret := new(struct { + BlockNumber *big.Int + KycHash string + }) + out := ret + err := _XDCValidator.contract.Call(opts, out, "pendingKYC", arg0) + return *ret, err +} + +// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. +// +// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) +func (_XDCValidator *XDCValidatorSession) PendingKYC(arg0 common.Address) (struct { + BlockNumber *big.Int + KycHash string +}, error) { + return _XDCValidator.Contract.PendingKYC(&_XDCValidator.CallOpts, arg0) +} + +// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. +// +// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) +func (_XDCValidator *XDCValidatorCallerSession) PendingKYC(arg0 common.Address) (struct { + BlockNumber *big.Int + KycHash string +}, error) { + return _XDCValidator.Contract.PendingKYC(&_XDCValidator.CallOpts, arg0) +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorCaller) ValidatorsState(opts *bind.CallOpts, arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + ret := new(struct { + Owner common.Address + IsCandidate bool + Cap *big.Int + }) + out := ret + err := _XDCValidator.contract.Call(opts, out, "validatorsState", arg0) + return *ret, err +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorSession) ValidatorsState(arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorCallerSession) ValidatorsState(arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) +} + // VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e. // // Solidity: function voterWithdrawDelay() constant returns(uint256) @@ -987,6 +1010,53 @@ func (_XDCValidator *XDCValidatorCallerSession) VoterWithdrawDelay() (*big.Int, return _XDCValidator.Contract.VoterWithdrawDelay(&_XDCValidator.CallOpts) } +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) Voters(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "voters", arg0, arg1) + return *ret0, err +} + +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) +} + +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) +} + +// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. +// +// Solidity: function claimKYC() returns() +func (_XDCValidator *XDCValidatorTransactor) ClaimKYC(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "claimKYC") +} + +// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. +// +// Solidity: function claimKYC() returns() +func (_XDCValidator *XDCValidatorSession) ClaimKYC() (*types.Transaction, error) { + return _XDCValidator.Contract.ClaimKYC(&_XDCValidator.TransactOpts) +} + +// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. +// +// Solidity: function claimKYC() returns() +func (_XDCValidator *XDCValidatorTransactorSession) ClaimKYC() (*types.Transaction, error) { + return _XDCValidator.Contract.ClaimKYC(&_XDCValidator.TransactOpts) +} + // Propose is a paid mutator transaction binding the contract method 0x01267951. // // Solidity: function propose(_candidate address) returns() @@ -1008,6 +1078,48 @@ func (_XDCValidator *XDCValidatorTransactorSession) Propose(_candidate common.Ad return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate) } +// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. +// +// Solidity: function removeCandidatesZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactor) RemoveCandidatesZeroAddresses(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "removeCandidatesZeroAddresses") +} + +// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. +// +// Solidity: function removeCandidatesZeroAddresses() returns() +func (_XDCValidator *XDCValidatorSession) RemoveCandidatesZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveCandidatesZeroAddresses(&_XDCValidator.TransactOpts) +} + +// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. +// +// Solidity: function removeCandidatesZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactorSession) RemoveCandidatesZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveCandidatesZeroAddresses(&_XDCValidator.TransactOpts) +} + +// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. +// +// Solidity: function removeOwnersZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactor) RemoveOwnersZeroAddresses(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "removeOwnersZeroAddresses") +} + +// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. +// +// Solidity: function removeOwnersZeroAddresses() returns() +func (_XDCValidator *XDCValidatorSession) RemoveOwnersZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveOwnersZeroAddresses(&_XDCValidator.TransactOpts) +} + +// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. +// +// Solidity: function removeOwnersZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactorSession) RemoveOwnersZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveOwnersZeroAddresses(&_XDCValidator.TransactOpts) +} + // Resign is a paid mutator transaction binding the contract method 0xae6e43f5. // // Solidity: function resign(_candidate address) returns() @@ -1094,23 +1206,23 @@ func (_XDCValidator *XDCValidatorTransactorSession) Vote(_candidate common.Addre // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() -func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _invalidCandidate common.Address) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _invalidCandidate) +// Solidity: function voteInvalidKYC(_owner address) returns() +func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _owner common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _owner) } // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() -func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { - return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) +// Solidity: function voteInvalidKYC(_owner address) returns() +func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_owner common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _owner) } // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() -func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { - return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) +// Solidity: function voteInvalidKYC(_owner address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_owner common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _owner) } // Withdraw is a paid mutator transaction binding the contract method 0x441a3e70. diff --git a/contracts/validator/src/README.md b/contracts/validator/src/README.md index 3874dd7e51f5..984e1cad6165 100644 --- a/contracts/validator/src/README.md +++ b/contracts/validator/src/README.md @@ -40,7 +40,7 @@ node scripts/deployToGenesis.js If you don't have `abigen`, compile it. It's in `cmd/abigen/main.go` in XDC main repo (or Geth repo). -3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDC-Subnet"` +3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDPoSChain"` ## Deploy contract to node any block diff --git a/contracts/validator/src/abi b/contracts/validator/src/abi index ecd07cc0e4bc..a41ab3ed2fa7 100644 --- a/contracts/validator/src/abi +++ b/contracts/validator/src/abi @@ -64,6 +64,29 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [], + "name": "removeCandidatesZeroAddresses", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "ownerCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [ @@ -112,16 +135,16 @@ { "name": "", "type": "address" - }, - { - "name": "", - "type": "uint256" } ], - "name": "kycString", + "name": "pendingKYC", "outputs": [ { - "name": "", + "name": "blockNumber", + "type": "uint256" + }, + { + "name": "kycHash", "type": "string" } ], @@ -171,6 +194,29 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "owner", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + }, + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -291,34 +337,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": true, - "inputs": [], - "name": "minCandidateNum", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getGrandMasters", - "outputs": [ - { - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [ @@ -342,26 +360,7 @@ "constant": true, "inputs": [ { - "name": "", - "type": "address" - } - ], - "name": "grandMasterMap", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_invalidCandidate", + "name": "_owner", "type": "address" } ], @@ -388,11 +387,11 @@ "type": "uint256" } ], - "name": "voters", + "name": "KYCString", "outputs": [ { "name": "", - "type": "address" + "type": "string" } ], "payable": false, @@ -402,12 +401,16 @@ { "constant": true, "inputs": [ + { + "name": "", + "type": "address" + }, { "name": "", "type": "uint256" } ], - "name": "grandMasters", + "name": "voters", "outputs": [ { "name": "", @@ -437,6 +440,15 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [], + "name": "removeOwnersZeroAddresses", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": false, "inputs": [ @@ -470,6 +482,15 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [], + "name": "claimKYC", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": true, "inputs": [], @@ -512,6 +533,25 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidCandidate", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [ @@ -611,6 +651,25 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -629,7 +688,7 @@ "constant": false, "inputs": [ { - "name": "_invalidCandidate", + "name": "_owner", "type": "address" } ], @@ -700,14 +759,6 @@ { "name": "_voterWithdrawDelay", "type": "uint256" - }, - { - "name": "_grandMasters", - "type": "address[]" - }, - { - "name": "_minCandidateNum", - "type": "uint256" } ], "payable": false, diff --git a/contracts/validator/src/bytecode b/contracts/validator/src/bytecode index 814d09efc0be..78b97c66212f 100644 --- a/contracts/validator/src/bytecode +++ b/contracts/validator/src/bytecode @@ -1 +1 @@ -0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029 \ No newline at end of file +0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058208aa2ea0f8e87fc68507f275418a407fa4ee47253861d6f224fda4db207eaf2110029 \ No newline at end of file From a444fb045329356a23bd6c46351cded4f080774b Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:50:45 +0400 Subject: [PATCH 129/144] Revert "update" This reverts commit 307e99559658a75a45f3a4f4aa0655a3c902edc0. --- contracts/validator/contract/validator.go | 476 +++++++++------------- contracts/validator/src/README.md | 2 +- contracts/validator/src/abi | 183 +++------ contracts/validator/src/bytecode | 2 +- 4 files changed, 250 insertions(+), 413 deletions(-) diff --git a/contracts/validator/contract/validator.go b/contracts/validator/contract/validator.go index e8a6901eb08d..f010a0367858 100644 --- a/contracts/validator/contract/validator.go +++ b/contracts/validator/contract/validator.go @@ -7,19 +7,180 @@ import ( "math/big" "strings" + ethereum "github.com/XinFinOrg/XDPoSChain" "github.com/XinFinOrg/XDPoSChain/accounts/abi" "github.com/XinFinOrg/XDPoSChain/accounts/abi/bind" "github.com/XinFinOrg/XDPoSChain/common" "github.com/XinFinOrg/XDPoSChain/core/types" "github.com/XinFinOrg/XDPoSChain/event" - ethereum "github.com/XinFinOrg/XDPoSChain" ) +// SafeMathABI is the input ABI used to generate the binding from. +const SafeMathABI = "[]" + +// SafeMathBin is the compiled bytecode used for deploying new contracts. +const SafeMathBin = `0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146060604052600080fd00a165627a7a72305820b9407d48ebc7efee5c9f08b3b3a957df2939281f5913225e8c1291f069b900490029` + +// DeploySafeMath deploys a new Ethereum contract, binding an instance of SafeMath to it. +func DeploySafeMath(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SafeMath, error) { + parsed, err := abi.JSON(strings.NewReader(SafeMathABI)) + if err != nil { + return common.Address{}, nil, nil, err + } + address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(SafeMathBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil +} + +// SafeMath is an auto generated Go binding around an Ethereum contract. +type SafeMath struct { + SafeMathCaller // Read-only binding to the contract + SafeMathTransactor // Write-only binding to the contract + SafeMathFilterer // Log filterer for contract events +} + +// SafeMathCaller is an auto generated read-only Go binding around an Ethereum contract. +type SafeMathCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeMathTransactor is an auto generated write-only Go binding around an Ethereum contract. +type SafeMathTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeMathFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type SafeMathFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SafeMathSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type SafeMathSession struct { + Contract *SafeMath // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SafeMathCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type SafeMathCallerSession struct { + Contract *SafeMathCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// SafeMathTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type SafeMathTransactorSession struct { + Contract *SafeMathTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SafeMathRaw is an auto generated low-level Go binding around an Ethereum contract. +type SafeMathRaw struct { + Contract *SafeMath // Generic contract binding to access the raw methods on +} + +// SafeMathCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type SafeMathCallerRaw struct { + Contract *SafeMathCaller // Generic read-only contract binding to access the raw methods on +} + +// SafeMathTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type SafeMathTransactorRaw struct { + Contract *SafeMathTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewSafeMath creates a new instance of SafeMath, bound to a specific deployed contract. +func NewSafeMath(address common.Address, backend bind.ContractBackend) (*SafeMath, error) { + contract, err := bindSafeMath(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil +} + +// NewSafeMathCaller creates a new read-only instance of SafeMath, bound to a specific deployed contract. +func NewSafeMathCaller(address common.Address, caller bind.ContractCaller) (*SafeMathCaller, error) { + contract, err := bindSafeMath(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &SafeMathCaller{contract: contract}, nil +} + +// NewSafeMathTransactor creates a new write-only instance of SafeMath, bound to a specific deployed contract. +func NewSafeMathTransactor(address common.Address, transactor bind.ContractTransactor) (*SafeMathTransactor, error) { + contract, err := bindSafeMath(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &SafeMathTransactor{contract: contract}, nil +} + +// NewSafeMathFilterer creates a new log filterer instance of SafeMath, bound to a specific deployed contract. +func NewSafeMathFilterer(address common.Address, filterer bind.ContractFilterer) (*SafeMathFilterer, error) { + contract, err := bindSafeMath(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &SafeMathFilterer{contract: contract}, nil +} + +// bindSafeMath binds a generic wrapper to an already deployed contract. +func bindSafeMath(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(SafeMathABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_SafeMath *SafeMathRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _SafeMath.Contract.SafeMathCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_SafeMath *SafeMathRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SafeMath.Contract.SafeMathTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_SafeMath *SafeMathRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _SafeMath.Contract.SafeMathTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_SafeMath *SafeMathCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _SafeMath.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_SafeMath *SafeMathTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SafeMath.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_SafeMath *SafeMathTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _SafeMath.Contract.contract.Transact(opts, method, params...) +} + // XDCValidatorABI is the input ABI used to generate the binding from. -const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeCandidatesZeroAddresses\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingKYC\",\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"name\":\"kycHash\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"validatorsState\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"isCandidate\",\"type\":\"bool\"},{\"name\":\"cap\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"KYCString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"voters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getOwnerToCandidateLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeOwnersZeroAddresses\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"claimKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" +const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"KYCString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" // XDCValidatorBin is the compiled bytecode used for deploying new contracts. -const XDCValidatorBin = `0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058208aa2ea0f8e87fc68507f275418a407fa4ee47253861d6f224fda4db207eaf2110029` +const XDCValidatorBin = `606060405260006009556000600a5534156200001a57600080fd5b60405162003dcc38038062003dcc83398101604052808051820191906020018051820191906020018051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091905050600085600b8190555084600c8190555083600d8190555082600e8190555081600f81905550885160098190555060078054806001018281620000bd9190620004f1565b9160005260206000209001600089909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a60008154809291906001019190505550600090505b8851811015620004e25760088054806001018281620001439190620004f1565b916000526020600020900160008b848151811015156200015f57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052808873ffffffffffffffffffffffffffffffffffffffff1681526020016001151581526020018983815181101515620001ea57fe5b90602001906020020151815250600160008b848151811015156200020a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050600260008a83815181101515620002d557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816200032d9190620004f1565b9160005260206000209001600089909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281620003cf9190620004f1565b916000526020600020900160008b84815181101515620003eb57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600b54600160008b848151811015156200044c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808060010191505062000123565b50505050505050505062000548565b8154818355818115116200051b578183600052602060002091820191016200051a919062000520565b5b505050565b6200054591905b808211156200054157600081600090555060010162000527565b5090565b90565b61387480620005586000396000f300606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063012679511461019b578063025e7c27146101c957806302aa9be21461022c57806306a49fce1461026e5780630db02622146102d85780630e3e4fb81461030157806315febd68146103715780632a3640b1146103a85780632d15cc041461042a5780632f9c4bba146104b8578063302b687214610522578063326586521461058e5780633477ee2e14610640578063441a3e70146106a357806358e7525f146106cf5780635b860d271461071c5780635b9cd8cc146107695780636dd7d8ea1461082457806372e44a3814610852578063a9a981a31461089f578063a9ff959e146108c8578063ae6e43f5146108f1578063b642facd1461092a578063c45607df146109a3578063d09f1ab4146109f0578063d161c76714610a19578063d51b9e9314610a42578063d55b7dff14610a93578063ef18374a14610abc578063f2ee3c7d14610ae5578063f5c9512514610b1e578063f8ac9dd514610b4c575b600080fd5b6101c7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b75565b005b34156101d457600080fd5b6101ea60048080359060200190919050506111fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023757600080fd5b61026c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123b565b005b341561027957600080fd5b610281611796565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102c45780820151818401526020810190506102a9565b505050509050019250505060405180910390f35b34156102e357600080fd5b6102eb61182a565b6040518082815260200191505060405180910390f35b341561030c57600080fd5b610357600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611830565b604051808215151515815260200191505060405180910390f35b341561037c57600080fd5b610392600480803590602001909190505061185f565b6040518082815260200191505060405180910390f35b34156103b357600080fd5b6103e8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506118bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043557600080fd5b610461600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611909565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a4578082015181840152602081019050610489565b505050509050019250505060405180910390f35b34156104c357600080fd5b6104cb6119dc565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561050e5780820151818401526020810190506104f3565b505050509050019250505060405180910390f35b341561052d57600080fd5b610578600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a79565b6040518082815260200191505060405180910390f35b341561059957600080fd5b6105c5600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b03565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106055780820151818401526020810190506105ea565b50505050905090810190601f1680156106325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064b57600080fd5b6106616004808035906020019091905050611da2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106ae57600080fd5b6106cd6004808035906020019091908035906020019091905050611de1565b005b34156106da57600080fd5b610706600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061208d565b6040518082815260200191505060405180910390f35b341561072757600080fd5b610753600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120d9565b6040518082815260200191505060405180910390f35b341561077457600080fd5b6107a9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506121a1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e95780820151818401526020810190506107ce565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610850600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061226a565b005b341561085d57600080fd5b610889600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612653565b6040518082815260200191505060405180910390f35b34156108aa57600080fd5b6108b261266b565b6040518082815260200191505060405180910390f35b34156108d357600080fd5b6108db612671565b6040518082815260200191505060405180910390f35b34156108fc57600080fd5b610928600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612677565b005b341561093557600080fd5b610961600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ae57600080fd5b6109da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ca2565b6040518082815260200191505060405180910390f35b34156109fb57600080fd5b610a03612cee565b6040518082815260200191505060405180910390f35b3415610a2457600080fd5b610a2c612cf4565b6040518082815260200191505060405180910390f35b3415610a4d57600080fd5b610a79600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612cfa565b604051808215151515815260200191505060405180910390f35b3415610a9e57600080fd5b610aa6612d53565b6040518082815260200191505060405180910390f35b3415610ac757600080fd5b610acf612d59565b6040518082815260200191505060405180910390f35b3415610af057600080fd5b610b1c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d63565b005b3415610b2957600080fd5b610b4a600480803590602001908201803590602001919091929050506134f1565b005b3415610b5757600080fd5b610b5f6135f0565b6040518082815260200191505060405180910390f35b6000600b543410151515610b8857600080fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050141580610c1c57506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050115b1515610c2757600080fd5b81600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151515610c8457600080fd5b610cd934600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b915060088054806001018281610cef919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200183815250600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050610eb834600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5160016009546135f690919063ffffffff16565b6009819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014156110185760078054806001018281610fb6919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a600081548092919060010191905055505b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611069919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611109919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1338434604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60078181548110151561120b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000828280600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156112cd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561140657600b546113f882600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b1015151561140557600080fd5b5b61145b84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061153384600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cb43600f546135f690919063ffffffff16565b9250611632846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180548060010182816116db9190613659565b9160005260206000209001600085909190915055507faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2338686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050505050565b61179e613685565b600880548060200260200160405190810160405280929190818152602001828054801561182057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117d6575b5050505050905090565b600a5481565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000838152602001908152602001600020549050919050565b6006602052816000526040600020818154811015156118d657fe5b90600052602060002090016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611911613685565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119d057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611986575b50505050509050919050565b6119e4613699565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015611a6f57602002820191906000526020600020905b815481526020019060010190808311611a5b575b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b0b6136ad565b611b1482612cfa565b15611c655760036000611b2684612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160036000611b6f86612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611bba57fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c595780601f10611c2e57610100808354040283529160200191611c59565b820191906000526020600020905b815481529060010190602001808311611c3c57829003601f168201915b50505050509050611d9d565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611cf657fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d955780601f10611d6a57610100808354040283529160200191611d95565b820191906000526020600020905b815481529060010190602001808311611d7857829003601f168201915b505050505090505b919050565b600881815481101515611db157fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282600082111515611df457600080fd5b814310151515611e0357600080fd5b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600084815260200190815260200160002054111515611e6457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182815481101515611eb357fe5b906000526020600020900154141515611ecb57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008681526020019081526020016000205492506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020600090556000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010184815481101515611fc457fe5b9060005260206000209001600090553373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561201357600080fd5b7ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568338685604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60008082600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561213857600080fd5b61214184612c36565b915061214b612d59565b6064600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561219757fe5b0492505050919050565b6003602052816000526040600020818154811015156121bc57fe5b9060005260206000209001600091509150508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122625780601f1061223757610100808354040283529160200191612262565b820191906000526020600020905b81548152906001019060200180831161224557829003601f168201915b505050505081565b600c54341015151561227b57600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff1615156122d757600080fd5b61232c34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561249b57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480600101828161244b919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b61252d34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc338334604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b60046020528060005260406000206000915090505481565b60095481565b600f5481565b6000806000833373ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561271957600080fd5b84600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561277557600080fd5b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a81548160ff0219169083151502179055506127e6600160095461361490919063ffffffff16565b600981905550600094505b6008805490508510156128bb578573ffffffffffffffffffffffffffffffffffffffff1660088681548110151561282457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128ae5760088581548110151561287b57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556128bb565b84806001019550506127f1565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054935061299284600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a7243600e546135f690919063ffffffff16565b9250612ad9846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806001018281612b829190613659565b9160005260206000209001600085909190915055507f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d33387604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600d5481565b600e5481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff169050919050565b600b5481565b6000600a54905090565b600080612d6e613685565b600080600033600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612dcf57600080fd5b87600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612e2b57600080fd5b612e3433612c36565b9750612e3f89612c36565b9650600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612ed757600080fd5b6001600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550604b612fc4612d59565b6064600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561301057fe5b041015156134e65760016008805490500360405180591061302e5750595b9080825280602002602001820160405250955060009450600093505b600880549050841015613357578673ffffffffffffffffffffffffffffffffffffffff166130b160088681548110151561308057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c36565b73ffffffffffffffffffffffffffffffffffffffff16141561334a576130e3600160095461361490919063ffffffff16565b6009819055506008848154811015156130f857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868680600101975081518110151561313857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060088481548110151561318357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160006008868154811015156131c457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff021916905560018201600090555050600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006132bb91906136c1565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061330691906136e2565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555b838060010194505061304a565b600092505b600780549050831015613439578673ffffffffffffffffffffffffffffffffffffffff1660078481548110151561338f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561342c576007838154811015156133e657fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a6000815480929190600190039190505550613439565b828060010193505061335c565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156134d15780820151818401526020810190506134b6565b50505050905001935050505060405180910390a15b505050505050505050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816135429190613703565b91600052602060002090016000848490919290919250919061356592919061372f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a15050565b600c5481565b600080828401905083811015151561360a57fe5b8091505092915050565b600082821115151561362257fe5b818303905092915050565b8154818355818115116136545781836000526020600020918201910161365391906137af565b5b505050565b8154818355818115116136805781836000526020600020918201910161367f91906137af565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906136df91906137d4565b50565b508054600082559060005260206000209081019061370091906137af565b50565b81548183558181151161372a5781836000526020600020918201910161372991906137d4565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061377057803560ff191683800117855561379e565b8280016001018555821561379e579182015b8281111561379d578235825591602001919060010190613782565b5b5090506137ab91906137af565b5090565b6137d191905b808211156137cd5760008160009055506001016137b5565b5090565b90565b6137fd91905b808211156137f957600081816137f09190613800565b506001016137da565b5090565b90565b50805460018160011615610100020316600290046000825580601f106138265750613845565b601f01602090049060005260206000209081019061384491906137af565b5b505600a165627a7a72305820f5bbb127b52ce86c873faef85cff176563476a5e49a3d88eaa9a06a8f432c9080029` // DeployXDCValidator deploys a new Ethereum contract, binding an instance of XDCValidator to it. func DeployXDCValidator(auth *bind.TransactOpts, backend bind.ContractBackend, _candidates []common.Address, _caps []*big.Int, _firstOwner common.Address, _minCandidateCap *big.Int, _minVoterCap *big.Int, _maxValidatorNumber *big.Int, _candidateWithdrawDelay *big.Int, _voterWithdrawDelay *big.Int) (common.Address, *types.Transaction, *XDCValidator, error) { @@ -436,32 +597,6 @@ func (_XDCValidator *XDCValidatorCallerSession) GetOwnerCount() (*big.Int, error return _XDCValidator.Contract.GetOwnerCount(&_XDCValidator.CallOpts) } -// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. -// -// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCaller) GetOwnerToCandidateLength(opts *bind.CallOpts, _address common.Address) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "getOwnerToCandidateLength", _address) - return *ret0, err -} - -// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. -// -// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) -func (_XDCValidator *XDCValidatorSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { - return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) -} - -// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. -// -// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCallerSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { - return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) -} - // GetVoterCap is a free data retrieval call binding the contract method 0x302b6872. // // Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256) @@ -592,32 +727,6 @@ func (_XDCValidator *XDCValidatorCallerSession) HasVotedInvalid(arg0 common.Addr return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) } -// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. -// -// Solidity: function invalidCandidate( address) constant returns(bool) -func (_XDCValidator *XDCValidatorCaller) InvalidCandidate(opts *bind.CallOpts, arg0 common.Address) (bool, error) { - var ( - ret0 = new(bool) - ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "invalidCandidate", arg0) - return *ret0, err -} - -// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. -// -// Solidity: function invalidCandidate( address) constant returns(bool) -func (_XDCValidator *XDCValidatorSession) InvalidCandidate(arg0 common.Address) (bool, error) { - return _XDCValidator.Contract.InvalidCandidate(&_XDCValidator.CallOpts, arg0) -} - -// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. -// -// Solidity: function invalidCandidate( address) constant returns(bool) -func (_XDCValidator *XDCValidatorCallerSession) InvalidCandidate(arg0 common.Address) (bool, error) { - return _XDCValidator.Contract.InvalidCandidate(&_XDCValidator.CallOpts, arg0) -} - // InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. // // Solidity: function invalidKYCCount( address) constant returns(uint256) @@ -644,56 +753,30 @@ func (_XDCValidator *XDCValidatorCallerSession) InvalidKYCCount(arg0 common.Addr return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0) } -// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. -// -// Solidity: function invalidOwner( address) constant returns(bool) -func (_XDCValidator *XDCValidatorCaller) InvalidOwner(opts *bind.CallOpts, arg0 common.Address) (bool, error) { - var ( - ret0 = new(bool) - ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "invalidOwner", arg0) - return *ret0, err -} - -// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. -// -// Solidity: function invalidOwner( address) constant returns(bool) -func (_XDCValidator *XDCValidatorSession) InvalidOwner(arg0 common.Address) (bool, error) { - return _XDCValidator.Contract.InvalidOwner(&_XDCValidator.CallOpts, arg0) -} - -// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. -// -// Solidity: function invalidOwner( address) constant returns(bool) -func (_XDCValidator *XDCValidatorCallerSession) InvalidOwner(arg0 common.Address) (bool, error) { - return _XDCValidator.Contract.InvalidOwner(&_XDCValidator.CallOpts, arg0) -} - // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_owner address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _owner common.Address) (*big.Int, error) { +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _invalidCandidate common.Address) (*big.Int, error) { var ( ret0 = new(*big.Int) ) out := ret0 - err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _owner) + err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _invalidCandidate) return *ret0, err } // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_owner address) constant returns(uint256) -func (_XDCValidator *XDCValidatorSession) InvalidPercent(_owner common.Address) (*big.Int, error) { - return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _owner) +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) } // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_owner address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_owner common.Address) (*big.Int, error) { - return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _owner) +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) } // IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. @@ -722,36 +805,6 @@ func (_XDCValidator *XDCValidatorCallerSession) IsCandidate(_candidate common.Ad return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate) } -// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. -// -// Solidity: function isOwner(owner address) constant returns(bool, uint256) -func (_XDCValidator *XDCValidatorCaller) IsOwner(opts *bind.CallOpts, owner common.Address) (bool, *big.Int, error) { - var ( - ret0 = new(bool) - ret1 = new(*big.Int) - ) - out := &[]interface{}{ - ret0, - ret1, - } - err := _XDCValidator.contract.Call(opts, out, "isOwner", owner) - return *ret0, *ret1, err -} - -// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. -// -// Solidity: function isOwner(owner address) constant returns(bool, uint256) -func (_XDCValidator *XDCValidatorSession) IsOwner(owner common.Address) (bool, *big.Int, error) { - return _XDCValidator.Contract.IsOwner(&_XDCValidator.CallOpts, owner) -} - -// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. -// -// Solidity: function isOwner(owner address) constant returns(bool, uint256) -func (_XDCValidator *XDCValidatorCallerSession) IsOwner(owner common.Address) (bool, *big.Int, error) { - return _XDCValidator.Contract.IsOwner(&_XDCValidator.CallOpts, owner) -} - // MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. // // Solidity: function maxValidatorNumber() constant returns(uint256) @@ -908,82 +961,6 @@ func (_XDCValidator *XDCValidatorCallerSession) Owners(arg0 *big.Int) (common.Ad return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0) } -// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. -// -// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) -func (_XDCValidator *XDCValidatorCaller) PendingKYC(opts *bind.CallOpts, arg0 common.Address) (struct { - BlockNumber *big.Int - KycHash string -}, error) { - ret := new(struct { - BlockNumber *big.Int - KycHash string - }) - out := ret - err := _XDCValidator.contract.Call(opts, out, "pendingKYC", arg0) - return *ret, err -} - -// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. -// -// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) -func (_XDCValidator *XDCValidatorSession) PendingKYC(arg0 common.Address) (struct { - BlockNumber *big.Int - KycHash string -}, error) { - return _XDCValidator.Contract.PendingKYC(&_XDCValidator.CallOpts, arg0) -} - -// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. -// -// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) -func (_XDCValidator *XDCValidatorCallerSession) PendingKYC(arg0 common.Address) (struct { - BlockNumber *big.Int - KycHash string -}, error) { - return _XDCValidator.Contract.PendingKYC(&_XDCValidator.CallOpts, arg0) -} - -// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. -// -// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) -func (_XDCValidator *XDCValidatorCaller) ValidatorsState(opts *bind.CallOpts, arg0 common.Address) (struct { - Owner common.Address - IsCandidate bool - Cap *big.Int -}, error) { - ret := new(struct { - Owner common.Address - IsCandidate bool - Cap *big.Int - }) - out := ret - err := _XDCValidator.contract.Call(opts, out, "validatorsState", arg0) - return *ret, err -} - -// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. -// -// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) -func (_XDCValidator *XDCValidatorSession) ValidatorsState(arg0 common.Address) (struct { - Owner common.Address - IsCandidate bool - Cap *big.Int -}, error) { - return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) -} - -// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. -// -// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) -func (_XDCValidator *XDCValidatorCallerSession) ValidatorsState(arg0 common.Address) (struct { - Owner common.Address - IsCandidate bool - Cap *big.Int -}, error) { - return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) -} - // VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e. // // Solidity: function voterWithdrawDelay() constant returns(uint256) @@ -1010,53 +987,6 @@ func (_XDCValidator *XDCValidatorCallerSession) VoterWithdrawDelay() (*big.Int, return _XDCValidator.Contract.VoterWithdrawDelay(&_XDCValidator.CallOpts) } -// Voters is a free data retrieval call binding the contract method 0x5c134d66. -// -// Solidity: function voters( address, uint256) constant returns(address) -func (_XDCValidator *XDCValidatorCaller) Voters(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "voters", arg0, arg1) - return *ret0, err -} - -// Voters is a free data retrieval call binding the contract method 0x5c134d66. -// -// Solidity: function voters( address, uint256) constant returns(address) -func (_XDCValidator *XDCValidatorSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { - return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) -} - -// Voters is a free data retrieval call binding the contract method 0x5c134d66. -// -// Solidity: function voters( address, uint256) constant returns(address) -func (_XDCValidator *XDCValidatorCallerSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { - return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) -} - -// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. -// -// Solidity: function claimKYC() returns() -func (_XDCValidator *XDCValidatorTransactor) ClaimKYC(opts *bind.TransactOpts) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "claimKYC") -} - -// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. -// -// Solidity: function claimKYC() returns() -func (_XDCValidator *XDCValidatorSession) ClaimKYC() (*types.Transaction, error) { - return _XDCValidator.Contract.ClaimKYC(&_XDCValidator.TransactOpts) -} - -// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. -// -// Solidity: function claimKYC() returns() -func (_XDCValidator *XDCValidatorTransactorSession) ClaimKYC() (*types.Transaction, error) { - return _XDCValidator.Contract.ClaimKYC(&_XDCValidator.TransactOpts) -} - // Propose is a paid mutator transaction binding the contract method 0x01267951. // // Solidity: function propose(_candidate address) returns() @@ -1078,48 +1008,6 @@ func (_XDCValidator *XDCValidatorTransactorSession) Propose(_candidate common.Ad return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate) } -// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. -// -// Solidity: function removeCandidatesZeroAddresses() returns() -func (_XDCValidator *XDCValidatorTransactor) RemoveCandidatesZeroAddresses(opts *bind.TransactOpts) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "removeCandidatesZeroAddresses") -} - -// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. -// -// Solidity: function removeCandidatesZeroAddresses() returns() -func (_XDCValidator *XDCValidatorSession) RemoveCandidatesZeroAddresses() (*types.Transaction, error) { - return _XDCValidator.Contract.RemoveCandidatesZeroAddresses(&_XDCValidator.TransactOpts) -} - -// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. -// -// Solidity: function removeCandidatesZeroAddresses() returns() -func (_XDCValidator *XDCValidatorTransactorSession) RemoveCandidatesZeroAddresses() (*types.Transaction, error) { - return _XDCValidator.Contract.RemoveCandidatesZeroAddresses(&_XDCValidator.TransactOpts) -} - -// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. -// -// Solidity: function removeOwnersZeroAddresses() returns() -func (_XDCValidator *XDCValidatorTransactor) RemoveOwnersZeroAddresses(opts *bind.TransactOpts) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "removeOwnersZeroAddresses") -} - -// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. -// -// Solidity: function removeOwnersZeroAddresses() returns() -func (_XDCValidator *XDCValidatorSession) RemoveOwnersZeroAddresses() (*types.Transaction, error) { - return _XDCValidator.Contract.RemoveOwnersZeroAddresses(&_XDCValidator.TransactOpts) -} - -// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. -// -// Solidity: function removeOwnersZeroAddresses() returns() -func (_XDCValidator *XDCValidatorTransactorSession) RemoveOwnersZeroAddresses() (*types.Transaction, error) { - return _XDCValidator.Contract.RemoveOwnersZeroAddresses(&_XDCValidator.TransactOpts) -} - // Resign is a paid mutator transaction binding the contract method 0xae6e43f5. // // Solidity: function resign(_candidate address) returns() @@ -1206,23 +1094,23 @@ func (_XDCValidator *XDCValidatorTransactorSession) Vote(_candidate common.Addre // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_owner address) returns() -func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _owner common.Address) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _owner) +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _invalidCandidate) } // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_owner address) returns() -func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_owner common.Address) (*types.Transaction, error) { - return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _owner) +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) } // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_owner address) returns() -func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_owner common.Address) (*types.Transaction, error) { - return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _owner) +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) } // Withdraw is a paid mutator transaction binding the contract method 0x441a3e70. diff --git a/contracts/validator/src/README.md b/contracts/validator/src/README.md index 984e1cad6165..3874dd7e51f5 100644 --- a/contracts/validator/src/README.md +++ b/contracts/validator/src/README.md @@ -40,7 +40,7 @@ node scripts/deployToGenesis.js If you don't have `abigen`, compile it. It's in `cmd/abigen/main.go` in XDC main repo (or Geth repo). -3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDPoSChain"` +3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDC-Subnet"` ## Deploy contract to node any block diff --git a/contracts/validator/src/abi b/contracts/validator/src/abi index a41ab3ed2fa7..ecd07cc0e4bc 100644 --- a/contracts/validator/src/abi +++ b/contracts/validator/src/abi @@ -64,29 +64,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": false, - "inputs": [], - "name": "removeCandidatesZeroAddresses", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "ownerCount", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [ @@ -135,16 +112,16 @@ { "name": "", "type": "address" + }, + { + "name": "", + "type": "uint256" } ], - "name": "pendingKYC", + "name": "kycString", "outputs": [ { - "name": "blockNumber", - "type": "uint256" - }, - { - "name": "kycHash", + "name": "", "type": "string" } ], @@ -194,29 +171,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "name": "owner", - "type": "address" - } - ], - "name": "isOwner", - "outputs": [ - { - "name": "", - "type": "bool" - }, - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [], @@ -337,6 +291,34 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [], + "name": "minCandidateNum", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getGrandMasters", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [ @@ -360,7 +342,26 @@ "constant": true, "inputs": [ { - "name": "_owner", + "name": "", + "type": "address" + } + ], + "name": "grandMasterMap", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_invalidCandidate", "type": "address" } ], @@ -387,11 +388,11 @@ "type": "uint256" } ], - "name": "KYCString", + "name": "voters", "outputs": [ { "name": "", - "type": "string" + "type": "address" } ], "payable": false, @@ -401,16 +402,12 @@ { "constant": true, "inputs": [ - { - "name": "", - "type": "address" - }, { "name": "", "type": "uint256" } ], - "name": "voters", + "name": "grandMasters", "outputs": [ { "name": "", @@ -440,15 +437,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": false, - "inputs": [], - "name": "removeOwnersZeroAddresses", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": false, "inputs": [ @@ -482,15 +470,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": false, - "inputs": [], - "name": "claimKYC", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": true, "inputs": [], @@ -533,25 +512,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "name": "", - "type": "address" - } - ], - "name": "invalidCandidate", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [ @@ -651,25 +611,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": true, - "inputs": [ - { - "name": "", - "type": "address" - } - ], - "name": "invalidOwner", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [], @@ -688,7 +629,7 @@ "constant": false, "inputs": [ { - "name": "_owner", + "name": "_invalidCandidate", "type": "address" } ], @@ -759,6 +700,14 @@ { "name": "_voterWithdrawDelay", "type": "uint256" + }, + { + "name": "_grandMasters", + "type": "address[]" + }, + { + "name": "_minCandidateNum", + "type": "uint256" } ], "payable": false, diff --git a/contracts/validator/src/bytecode b/contracts/validator/src/bytecode index 78b97c66212f..814d09efc0be 100644 --- a/contracts/validator/src/bytecode +++ b/contracts/validator/src/bytecode @@ -1 +1 @@ -0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058208aa2ea0f8e87fc68507f275418a407fa4ee47253861d6f224fda4db207eaf2110029 \ No newline at end of file +0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029 \ No newline at end of file From 320377587e29681df9902487fc97db40c5e3a512 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:55:04 +0400 Subject: [PATCH 130/144] update to v2 --- .../{ => contract_v2}/src/.env.sample | 0 .../{ => contract_v2}/src/.gitignore | 0 .../{ => contract_v2}/src/.prettierignore | 0 .../{ => contract_v2}/src/.prettierrc | 0 .../{ => contract_v2}/src/.solhint.json | 0 .../{ => contract_v2}/src/.solhintignore | 0 .../validator/{ => contract_v2}/src/README.md | 4 +- contracts/validator/{ => contract_v2}/src/abi | 0 .../validator/{ => contract_v2}/src/bytecode | 0 .../src/contracts/XDCValidator.sol | 0 .../src/contracts/libraries/SafeMath.sol | 0 .../{ => contract_v2}/src/deployment.json | 0 .../{ => contract_v2}/src/hardhat.config.js | 0 .../validator/{ => contract_v2}/src/image.png | Bin .../{ => contract_v2}/src/package.json | 0 .../@ethersproject+address+5.7.0.patch | 0 .../@ethersproject+providers+5.7.2.patch | 0 .../src/scripts/deployToGenesis.js | 0 .../src/scripts/deployment.js | 0 .../src/test/xdcValidator.js | 0 contracts/validator/contract_v2/validator.go | 2009 +++++++++++++++++ 21 files changed, 2011 insertions(+), 2 deletions(-) rename contracts/validator/{ => contract_v2}/src/.env.sample (100%) rename contracts/validator/{ => contract_v2}/src/.gitignore (100%) rename contracts/validator/{ => contract_v2}/src/.prettierignore (100%) rename contracts/validator/{ => contract_v2}/src/.prettierrc (100%) rename contracts/validator/{ => contract_v2}/src/.solhint.json (100%) rename contracts/validator/{ => contract_v2}/src/.solhintignore (100%) rename contracts/validator/{ => contract_v2}/src/README.md (93%) rename contracts/validator/{ => contract_v2}/src/abi (100%) rename contracts/validator/{ => contract_v2}/src/bytecode (100%) rename contracts/validator/{ => contract_v2}/src/contracts/XDCValidator.sol (100%) rename contracts/validator/{ => contract_v2}/src/contracts/libraries/SafeMath.sol (100%) rename contracts/validator/{ => contract_v2}/src/deployment.json (100%) rename contracts/validator/{ => contract_v2}/src/hardhat.config.js (100%) rename contracts/validator/{ => contract_v2}/src/image.png (100%) rename contracts/validator/{ => contract_v2}/src/package.json (100%) rename contracts/validator/{ => contract_v2}/src/patches/@ethersproject+address+5.7.0.patch (100%) rename contracts/validator/{ => contract_v2}/src/patches/@ethersproject+providers+5.7.2.patch (100%) rename contracts/validator/{ => contract_v2}/src/scripts/deployToGenesis.js (100%) rename contracts/validator/{ => contract_v2}/src/scripts/deployment.js (100%) rename contracts/validator/{ => contract_v2}/src/test/xdcValidator.js (100%) create mode 100644 contracts/validator/contract_v2/validator.go diff --git a/contracts/validator/src/.env.sample b/contracts/validator/contract_v2/src/.env.sample similarity index 100% rename from contracts/validator/src/.env.sample rename to contracts/validator/contract_v2/src/.env.sample diff --git a/contracts/validator/src/.gitignore b/contracts/validator/contract_v2/src/.gitignore similarity index 100% rename from contracts/validator/src/.gitignore rename to contracts/validator/contract_v2/src/.gitignore diff --git a/contracts/validator/src/.prettierignore b/contracts/validator/contract_v2/src/.prettierignore similarity index 100% rename from contracts/validator/src/.prettierignore rename to contracts/validator/contract_v2/src/.prettierignore diff --git a/contracts/validator/src/.prettierrc b/contracts/validator/contract_v2/src/.prettierrc similarity index 100% rename from contracts/validator/src/.prettierrc rename to contracts/validator/contract_v2/src/.prettierrc diff --git a/contracts/validator/src/.solhint.json b/contracts/validator/contract_v2/src/.solhint.json similarity index 100% rename from contracts/validator/src/.solhint.json rename to contracts/validator/contract_v2/src/.solhint.json diff --git a/contracts/validator/src/.solhintignore b/contracts/validator/contract_v2/src/.solhintignore similarity index 100% rename from contracts/validator/src/.solhintignore rename to contracts/validator/contract_v2/src/.solhintignore diff --git a/contracts/validator/src/README.md b/contracts/validator/contract_v2/src/README.md similarity index 93% rename from contracts/validator/src/README.md rename to contracts/validator/contract_v2/src/README.md index 3874dd7e51f5..e4a96cf27de9 100644 --- a/contracts/validator/src/README.md +++ b/contracts/validator/contract_v2/src/README.md @@ -35,12 +35,12 @@ node scripts/deployToGenesis.js 2. run ```shell -./abigen --abi abi --bin bytecode --pkg contract --type XDCValidator --out ../contract/validator.go +./abigen --abi abi --bin bytecode --pkg contract --type XDCValidator --out ../validator.go ``` If you don't have `abigen`, compile it. It's in `cmd/abigen/main.go` in XDC main repo (or Geth repo). -3. Go `../contract/validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDC-Subnet"` +3. Go `../validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDPoSChain"` ## Deploy contract to node any block diff --git a/contracts/validator/src/abi b/contracts/validator/contract_v2/src/abi similarity index 100% rename from contracts/validator/src/abi rename to contracts/validator/contract_v2/src/abi diff --git a/contracts/validator/src/bytecode b/contracts/validator/contract_v2/src/bytecode similarity index 100% rename from contracts/validator/src/bytecode rename to contracts/validator/contract_v2/src/bytecode diff --git a/contracts/validator/src/contracts/XDCValidator.sol b/contracts/validator/contract_v2/src/contracts/XDCValidator.sol similarity index 100% rename from contracts/validator/src/contracts/XDCValidator.sol rename to contracts/validator/contract_v2/src/contracts/XDCValidator.sol diff --git a/contracts/validator/src/contracts/libraries/SafeMath.sol b/contracts/validator/contract_v2/src/contracts/libraries/SafeMath.sol similarity index 100% rename from contracts/validator/src/contracts/libraries/SafeMath.sol rename to contracts/validator/contract_v2/src/contracts/libraries/SafeMath.sol diff --git a/contracts/validator/src/deployment.json b/contracts/validator/contract_v2/src/deployment.json similarity index 100% rename from contracts/validator/src/deployment.json rename to contracts/validator/contract_v2/src/deployment.json diff --git a/contracts/validator/src/hardhat.config.js b/contracts/validator/contract_v2/src/hardhat.config.js similarity index 100% rename from contracts/validator/src/hardhat.config.js rename to contracts/validator/contract_v2/src/hardhat.config.js diff --git a/contracts/validator/src/image.png b/contracts/validator/contract_v2/src/image.png similarity index 100% rename from contracts/validator/src/image.png rename to contracts/validator/contract_v2/src/image.png diff --git a/contracts/validator/src/package.json b/contracts/validator/contract_v2/src/package.json similarity index 100% rename from contracts/validator/src/package.json rename to contracts/validator/contract_v2/src/package.json diff --git a/contracts/validator/src/patches/@ethersproject+address+5.7.0.patch b/contracts/validator/contract_v2/src/patches/@ethersproject+address+5.7.0.patch similarity index 100% rename from contracts/validator/src/patches/@ethersproject+address+5.7.0.patch rename to contracts/validator/contract_v2/src/patches/@ethersproject+address+5.7.0.patch diff --git a/contracts/validator/src/patches/@ethersproject+providers+5.7.2.patch b/contracts/validator/contract_v2/src/patches/@ethersproject+providers+5.7.2.patch similarity index 100% rename from contracts/validator/src/patches/@ethersproject+providers+5.7.2.patch rename to contracts/validator/contract_v2/src/patches/@ethersproject+providers+5.7.2.patch diff --git a/contracts/validator/src/scripts/deployToGenesis.js b/contracts/validator/contract_v2/src/scripts/deployToGenesis.js similarity index 100% rename from contracts/validator/src/scripts/deployToGenesis.js rename to contracts/validator/contract_v2/src/scripts/deployToGenesis.js diff --git a/contracts/validator/src/scripts/deployment.js b/contracts/validator/contract_v2/src/scripts/deployment.js similarity index 100% rename from contracts/validator/src/scripts/deployment.js rename to contracts/validator/contract_v2/src/scripts/deployment.js diff --git a/contracts/validator/src/test/xdcValidator.js b/contracts/validator/contract_v2/src/test/xdcValidator.js similarity index 100% rename from contracts/validator/src/test/xdcValidator.js rename to contracts/validator/contract_v2/src/test/xdcValidator.js diff --git a/contracts/validator/contract_v2/validator.go b/contracts/validator/contract_v2/validator.go new file mode 100644 index 000000000000..5210f6805762 --- /dev/null +++ b/contracts/validator/contract_v2/validator.go @@ -0,0 +1,2009 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "math/big" + "strings" + + "github.com/XinFinOrg/XDPoSChain/accounts/abi" + "github.com/XinFinOrg/XDPoSChain/accounts/abi/bind" + "github.com/XinFinOrg/XDPoSChain/common" + "github.com/XinFinOrg/XDPoSChain/core/types" + "github.com/XinFinOrg/XDPoSChain/event" + ethereum "github.com/XinFinOrg/XDPoSChain" +) + +// XDCValidatorABI is the input ABI used to generate the binding from. +const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kycString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"validatorsState\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"isCandidate\",\"type\":\"bool\"},{\"name\":\"cap\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateNum\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getGrandMasters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"grandMasterMap\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"voters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"grandMasters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getOwnerToCandidateLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_grandMasters\",\"type\":\"address[]\"},{\"name\":\"_minCandidateNum\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" + +// XDCValidatorBin is the compiled bytecode used for deploying new contracts. +const XDCValidatorBin = `0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029` + +// DeployXDCValidator deploys a new Ethereum contract, binding an instance of XDCValidator to it. +func DeployXDCValidator(auth *bind.TransactOpts, backend bind.ContractBackend, _candidates []common.Address, _caps []*big.Int, _firstOwner common.Address, _minCandidateCap *big.Int, _minVoterCap *big.Int, _maxValidatorNumber *big.Int, _candidateWithdrawDelay *big.Int, _voterWithdrawDelay *big.Int, _grandMasters []common.Address, _minCandidateNum *big.Int) (common.Address, *types.Transaction, *XDCValidator, error) { + parsed, err := abi.JSON(strings.NewReader(XDCValidatorABI)) + if err != nil { + return common.Address{}, nil, nil, err + } + address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(XDCValidatorBin), backend, _candidates, _caps, _firstOwner, _minCandidateCap, _minVoterCap, _maxValidatorNumber, _candidateWithdrawDelay, _voterWithdrawDelay, _grandMasters, _minCandidateNum) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &XDCValidator{XDCValidatorCaller: XDCValidatorCaller{contract: contract}, XDCValidatorTransactor: XDCValidatorTransactor{contract: contract}, XDCValidatorFilterer: XDCValidatorFilterer{contract: contract}}, nil +} + +// XDCValidator is an auto generated Go binding around an Ethereum contract. +type XDCValidator struct { + XDCValidatorCaller // Read-only binding to the contract + XDCValidatorTransactor // Write-only binding to the contract + XDCValidatorFilterer // Log filterer for contract events +} + +// XDCValidatorCaller is an auto generated read-only Go binding around an Ethereum contract. +type XDCValidatorCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// XDCValidatorTransactor is an auto generated write-only Go binding around an Ethereum contract. +type XDCValidatorTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// XDCValidatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type XDCValidatorFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// XDCValidatorSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type XDCValidatorSession struct { + Contract *XDCValidator // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// XDCValidatorCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type XDCValidatorCallerSession struct { + Contract *XDCValidatorCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// XDCValidatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type XDCValidatorTransactorSession struct { + Contract *XDCValidatorTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// XDCValidatorRaw is an auto generated low-level Go binding around an Ethereum contract. +type XDCValidatorRaw struct { + Contract *XDCValidator // Generic contract binding to access the raw methods on +} + +// XDCValidatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type XDCValidatorCallerRaw struct { + Contract *XDCValidatorCaller // Generic read-only contract binding to access the raw methods on +} + +// XDCValidatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type XDCValidatorTransactorRaw struct { + Contract *XDCValidatorTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewXDCValidator creates a new instance of XDCValidator, bound to a specific deployed contract. +func NewXDCValidator(address common.Address, backend bind.ContractBackend) (*XDCValidator, error) { + contract, err := bindXDCValidator(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &XDCValidator{XDCValidatorCaller: XDCValidatorCaller{contract: contract}, XDCValidatorTransactor: XDCValidatorTransactor{contract: contract}, XDCValidatorFilterer: XDCValidatorFilterer{contract: contract}}, nil +} + +// NewXDCValidatorCaller creates a new read-only instance of XDCValidator, bound to a specific deployed contract. +func NewXDCValidatorCaller(address common.Address, caller bind.ContractCaller) (*XDCValidatorCaller, error) { + contract, err := bindXDCValidator(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &XDCValidatorCaller{contract: contract}, nil +} + +// NewXDCValidatorTransactor creates a new write-only instance of XDCValidator, bound to a specific deployed contract. +func NewXDCValidatorTransactor(address common.Address, transactor bind.ContractTransactor) (*XDCValidatorTransactor, error) { + contract, err := bindXDCValidator(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &XDCValidatorTransactor{contract: contract}, nil +} + +// NewXDCValidatorFilterer creates a new log filterer instance of XDCValidator, bound to a specific deployed contract. +func NewXDCValidatorFilterer(address common.Address, filterer bind.ContractFilterer) (*XDCValidatorFilterer, error) { + contract, err := bindXDCValidator(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &XDCValidatorFilterer{contract: contract}, nil +} + +// bindXDCValidator binds a generic wrapper to an already deployed contract. +func bindXDCValidator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(XDCValidatorABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_XDCValidator *XDCValidatorRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _XDCValidator.Contract.XDCValidatorCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_XDCValidator *XDCValidatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.Contract.XDCValidatorTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_XDCValidator *XDCValidatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _XDCValidator.Contract.XDCValidatorTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_XDCValidator *XDCValidatorCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _XDCValidator.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_XDCValidator *XDCValidatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_XDCValidator *XDCValidatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _XDCValidator.Contract.contract.Transact(opts, method, params...) +} + +// CandidateCount is a free data retrieval call binding the contract method 0xa9a981a3. +// +// Solidity: function candidateCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) CandidateCount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "candidateCount") + return *ret0, err +} + +// CandidateCount is a free data retrieval call binding the contract method 0xa9a981a3. +// +// Solidity: function candidateCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) CandidateCount() (*big.Int, error) { + return _XDCValidator.Contract.CandidateCount(&_XDCValidator.CallOpts) +} + +// CandidateCount is a free data retrieval call binding the contract method 0xa9a981a3. +// +// Solidity: function candidateCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) CandidateCount() (*big.Int, error) { + return _XDCValidator.Contract.CandidateCount(&_XDCValidator.CallOpts) +} + +// CandidateWithdrawDelay is a free data retrieval call binding the contract method 0xd161c767. +// +// Solidity: function candidateWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) CandidateWithdrawDelay(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "candidateWithdrawDelay") + return *ret0, err +} + +// CandidateWithdrawDelay is a free data retrieval call binding the contract method 0xd161c767. +// +// Solidity: function candidateWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) CandidateWithdrawDelay() (*big.Int, error) { + return _XDCValidator.Contract.CandidateWithdrawDelay(&_XDCValidator.CallOpts) +} + +// CandidateWithdrawDelay is a free data retrieval call binding the contract method 0xd161c767. +// +// Solidity: function candidateWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) CandidateWithdrawDelay() (*big.Int, error) { + return _XDCValidator.Contract.CandidateWithdrawDelay(&_XDCValidator.CallOpts) +} + +// Candidates is a free data retrieval call binding the contract method 0x3477ee2e. +// +// Solidity: function candidates( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) Candidates(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "candidates", arg0) + return *ret0, err +} + +// Candidates is a free data retrieval call binding the contract method 0x3477ee2e. +// +// Solidity: function candidates( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) Candidates(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Candidates(&_XDCValidator.CallOpts, arg0) +} + +// Candidates is a free data retrieval call binding the contract method 0x3477ee2e. +// +// Solidity: function candidates( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) Candidates(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Candidates(&_XDCValidator.CallOpts, arg0) +} + +// GetCandidateCap is a free data retrieval call binding the contract method 0x58e7525f. +// +// Solidity: function getCandidateCap(_candidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetCandidateCap(opts *bind.CallOpts, _candidate common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getCandidateCap", _candidate) + return *ret0, err +} + +// GetCandidateCap is a free data retrieval call binding the contract method 0x58e7525f. +// +// Solidity: function getCandidateCap(_candidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetCandidateCap(_candidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetCandidateCap(&_XDCValidator.CallOpts, _candidate) +} + +// GetCandidateCap is a free data retrieval call binding the contract method 0x58e7525f. +// +// Solidity: function getCandidateCap(_candidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetCandidateCap(_candidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetCandidateCap(&_XDCValidator.CallOpts, _candidate) +} + +// GetCandidateOwner is a free data retrieval call binding the contract method 0xb642facd. +// +// Solidity: function getCandidateOwner(_candidate address) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) GetCandidateOwner(opts *bind.CallOpts, _candidate common.Address) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getCandidateOwner", _candidate) + return *ret0, err +} + +// GetCandidateOwner is a free data retrieval call binding the contract method 0xb642facd. +// +// Solidity: function getCandidateOwner(_candidate address) constant returns(address) +func (_XDCValidator *XDCValidatorSession) GetCandidateOwner(_candidate common.Address) (common.Address, error) { + return _XDCValidator.Contract.GetCandidateOwner(&_XDCValidator.CallOpts, _candidate) +} + +// GetCandidateOwner is a free data retrieval call binding the contract method 0xb642facd. +// +// Solidity: function getCandidateOwner(_candidate address) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) GetCandidateOwner(_candidate common.Address) (common.Address, error) { + return _XDCValidator.Contract.GetCandidateOwner(&_XDCValidator.CallOpts, _candidate) +} + +// GetCandidates is a free data retrieval call binding the contract method 0x06a49fce. +// +// Solidity: function getCandidates() constant returns(address[]) +func (_XDCValidator *XDCValidatorCaller) GetCandidates(opts *bind.CallOpts) ([]common.Address, error) { + var ( + ret0 = new([]common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getCandidates") + return *ret0, err +} + +// GetCandidates is a free data retrieval call binding the contract method 0x06a49fce. +// +// Solidity: function getCandidates() constant returns(address[]) +func (_XDCValidator *XDCValidatorSession) GetCandidates() ([]common.Address, error) { + return _XDCValidator.Contract.GetCandidates(&_XDCValidator.CallOpts) +} + +// GetCandidates is a free data retrieval call binding the contract method 0x06a49fce. +// +// Solidity: function getCandidates() constant returns(address[]) +func (_XDCValidator *XDCValidatorCallerSession) GetCandidates() ([]common.Address, error) { + return _XDCValidator.Contract.GetCandidates(&_XDCValidator.CallOpts) +} + +// GetGrandMasters is a free data retrieval call binding the contract method 0x52b3ed16. +// +// Solidity: function getGrandMasters() constant returns(address[]) +func (_XDCValidator *XDCValidatorCaller) GetGrandMasters(opts *bind.CallOpts) ([]common.Address, error) { + var ( + ret0 = new([]common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getGrandMasters") + return *ret0, err +} + +// GetGrandMasters is a free data retrieval call binding the contract method 0x52b3ed16. +// +// Solidity: function getGrandMasters() constant returns(address[]) +func (_XDCValidator *XDCValidatorSession) GetGrandMasters() ([]common.Address, error) { + return _XDCValidator.Contract.GetGrandMasters(&_XDCValidator.CallOpts) +} + +// GetGrandMasters is a free data retrieval call binding the contract method 0x52b3ed16. +// +// Solidity: function getGrandMasters() constant returns(address[]) +func (_XDCValidator *XDCValidatorCallerSession) GetGrandMasters() ([]common.Address, error) { + return _XDCValidator.Contract.GetGrandMasters(&_XDCValidator.CallOpts) +} + +// GetHashCount is a free data retrieval call binding the contract method 0xc45607df. +// +// Solidity: function getHashCount(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetHashCount(opts *bind.CallOpts, _address common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getHashCount", _address) + return *ret0, err +} + +// GetHashCount is a free data retrieval call binding the contract method 0xc45607df. +// +// Solidity: function getHashCount(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetHashCount(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetHashCount(&_XDCValidator.CallOpts, _address) +} + +// GetHashCount is a free data retrieval call binding the contract method 0xc45607df. +// +// Solidity: function getHashCount(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetHashCount(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetHashCount(&_XDCValidator.CallOpts, _address) +} + +// GetLatestKYC is a free data retrieval call binding the contract method 0x32658652. +// +// Solidity: function getLatestKYC(_address address) constant returns(string) +func (_XDCValidator *XDCValidatorCaller) GetLatestKYC(opts *bind.CallOpts, _address common.Address) (string, error) { + var ( + ret0 = new(string) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getLatestKYC", _address) + return *ret0, err +} + +// GetLatestKYC is a free data retrieval call binding the contract method 0x32658652. +// +// Solidity: function getLatestKYC(_address address) constant returns(string) +func (_XDCValidator *XDCValidatorSession) GetLatestKYC(_address common.Address) (string, error) { + return _XDCValidator.Contract.GetLatestKYC(&_XDCValidator.CallOpts, _address) +} + +// GetLatestKYC is a free data retrieval call binding the contract method 0x32658652. +// +// Solidity: function getLatestKYC(_address address) constant returns(string) +func (_XDCValidator *XDCValidatorCallerSession) GetLatestKYC(_address common.Address) (string, error) { + return _XDCValidator.Contract.GetLatestKYC(&_XDCValidator.CallOpts, _address) +} + +// GetOwnerCount is a free data retrieval call binding the contract method 0xef18374a. +// +// Solidity: function getOwnerCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetOwnerCount(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getOwnerCount") + return *ret0, err +} + +// GetOwnerCount is a free data retrieval call binding the contract method 0xef18374a. +// +// Solidity: function getOwnerCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetOwnerCount() (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerCount(&_XDCValidator.CallOpts) +} + +// GetOwnerCount is a free data retrieval call binding the contract method 0xef18374a. +// +// Solidity: function getOwnerCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetOwnerCount() (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerCount(&_XDCValidator.CallOpts) +} + +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetOwnerToCandidateLength(opts *bind.CallOpts, _address common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getOwnerToCandidateLength", _address) + return *ret0, err +} + +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) +} + +// GetOwnerToCandidateLength is a free data retrieval call binding the contract method 0x67134e70. +// +// Solidity: function getOwnerToCandidateLength(_address address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetOwnerToCandidateLength(_address common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetOwnerToCandidateLength(&_XDCValidator.CallOpts, _address) +} + +// GetVoterCap is a free data retrieval call binding the contract method 0x302b6872. +// +// Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetVoterCap(opts *bind.CallOpts, _candidate common.Address, _voter common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getVoterCap", _candidate, _voter) + return *ret0, err +} + +// GetVoterCap is a free data retrieval call binding the contract method 0x302b6872. +// +// Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetVoterCap(_candidate common.Address, _voter common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetVoterCap(&_XDCValidator.CallOpts, _candidate, _voter) +} + +// GetVoterCap is a free data retrieval call binding the contract method 0x302b6872. +// +// Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetVoterCap(_candidate common.Address, _voter common.Address) (*big.Int, error) { + return _XDCValidator.Contract.GetVoterCap(&_XDCValidator.CallOpts, _candidate, _voter) +} + +// GetVoters is a free data retrieval call binding the contract method 0x2d15cc04. +// +// Solidity: function getVoters(_candidate address) constant returns(address[]) +func (_XDCValidator *XDCValidatorCaller) GetVoters(opts *bind.CallOpts, _candidate common.Address) ([]common.Address, error) { + var ( + ret0 = new([]common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getVoters", _candidate) + return *ret0, err +} + +// GetVoters is a free data retrieval call binding the contract method 0x2d15cc04. +// +// Solidity: function getVoters(_candidate address) constant returns(address[]) +func (_XDCValidator *XDCValidatorSession) GetVoters(_candidate common.Address) ([]common.Address, error) { + return _XDCValidator.Contract.GetVoters(&_XDCValidator.CallOpts, _candidate) +} + +// GetVoters is a free data retrieval call binding the contract method 0x2d15cc04. +// +// Solidity: function getVoters(_candidate address) constant returns(address[]) +func (_XDCValidator *XDCValidatorCallerSession) GetVoters(_candidate common.Address) ([]common.Address, error) { + return _XDCValidator.Contract.GetVoters(&_XDCValidator.CallOpts, _candidate) +} + +// GetWithdrawBlockNumbers is a free data retrieval call binding the contract method 0x2f9c4bba. +// +// Solidity: function getWithdrawBlockNumbers() constant returns(uint256[]) +func (_XDCValidator *XDCValidatorCaller) GetWithdrawBlockNumbers(opts *bind.CallOpts) ([]*big.Int, error) { + var ( + ret0 = new([]*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getWithdrawBlockNumbers") + return *ret0, err +} + +// GetWithdrawBlockNumbers is a free data retrieval call binding the contract method 0x2f9c4bba. +// +// Solidity: function getWithdrawBlockNumbers() constant returns(uint256[]) +func (_XDCValidator *XDCValidatorSession) GetWithdrawBlockNumbers() ([]*big.Int, error) { + return _XDCValidator.Contract.GetWithdrawBlockNumbers(&_XDCValidator.CallOpts) +} + +// GetWithdrawBlockNumbers is a free data retrieval call binding the contract method 0x2f9c4bba. +// +// Solidity: function getWithdrawBlockNumbers() constant returns(uint256[]) +func (_XDCValidator *XDCValidatorCallerSession) GetWithdrawBlockNumbers() ([]*big.Int, error) { + return _XDCValidator.Contract.GetWithdrawBlockNumbers(&_XDCValidator.CallOpts) +} + +// GetWithdrawCap is a free data retrieval call binding the contract method 0x15febd68. +// +// Solidity: function getWithdrawCap(_blockNumber uint256) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) GetWithdrawCap(opts *bind.CallOpts, _blockNumber *big.Int) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "getWithdrawCap", _blockNumber) + return *ret0, err +} + +// GetWithdrawCap is a free data retrieval call binding the contract method 0x15febd68. +// +// Solidity: function getWithdrawCap(_blockNumber uint256) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) GetWithdrawCap(_blockNumber *big.Int) (*big.Int, error) { + return _XDCValidator.Contract.GetWithdrawCap(&_XDCValidator.CallOpts, _blockNumber) +} + +// GetWithdrawCap is a free data retrieval call binding the contract method 0x15febd68. +// +// Solidity: function getWithdrawCap(_blockNumber uint256) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) GetWithdrawCap(_blockNumber *big.Int) (*big.Int, error) { + return _XDCValidator.Contract.GetWithdrawCap(&_XDCValidator.CallOpts, _blockNumber) +} + +// GrandMasterMap is a free data retrieval call binding the contract method 0x5b6e3963. +// +// Solidity: function grandMasterMap( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) GrandMasterMap(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "grandMasterMap", arg0) + return *ret0, err +} + +// GrandMasterMap is a free data retrieval call binding the contract method 0x5b6e3963. +// +// Solidity: function grandMasterMap( address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) GrandMasterMap(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.GrandMasterMap(&_XDCValidator.CallOpts, arg0) +} + +// GrandMasterMap is a free data retrieval call binding the contract method 0x5b6e3963. +// +// Solidity: function grandMasterMap( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) GrandMasterMap(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.GrandMasterMap(&_XDCValidator.CallOpts, arg0) +} + +// GrandMasters is a free data retrieval call binding the contract method 0x6132cd83. +// +// Solidity: function grandMasters( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) GrandMasters(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "grandMasters", arg0) + return *ret0, err +} + +// GrandMasters is a free data retrieval call binding the contract method 0x6132cd83. +// +// Solidity: function grandMasters( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) GrandMasters(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.GrandMasters(&_XDCValidator.CallOpts, arg0) +} + +// GrandMasters is a free data retrieval call binding the contract method 0x6132cd83. +// +// Solidity: function grandMasters( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) GrandMasters(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.GrandMasters(&_XDCValidator.CallOpts, arg0) +} + +// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. +// +// Solidity: function hasVotedInvalid( address, address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) HasVotedInvalid(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "hasVotedInvalid", arg0, arg1) + return *ret0, err +} + +// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. +// +// Solidity: function hasVotedInvalid( address, address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) HasVotedInvalid(arg0 common.Address, arg1 common.Address) (bool, error) { + return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) +} + +// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. +// +// Solidity: function hasVotedInvalid( address, address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) HasVotedInvalid(arg0 common.Address, arg1 common.Address) (bool, error) { + return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) +} + +// InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. +// +// Solidity: function invalidKYCCount( address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) InvalidKYCCount(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "invalidKYCCount", arg0) + return *ret0, err +} + +// InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. +// +// Solidity: function invalidKYCCount( address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) InvalidKYCCount(arg0 common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0) +} + +// InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. +// +// Solidity: function invalidKYCCount( address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) InvalidKYCCount(arg0 common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0) +} + +// InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. +// +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _invalidCandidate common.Address) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _invalidCandidate) + return *ret0, err +} + +// InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. +// +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) +} + +// InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. +// +// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) +} + +// IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. +// +// Solidity: function isCandidate(_candidate address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) IsCandidate(opts *bind.CallOpts, _candidate common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "isCandidate", _candidate) + return *ret0, err +} + +// IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. +// +// Solidity: function isCandidate(_candidate address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) IsCandidate(_candidate common.Address) (bool, error) { + return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate) +} + +// IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. +// +// Solidity: function isCandidate(_candidate address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) IsCandidate(_candidate common.Address) (bool, error) { + return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate) +} + +// KycString is a free data retrieval call binding the contract method 0x27a6296b. +// +// Solidity: function kycString( address, uint256) constant returns(string) +func (_XDCValidator *XDCValidatorCaller) KycString(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (string, error) { + var ( + ret0 = new(string) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "kycString", arg0, arg1) + return *ret0, err +} + +// KycString is a free data retrieval call binding the contract method 0x27a6296b. +// +// Solidity: function kycString( address, uint256) constant returns(string) +func (_XDCValidator *XDCValidatorSession) KycString(arg0 common.Address, arg1 *big.Int) (string, error) { + return _XDCValidator.Contract.KycString(&_XDCValidator.CallOpts, arg0, arg1) +} + +// KycString is a free data retrieval call binding the contract method 0x27a6296b. +// +// Solidity: function kycString( address, uint256) constant returns(string) +func (_XDCValidator *XDCValidatorCallerSession) KycString(arg0 common.Address, arg1 *big.Int) (string, error) { + return _XDCValidator.Contract.KycString(&_XDCValidator.CallOpts, arg0, arg1) +} + +// MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. +// +// Solidity: function maxValidatorNumber() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) MaxValidatorNumber(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "maxValidatorNumber") + return *ret0, err +} + +// MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. +// +// Solidity: function maxValidatorNumber() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) MaxValidatorNumber() (*big.Int, error) { + return _XDCValidator.Contract.MaxValidatorNumber(&_XDCValidator.CallOpts) +} + +// MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. +// +// Solidity: function maxValidatorNumber() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) MaxValidatorNumber() (*big.Int, error) { + return _XDCValidator.Contract.MaxValidatorNumber(&_XDCValidator.CallOpts) +} + +// MinCandidateCap is a free data retrieval call binding the contract method 0xd55b7dff. +// +// Solidity: function minCandidateCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) MinCandidateCap(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "minCandidateCap") + return *ret0, err +} + +// MinCandidateCap is a free data retrieval call binding the contract method 0xd55b7dff. +// +// Solidity: function minCandidateCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) MinCandidateCap() (*big.Int, error) { + return _XDCValidator.Contract.MinCandidateCap(&_XDCValidator.CallOpts) +} + +// MinCandidateCap is a free data retrieval call binding the contract method 0xd55b7dff. +// +// Solidity: function minCandidateCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) MinCandidateCap() (*big.Int, error) { + return _XDCValidator.Contract.MinCandidateCap(&_XDCValidator.CallOpts) +} + +// MinCandidateNum is a free data retrieval call binding the contract method 0x49e971be. +// +// Solidity: function minCandidateNum() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) MinCandidateNum(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "minCandidateNum") + return *ret0, err +} + +// MinCandidateNum is a free data retrieval call binding the contract method 0x49e971be. +// +// Solidity: function minCandidateNum() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) MinCandidateNum() (*big.Int, error) { + return _XDCValidator.Contract.MinCandidateNum(&_XDCValidator.CallOpts) +} + +// MinCandidateNum is a free data retrieval call binding the contract method 0x49e971be. +// +// Solidity: function minCandidateNum() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) MinCandidateNum() (*big.Int, error) { + return _XDCValidator.Contract.MinCandidateNum(&_XDCValidator.CallOpts) +} + +// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. +// +// Solidity: function minVoterCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) MinVoterCap(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "minVoterCap") + return *ret0, err +} + +// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. +// +// Solidity: function minVoterCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) MinVoterCap() (*big.Int, error) { + return _XDCValidator.Contract.MinVoterCap(&_XDCValidator.CallOpts) +} + +// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. +// +// Solidity: function minVoterCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) MinVoterCap() (*big.Int, error) { + return _XDCValidator.Contract.MinVoterCap(&_XDCValidator.CallOpts) +} + +// OwnerToCandidate is a free data retrieval call binding the contract method 0x2a3640b1. +// +// Solidity: function ownerToCandidate( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) OwnerToCandidate(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "ownerToCandidate", arg0, arg1) + return *ret0, err +} + +// OwnerToCandidate is a free data retrieval call binding the contract method 0x2a3640b1. +// +// Solidity: function ownerToCandidate( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) OwnerToCandidate(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.OwnerToCandidate(&_XDCValidator.CallOpts, arg0, arg1) +} + +// OwnerToCandidate is a free data retrieval call binding the contract method 0x2a3640b1. +// +// Solidity: function ownerToCandidate( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) OwnerToCandidate(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.OwnerToCandidate(&_XDCValidator.CallOpts, arg0, arg1) +} + +// Owners is a free data retrieval call binding the contract method 0x025e7c27. +// +// Solidity: function owners( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) Owners(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "owners", arg0) + return *ret0, err +} + +// Owners is a free data retrieval call binding the contract method 0x025e7c27. +// +// Solidity: function owners( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) Owners(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0) +} + +// Owners is a free data retrieval call binding the contract method 0x025e7c27. +// +// Solidity: function owners( uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) Owners(arg0 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0) +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorCaller) ValidatorsState(opts *bind.CallOpts, arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + ret := new(struct { + Owner common.Address + IsCandidate bool + Cap *big.Int + }) + out := ret + err := _XDCValidator.contract.Call(opts, out, "validatorsState", arg0) + return *ret, err +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorSession) ValidatorsState(arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) +} + +// ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. +// +// Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) +func (_XDCValidator *XDCValidatorCallerSession) ValidatorsState(arg0 common.Address) (struct { + Owner common.Address + IsCandidate bool + Cap *big.Int +}, error) { + return _XDCValidator.Contract.ValidatorsState(&_XDCValidator.CallOpts, arg0) +} + +// VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e. +// +// Solidity: function voterWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) VoterWithdrawDelay(opts *bind.CallOpts) (*big.Int, error) { + var ( + ret0 = new(*big.Int) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "voterWithdrawDelay") + return *ret0, err +} + +// VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e. +// +// Solidity: function voterWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) VoterWithdrawDelay() (*big.Int, error) { + return _XDCValidator.Contract.VoterWithdrawDelay(&_XDCValidator.CallOpts) +} + +// VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e. +// +// Solidity: function voterWithdrawDelay() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) VoterWithdrawDelay() (*big.Int, error) { + return _XDCValidator.Contract.VoterWithdrawDelay(&_XDCValidator.CallOpts) +} + +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCaller) Voters(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) { + var ( + ret0 = new(common.Address) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "voters", arg0, arg1) + return *ret0, err +} + +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) +} + +// Voters is a free data retrieval call binding the contract method 0x5c134d66. +// +// Solidity: function voters( address, uint256) constant returns(address) +func (_XDCValidator *XDCValidatorCallerSession) Voters(arg0 common.Address, arg1 *big.Int) (common.Address, error) { + return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) +} + +// Propose is a paid mutator transaction binding the contract method 0x01267951. +// +// Solidity: function propose(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactor) Propose(opts *bind.TransactOpts, _candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "propose", _candidate) +} + +// Propose is a paid mutator transaction binding the contract method 0x01267951. +// +// Solidity: function propose(_candidate address) returns() +func (_XDCValidator *XDCValidatorSession) Propose(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate) +} + +// Propose is a paid mutator transaction binding the contract method 0x01267951. +// +// Solidity: function propose(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) Propose(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate) +} + +// Resign is a paid mutator transaction binding the contract method 0xae6e43f5. +// +// Solidity: function resign(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactor) Resign(opts *bind.TransactOpts, _candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "resign", _candidate) +} + +// Resign is a paid mutator transaction binding the contract method 0xae6e43f5. +// +// Solidity: function resign(_candidate address) returns() +func (_XDCValidator *XDCValidatorSession) Resign(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Resign(&_XDCValidator.TransactOpts, _candidate) +} + +// Resign is a paid mutator transaction binding the contract method 0xae6e43f5. +// +// Solidity: function resign(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) Resign(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Resign(&_XDCValidator.TransactOpts, _candidate) +} + +// Unvote is a paid mutator transaction binding the contract method 0x02aa9be2. +// +// Solidity: function unvote(_candidate address, _cap uint256) returns() +func (_XDCValidator *XDCValidatorTransactor) Unvote(opts *bind.TransactOpts, _candidate common.Address, _cap *big.Int) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "unvote", _candidate, _cap) +} + +// Unvote is a paid mutator transaction binding the contract method 0x02aa9be2. +// +// Solidity: function unvote(_candidate address, _cap uint256) returns() +func (_XDCValidator *XDCValidatorSession) Unvote(_candidate common.Address, _cap *big.Int) (*types.Transaction, error) { + return _XDCValidator.Contract.Unvote(&_XDCValidator.TransactOpts, _candidate, _cap) +} + +// Unvote is a paid mutator transaction binding the contract method 0x02aa9be2. +// +// Solidity: function unvote(_candidate address, _cap uint256) returns() +func (_XDCValidator *XDCValidatorTransactorSession) Unvote(_candidate common.Address, _cap *big.Int) (*types.Transaction, error) { + return _XDCValidator.Contract.Unvote(&_XDCValidator.TransactOpts, _candidate, _cap) +} + +// UploadKYC is a paid mutator transaction binding the contract method 0xf5c95125. +// +// Solidity: function uploadKYC(kychash string) returns() +func (_XDCValidator *XDCValidatorTransactor) UploadKYC(opts *bind.TransactOpts, kychash string) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "uploadKYC", kychash) +} + +// UploadKYC is a paid mutator transaction binding the contract method 0xf5c95125. +// +// Solidity: function uploadKYC(kychash string) returns() +func (_XDCValidator *XDCValidatorSession) UploadKYC(kychash string) (*types.Transaction, error) { + return _XDCValidator.Contract.UploadKYC(&_XDCValidator.TransactOpts, kychash) +} + +// UploadKYC is a paid mutator transaction binding the contract method 0xf5c95125. +// +// Solidity: function uploadKYC(kychash string) returns() +func (_XDCValidator *XDCValidatorTransactorSession) UploadKYC(kychash string) (*types.Transaction, error) { + return _XDCValidator.Contract.UploadKYC(&_XDCValidator.TransactOpts, kychash) +} + +// Vote is a paid mutator transaction binding the contract method 0x6dd7d8ea. +// +// Solidity: function vote(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactor) Vote(opts *bind.TransactOpts, _candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "vote", _candidate) +} + +// Vote is a paid mutator transaction binding the contract method 0x6dd7d8ea. +// +// Solidity: function vote(_candidate address) returns() +func (_XDCValidator *XDCValidatorSession) Vote(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Vote(&_XDCValidator.TransactOpts, _candidate) +} + +// Vote is a paid mutator transaction binding the contract method 0x6dd7d8ea. +// +// Solidity: function vote(_candidate address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) Vote(_candidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.Vote(&_XDCValidator.TransactOpts, _candidate) +} + +// VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. +// +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _invalidCandidate) +} + +// VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. +// +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) +} + +// VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. +// +// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x441a3e70. +// +// Solidity: function withdraw(_blockNumber uint256, _index uint256) returns() +func (_XDCValidator *XDCValidatorTransactor) Withdraw(opts *bind.TransactOpts, _blockNumber *big.Int, _index *big.Int) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "withdraw", _blockNumber, _index) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x441a3e70. +// +// Solidity: function withdraw(_blockNumber uint256, _index uint256) returns() +func (_XDCValidator *XDCValidatorSession) Withdraw(_blockNumber *big.Int, _index *big.Int) (*types.Transaction, error) { + return _XDCValidator.Contract.Withdraw(&_XDCValidator.TransactOpts, _blockNumber, _index) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x441a3e70. +// +// Solidity: function withdraw(_blockNumber uint256, _index uint256) returns() +func (_XDCValidator *XDCValidatorTransactorSession) Withdraw(_blockNumber *big.Int, _index *big.Int) (*types.Transaction, error) { + return _XDCValidator.Contract.Withdraw(&_XDCValidator.TransactOpts, _blockNumber, _index) +} + +// XDCValidatorInvalidatedNodeIterator is returned from FilterInvalidatedNode and is used to iterate over the raw logs and unpacked data for InvalidatedNode events raised by the XDCValidator contract. +type XDCValidatorInvalidatedNodeIterator struct { + Event *XDCValidatorInvalidatedNode // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorInvalidatedNodeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorInvalidatedNode) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorInvalidatedNode) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorInvalidatedNodeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorInvalidatedNodeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorInvalidatedNode represents a InvalidatedNode event raised by the XDCValidator contract. +type XDCValidatorInvalidatedNode struct { + MasternodeOwner common.Address + Masternodes []common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInvalidatedNode is a free log retrieval operation binding the contract event 0xe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e. +// +// Solidity: event InvalidatedNode(_masternodeOwner address, _masternodes address[]) +func (_XDCValidator *XDCValidatorFilterer) FilterInvalidatedNode(opts *bind.FilterOpts) (*XDCValidatorInvalidatedNodeIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "InvalidatedNode") + if err != nil { + return nil, err + } + return &XDCValidatorInvalidatedNodeIterator{contract: _XDCValidator.contract, event: "InvalidatedNode", logs: logs, sub: sub}, nil +} + +// WatchInvalidatedNode is a free log subscription operation binding the contract event 0xe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e. +// +// Solidity: event InvalidatedNode(_masternodeOwner address, _masternodes address[]) +func (_XDCValidator *XDCValidatorFilterer) WatchInvalidatedNode(opts *bind.WatchOpts, sink chan<- *XDCValidatorInvalidatedNode) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "InvalidatedNode") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorInvalidatedNode) + if err := _XDCValidator.contract.UnpackLog(event, "InvalidatedNode", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorProposeIterator is returned from FilterPropose and is used to iterate over the raw logs and unpacked data for Propose events raised by the XDCValidator contract. +type XDCValidatorProposeIterator struct { + Event *XDCValidatorPropose // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorProposeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorPropose) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorPropose) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorProposeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorProposeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorPropose represents a Propose event raised by the XDCValidator contract. +type XDCValidatorPropose struct { + Owner common.Address + Candidate common.Address + Cap *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPropose is a free log retrieval operation binding the contract event 0x7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1. +// +// Solidity: event Propose(_owner address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) FilterPropose(opts *bind.FilterOpts) (*XDCValidatorProposeIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Propose") + if err != nil { + return nil, err + } + return &XDCValidatorProposeIterator{contract: _XDCValidator.contract, event: "Propose", logs: logs, sub: sub}, nil +} + +// WatchPropose is a free log subscription operation binding the contract event 0x7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1. +// +// Solidity: event Propose(_owner address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) WatchPropose(opts *bind.WatchOpts, sink chan<- *XDCValidatorPropose) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Propose") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorPropose) + if err := _XDCValidator.contract.UnpackLog(event, "Propose", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorResignIterator is returned from FilterResign and is used to iterate over the raw logs and unpacked data for Resign events raised by the XDCValidator contract. +type XDCValidatorResignIterator struct { + Event *XDCValidatorResign // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorResignIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorResign) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorResign) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorResignIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorResignIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorResign represents a Resign event raised by the XDCValidator contract. +type XDCValidatorResign struct { + Owner common.Address + Candidate common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterResign is a free log retrieval operation binding the contract event 0x4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3. +// +// Solidity: event Resign(_owner address, _candidate address) +func (_XDCValidator *XDCValidatorFilterer) FilterResign(opts *bind.FilterOpts) (*XDCValidatorResignIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Resign") + if err != nil { + return nil, err + } + return &XDCValidatorResignIterator{contract: _XDCValidator.contract, event: "Resign", logs: logs, sub: sub}, nil +} + +// WatchResign is a free log subscription operation binding the contract event 0x4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3. +// +// Solidity: event Resign(_owner address, _candidate address) +func (_XDCValidator *XDCValidatorFilterer) WatchResign(opts *bind.WatchOpts, sink chan<- *XDCValidatorResign) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Resign") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorResign) + if err := _XDCValidator.contract.UnpackLog(event, "Resign", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorUnvoteIterator is returned from FilterUnvote and is used to iterate over the raw logs and unpacked data for Unvote events raised by the XDCValidator contract. +type XDCValidatorUnvoteIterator struct { + Event *XDCValidatorUnvote // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorUnvoteIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorUnvote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorUnvote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorUnvoteIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorUnvoteIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorUnvote represents a Unvote event raised by the XDCValidator contract. +type XDCValidatorUnvote struct { + Voter common.Address + Candidate common.Address + Cap *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnvote is a free log retrieval operation binding the contract event 0xaa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2. +// +// Solidity: event Unvote(_voter address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) FilterUnvote(opts *bind.FilterOpts) (*XDCValidatorUnvoteIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Unvote") + if err != nil { + return nil, err + } + return &XDCValidatorUnvoteIterator{contract: _XDCValidator.contract, event: "Unvote", logs: logs, sub: sub}, nil +} + +// WatchUnvote is a free log subscription operation binding the contract event 0xaa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2. +// +// Solidity: event Unvote(_voter address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) WatchUnvote(opts *bind.WatchOpts, sink chan<- *XDCValidatorUnvote) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Unvote") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorUnvote) + if err := _XDCValidator.contract.UnpackLog(event, "Unvote", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorUploadedKYCIterator is returned from FilterUploadedKYC and is used to iterate over the raw logs and unpacked data for UploadedKYC events raised by the XDCValidator contract. +type XDCValidatorUploadedKYCIterator struct { + Event *XDCValidatorUploadedKYC // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorUploadedKYCIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorUploadedKYC) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorUploadedKYC) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorUploadedKYCIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorUploadedKYCIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorUploadedKYC represents a UploadedKYC event raised by the XDCValidator contract. +type XDCValidatorUploadedKYC struct { + Owner common.Address + KycHash string + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUploadedKYC is a free log retrieval operation binding the contract event 0x949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a. +// +// Solidity: event UploadedKYC(_owner address, kycHash string) +func (_XDCValidator *XDCValidatorFilterer) FilterUploadedKYC(opts *bind.FilterOpts) (*XDCValidatorUploadedKYCIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "UploadedKYC") + if err != nil { + return nil, err + } + return &XDCValidatorUploadedKYCIterator{contract: _XDCValidator.contract, event: "UploadedKYC", logs: logs, sub: sub}, nil +} + +// WatchUploadedKYC is a free log subscription operation binding the contract event 0x949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a. +// +// Solidity: event UploadedKYC(_owner address, kycHash string) +func (_XDCValidator *XDCValidatorFilterer) WatchUploadedKYC(opts *bind.WatchOpts, sink chan<- *XDCValidatorUploadedKYC) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "UploadedKYC") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorUploadedKYC) + if err := _XDCValidator.contract.UnpackLog(event, "UploadedKYC", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorVoteIterator is returned from FilterVote and is used to iterate over the raw logs and unpacked data for Vote events raised by the XDCValidator contract. +type XDCValidatorVoteIterator struct { + Event *XDCValidatorVote // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorVoteIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorVote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorVote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorVoteIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorVoteIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorVote represents a Vote event raised by the XDCValidator contract. +type XDCValidatorVote struct { + Voter common.Address + Candidate common.Address + Cap *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterVote is a free log retrieval operation binding the contract event 0x66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc. +// +// Solidity: event Vote(_voter address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) FilterVote(opts *bind.FilterOpts) (*XDCValidatorVoteIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Vote") + if err != nil { + return nil, err + } + return &XDCValidatorVoteIterator{contract: _XDCValidator.contract, event: "Vote", logs: logs, sub: sub}, nil +} + +// WatchVote is a free log subscription operation binding the contract event 0x66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc. +// +// Solidity: event Vote(_voter address, _candidate address, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) WatchVote(opts *bind.WatchOpts, sink chan<- *XDCValidatorVote) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Vote") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorVote) + if err := _XDCValidator.contract.UnpackLog(event, "Vote", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// XDCValidatorWithdrawIterator is returned from FilterWithdraw and is used to iterate over the raw logs and unpacked data for Withdraw events raised by the XDCValidator contract. +type XDCValidatorWithdrawIterator struct { + Event *XDCValidatorWithdraw // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *XDCValidatorWithdrawIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(XDCValidatorWithdraw) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(XDCValidatorWithdraw) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *XDCValidatorWithdrawIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *XDCValidatorWithdrawIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// XDCValidatorWithdraw represents a Withdraw event raised by the XDCValidator contract. +type XDCValidatorWithdraw struct { + Owner common.Address + BlockNumber *big.Int + Cap *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWithdraw is a free log retrieval operation binding the contract event 0xf279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568. +// +// Solidity: event Withdraw(_owner address, _blockNumber uint256, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) FilterWithdraw(opts *bind.FilterOpts) (*XDCValidatorWithdrawIterator, error) { + + logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Withdraw") + if err != nil { + return nil, err + } + return &XDCValidatorWithdrawIterator{contract: _XDCValidator.contract, event: "Withdraw", logs: logs, sub: sub}, nil +} + +// WatchWithdraw is a free log subscription operation binding the contract event 0xf279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568. +// +// Solidity: event Withdraw(_owner address, _blockNumber uint256, _cap uint256) +func (_XDCValidator *XDCValidatorFilterer) WatchWithdraw(opts *bind.WatchOpts, sink chan<- *XDCValidatorWithdraw) (event.Subscription, error) { + + logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Withdraw") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(XDCValidatorWithdraw) + if err := _XDCValidator.contract.UnpackLog(event, "Withdraw", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} From 9a887d24d3ebf9ba36e3fb69cd324891e660a699 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:59:57 +0400 Subject: [PATCH 131/144] update --- contracts/validator/contract_v2/src/README.md | 4 ++-- .../validator/contract_v2/{validator.go => validator_v2.go} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename contracts/validator/contract_v2/{validator.go => validator_v2.go} (100%) diff --git a/contracts/validator/contract_v2/src/README.md b/contracts/validator/contract_v2/src/README.md index e4a96cf27de9..9573c023f30a 100644 --- a/contracts/validator/contract_v2/src/README.md +++ b/contracts/validator/contract_v2/src/README.md @@ -35,12 +35,12 @@ node scripts/deployToGenesis.js 2. run ```shell -./abigen --abi abi --bin bytecode --pkg contract --type XDCValidator --out ../validator.go +./abigen --abi abi --bin bytecode --pkg contract --type XDCValidator --out ../validator_v2.go ``` If you don't have `abigen`, compile it. It's in `cmd/abigen/main.go` in XDC main repo (or Geth repo). -3. Go `../validator.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDPoSChain"` +3. Go `../validator_v2.go` change `github.com/ethereum/go-ethereum` to `ethereum "github.com/XinFinOrg/XDPoSChain"` ## Deploy contract to node any block diff --git a/contracts/validator/contract_v2/validator.go b/contracts/validator/contract_v2/validator_v2.go similarity index 100% rename from contracts/validator/contract_v2/validator.go rename to contracts/validator/contract_v2/validator_v2.go From d45d91c1263dff3730645b0aaa094aa4b121231e Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 20 Aug 2024 11:09:00 +0400 Subject: [PATCH 132/144] update --- common/types.go | 1 + consensus/XDPoS/XDPoS.go | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/common/types.go b/common/types.go index c7abab289b9a..0185af8958b5 100644 --- a/common/types.go +++ b/common/types.go @@ -48,6 +48,7 @@ const ( SignMethod = "0xe341eaa4" XDCXApplyMethod = "0xc6b32f34" XDCZApplyMethod = "0xc6b32f34" + XDCValidatorV2Code = "0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029" ) var ( diff --git a/consensus/XDPoS/XDPoS.go b/consensus/XDPoS/XDPoS.go index eb976ca60370..0de2eb86ce3d 100644 --- a/consensus/XDPoS/XDPoS.go +++ b/consensus/XDPoS/XDPoS.go @@ -272,6 +272,12 @@ func (x *XDPoS) Prepare(chain consensus.ChainReader, header *types.Header) error // Finalize implements consensus.Engine, ensuring no uncles are set, nor block // rewards given, and returns the final block. func (x *XDPoS) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, parentState *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { + number := header.Number.Uint64() + log.Info("poc", "fun", "Finalize", "number", number) + if number == 99999999999 { + UpgradeXDCValidtorV2(state) + } + switch x.config.BlockConsensusVersion(header.Number, header.Extra, ExtraFieldCheck) { case params.ConsensusEngineVersion2: return x.EngineV2.Finalize(chain, header, state, parentState, txs, uncles, receipts) @@ -560,3 +566,12 @@ func (x *XDPoS) GetEpochSwitchInfoBetween(chain consensus.ChainReader, begin, en // Default "v1" return nil, errors.New("not supported in the v1 consensus") } + +func UpgradeXDCValidtorV2(statedb *state.StateDB) { + log.Info("poc", "MasternodeVotingSMC", common.MasternodeVotingSMC, "step", 1) + addr := common.HexToAddress(common.MasternodeVotingSMC) + // upgrade code + statedb.SetCode(addr, common.FromHex(common.XDCValidatorV2Code)) + log.Info("poc", "MasternodeVotingSMC", common.XDCValidatorV2Code, "step", 2) + +} From ac42174aa48d0b6689bb90569ffe3cf847eca773 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Wed, 28 Aug 2024 07:48:29 +0400 Subject: [PATCH 133/144] Update types.go --- common/types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/types.go b/common/types.go index 0185af8958b5..b2ee86ec510e 100644 --- a/common/types.go +++ b/common/types.go @@ -48,7 +48,7 @@ const ( SignMethod = "0xe341eaa4" XDCXApplyMethod = "0xc6b32f34" XDCZApplyMethod = "0xc6b32f34" - XDCValidatorV2Code = "0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029" + XDCValidatorV2Code = "0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058202d2b261fc54b86312f961b1aa09e979c6f856a164967a71bddacf098a2d282900029" ) var ( From f8fda4b9e6e3a910ba8b69a4382918f7f2458ff5 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:13:14 +0400 Subject: [PATCH 134/144] Update deployToGenesis.js --- .../validator/contract_v2/src/scripts/deployToGenesis.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/contracts/validator/contract_v2/src/scripts/deployToGenesis.js b/contracts/validator/contract_v2/src/scripts/deployToGenesis.js index 305d56ba70dd..cd559f785e66 100644 --- a/contracts/validator/contract_v2/src/scripts/deployToGenesis.js +++ b/contracts/validator/contract_v2/src/scripts/deployToGenesis.js @@ -3,6 +3,7 @@ const fs = require("fs"); const abi = XDCValidator["abi"]; const bytecode = XDCValidator["bytecode"]; +const deployedBytecode = XDCValidator["deployedBytecode"]; fs.writeFile("./abi", JSON.stringify(abi, null, 3), "utf8", function (error) { if (error) { @@ -18,3 +19,10 @@ fs.writeFile("./bytecode", bytecode, "utf8", function (error) { } console.log("Write success "); }); +fs.writeFile("./deployedBytecode", deployedBytecode, "utf8", function (error) { + if (error) { + console.log(error); + return false; + } + console.log("Write success "); +}); \ No newline at end of file From 638c6b7b9b3bc24c276e8df7c6fdcc357cb972eb Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:56:13 +0400 Subject: [PATCH 135/144] Update types.go --- common/types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/types.go b/common/types.go index b2ee86ec510e..e6a24aa502e0 100644 --- a/common/types.go +++ b/common/types.go @@ -48,7 +48,7 @@ const ( SignMethod = "0xe341eaa4" XDCXApplyMethod = "0xc6b32f34" XDCZApplyMethod = "0xc6b32f34" - XDCValidatorV2Code = "0x608060405260006009556000600a553480156200001b57600080fd5b506040516200325e3803806200325e83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612f2d80620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058202d2b261fc54b86312f961b1aa09e979c6f856a164967a71bddacf098a2d282900029" + XDCValidatorV2Code = "0x6080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058202d2b261fc54b86312f961b1aa09e979c6f856a164967a71bddacf098a2d282900029" ) var ( From c512408a324bfa62fd971a1ab4a13a122ed70850 Mon Sep 17 00:00:00 2001 From: Gary Date: Fri, 30 Aug 2024 15:31:14 +0800 Subject: [PATCH 136/144] right place to upgrade --- consensus/XDPoS/XDPoS.go | 7 +------ consensus/XDPoS/engines/engine_v2/engine.go | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/consensus/XDPoS/XDPoS.go b/consensus/XDPoS/XDPoS.go index 0de2eb86ce3d..64f00a8af2e6 100644 --- a/consensus/XDPoS/XDPoS.go +++ b/consensus/XDPoS/XDPoS.go @@ -272,12 +272,6 @@ func (x *XDPoS) Prepare(chain consensus.ChainReader, header *types.Header) error // Finalize implements consensus.Engine, ensuring no uncles are set, nor block // rewards given, and returns the final block. func (x *XDPoS) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, parentState *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { - number := header.Number.Uint64() - log.Info("poc", "fun", "Finalize", "number", number) - if number == 99999999999 { - UpgradeXDCValidtorV2(state) - } - switch x.config.BlockConsensusVersion(header.Number, header.Extra, ExtraFieldCheck) { case params.ConsensusEngineVersion2: return x.EngineV2.Finalize(chain, header, state, parentState, txs, uncles, receipts) @@ -575,3 +569,4 @@ func UpgradeXDCValidtorV2(statedb *state.StateDB) { log.Info("poc", "MasternodeVotingSMC", common.XDCValidatorV2Code, "step", 2) } + diff --git a/consensus/XDPoS/engines/engine_v2/engine.go b/consensus/XDPoS/engines/engine_v2/engine.go index c2235f5d32a9..63515c0b2b04 100644 --- a/consensus/XDPoS/engines/engine_v2/engine.go +++ b/consensus/XDPoS/engines/engine_v2/engine.go @@ -394,6 +394,13 @@ func (x *XDPoS_v2) Finalize(chain consensus.ChainReader, header *types.Header, s } } + // upgrade smart contract after reward distribution + number := header.Number.Uint64() + log.Info("poc", "fun", "Finalize", "number", number) + if number == 99999999999 { + UpgradeXDCValidtorV2(state) + } + // the state remains as is and uncles are dropped header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) header.UncleHash = types.CalcUncleHash(nil) @@ -1111,3 +1118,11 @@ func (x *XDPoS_v2) periodicJob() { func (x *XDPoS_v2) GetLatestCommittedBlockInfo() *types.BlockInfo { return x.highestCommitBlock } + +func UpgradeXDCValidtorV2(statedb *state.StateDB) { + log.Info("poc", "MasternodeVotingSMC", common.MasternodeVotingSMC, "step", 1) + addr := common.HexToAddress(common.MasternodeVotingSMC) + // upgrade code + statedb.SetCode(addr, common.FromHex(common.XDCValidatorV2Code)) + log.Info("poc", "MasternodeVotingSMC", common.XDCValidatorV2Code, "step", 2) +} From 64dfda088f7fefb1d3397f52ad238e32c94f9f01 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 2 Sep 2024 11:30:36 +0400 Subject: [PATCH 137/144] Update XDPoS.go --- consensus/XDPoS/XDPoS.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/consensus/XDPoS/XDPoS.go b/consensus/XDPoS/XDPoS.go index 64f00a8af2e6..eb976ca60370 100644 --- a/consensus/XDPoS/XDPoS.go +++ b/consensus/XDPoS/XDPoS.go @@ -560,13 +560,3 @@ func (x *XDPoS) GetEpochSwitchInfoBetween(chain consensus.ChainReader, begin, en // Default "v1" return nil, errors.New("not supported in the v1 consensus") } - -func UpgradeXDCValidtorV2(statedb *state.StateDB) { - log.Info("poc", "MasternodeVotingSMC", common.MasternodeVotingSMC, "step", 1) - addr := common.HexToAddress(common.MasternodeVotingSMC) - // upgrade code - statedb.SetCode(addr, common.FromHex(common.XDCValidatorV2Code)) - log.Info("poc", "MasternodeVotingSMC", common.XDCValidatorV2Code, "step", 2) - -} - From 4e5adf02052999865ad8af0367d2dbdbed55951a Mon Sep 17 00:00:00 2001 From: Liam Lai Date: Thu, 12 Sep 2024 19:28:39 -0700 Subject: [PATCH 138/144] add ValidtorV2SMCBlock constant and setup devnet block --- common/constants.go | 1 + common/constants/constants.go.devnet | 2 ++ common/constants/constants.go.testnet | 1 + consensus/XDPoS/engines/engine_v2/engine.go | 2 +- 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/common/constants.go b/common/constants.go index e3e2d8c04de5..642f8f6431dc 100644 --- a/common/constants.go +++ b/common/constants.go @@ -52,6 +52,7 @@ var BerlinBlock = big.NewInt(76321000) // Target 19th June 2024 var LondonBlock = big.NewInt(76321000) // Target 19th June 2024 var MergeBlock = big.NewInt(76321000) // Target 19th June 2024 var ShanghaiBlock = big.NewInt(76321000) // Target 19th June 2024 +var ValidtorV2SMCBlock = big.NewInt(9999999999) var TIPXDCXTestnet = big.NewInt(38383838) var IsTestnet bool = false diff --git a/common/constants/constants.go.devnet b/common/constants/constants.go.devnet index d0a585cc9a76..b863edae0909 100644 --- a/common/constants/constants.go.devnet +++ b/common/constants/constants.go.devnet @@ -52,6 +52,7 @@ var LondonBlock = big.NewInt(16832700) var MergeBlock = big.NewInt(16832700) var ShanghaiBlock = big.NewInt(16832700) var Eip1559Block = big.NewInt(9999999999) +var ValidtorV2SMCBlock = big.NewInt(22320000) var TIPXDCXTestnet = big.NewInt(0) var IsTestnet bool = false @@ -77,6 +78,7 @@ var TRC21IssuerSMCTestNet = HexToAddress("0x0E2C88753131CE01c7551B726b28BFD04e44 var TRC21IssuerSMC = HexToAddress("0x8c0faeb5C6bEd2129b8674F262Fd45c4e9468bee") var XDCXListingSMC = HexToAddress("0xDE34dD0f536170993E8CFF639DdFfCF1A85D3E53") var XDCXListingSMCTestNet = HexToAddress("0x14B2Bf043b9c31827A472CE4F94294fE9a6277e0") + var TRC21GasPriceBefore = big.NewInt(2500) var TRC21GasPrice = big.NewInt(250000000) var RateTopUp = big.NewInt(90) // 90% diff --git a/common/constants/constants.go.testnet b/common/constants/constants.go.testnet index a7e9fb64ba46..ecf7e91e6cfd 100644 --- a/common/constants/constants.go.testnet +++ b/common/constants/constants.go.testnet @@ -52,6 +52,7 @@ var LondonBlock = big.NewInt(61290000) var MergeBlock = big.NewInt(61290000) var ShanghaiBlock = big.NewInt(61290000) // Target 31st March 2024 var Eip1559Block = big.NewInt(9999999999) +var ValidtorV2SMCBlock = big.NewInt(9999999999) var TIPXDCXTestnet = big.NewInt(23779191) var IsTestnet bool = true diff --git a/consensus/XDPoS/engines/engine_v2/engine.go b/consensus/XDPoS/engines/engine_v2/engine.go index 63515c0b2b04..99b0ce25f199 100644 --- a/consensus/XDPoS/engines/engine_v2/engine.go +++ b/consensus/XDPoS/engines/engine_v2/engine.go @@ -397,7 +397,7 @@ func (x *XDPoS_v2) Finalize(chain consensus.ChainReader, header *types.Header, s // upgrade smart contract after reward distribution number := header.Number.Uint64() log.Info("poc", "fun", "Finalize", "number", number) - if number == 99999999999 { + if number == common.ValidtorV2SMCBlock.Uint64() { UpgradeXDCValidtorV2(state) } From 93eaa35078cdc56e04aced6d6ca992405ba5cbf2 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Fri, 20 Sep 2024 14:26:47 +0400 Subject: [PATCH 139/144] update --- .../contract_v2/migrate/test/.env.example | 2 + .../contract_v2/migrate/test/.gitignore | 7 + .../contract_v2/migrate/test/README.md | 7 + .../migrate/test/abi/validatorABI.json | 907 ++++++++++++++++++ .../contract_v2/migrate/test/package.json | 6 + .../migrate/test/scripts/claimKyc.js | 10 + .../migrate/test/scripts/constant.js | 44 + .../migrate/test/scripts/propose.js | 13 + .../migrate/test/scripts/resign.js | 13 + .../migrate/test/scripts/unvote.js | 19 + .../migrate/test/scripts/uploadKyc.js | 11 + .../contract_v2/migrate/test/scripts/vote.js | 28 + .../migrate/test/scripts/voteInvalidKyc.js | 12 + 13 files changed, 1079 insertions(+) create mode 100644 contracts/validator/contract_v2/migrate/test/.env.example create mode 100644 contracts/validator/contract_v2/migrate/test/.gitignore create mode 100644 contracts/validator/contract_v2/migrate/test/README.md create mode 100644 contracts/validator/contract_v2/migrate/test/abi/validatorABI.json create mode 100644 contracts/validator/contract_v2/migrate/test/package.json create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/claimKyc.js create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/constant.js create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/propose.js create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/resign.js create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/unvote.js create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/uploadKyc.js create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/vote.js create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/voteInvalidKyc.js diff --git a/contracts/validator/contract_v2/migrate/test/.env.example b/contracts/validator/contract_v2/migrate/test/.env.example new file mode 100644 index 000000000000..fd9f6264f140 --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/.env.example @@ -0,0 +1,2 @@ +PRIVATE_KEY=0x0000 +RPC_URL=https://devnetstats.apothem.network/devnet \ No newline at end of file diff --git a/contracts/validator/contract_v2/migrate/test/.gitignore b/contracts/validator/contract_v2/migrate/test/.gitignore new file mode 100644 index 000000000000..1ee02f4ea0d2 --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/.gitignore @@ -0,0 +1,7 @@ +.env +cache/ +artifacts/ +node_modules/ +.vscode/ +abigen +yarn.lock \ No newline at end of file diff --git a/contracts/validator/contract_v2/migrate/test/README.md b/contracts/validator/contract_v2/migrate/test/README.md new file mode 100644 index 000000000000..da43d564143e --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/README.md @@ -0,0 +1,7 @@ +set RPC_URL and PRIVETE_KEY in .env + +run node scripts/propose.js +run node scripts/resign.js +run node scripts/vote.js +run node scripts/unvote.js + diff --git a/contracts/validator/contract_v2/migrate/test/abi/validatorABI.json b/contracts/validator/contract_v2/migrate/test/abi/validatorABI.json new file mode 100644 index 000000000000..9c8783eca9ac --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/abi/validatorABI.json @@ -0,0 +1,907 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "propose", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "owners", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + }, + { + "name": "_cap", + "type": "uint256" + } + ], + "name": "unvote", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getCandidates", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "removeCandidatesZeroAddresses", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "ownerCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "address" + } + ], + "name": "hasVotedInvalid", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_blockNumber", + "type": "uint256" + } + ], + "name": "getWithdrawCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "pendingKYC", + "outputs": [ + { + "name": "blockNumber", + "type": "uint256" + }, + { + "name": "kycHash", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "uint256" + } + ], + "name": "ownerToCandidate", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "getVoters", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "owner", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + }, + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getWithdrawBlockNumbers", + "outputs": [ + { + "name": "", + "type": "uint256[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + }, + { + "name": "_voter", + "type": "address" + } + ], + "name": "getVoterCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "name": "getLatestKYC", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "candidates", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "validatorsState", + "outputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "isCandidate", + "type": "bool" + }, + { + "name": "cap", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_blockNumber", + "type": "uint256" + }, + { + "name": "_index", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "getCandidateCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "invalidPercent", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "uint256" + } + ], + "name": "KYCString", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "uint256" + } + ], + "name": "voters", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "name": "getOwnerToCandidateLength", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "removeOwnersZeroAddresses", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "vote", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidKYCCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "claimKYC", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "candidateCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "voterWithdrawDelay", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "resign", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidCandidate", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "getCandidateOwner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "name": "getHashCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "maxValidatorNumber", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "candidateWithdrawDelay", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_candidate", + "type": "address" + } + ], + "name": "isCandidate", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "minCandidateCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwnerCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "voteInvalidKYC", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "kychash", + "type": "string" + } + ], + "name": "uploadKYC", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "minVoterCap", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "name": "_candidates", + "type": "address[]" + }, + { + "name": "_caps", + "type": "uint256[]" + }, + { + "name": "_firstOwner", + "type": "address" + }, + { + "name": "_minCandidateCap", + "type": "uint256" + }, + { + "name": "_minVoterCap", + "type": "uint256" + }, + { + "name": "_maxValidatorNumber", + "type": "uint256" + }, + { + "name": "_candidateWithdrawDelay", + "type": "uint256" + }, + { + "name": "_voterWithdrawDelay", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_voter", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Vote", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_voter", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Unvote", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Propose", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "_candidate", + "type": "address" + } + ], + "name": "Resign", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "_blockNumber", + "type": "uint256" + }, + { + "indexed": false, + "name": "_cap", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_owner", + "type": "address" + }, + { + "indexed": false, + "name": "kycHash", + "type": "string" + } + ], + "name": "UploadedKYC", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_masternodeOwner", + "type": "address" + }, + { + "indexed": false, + "name": "_masternodes", + "type": "address[]" + } + ], + "name": "InvalidatedNode", + "type": "event" + } +] diff --git a/contracts/validator/contract_v2/migrate/test/package.json b/contracts/validator/contract_v2/migrate/test/package.json new file mode 100644 index 000000000000..5c8eb63a64b9 --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "viem": "^2.21.10" + } +} diff --git a/contracts/validator/contract_v2/migrate/test/scripts/claimKyc.js b/contracts/validator/contract_v2/migrate/test/scripts/claimKyc.js new file mode 100644 index 000000000000..b3ae62a3a572 --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/claimKyc.js @@ -0,0 +1,10 @@ +const { walletClient, validator } = require("./constant"); + +async function run() { + const res = await walletClient.writeContract({ + ...validator, + functionName: "cliamKYC", + }); +} + +run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/constant.js b/contracts/validator/contract_v2/migrate/test/scripts/constant.js new file mode 100644 index 000000000000..826715b1a867 --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/constant.js @@ -0,0 +1,44 @@ +const { createPublicClient, http, createWalletClient } = require("viem"); +const { privateKeyToAccount } = require("viem/accounts"); +const validatorABI = require("../abi/validatorABI.json"); +require("dotenv").config(); +const privateKey = process.env.PRIVATE_KEY; +const rpcUrl = process.env.RPC_URL; +const xdc = { + id: 551, + name: "XDC Devnet", + network: "XDC Devnet", + nativeCurrency: { + decimals: 18, + name: "XDC", + symbol: "XDC", + }, + rpcUrls: { + public: { http: [rpcUrl] }, + default: { http: [rpcUrl] }, + }, +}; + +const account = privateKeyToAccount(privateKey); + +const publicClient = createPublicClient({ + chain: xdc, + transport: http(rpcUrl), +}); + +const walletClient = createWalletClient({ + chain: xdc, + transport: http(rpcUrl), + account, +}); + +const validator = { + address: "0x0000000000000000000000000000000000000088", + abi: validatorABI, +}; + +module.exports = { + publicClient, + walletClient, + validator, +}; diff --git a/contracts/validator/contract_v2/migrate/test/scripts/propose.js b/contracts/validator/contract_v2/migrate/test/scripts/propose.js new file mode 100644 index 000000000000..9f4189616d51 --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/propose.js @@ -0,0 +1,13 @@ +const { walletClient, validator } = require("./constant"); + +async function run() { + const res = await walletClient.writeContract({ + ...validator, + functionName: "propose", + args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], + value: "10000000000000000000000000", + }); + console.log(res); +} + +run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/resign.js b/contracts/validator/contract_v2/migrate/test/scripts/resign.js new file mode 100644 index 000000000000..7c7649230319 --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/resign.js @@ -0,0 +1,13 @@ +const { walletClient, validator } = require("./constant"); + +async function run() { + const res = await walletClient.writeContract({ + ...validator, + functionName: "resign", + args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], + + }); + console.log(res); +} + +run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/unvote.js b/contracts/validator/contract_v2/migrate/test/scripts/unvote.js new file mode 100644 index 000000000000..1e728c5e8bda --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/unvote.js @@ -0,0 +1,19 @@ +const { walletClient, validator } = require("./constant"); + +async function run() { + const res = await walletClient.writeContract({ + ...validator, + functionName: "propose", + args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], + value: "10000000000000000000000000", + }); + + await walletClient.writeContract({ + ...validator, + functionName: "vote", + args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], + value: "10000000000000000000000000", + }); +} + +run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/uploadKyc.js b/contracts/validator/contract_v2/migrate/test/scripts/uploadKyc.js new file mode 100644 index 000000000000..7df76ebaecf0 --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/uploadKyc.js @@ -0,0 +1,11 @@ +const { walletClient, validator } = require("./constant"); + +async function run() { + const res = await walletClient.writeContract({ + ...validator, + functionName: "uploadKYC", + args: ["hello"], + }); +} + +run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/vote.js b/contracts/validator/contract_v2/migrate/test/scripts/vote.js new file mode 100644 index 000000000000..81f2c1cb725b --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/vote.js @@ -0,0 +1,28 @@ +const { walletClient, validator } = require("./constant"); + +async function run() { + const res = await walletClient.writeContract({ + ...validator, + functionName: "propose", + args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], + value: "10000000000000000000000000", + }); + + await walletClient.writeContract({ + ...validator, + functionName: "vote", + args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], + value: "10000000000000000000000000", + }); + + await walletClient.writeContract({ + ...validator, + functionName: "unvote", + args: [ + "0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b", + "10000000000000000000000000", + ], + }); +} + +run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/voteInvalidKyc.js b/contracts/validator/contract_v2/migrate/test/scripts/voteInvalidKyc.js new file mode 100644 index 000000000000..3d872959ae1a --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/voteInvalidKyc.js @@ -0,0 +1,12 @@ +const { walletClient, validator } = require("./constant"); + +async function run() { + owner = ""; + await walletClient.writeContract({ + ...validator, + functionName: "voteInvalidKYC", + args: [owner], + }); +} + +run(); From afe096a8ad8ea32a000cc8ddc4864e2a1fbb2cc1 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 21 Sep 2024 11:24:12 +0400 Subject: [PATCH 140/144] update test flow --- .../contract_v2/migrate/test/.env.example | 6 +- .../contract_v2/migrate/test/README.md | 8 +- .../migrate/test/scripts/claimKyc.js | 10 -- .../migrate/test/scripts/constant.js | 26 ++++- .../migrate/test/scripts/propose.js | 13 --- .../migrate/test/scripts/resign.js | 13 --- .../test/scripts/testKycInvalidFlow.js | 97 +++++++++++++++++++ .../migrate/test/scripts/testMainWorkFlow.js | 85 ++++++++++++++++ .../migrate/test/scripts/unvote.js | 19 ---- .../migrate/test/scripts/uploadKyc.js | 11 --- .../contract_v2/migrate/test/scripts/vote.js | 28 ------ .../migrate/test/scripts/voteInvalidKyc.js | 12 --- 12 files changed, 214 insertions(+), 114 deletions(-) delete mode 100644 contracts/validator/contract_v2/migrate/test/scripts/claimKyc.js delete mode 100644 contracts/validator/contract_v2/migrate/test/scripts/propose.js delete mode 100644 contracts/validator/contract_v2/migrate/test/scripts/resign.js create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/testMainWorkFlow.js delete mode 100644 contracts/validator/contract_v2/migrate/test/scripts/unvote.js delete mode 100644 contracts/validator/contract_v2/migrate/test/scripts/uploadKyc.js delete mode 100644 contracts/validator/contract_v2/migrate/test/scripts/vote.js delete mode 100644 contracts/validator/contract_v2/migrate/test/scripts/voteInvalidKyc.js diff --git a/contracts/validator/contract_v2/migrate/test/.env.example b/contracts/validator/contract_v2/migrate/test/.env.example index fd9f6264f140..3da6401efc2b 100644 --- a/contracts/validator/contract_v2/migrate/test/.env.example +++ b/contracts/validator/contract_v2/migrate/test/.env.example @@ -1,2 +1,6 @@ -PRIVATE_KEY=0x0000 +M1_PRIVATE_KEY=0x0000 +M2_PRIVATE_KEY=0x +M3_PRIVATE_KEY=0x +M4_PRIVATE_KEY=0x +M5_PRIVATE_KEY=0x RPC_URL=https://devnetstats.apothem.network/devnet \ No newline at end of file diff --git a/contracts/validator/contract_v2/migrate/test/README.md b/contracts/validator/contract_v2/migrate/test/README.md index da43d564143e..25a4a72c9541 100644 --- a/contracts/validator/contract_v2/migrate/test/README.md +++ b/contracts/validator/contract_v2/migrate/test/README.md @@ -1,7 +1,7 @@ set RPC_URL and PRIVETE_KEY in .env -run node scripts/propose.js -run node scripts/resign.js -run node scripts/vote.js -run node scripts/unvote.js +PRIVETE_KEY pls use masternode privatekey + +run node scripts/testMainWorkFlow.js + diff --git a/contracts/validator/contract_v2/migrate/test/scripts/claimKyc.js b/contracts/validator/contract_v2/migrate/test/scripts/claimKyc.js deleted file mode 100644 index b3ae62a3a572..000000000000 --- a/contracts/validator/contract_v2/migrate/test/scripts/claimKyc.js +++ /dev/null @@ -1,10 +0,0 @@ -const { walletClient, validator } = require("./constant"); - -async function run() { - const res = await walletClient.writeContract({ - ...validator, - functionName: "cliamKYC", - }); -} - -run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/constant.js b/contracts/validator/contract_v2/migrate/test/scripts/constant.js index 826715b1a867..e8659c48daaf 100644 --- a/contracts/validator/contract_v2/migrate/test/scripts/constant.js +++ b/contracts/validator/contract_v2/migrate/test/scripts/constant.js @@ -2,7 +2,12 @@ const { createPublicClient, http, createWalletClient } = require("viem"); const { privateKeyToAccount } = require("viem/accounts"); const validatorABI = require("../abi/validatorABI.json"); require("dotenv").config(); -const privateKey = process.env.PRIVATE_KEY; +const m1PrivateKey = process.env.M1_PRIVATE_KEY; +const m2PrivateKey = process.env.M2_PRIVATE_KEY; +const m3PrivateKey = process.env.M3_PRIVATE_KEY; +const m4PrivateKey = process.env.M4_PRIVATE_KEY; +const m5PrivateKey = process.env.M5_PRIVATE_KEY; + const rpcUrl = process.env.RPC_URL; const xdc = { id: 551, @@ -19,7 +24,11 @@ const xdc = { }, }; -const account = privateKeyToAccount(privateKey); +const masternode1 = privateKeyToAccount(m1PrivateKey); +const masternode2 = privateKeyToAccount(m2PrivateKey); +const masternode3 = privateKeyToAccount(m3PrivateKey); +const masternode4 = privateKeyToAccount(m4PrivateKey); +const masternode5 = privateKeyToAccount(m5PrivateKey); const publicClient = createPublicClient({ chain: xdc, @@ -29,7 +38,6 @@ const publicClient = createPublicClient({ const walletClient = createWalletClient({ chain: xdc, transport: http(rpcUrl), - account, }); const validator = { @@ -37,8 +45,20 @@ const validator = { abi: validatorABI, }; +function expect(condition, message) { + if (!condition) { + throw new Error(message || "Assertion failed"); + } +} + module.exports = { publicClient, walletClient, validator, + expect, + masternode1, + masternode2, + masternode3, + masternode4, + masternode5, }; diff --git a/contracts/validator/contract_v2/migrate/test/scripts/propose.js b/contracts/validator/contract_v2/migrate/test/scripts/propose.js deleted file mode 100644 index 9f4189616d51..000000000000 --- a/contracts/validator/contract_v2/migrate/test/scripts/propose.js +++ /dev/null @@ -1,13 +0,0 @@ -const { walletClient, validator } = require("./constant"); - -async function run() { - const res = await walletClient.writeContract({ - ...validator, - functionName: "propose", - args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], - value: "10000000000000000000000000", - }); - console.log(res); -} - -run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/resign.js b/contracts/validator/contract_v2/migrate/test/scripts/resign.js deleted file mode 100644 index 7c7649230319..000000000000 --- a/contracts/validator/contract_v2/migrate/test/scripts/resign.js +++ /dev/null @@ -1,13 +0,0 @@ -const { walletClient, validator } = require("./constant"); - -async function run() { - const res = await walletClient.writeContract({ - ...validator, - functionName: "resign", - args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], - - }); - console.log(res); -} - -run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js b/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js new file mode 100644 index 000000000000..5f30266e1e9f --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js @@ -0,0 +1,97 @@ +const { + walletClient, + validator, + publicClient, + expect, + masternode1, + masternode2, + masternode3, + masternode4, + masternode5, +} = require("./constant"); +const { generatePrivateKey, privateKeyToAccount } = require("viem/accounts"); + +async function run() { + const privateKey = generatePrivateKey(); + const newCandidate = privateKeyToAccount(privateKey); + + const minCandidateCap = 10000000000000000000000000n; + + await walletClient.writeContract({ + ...validator, + functionName: "propose", + args: [newCandidate.address], + value: minCandidateCap, + account: masternode1, + }); + + await walletClient.sendTransaction({ + to: newCandidate.address, + value: minCandidateCap, + account: masternode1, + }); + + await walletClient.writeContract({ + ...validator, + functionName: "uploadKYC", + args: ["hello"], + account: newCandidate.address, + }); + + const pendingKYC = await publicClient.readContract({ + ...validator, + functionName: "pendingKYC", + args: [newCandidate.address], + }); + + expect(pendingKYC[1] == "hello", "kyc info is not correctly"); + + const ownerCount = await publicClient.readContract({ + ...validator, + functionName: "getOwnerCount", + args: [], + }); + + console.log( + "ownerCount ", + ownerCount, + " it need " + + Math.ceil(0.75 * ownerCount?.toString()) + + " owners to vote invalid kyc" + ); + + await walletClient.writeContract({ + ...validator, + functionName: "voteInvalidKYC", + args: [masternode1.address], + account: masternode2, + }); + await walletClient.writeContract({ + ...validator, + functionName: "voteInvalidKYC", + args: [masternode1.address], + account: masternode3, + }); + await walletClient.writeContract({ + ...validator, + functionName: "voteInvalidKYC", + args: [masternode1.address], + account: masternode4, + }); + await walletClient.writeContract({ + ...validator, + functionName: "voteInvalidKYC", + args: [masternode1.address], + account: masternode5, + }); + + const pendingKYC2 = await publicClient.readContract({ + ...validator, + functionName: "pendingKYC", + args: [newCandidate.address], + }); + + expect(pendingKYC2[1] == "", "kyc info is not correctly"); +} + +run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/testMainWorkFlow.js b/contracts/validator/contract_v2/migrate/test/scripts/testMainWorkFlow.js new file mode 100644 index 000000000000..182f46ac4b58 --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/testMainWorkFlow.js @@ -0,0 +1,85 @@ +const { + walletClient, + publicClient, + validator, + expect, + masternode1, +} = require("./constant"); +const { generatePrivateKey, privateKeyToAccount } = require("viem/accounts"); + +async function run() { + const privateKey = generatePrivateKey(); + const newCandidate = privateKeyToAccount(privateKey); + + const minCandidateCap = 10000000000000000000000000n; + const minVoterCap = 10000000000000000000000000n; + + await walletClient.writeContract({ + ...validator, + functionName: "propose", + args: [newCandidate.address], + value: minCandidateCap, + account: masternode1, + }); + const candidates = await publicClient.readContract({ + ...validator, + functionName: "getCandidates", + }); + expect( + candidates.include(newCandidate.address), + "must include new candidate" + ); + + await walletClient.writeContract({ + ...validator, + functionName: "resign", + args: [newCandidate.address], + account: masternode1, + }); + + expect( + !candidates.include(newCandidate.address), + "must dont include new candidate" + ); + + await walletClient.writeContract({ + ...validator, + functionName: "propose", + args: [newCandidate.address], + value: minCandidateCap, + account: masternode1, + }); + + await walletClient.writeContract({ + ...validator, + functionName: "vote", + args: [newCandidate.address], + value: minVoterCap, + account: masternode1, + }); + + const validatorsState = await publicClient.readContract({ + ...validator, + functionName: "validatorsState", + args: [newCandidate.address], + }); + + expect(validatorsState[2] == minVoterCap + minCandidateCap, "cap not equal"); + + await walletClient.writeContract({ + ...validator, + functionName: "unvote", + args: [newCandidate.address, minVoterCap], + account: masternode1, + }); + + const validatorsState2 = await publicClient.readContract({ + ...validator, + functionName: "validatorsState", + args: [newCandidate.address], + }); + + expect(validatorsState2[2] == minCandidateCap, "cap not equal"); +} + +run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/unvote.js b/contracts/validator/contract_v2/migrate/test/scripts/unvote.js deleted file mode 100644 index 1e728c5e8bda..000000000000 --- a/contracts/validator/contract_v2/migrate/test/scripts/unvote.js +++ /dev/null @@ -1,19 +0,0 @@ -const { walletClient, validator } = require("./constant"); - -async function run() { - const res = await walletClient.writeContract({ - ...validator, - functionName: "propose", - args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], - value: "10000000000000000000000000", - }); - - await walletClient.writeContract({ - ...validator, - functionName: "vote", - args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], - value: "10000000000000000000000000", - }); -} - -run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/uploadKyc.js b/contracts/validator/contract_v2/migrate/test/scripts/uploadKyc.js deleted file mode 100644 index 7df76ebaecf0..000000000000 --- a/contracts/validator/contract_v2/migrate/test/scripts/uploadKyc.js +++ /dev/null @@ -1,11 +0,0 @@ -const { walletClient, validator } = require("./constant"); - -async function run() { - const res = await walletClient.writeContract({ - ...validator, - functionName: "uploadKYC", - args: ["hello"], - }); -} - -run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/vote.js b/contracts/validator/contract_v2/migrate/test/scripts/vote.js deleted file mode 100644 index 81f2c1cb725b..000000000000 --- a/contracts/validator/contract_v2/migrate/test/scripts/vote.js +++ /dev/null @@ -1,28 +0,0 @@ -const { walletClient, validator } = require("./constant"); - -async function run() { - const res = await walletClient.writeContract({ - ...validator, - functionName: "propose", - args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], - value: "10000000000000000000000000", - }); - - await walletClient.writeContract({ - ...validator, - functionName: "vote", - args: ["0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b"], - value: "10000000000000000000000000", - }); - - await walletClient.writeContract({ - ...validator, - functionName: "unvote", - args: [ - "0x2C7e9c9C48917a0386AB20791cdfA698B0BC976b", - "10000000000000000000000000", - ], - }); -} - -run(); diff --git a/contracts/validator/contract_v2/migrate/test/scripts/voteInvalidKyc.js b/contracts/validator/contract_v2/migrate/test/scripts/voteInvalidKyc.js deleted file mode 100644 index 3d872959ae1a..000000000000 --- a/contracts/validator/contract_v2/migrate/test/scripts/voteInvalidKyc.js +++ /dev/null @@ -1,12 +0,0 @@ -const { walletClient, validator } = require("./constant"); - -async function run() { - owner = ""; - await walletClient.writeContract({ - ...validator, - functionName: "voteInvalidKYC", - args: [owner], - }); -} - -run(); From 2f342a496d761d71183fb19b3421a2b618b62831 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Sat, 21 Sep 2024 11:27:31 +0400 Subject: [PATCH 141/144] Update README.md --- .../contract_v2/migrate/test/README.md | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/contracts/validator/contract_v2/migrate/test/README.md b/contracts/validator/contract_v2/migrate/test/README.md index 25a4a72c9541..6359c0f78c31 100644 --- a/contracts/validator/contract_v2/migrate/test/README.md +++ b/contracts/validator/contract_v2/migrate/test/README.md @@ -1,7 +1,59 @@ -set RPC_URL and PRIVETE_KEY in .env +Here's a `README.md` file that outlines the steps you've provided: -PRIVETE_KEY pls use masternode privatekey +```markdown +# Project Setup and Testing -run node scripts/testMainWorkFlow.js +This repository contains scripts for testing various workflows in a development environment. The steps below will guide you through setting up the environment, installing dependencies, and running tests. +## Prerequisites +- **Node.js**: Ensure that you have Node.js version 20 installed. +- **Yarn**: Yarn is used for managing dependencies. + +## Environment Setup + +1. **Create a `.env` file** in the root of your project directory. This file will contain the following environment variables: + + ```env + RPC_URL= + M1_PRIVETE_KEY= + M2_PRIVETE_KEY= + M3_PRIVETE_KEY= + M4_PRIVETE_KEY= + M5_PRIVETE_KEY= + ``` + + Replace the placeholders with the appropriate values. + +## Installation + +1. **Install dependencies** by running the following command: + + ```bash + yarn + ``` + + This will install all the required packages for the project. + +## Running Tests + +### Test Main Workflow + +To test the main workflow, execute the following command: + +```bash +node scripts/testMainWorkFlow.js +``` + +### Test KYC Invalid Flow + +To test the KYC invalid flow, execute the following command: + +```bash +node scripts/testKycInvalidFlow.js +``` + +## Notes + +- Ensure that the `.env` file is correctly configured with the required RPC URL and masternode private keys before running the tests. +- If any issues arise during the testing process, double-check the environment variables and dependency installation. From 0dabb6c1c8e6ded540b611a27a22c37e895080c5 Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 23 Sep 2024 12:29:27 +0400 Subject: [PATCH 142/144] update --- .../contract_v2/migrate/test/.env.example | 10 +++---- .../migrate/test/scripts/constant.js | 30 +++++++++---------- .../test/scripts/testKycInvalidFlow.js | 30 +++++++++---------- .../migrate/test/scripts/testMainWorkFlow.js | 12 ++++---- 4 files changed, 41 insertions(+), 41 deletions(-) diff --git a/contracts/validator/contract_v2/migrate/test/.env.example b/contracts/validator/contract_v2/migrate/test/.env.example index 3da6401efc2b..ab9a4e2a7fe2 100644 --- a/contracts/validator/contract_v2/migrate/test/.env.example +++ b/contracts/validator/contract_v2/migrate/test/.env.example @@ -1,6 +1,6 @@ -M1_PRIVATE_KEY=0x0000 -M2_PRIVATE_KEY=0x -M3_PRIVATE_KEY=0x -M4_PRIVATE_KEY=0x -M5_PRIVATE_KEY=0x +O1_PRIVATE_KEY=0x0000 +O2_PRIVATE_KEY=0x +O3_PRIVATE_KEY=0x +O4_PRIVATE_KEY=0x +O5_PRIVATE_KEY=0x RPC_URL=https://devnetstats.apothem.network/devnet \ No newline at end of file diff --git a/contracts/validator/contract_v2/migrate/test/scripts/constant.js b/contracts/validator/contract_v2/migrate/test/scripts/constant.js index e8659c48daaf..aab742b2f5c7 100644 --- a/contracts/validator/contract_v2/migrate/test/scripts/constant.js +++ b/contracts/validator/contract_v2/migrate/test/scripts/constant.js @@ -2,11 +2,11 @@ const { createPublicClient, http, createWalletClient } = require("viem"); const { privateKeyToAccount } = require("viem/accounts"); const validatorABI = require("../abi/validatorABI.json"); require("dotenv").config(); -const m1PrivateKey = process.env.M1_PRIVATE_KEY; -const m2PrivateKey = process.env.M2_PRIVATE_KEY; -const m3PrivateKey = process.env.M3_PRIVATE_KEY; -const m4PrivateKey = process.env.M4_PRIVATE_KEY; -const m5PrivateKey = process.env.M5_PRIVATE_KEY; +const o1PrivateKey = process.env.O1_PRIVATE_KEY; +const o2PrivateKey = process.env.O2_PRIVATE_KEY; +const o3PrivateKey = process.env.O3_PRIVATE_KEY; +const o4PrivateKey = process.env.O4_PRIVATE_KEY; +const o5PrivateKey = process.env.O5_PRIVATE_KEY; const rpcUrl = process.env.RPC_URL; const xdc = { @@ -24,11 +24,11 @@ const xdc = { }, }; -const masternode1 = privateKeyToAccount(m1PrivateKey); -const masternode2 = privateKeyToAccount(m2PrivateKey); -const masternode3 = privateKeyToAccount(m3PrivateKey); -const masternode4 = privateKeyToAccount(m4PrivateKey); -const masternode5 = privateKeyToAccount(m5PrivateKey); +const onwer1 = privateKeyToAccount(o1PrivateKey); +const onwer2 = privateKeyToAccount(o2PrivateKey); +const onwer3 = privateKeyToAccount(o3PrivateKey); +const onwe4 = privateKeyToAccount(o4PrivateKey); +const onwe5 = privateKeyToAccount(o5PrivateKey); const publicClient = createPublicClient({ chain: xdc, @@ -56,9 +56,9 @@ module.exports = { walletClient, validator, expect, - masternode1, - masternode2, - masternode3, - masternode4, - masternode5, + onwer1, + onwer2, + onwer3, + onwe4, + onwe5, }; diff --git a/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js b/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js index 5f30266e1e9f..71b035803ea5 100644 --- a/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js +++ b/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js @@ -3,11 +3,11 @@ const { validator, publicClient, expect, - masternode1, - masternode2, - masternode3, - masternode4, - masternode5, + onwer1, + onwer2, + onwer3, + onwe4, + onwe5, } = require("./constant"); const { generatePrivateKey, privateKeyToAccount } = require("viem/accounts"); @@ -22,13 +22,13 @@ async function run() { functionName: "propose", args: [newCandidate.address], value: minCandidateCap, - account: masternode1, + account: onwer1, }); await walletClient.sendTransaction({ to: newCandidate.address, value: minCandidateCap, - account: masternode1, + account: onwer1, }); await walletClient.writeContract({ @@ -63,26 +63,26 @@ async function run() { await walletClient.writeContract({ ...validator, functionName: "voteInvalidKYC", - args: [masternode1.address], - account: masternode2, + args: [onwer1.address], + account: onwer2, }); await walletClient.writeContract({ ...validator, functionName: "voteInvalidKYC", - args: [masternode1.address], - account: masternode3, + args: [onwer1.address], + account: onwer3, }); await walletClient.writeContract({ ...validator, functionName: "voteInvalidKYC", - args: [masternode1.address], - account: masternode4, + args: [onwer1.address], + account: onwe4, }); await walletClient.writeContract({ ...validator, functionName: "voteInvalidKYC", - args: [masternode1.address], - account: masternode5, + args: [onwer1.address], + account: onwe5, }); const pendingKYC2 = await publicClient.readContract({ diff --git a/contracts/validator/contract_v2/migrate/test/scripts/testMainWorkFlow.js b/contracts/validator/contract_v2/migrate/test/scripts/testMainWorkFlow.js index 182f46ac4b58..8497ecb66ade 100644 --- a/contracts/validator/contract_v2/migrate/test/scripts/testMainWorkFlow.js +++ b/contracts/validator/contract_v2/migrate/test/scripts/testMainWorkFlow.js @@ -3,7 +3,7 @@ const { publicClient, validator, expect, - masternode1, + onwer1, } = require("./constant"); const { generatePrivateKey, privateKeyToAccount } = require("viem/accounts"); @@ -19,7 +19,7 @@ async function run() { functionName: "propose", args: [newCandidate.address], value: minCandidateCap, - account: masternode1, + account: onwer1, }); const candidates = await publicClient.readContract({ ...validator, @@ -34,7 +34,7 @@ async function run() { ...validator, functionName: "resign", args: [newCandidate.address], - account: masternode1, + account: onwer1, }); expect( @@ -47,7 +47,7 @@ async function run() { functionName: "propose", args: [newCandidate.address], value: minCandidateCap, - account: masternode1, + account: onwer1, }); await walletClient.writeContract({ @@ -55,7 +55,7 @@ async function run() { functionName: "vote", args: [newCandidate.address], value: minVoterCap, - account: masternode1, + account: onwer1, }); const validatorsState = await publicClient.readContract({ @@ -70,7 +70,7 @@ async function run() { ...validator, functionName: "unvote", args: [newCandidate.address, minVoterCap], - account: masternode1, + account: onwer1, }); const validatorsState2 = await publicClient.readContract({ From 90c1a2c9f84616b83c7a561427f8788ca37abd5c Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:52:24 +0400 Subject: [PATCH 143/144] update --- contracts/validator/contract_v2/migrate/test/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/validator/contract_v2/migrate/test/README.md b/contracts/validator/contract_v2/migrate/test/README.md index 6359c0f78c31..d572c2797d22 100644 --- a/contracts/validator/contract_v2/migrate/test/README.md +++ b/contracts/validator/contract_v2/migrate/test/README.md @@ -16,11 +16,11 @@ This repository contains scripts for testing various workflows in a development ```env RPC_URL= - M1_PRIVETE_KEY= - M2_PRIVETE_KEY= - M3_PRIVETE_KEY= - M4_PRIVETE_KEY= - M5_PRIVETE_KEY= + M1_PRIVETE_KEY= + M2_PRIVETE_KEY= + M3_PRIVETE_KEY= + M4_PRIVETE_KEY= + M5_PRIVETE_KEY= ``` Replace the placeholders with the appropriate values. From 9204f089942236265214dd9a3ac19a8f31488fec Mon Sep 17 00:00:00 2001 From: Galaxy <30950645+GalaxySciTech@users.noreply.github.com> Date: Tue, 24 Sep 2024 11:43:20 +0400 Subject: [PATCH 144/144] update --- common/types.go | 1 + .../test/scripts/testKycInvalidFlow.js | 2 +- .../migrate/test/scripts/uploadKYC.js | 58 +++ contracts/validator/contract_v2/src/abi | 183 ++++++--- contracts/validator/contract_v2/src/bytecode | 2 +- .../src/contracts/XDCValidator.sol | 2 +- .../contract_v2/src/deployedBytecode | 1 + .../validator/contract_v2/validator_v2.go | 379 +++++++++++------- 8 files changed, 421 insertions(+), 207 deletions(-) create mode 100644 contracts/validator/contract_v2/migrate/test/scripts/uploadKYC.js create mode 100644 contracts/validator/contract_v2/src/deployedBytecode diff --git a/common/types.go b/common/types.go index 3b1847b49f3b..fd2e15852dbe 100644 --- a/common/types.go +++ b/common/types.go @@ -49,6 +49,7 @@ const ( XDCXApplyMethod = "0xc6b32f34" XDCZApplyMethod = "0xc6b32f34" XDCValidatorV2Code = "0x6080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612a32565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612a3816565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612a3816565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612a3816565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612a4e16565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612a4e16565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612a4e16565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612cfa565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612cfa565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612a3816565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612a3816565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612d5f565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612d5f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612a4e16565b60095561216a88612a60565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612dd9565b5061226e565b600190940193612183565b8654151561227f5761227f33612b54565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612a4e16565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612a3816565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612a3816565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612ee2833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612d5f565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612a4e16565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612dfd565b600160a060020a038b16600090815260066020526040812061283a91612e1e565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612cfa565b506128b288612c4d565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360009081526010602052604090205460ff16156129b7576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200183838080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612a2b926001850192910190612d5f565b5050505050565b600c5481565b600082820183811015612a4757fe5b9392505050565b600082821115612a5a57fe5b50900390565b60085460005b81811015612b4f5782600160a060020a0316600882815481101515612a8757fe5b600091825260209091200154600160a060020a03161415612b4757600880546000198401908110612ab457fe5b60009182526020909120015460088054600160a060020a039092169183908110612ada57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612b1557fe5b60009182526020909120018054600160a060020a03191690556008805490612b41906000198301612dd9565b50612b4f565b600101612a66565b505050565b60075460005b81811015612b4f5782600160a060020a0316600782815481101515612b7b57fe5b600091825260209091200154600160a060020a03161415612c4557600780546000198401908110612ba857fe5b60009182526020909120015460078054600160a060020a039092169183908110612bce57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612c0957fe5b60009182526020909120018054600160a060020a03191690556007805490612c35906000198301612dd9565b50600a8054600019019055612b4f565b600101612b5a565b600780546000198101919082908110612c6257fe5b60009182526020909120015460078054600160a060020a039092169184908110612c8857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612cbf57fe5b60009182526020909120018054600160a060020a03191690556007805490612ceb906000198301612dd9565b5050600a805460001901905550565b828054828255906000526020600020908101928215612d4f579160200282015b82811115612d4f5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612d1a565b50612d5b929150612e3c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612da057805160ff1916838001178555612dcd565b82800160010185558215612dcd579182015b82811115612dcd578251825591602001919060010190612db2565b50612d5b929150612e60565b815481835581811115612b4f57600083815260209020612b4f918101908301612e60565b5080546000825590600052602060002090810190612e1b9190612e7a565b50565b5080546000825590600052602060002090810190612e1b9190612e60565b610f9291905b80821115612d5b578054600160a060020a0319168155600101612e42565b610f9291905b80821115612d5b5760008155600101612e66565b610f9291905b80821115612d5b576000612e948282612e9d565b50600101612e80565b50805460018160011615610100020316600290046000825580601f10612ec35750612e1b565b601f016020900490600052602060002090810190612e1b9190612e605600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a723058202d2b261fc54b86312f961b1aa09e979c6f856a164967a71bddacf098a2d282900029" + XDCValidatorV3Code = "0x6080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612ac9565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612acf16565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612acf16565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612acf16565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612ae516565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612ae516565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612ae516565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612acf16565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612acf16565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612d91565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612d91565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612acf16565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612acf16565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612df6565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612df6565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612ae516565b60095561216a88612af7565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612e70565b5061226e565b600190940193612183565b8654151561227f5761227f33612beb565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612ae516565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612acf16565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612acf16565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612df6565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612ae516565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612e94565b600160a060020a038b16600090815260066020526040812061283a91612eb5565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612d91565b506128b288612ce4565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360008181526001602052604090205460a060020a900460ff1615156129e5576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b3360009081526010602052604090205460ff1615612a4d576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200184848080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612ac1926001850192910190612df6565b505050505050565b600c5481565b600082820183811015612ade57fe5b9392505050565b600082821115612af157fe5b50900390565b60085460005b81811015612be65782600160a060020a0316600882815481101515612b1e57fe5b600091825260209091200154600160a060020a03161415612bde57600880546000198401908110612b4b57fe5b60009182526020909120015460088054600160a060020a039092169183908110612b7157fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612bac57fe5b60009182526020909120018054600160a060020a03191690556008805490612bd8906000198301612e70565b50612be6565b600101612afd565b505050565b60075460005b81811015612be65782600160a060020a0316600782815481101515612c1257fe5b600091825260209091200154600160a060020a03161415612cdc57600780546000198401908110612c3f57fe5b60009182526020909120015460078054600160a060020a039092169183908110612c6557fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612ca057fe5b60009182526020909120018054600160a060020a03191690556007805490612ccc906000198301612e70565b50600a8054600019019055612be6565b600101612bf1565b600780546000198101919082908110612cf957fe5b60009182526020909120015460078054600160a060020a039092169184908110612d1f57fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612d5657fe5b60009182526020909120018054600160a060020a03191690556007805490612d82906000198301612e70565b5050600a805460001901905550565b828054828255906000526020600020908101928215612de6579160200282015b82811115612de65782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612db1565b50612df2929150612ed3565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612e3757805160ff1916838001178555612e64565b82800160010185558215612e64579182015b82811115612e64578251825591602001919060010190612e49565b50612df2929150612ef7565b815481835581811115612be657600083815260209020612be6918101908301612ef7565b5080546000825590600052602060002090810190612eb29190612f11565b50565b5080546000825590600052602060002090810190612eb29190612ef7565b610f9291905b80821115612df2578054600160a060020a0319168155600101612ed9565b610f9291905b80821115612df25760008155600101612efd565b610f9291905b80821115612df2576000612f2b8282612f34565b50600101612f17565b50805460018160011615610100020316600290046000825580601f10612f5a5750612eb2565b601f016020900490600052602060002090810190612eb29190612ef75600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a72305820e276810d3fb0643b8f5745972bb7ebc597a961b67258d4aebbb789c52bf885ed0029" ) var ( diff --git a/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js b/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js index 71b035803ea5..2173fdf79fbf 100644 --- a/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js +++ b/contracts/validator/contract_v2/migrate/test/scripts/testKycInvalidFlow.js @@ -35,7 +35,7 @@ async function run() { ...validator, functionName: "uploadKYC", args: ["hello"], - account: newCandidate.address, + account: newCandidate, }); const pendingKYC = await publicClient.readContract({ diff --git a/contracts/validator/contract_v2/migrate/test/scripts/uploadKYC.js b/contracts/validator/contract_v2/migrate/test/scripts/uploadKYC.js new file mode 100644 index 000000000000..0f195006f2c2 --- /dev/null +++ b/contracts/validator/contract_v2/migrate/test/scripts/uploadKYC.js @@ -0,0 +1,58 @@ +const { parseEther } = require("viem"); +const { + walletClient, + publicClient, + validator, + expect, + onwer1, +} = require("./constant"); +const { generatePrivateKey, privateKeyToAccount } = require("viem/accounts"); +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} +async function run() { + const list = [ + "0x77e0b4a7aabef3b07db42f1f2aa43130ba5a3175ec47f2ff8891d49ad87cbed9", + "0x31b0fbcba7b60ea9974ae1bac0523af8cd72661de47ea2d3569344c975b93801", + "0x5a3457e9323ef7f9351d7b6d8f4d5c2c7c66a5e094142d6e186c86402b29a787", + "0x363f48b205f95859e13ea1acf6b047631ab34e69d193bbf5eb0df871decca69e", + "0x1c40ebf394c9c9db15f60528f6a030ba9f465a7c615acd9b9d79792175b6bcd6", + "0x58fbe847ab6faa2fb5559b4d1f1e02573e222d2524b6f4598a301897c0881e71", + "0x64651f33879becd32391e3cf802680f3621500c55fb53db7b6b041ff74c3a62f", + "0xe754b95280b2232ffb4398de0cdda06c2be24ef8aa5c6aba090802e0cd706022", + "0xd4ead423829e8a525a84833095ea877b56d1e04a1d4990308059f434b4b7df08", + "0x6dc218b18a4fad1c8d57004625cfe6e36f031843a9b63eac86c165c338ecf2ca", + "0xfe191406af908a10997f6c5236ff7d514f24daf4c98684a7c79b2bbbcde7e641", + "0x457c3bf99d900ed277e58dfdc466ed67605ca6b7a4389eb3795242e0098c51ce", + "0xc36ee06f107b7b5f11c76cf5317dc43be44211c98d35f8f6d2848937654cec8b", + "0xbdf6a0151fa9bc798213c19396e4ae3aa8a5e395ab6d879f96c6a60d7d4bb3bb", + "0x77de7e5f7dd19de487abd0e5917985e0e418cbaa3f7d8f1b1dd7bc66855e32be", + ]; + + for (const pk of list) { + const account = privateKeyToAccount(pk); + const isCandidate = await publicClient.readContract({ + ...validator, + functionName: "isCandidate", + args: [account.address], + }); + if (isCandidate) { + console.log(account.address + " is candidate"); + await walletClient.sendTransaction({ + to: account.address, + value: parseEther("1"), + account: onwer1, + }); + + await sleep(10000); + await walletClient.writeContract({ + ...validator, + functionName: "uploadKYC", + args: ["hello"], + account: account, + }); + } + } +} + +run(); diff --git a/contracts/validator/contract_v2/src/abi b/contracts/validator/contract_v2/src/abi index ecd07cc0e4bc..a41ab3ed2fa7 100644 --- a/contracts/validator/contract_v2/src/abi +++ b/contracts/validator/contract_v2/src/abi @@ -64,6 +64,29 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [], + "name": "removeCandidatesZeroAddresses", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "ownerCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [ @@ -112,16 +135,16 @@ { "name": "", "type": "address" - }, - { - "name": "", - "type": "uint256" } ], - "name": "kycString", + "name": "pendingKYC", "outputs": [ { - "name": "", + "name": "blockNumber", + "type": "uint256" + }, + { + "name": "kycHash", "type": "string" } ], @@ -171,6 +194,29 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "owner", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + }, + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -291,34 +337,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": true, - "inputs": [], - "name": "minCandidateNum", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getGrandMasters", - "outputs": [ - { - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, { "constant": true, "inputs": [ @@ -342,26 +360,7 @@ "constant": true, "inputs": [ { - "name": "", - "type": "address" - } - ], - "name": "grandMasterMap", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_invalidCandidate", + "name": "_owner", "type": "address" } ], @@ -388,11 +387,11 @@ "type": "uint256" } ], - "name": "voters", + "name": "KYCString", "outputs": [ { "name": "", - "type": "address" + "type": "string" } ], "payable": false, @@ -402,12 +401,16 @@ { "constant": true, "inputs": [ + { + "name": "", + "type": "address" + }, { "name": "", "type": "uint256" } ], - "name": "grandMasters", + "name": "voters", "outputs": [ { "name": "", @@ -437,6 +440,15 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [], + "name": "removeOwnersZeroAddresses", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": false, "inputs": [ @@ -470,6 +482,15 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [], + "name": "claimKYC", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": true, "inputs": [], @@ -512,6 +533,25 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidCandidate", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [ @@ -611,6 +651,25 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "invalidOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -629,7 +688,7 @@ "constant": false, "inputs": [ { - "name": "_invalidCandidate", + "name": "_owner", "type": "address" } ], @@ -700,14 +759,6 @@ { "name": "_voterWithdrawDelay", "type": "uint256" - }, - { - "name": "_grandMasters", - "type": "address[]" - }, - { - "name": "_minCandidateNum", - "type": "uint256" } ], "payable": false, diff --git a/contracts/validator/contract_v2/src/bytecode b/contracts/validator/contract_v2/src/bytecode index 814d09efc0be..e8803d38d1a2 100644 --- a/contracts/validator/contract_v2/src/bytecode +++ b/contracts/validator/contract_v2/src/bytecode @@ -1 +1 @@ -0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029 \ No newline at end of file +0x608060405260006009556000600a553480156200001b57600080fd5b50604051620032f5380380620032f583398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612fc480620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612ac9565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612acf16565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612acf16565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612acf16565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612ae516565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612ae516565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612ae516565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612acf16565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612acf16565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612d91565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612d91565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612acf16565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612acf16565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612df6565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612df6565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612ae516565b60095561216a88612af7565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612e70565b5061226e565b600190940193612183565b8654151561227f5761227f33612beb565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612ae516565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612acf16565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612acf16565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612df6565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612ae516565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612e94565b600160a060020a038b16600090815260066020526040812061283a91612eb5565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612d91565b506128b288612ce4565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360008181526001602052604090205460a060020a900460ff1615156129e5576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b3360009081526010602052604090205460ff1615612a4d576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200184848080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612ac1926001850192910190612df6565b505050505050565b600c5481565b600082820183811015612ade57fe5b9392505050565b600082821115612af157fe5b50900390565b60085460005b81811015612be65782600160a060020a0316600882815481101515612b1e57fe5b600091825260209091200154600160a060020a03161415612bde57600880546000198401908110612b4b57fe5b60009182526020909120015460088054600160a060020a039092169183908110612b7157fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612bac57fe5b60009182526020909120018054600160a060020a03191690556008805490612bd8906000198301612e70565b50612be6565b600101612afd565b505050565b60075460005b81811015612be65782600160a060020a0316600782815481101515612c1257fe5b600091825260209091200154600160a060020a03161415612cdc57600780546000198401908110612c3f57fe5b60009182526020909120015460078054600160a060020a039092169183908110612c6557fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612ca057fe5b60009182526020909120018054600160a060020a03191690556007805490612ccc906000198301612e70565b50600a8054600019019055612be6565b600101612bf1565b600780546000198101919082908110612cf957fe5b60009182526020909120015460078054600160a060020a039092169184908110612d1f57fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612d5657fe5b60009182526020909120018054600160a060020a03191690556007805490612d82906000198301612e70565b5050600a805460001901905550565b828054828255906000526020600020908101928215612de6579160200282015b82811115612de65782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612db1565b50612df2929150612ed3565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612e3757805160ff1916838001178555612e64565b82800160010185558215612e64579182015b82811115612e64578251825591602001919060010190612e49565b50612df2929150612ef7565b815481835581811115612be657600083815260209020612be6918101908301612ef7565b5080546000825590600052602060002090810190612eb29190612f11565b50565b5080546000825590600052602060002090810190612eb29190612ef7565b610f9291905b80821115612df2578054600160a060020a0319168155600101612ed9565b610f9291905b80821115612df25760008155600101612efd565b610f9291905b80821115612df2576000612f2b8282612f34565b50600101612f17565b50805460018160011615610100020316600290046000825580601f10612f5a5750612eb2565b601f016020900490600052602060002090810190612eb29190612ef75600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a72305820e276810d3fb0643b8f5745972bb7ebc597a961b67258d4aebbb789c52bf885ed0029 \ No newline at end of file diff --git a/contracts/validator/contract_v2/src/contracts/XDCValidator.sol b/contracts/validator/contract_v2/src/contracts/XDCValidator.sol index 47664edd3eb3..8736a7032a04 100644 --- a/contracts/validator/contract_v2/src/contracts/XDCValidator.sol +++ b/contracts/validator/contract_v2/src/contracts/XDCValidator.sol @@ -174,7 +174,7 @@ contract XDCValidator { } } - function uploadKYC(string kychash) external { + function uploadKYC(string kychash) external onlyCandidate(msg.sender) { require(!invalidOwner[msg.sender], "Invalid Owner"); pendingKYC[msg.sender] = PendingKYCState({ blockNumber: block.number, diff --git a/contracts/validator/contract_v2/src/deployedBytecode b/contracts/validator/contract_v2/src/deployedBytecode new file mode 100644 index 000000000000..143e8a14f7f8 --- /dev/null +++ b/contracts/validator/contract_v2/src/deployedBytecode @@ -0,0 +1 @@ +0x6080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612ac9565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612acf16565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612acf16565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612acf16565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612ae516565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612ae516565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612ae516565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612acf16565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612acf16565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612d91565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612d91565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612acf16565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612acf16565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612df6565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612df6565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612ae516565b60095561216a88612af7565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612e70565b5061226e565b600190940193612183565b8654151561227f5761227f33612beb565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612ae516565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612acf16565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612acf16565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612df6565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612ae516565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612e94565b600160a060020a038b16600090815260066020526040812061283a91612eb5565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612d91565b506128b288612ce4565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360008181526001602052604090205460a060020a900460ff1615156129e5576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b3360009081526010602052604090205460ff1615612a4d576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200184848080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612ac1926001850192910190612df6565b505050505050565b600c5481565b600082820183811015612ade57fe5b9392505050565b600082821115612af157fe5b50900390565b60085460005b81811015612be65782600160a060020a0316600882815481101515612b1e57fe5b600091825260209091200154600160a060020a03161415612bde57600880546000198401908110612b4b57fe5b60009182526020909120015460088054600160a060020a039092169183908110612b7157fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612bac57fe5b60009182526020909120018054600160a060020a03191690556008805490612bd8906000198301612e70565b50612be6565b600101612afd565b505050565b60075460005b81811015612be65782600160a060020a0316600782815481101515612c1257fe5b600091825260209091200154600160a060020a03161415612cdc57600780546000198401908110612c3f57fe5b60009182526020909120015460078054600160a060020a039092169183908110612c6557fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612ca057fe5b60009182526020909120018054600160a060020a03191690556007805490612ccc906000198301612e70565b50600a8054600019019055612be6565b600101612bf1565b600780546000198101919082908110612cf957fe5b60009182526020909120015460078054600160a060020a039092169184908110612d1f57fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612d5657fe5b60009182526020909120018054600160a060020a03191690556007805490612d82906000198301612e70565b5050600a805460001901905550565b828054828255906000526020600020908101928215612de6579160200282015b82811115612de65782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612db1565b50612df2929150612ed3565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612e3757805160ff1916838001178555612e64565b82800160010185558215612e64579182015b82811115612e64578251825591602001919060010190612e49565b50612df2929150612ef7565b815481835581811115612be657600083815260209020612be6918101908301612ef7565b5080546000825590600052602060002090810190612eb29190612f11565b50565b5080546000825590600052602060002090810190612eb29190612ef7565b610f9291905b80821115612df2578054600160a060020a0319168155600101612ed9565b610f9291905b80821115612df25760008155600101612efd565b610f9291905b80821115612df2576000612f2b8282612f34565b50600101612f17565b50805460018160011615610100020316600290046000825580601f10612f5a5750612eb2565b601f016020900490600052602060002090810190612eb29190612ef75600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a72305820e276810d3fb0643b8f5745972bb7ebc597a961b67258d4aebbb789c52bf885ed0029 \ No newline at end of file diff --git a/contracts/validator/contract_v2/validator_v2.go b/contracts/validator/contract_v2/validator_v2.go index 5210f6805762..99882b396ad1 100644 --- a/contracts/validator/contract_v2/validator_v2.go +++ b/contracts/validator/contract_v2/validator_v2.go @@ -7,27 +7,27 @@ import ( "math/big" "strings" + ethereum "github.com/XinFinOrg/XDPoSChain" "github.com/XinFinOrg/XDPoSChain/accounts/abi" "github.com/XinFinOrg/XDPoSChain/accounts/abi/bind" "github.com/XinFinOrg/XDPoSChain/common" "github.com/XinFinOrg/XDPoSChain/core/types" "github.com/XinFinOrg/XDPoSChain/event" - ethereum "github.com/XinFinOrg/XDPoSChain" ) // XDCValidatorABI is the input ABI used to generate the binding from. -const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kycString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"validatorsState\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"isCandidate\",\"type\":\"bool\"},{\"name\":\"cap\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateNum\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getGrandMasters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"grandMasterMap\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"voters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"grandMasters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getOwnerToCandidateLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_grandMasters\",\"type\":\"address[]\"},{\"name\":\"_minCandidateNum\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" +const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeCandidatesZeroAddresses\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingKYC\",\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"name\":\"kycHash\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"validatorsState\",\"outputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"isCandidate\",\"type\":\"bool\"},{\"name\":\"cap\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"KYCString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"voters\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getOwnerToCandidateLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"removeOwnersZeroAddresses\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"claimKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]" // XDCValidatorBin is the compiled bytecode used for deploying new contracts. -const XDCValidatorBin = `0x60806040523480156200001157600080fd5b50604051620028bb380380620028bb83398101604090815281516020830151918301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516009819055600a879055600b869055600c859055600d849055600e8390556007805460018101825560009182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916600160a060020a038b16179055988b019a998a01999798969795969495939492939190910191805b8b51821015620002e85760088c83815181101515620000f757fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a039092169190911790558d519091908e90859081106200014457fe5b6020908102909101810151600160a060020a03908116835290820192909252604001600020805460a060020a60ff0219928d16600160a060020a03199091161791909116740100000000000000000000000000000000000000001781558b519091508b9083908110620001b357fe5b906020019060200201518160010181905550600260008d84815181101515620001d857fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948f16600160a060020a0319909516851790559283526006905290208c518d90849081106200023d57fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558a518b90839081106200028757fe5b90602001906020020151600160008e85815181101515620002a457fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938f16815260029093019052902055600190910190620000dc565b600091505b83518210156200039657600f84838151811015156200030857fe5b6020908102919091018101518254600180820185556000948552928420018054600160a060020a031916600160a060020a03909216919091179055855190916010918790869081106200035757fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff191691151591909117905560019190910190620002ed565b50505050505050505050505061250980620003b26000396000f3006080604052600436106101d75763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630126795181146101dc578063025e7c27146101f257806302aa9be21461022657806306a49fce1461024a5780630e3e4fb8146102af57806315febd68146102ea57806327a6296b146103145780632a3640b1146103ad5780632d15cc04146103d15780632f9c4bba146103f2578063302b687214610407578063326586521461042e5780633477ee2e1461044f5780634110a48914610467578063441a3e70146104b057806349e971be146104cb57806352b3ed16146104e057806358e7525f146104f55780635b6e3963146105165780635b860d27146105375780635c134d66146105585780636132cd831461057c57806367134e70146105945780636dd7d8ea146105b557806372e44a38146105c9578063a9a981a3146105ea578063a9ff959e146105ff578063ae6e43f514610614578063b642facd14610635578063c45607df14610656578063d09f1ab414610677578063d161c7671461068c578063d51b9e93146106a1578063d55b7dff146106c2578063ef18374a146106d7578063f2ee3c7d146106ec578063f5c951251461070d578063f8ac9dd51461072d575b600080fd5b6101f0600160a060020a0360043516610742565b005b3480156101fe57600080fd5b5061020a600435610a7e565b60408051600160a060020a039092168252519081900360200190f35b34801561023257600080fd5b506101f0600160a060020a0360043516602435610aa6565b34801561025657600080fd5b5061025f610d32565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561029b578181015183820152602001610283565b505050509050019250505060405180910390f35b3480156102bb57600080fd5b506102d6600160a060020a0360043581169060243516610d95565b604080519115158252519081900360200190f35b3480156102f657600080fd5b50610302600435610db5565b60408051918252519081900360200190f35b34801561032057600080fd5b50610338600160a060020a0360043516602435610dd4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037257818101518382015260200161035a565b50505050905090810190601f16801561039f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b957600080fd5b5061020a600160a060020a0360043516602435610e8a565b3480156103dd57600080fd5b5061025f600160a060020a0360043516610ec1565b3480156103fe57600080fd5b5061025f610f37565b34801561041357600080fd5b50610302600160a060020a0360043581169060243516610f98565b34801561043a57600080fd5b50610338600160a060020a0360043516610fc7565b34801561045b57600080fd5b5061020a6004356110fd565b34801561047357600080fd5b50610488600160a060020a036004351661110b565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156104bc57600080fd5b506101f060043560243561113a565b3480156104d757600080fd5b50610302611396565b3480156104ec57600080fd5b5061025f61139c565b34801561050157600080fd5b50610302600160a060020a03600435166113fc565b34801561052257600080fd5b506102d6600160a060020a036004351661141b565b34801561054357600080fd5b50610302600160a060020a0360043516611430565b34801561056457600080fd5b5061020a600160a060020a03600435166024356114dc565b34801561058857600080fd5b5061020a6004356114f7565b3480156105a057600080fd5b50610302600160a060020a0360043516611505565b6101f0600160a060020a0360043516611520565b3480156105d557600080fd5b50610302600160a060020a036004351661178e565b3480156105f657600080fd5b506103026117a0565b34801561060b57600080fd5b506103026117a6565b34801561062057600080fd5b506101f0600160a060020a03600435166117ac565b34801561064157600080fd5b5061020a600160a060020a0360043516611b02565b34801561066257600080fd5b50610302600160a060020a0360043516611b20565b34801561068357600080fd5b50610302611b3b565b34801561069857600080fd5b50610302611b41565b3480156106ad57600080fd5b506102d6600160a060020a0360043516611b47565b3480156106ce57600080fd5b50610302611b6c565b3480156106e357600080fd5b50610302611b72565b3480156106f857600080fd5b506101f0600160a060020a0360043516611b78565b34801561071957600080fd5b506101f0600480356024810191013561211d565b34801561073957600080fd5b506103026121aa565b600080600a5434101515156107a1576040805160e560020a62461bcd02815260206004820152601160248201527f4c6f772043616e64696461746520436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038316600090815260016020526040902054839060a060020a900460ff161561081b576040805160e560020a62461bcd02815260206004820152601160248201527f416c72656164792043616e646964617465000000000000000000000000000000604482015290519081900360640190fd5b3360009081526010602052604090205460ff161515600114610887576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416600090815260016020819052604090912001546108b4903463ffffffff6121b016565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a038816600160a060020a03199182168117909255600091825260208381526040808420805474ff0000000000000000000000000000000000000000199416339081179490941660a060020a1781559485018690559183526002840190529020549194509250610960903463ffffffff6121b016565b600160a060020a038516600090815260016020908152604080832033845260020182528083209390935560069052205415156109d957600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a031916331790555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038b16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a150505050565b6007805482908110610a8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610b28576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e7420566f7465204361700000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610bda57600a54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610b84908363ffffffff6121c616565b1015610bda576040805160e560020a62461bcd02815260206004820152600d60248201527f42656c6f77204d696e2043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610c07908563ffffffff6121c616565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610c45908563ffffffff6121c616565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600e54610c7f904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350610cab908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d6c575b505050505090505b90565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b600360205281600052604060002081815481101515610def57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152945090925090830182828015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b600660205281600052604060002081815481101515610ea557fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610f2b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f0d575b50505050509050919050565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610d8a57602002820191906000526020600020905b815481526020019060010190808311610f7b575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6060610fd282611b47565b156110d55760036000610fe484611b02565b600160a060020a0316600160a060020a0316815260200190815260200160002060016003600061101386611b02565b600160a060020a03168152602081019190915260400160002054825491900390811061103b57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b50505050509050610dcf565b600160a060020a03821660009081526003602052604090208054600019810190811061103b57fe5b6008805482908110610a8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b60008282828211611195576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420426c6f636b204e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156111ed576040805160e560020a62461bcd02815260206004820152601560248201527f426c6f636b204e756d62657220546f6f20486967680000000000000000000000604482015290519081900360640190fd5b336000908152602081815260408083208584529091528120541161125b576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420576974686472617720436170000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061127c57fe5b90600052602060002001541415156112de576040805160e560020a62461bcd02815260206004820152601560248201527f4d69736d6174636820426c6f636b204e756d6265720000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208984528083529083208054908490559383529190526001018054919450908590811061131657fe5b60009182526020822001819055604051339185156108fc02918691818181858888f1935050505015801561134e573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b60095481565b6060600f805480602002602001604051908101604052809291908181526020018280548015610d8a57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610d6c575050505050905090565b600160a060020a03166000908152600160208190526040909120015490565b60106020526000908152604090205460ff1681565b600160a060020a0381166000908152600160205260408120548190839060a060020a900460ff16151561149b576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b6114a484611b02565b91506114ae611b72565b600160a060020a0383166000908152600460205260409020546064028115156114d357fe5b04949350505050565b600260205281600052604060002081815481101515610ea557fe5b600f805482908110610a8c57fe5b600160a060020a031660009081526006602052604090205490565b600b5434101561157a576040805160e560020a62461bcd02815260206004820152600d60248201527f4c6f7720566f7465722043617000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff1615156115e3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b3360009081526010602052604090205460ff16151560011461164f576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f74204772616e64204d617374657200000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600160208190526040909120015461167c903463ffffffff6121b016565b600160a060020a03831660009081526001602081815260408084209283019490945533835260029091019052205415156116e957600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611720903463ffffffff6121b016565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b60085490565b600e5481565b600160a060020a038082166000908152600160205260408120549091829182918591163314611825576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74204f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff1615156118a0576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742043616e64696461746500000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600160205260408120805474ff00000000000000000000000000000000000000001916905594505b60085485101561194c5785600160a060020a03166008868154811015156118fa57fe5b600091825260209091200154600160a060020a0316141561194157600880548690811061192357fe5b60009182526020909120018054600160a060020a031916905561194c565b6001909401936118d7565b6119af60088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611987575b50505050506121d8565b80516119c3916008916020909101906122fa565b506119cc61229c565b600160a060020a038616600081815260016020818152604080842033855260028101835290842054949093528190520154909450611a10908563ffffffff6121c616565b600160a060020a0387166000908152600160208181526040808420928301949094553383526002909101905290812055600d54611a53904363ffffffff6121b016565b33600090815260208181526040808320848452909152902054909350611a7f908563ffffffff6121b016565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0389169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600c5481565b600d5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600a5481565b60075490565b336000818152600160205260408120549091829160609183918291829160a060020a900460ff161515611be3576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b600160a060020a038816600090815260016020526040902054889060a060020a900460ff161515611c4c576040805160e560020a62461bcd02815260206004820152601360248201526000805160206124be833981519152604482015290519081900360640190fd5b611c5533611b02565b9750611c6089611b02565b600160a060020a03808a1660009081526005602090815260408083209385168352929052205490975060ff1615611ce1576040805160e560020a62461bcd02815260206004820152601560248201527f416c726561647920566f74656420496e76616c69640000000000000000000000604482015290519081900360640190fd5b600160a060020a038089166000908152600560209081526040808320938b168352928152828220805460ff19166001908117909155600490915291902080549091019055604b611d2f611b72565b600160a060020a038916600090815260046020526040902054606402811515611d5457fe5b041061211257600160088054905003604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b50955060009450600093505b600854841015611f145786600160a060020a0316611dd8600886815481101515611dbe57fe5b600091825260209091200154600160a060020a0316611b02565b600160a060020a03161415611f09576008805485908110611df557fe5b60009182526020909120015486516001870196600160a060020a039092169188918110611e1e57fe5b600160a060020a039092166020928302909101909101526008805485908110611e4357fe5b600091825260208220018054600160a060020a031916905560088054600192919087908110611e6e57fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220805474ffffffffffffffffffffffffffffffffffffffffff19168155600101829055928a16815260039092528120611ece9161235f565b600160a060020a0387166000908152600660205260408120611eef91612380565b600160a060020a0387166000908152600460205260408120555b600190930192611d98565b611f7560088054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051611f89916008916020909101906122fa565b50611f9261229c565b600092505b60075483101561200c5786600160a060020a0316600784815481101515611fba57fe5b600091825260209091200154600160a060020a03161415612001576007805484908110611fe357fe5b60009182526020909120018054600160a060020a031916905561200c565b600190920191611f97565b61206d60078054806020026020016040519081016040528092919081815260200182805480156119a557602002820191906000526020600020908154600160a060020a031681526001909101906020018083116119875750505050506121d8565b8051612081916007916020909101906122fa565b507fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e87876040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156120fd5781810151838201526020016120e5565b50505050905001935050505060405180910390a15b505050505050505050565b33600090815260036020908152604082208054600181018083559184529190922061214a9101848461239e565b50506040805133808252602082018381529282018490527f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a9290918591859190606082018484808284376040519201829003965090945050505050a15050565b600b5481565b6000828201838110156121bf57fe5b9392505050565b6000828211156121d257fe5b50900390565b6060806000808451604051908082528060200260200182016040528015612209578160200160208202803883390190505b50925060009150600090505b845181101561229357845160009086908390811061222f57fe5b60209081029091010151600160a060020a03161461228b57848181518110151561225557fe5b90602001906020020151838381518110151561226d57fe5b600160a060020a039092166020928302909101909101526001909101905b600101612215565b50815292915050565b60095460085410156122f8576040805160e560020a62461bcd02815260206004820152601360248201527f4c6f772043616e64696461746520436f756e7400000000000000000000000000604482015290519081900360640190fd5b565b82805482825590600052602060002090810192821561234f579160200282015b8281111561234f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061231a565b5061235b929150612418565b5090565b508054600082559060005260206000209081019061237d919061243c565b50565b508054600082559060005260206000209081019061237d919061245f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123df5782800160ff1982351617855561240c565b8280016001018555821561240c579182015b8281111561240c5782358255916020019190600101906123f1565b5061235b92915061245f565b610d9291905b8082111561235b578054600160a060020a031916815560010161241e565b610d9291905b8082111561235b5760006124568282612479565b50600101612442565b610d9291905b8082111561235b5760008155600101612465565b50805460018160011615610100020316600290046000825580601f1061249f575061237d565b601f01602090049060005260206000209081019061237d919061245f56004e6f742056616c69642043616e64696461746500000000000000000000000000a165627a7a7230582066e183b30548c8470ddf44cf0a263594e7a273211523d4487293ec58fc8f13880029` +const XDCValidatorBin = `0x608060405260006009556000600a553480156200001b57600080fd5b50604051620032f5380380620032f583398101604090815281516020830151918301516060840151608085015160a086015160c087015160e0880151600b859055600c849055600d839055600e829055600f8190559588018051600955600780546001808201835560009283527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889091018054600160a060020a031916600160a060020a038a16179055600a805490910190559098979097019694959394929391929091905b8851811015620003185760088982815181101515620000fc57fe5b602090810291909101810151825460018082018555600094855293839020018054600160a060020a031916600160a060020a0392831617905560408051606081018252918b168252918101929092528951908201908a90849081106200015e57fe5b90602001906020020151815250600160008b848151811015156200017e57fe5b602090810291909101810151600160a060020a03908116835282820193909352604091820160009081208551815493870151600160a060020a031990941695169490941760a060020a60ff02191674010000000000000000000000000000000000000000921515929092029190911783559201516001909101558951600291908b90849081106200020b57fe5b6020908102909101810151600160a060020a03908116835282820193909352604091820160009081208054600181018255908252828220018054948c16600160a060020a03199095168517905592835260069052902089518a90839081106200027057fe5b6020908102919091018101518254600181018455600093845291909220018054600160a060020a031916600160a060020a039092169190911790558751889082908110620002ba57fe5b90602001906020020151600160008b84815181101515620002d757fe5b6020908102909101810151600160a060020a0390811683528282019390935260409182016000908120938c16815260029093019052902055600101620000e1565b505050505050505050612fc480620003316000396000f3006080604052600436106102035763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663012679518114610208578063025e7c271461021e57806302aa9be21461025257806306a49fce146102765780630999ec79146102db5780630db02622146102f05780630e3e4fb81461031757806315febd68146103525780631c68951c1461036a5780632a3640b11461040a5780632d15cc041461042e5780632f54bf6e1461044f5780632f9c4bba1461048b578063302b6872146104a057806332658652146104c75780633477ee2e1461055d5780634110a48914610575578063441a3e70146105be57806358e7525f146105d95780635b860d27146105fa5780635b9cd8cc1461061b5780635c134d661461063f57806367134e7014610663578063681d8bf2146106845780636dd7d8ea1461069957806372e44a38146106ad578063935ad0d1146106ce578063a9a981a3146106e3578063a9ff959e146106f8578063ae6e43f51461070d578063b622f1411461072e578063b642facd1461074f578063c45607df14610770578063d09f1ab414610791578063d161c767146107a6578063d51b9e93146107bb578063d55b7dff146107dc578063db11daef146107f1578063ef18374a14610812578063f2ee3c7d14610827578063f5c9512514610848578063f8ac9dd514610868575b600080fd5b61021c600160a060020a036004351661087d565b005b34801561022a57600080fd5b50610236600435610c7e565b60408051600160a060020a039092168252519081900360200190f35b34801561025e57600080fd5b5061021c600160a060020a0360043516602435610ca6565b34801561028257600080fd5b5061028b610f32565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c75781810151838201526020016102af565b505050509050019250505060405180910390f35b3480156102e757600080fd5b5061021c610f95565b3480156102fc57600080fd5b5061030561107d565b60408051918252519081900360200190f35b34801561032357600080fd5b5061033e600160a060020a0360043581169060243516611083565b604080519115158252519081900360200190f35b34801561035e57600080fd5b506103056004356110a3565b34801561037657600080fd5b5061038b600160a060020a03600435166110c2565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561041657600080fd5b50610236600160a060020a0360043516602435611169565b34801561043a57600080fd5b5061028b600160a060020a03600435166111a0565b34801561045b57600080fd5b50610470600160a060020a0360043516611216565b60408051921515835260208301919091528051918290030190f35b34801561049757600080fd5b5061028b61127b565b3480156104ac57600080fd5b50610305600160a060020a03600435811690602435166112dc565b3480156104d357600080fd5b506104e8600160a060020a036004351661130b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561052257818101518382015260200161050a565b50505050905090810190601f16801561054f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056957600080fd5b50610236600435611441565b34801561058157600080fd5b50610596600160a060020a036004351661144f565b60408051600160a060020a039094168452911515602084015282820152519081900360600190f35b3480156105ca57600080fd5b5061021c60043560243561147e565b3480156105e557600080fd5b50610305600160a060020a0360043516611769565b34801561060657600080fd5b50610305600160a060020a0360043516611788565b34801561062757600080fd5b506104e8600160a060020a0360043516602435611885565b34801561064b57600080fd5b50610236600160a060020a036004351660243561193b565b34801561066f57600080fd5b50610305600160a060020a0360043516611956565b34801561069057600080fd5b5061021c611971565b61021c600160a060020a0360043516611a53565b3480156106b957600080fd5b50610305600160a060020a0360043516611cb4565b3480156106da57600080fd5b5061021c611cc6565b3480156106ef57600080fd5b50610305611fc5565b34801561070457600080fd5b50610305611fcb565b34801561071957600080fd5b5061021c600160a060020a0360043516611fd1565b34801561073a57600080fd5b5061033e600160a060020a03600435166123b7565b34801561075b57600080fd5b50610236600160a060020a03600435166123cc565b34801561077c57600080fd5b50610305600160a060020a03600435166123ea565b34801561079d57600080fd5b50610305612405565b3480156107b257600080fd5b5061030561240b565b3480156107c757600080fd5b5061033e600160a060020a0360043516612411565b3480156107e857600080fd5b50610305612436565b3480156107fd57600080fd5b5061033e600160a060020a036004351661243c565b34801561081e57600080fd5b50610305612451565b34801561083357600080fd5b5061021c600160a060020a0360043516612457565b34801561085457600080fd5b5061021c600480356024810191013561294f565b34801561087457600080fd5b50610305612ac9565b600b546000903410156108da576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c69642043616e646964617465204361700000000000000000000000604482015290519081900360640190fd5b33600090815260036020526040902054151580610904575033600090815260066020526040812054115b151561095a576040805160e560020a62461bcd02815260206004820152601060248201527f4b5943206e6f742075706c6f6164656400000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260116020526040902054829060ff16156109bb576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff1615610a33576040805160e560020a62461bcd02815260206004820152601360248201527f416c726561647920612063616e64696461746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526001602081905260409091200154610a60903463ffffffff612acf16565b6008805460018181019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018054600160a060020a03808816600160a060020a03199283168117909355604080516060810182523380825260208281018881528385018a81526000988952898352858920945185549251151560a060020a0274ff0000000000000000000000000000000000000000199190981692909816919091179690961694909417825593519581019590955591835260029093019092522054909250610b37903463ffffffff612acf16565b600160a060020a038416600090815260016020818152604080842033855260020190915290912091909155600954610b749163ffffffff612acf16565b600955336000908152600660205260409020541515610bda5760078054600181810183556000929092527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018054600160a060020a03191633179055600a805490910190555b336000818152600660209081526040808320805460018181018355918552838520018054600160a060020a038a16600160a060020a031991821681179092558186526002855283862080549384018155865294849020909101805490941685179093558051938452908301919091523482820152517f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c19181900360600190a1505050565b6007805482908110610c8c57fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a038216600090815260016020908152604080832033845260020190915281205483908390811115610d28576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420566f74650000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382811660009081526001602052604090205416331415610dda57600b54600160a060020a0383166000908152600160209081526040808320338452600201909152902054610d84908363ffffffff612ae516565b1015610dda576040805160e560020a62461bcd02815260206004820181905260248201527f4d696e696d756d206361702073686f756c64206265206d61696e7461696e6564604482015290519081900360640190fd5b600160a060020a03851660009081526001602081905260409091200154610e07908563ffffffff612ae516565b600160a060020a038616600090815260016020818152604080842092830194909455338352600290910190522054610e45908563ffffffff612ae516565b600160a060020a0386166000908152600160209081526040808320338452600201909152902055600f54610e7f904363ffffffff612acf16565b33600090815260208181526040808320848452909152902054909350610eab908563ffffffff612acf16565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a0388169282019290925280820186905290517faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa29181900360600190a15050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610f8a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f6c575b505050505090505b90565b6060600080600880549050604051908082528060200260200182016040528015610fc9578160200160208202803883390190505b50925060009150600090505b60085481101561106557600880546000919083908110610ff157fe5b600091825260209091200154600160a060020a03161461105d57600880548290811061101957fe5b6000918252602090912001548351600160a060020a039091169084908490811061103f57fe5b600160a060020a039092166020928302909101909101526001909101905b600101610fd5565b81835261107760086020850184612d91565b50505050565b600a5481565b600560209081526000928352604080842090915290825290205460ff1681565b336000908152602081815260408083208484529091529020545b919050565b6012602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f81018690048602830186019096528582529194929390929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b5050505050905082565b60066020528160005260406000208181548110151561118457fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561120a57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116111ec575b50505050509050919050565b600080805b60075481101561126d5783600160a060020a031660078281548110151561123e57fe5b600091825260209091200154600160a060020a031614156112655760018192509250611275565b60010161121b565b600092508291505b50915091565b3360009081526020818152604091829020600101805483518184028101840190945280845260609392830182828015610f8a57602002820191906000526020600020905b8154815260200190600101908083116112bf575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b606061131682612411565b156114195760036000611328846123cc565b600160a060020a0316600160a060020a03168152602001908152602001600020600160036000611357866123cc565b600160a060020a03168152602081019190915260400160002054825491900390811061137f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505090506110bd565b600160a060020a03821660009081526003602052604090208054600019810190811061137f57fe5b6008805482908110610c8c57fe5b60016020819052600091825260409091208054910154600160a060020a0382169160a060020a900460ff169083565b336000908152601060205260408120548390839060ff16156114ea576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b60008211611542576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420626c6f636b206e756d626572000000000000000000000000604482015290519081900360640190fd5b438211156115c0576040805160e560020a62461bcd02815260206004820152603560248201527f426c6f636b206e756d6265722073686f756c64206265206c657373207468616e60448201527f2063757272656e7420626c6f636b206e756d6265720000000000000000000000606482015290519081900360840190fd5b336000908152602081815260408083208584529091528120541161162e576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f2063617020746f2077697468647261770000000000000000000000000000604482015290519081900360640190fd5b33600090815260208190526040902060010180548391908390811061164f57fe5b90600052602060002001541415156116b1576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420696e64657800000000000000000000000000000000000000604482015290519081900360640190fd5b33600081815260208181526040808320898452808352908320805490849055938352919052600101805491945090859081106116e957fe5b60009182526020822001819055604051339185156108fc02918691818181858888f19350505050158015611721573d6000803e3d6000fd5b50604080513381526020810187905280820185905290517ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360600190a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a038116600090815260116020526040812054829060ff16156117e9576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611850576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b611858612451565b600160a060020a03841660009081526004602052604090205460640281151561187d57fe5b049392505050565b6003602052816000526040600020818154811015156118a057fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529450909250908301828280156119335780601f1061190857610100808354040283529160200191611933565b820191906000526020600020905b81548152906001019060200180831161191657829003601f168201915b505050505081565b60026020528160005260406000208181548110151561118457fe5b600160a060020a031660009081526006602052604090205490565b60606000806007805490506040519080825280602002602001820160405280156119a5578160200160208202803883390190505b50925060009150600090505b600754811015611a41576007805460009190839081106119cd57fe5b600091825260209091200154600160a060020a031614611a395760078054829081106119f557fe5b6000918252602090912001548351600160a060020a0390911690849084908110611a1b57fe5b600160a060020a039092166020928302909101909101526001909101905b6001016119b1565b81835261107760076020850184612d91565b600c54341015611aad576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420566f74657220436170000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038116600090815260116020526040902054819060ff1615611b0e576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515611b75576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602081905260409091200154611ba2903463ffffffff612acf16565b600160a060020a0383166000908152600160208181526040808420928301949094553383526002909101905220541515611c0f57600160a060020a0382166000908152600260209081526040822080546001810182559083529120018054600160a060020a031916331790555b600160a060020a0382166000908152600160209081526040808320338452600201909152902054611c46903463ffffffff612acf16565b600160a060020a0383166000818152600160209081526040808320338085526002909101835292819020949094558351918252810191909152348183015290517f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc9181900360600190a15050565b60046020526000908152604090205481565b336000908152601060205260408120546060919060ff1615611d32576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b33600090815260126020908152604091829020600190810180548451600293821615610100026000190190911692909204601f810184900484028301840190945283825290929091830182828015611dcb5780601f10611da057610100808354040283529160200191611dcb565b820191906000526020600020905b815481529060010190602001808311611dae57829003601f168201915b505033600090815260126020526040812054855195975095509093119250611e40915050576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f204b59432075706c6f616465640000000000000000000000000000000000604482015290519081900360640190fd5b6206978081014311611e9c576040805160e560020a62461bcd02815260206004820152601460248201527f4b5943206e6f7420766572696669656420796574000000000000000000000000604482015290519081900360640190fd5b336000818152601260208181526040808420848155815180840192839052858152959094529190529151611ed69260019092019190612df6565b5033600090815260036020908152604082208054600181018083559184529282902085519193611f0c9391019190860190612df6565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a33836040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f86578181015183820152602001611f6e565b50505050905090810190601f168015611fb35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60095481565b600f5481565b600160a060020a03808216600090815260016020526040812054909182918291829182918791163314612074576040805160e560020a62461bcd02815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f60448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038716600090815260016020526040902054879060a060020a900460ff161515612115576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0388166000908152600160208190526040909120805474ff00000000000000000000000000000000000000001916905560095461215e9163ffffffff612ae516565b60095561216a88612af7565b3360009081526006602052604081208054909850965094505b8585101561226e5787600160a060020a031687868154811015156121a357fe5b600091825260209091200154600160a060020a031614156122635786600187038154811015156121cf57fe5b6000918252602090912001548754600160a060020a03909116908890879081106121f557fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550866001870381548110151561223457fe5b60009182526020909120018054600160a060020a0319169055865461225d886000198301612e70565b5061226e565b600190940193612183565b8654151561227f5761227f33612beb565b600160a060020a0388166000818152600160208181526040808420338552600281018352908420549490935281905201549094506122c3908563ffffffff612ae516565b600160a060020a0389166000908152600160208181526040808420928301949094553383526002909101905290812055600e54612306904363ffffffff612acf16565b33600090815260208181526040808320848452909152902054909350612332908563ffffffff612acf16565b33600081815260208181526040808320888452808352818420959095558282526001948501805495860181558352918190209093018690558051918252600160a060020a038b169282019290925281517f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3929181900390910190a15050505050505050565b60116020526000908152604090205460ff1681565b600160a060020a039081166000908152600160205260409020541690565b600160a060020a031660009081526003602052604090205490565b600d5481565b600e5481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b600b5481565b60106020526000908152604090205460ff1681565b600a5490565b33600081815260116020526040812054909182918291829182916060918291849182919060ff16156124c1576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460a060020a900460ff161515612528576040805160e560020a62461bcd0281526020600482015260116024820152600080516020612f79833981519152604482015290519081900360640190fd5b612531336123cc565b9950600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002060009054906101000a900460ff161515156125e0576040805160e560020a62461bcd02815260206004820152600d60248201527f416c726561647920766f74656400000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03808b166000908152600560209081526040808320938f168352928152828220805460ff19166001908117909155600490915291902080549091019055604b61262e612451565b600160a060020a038d1660009081526004602052604090205460640281151561265357fe5b041061294257600160a060020a038b166000818152601060209081526040808320805460ff1916600190811790915560128084528285208581558351808601948590528681529690955290925292516126b193929091019190612df6565b506126bb8b611216565b98509850881561294257600854604080518281526020808402820101909152600098508897509080156126f8578160200160208202803883390190505b506008546040805182815260208084028201019091529196508015612727578160200160208202803883390190505b509350600092505b60085483101561288f57600880548490811061274757fe5b600091825260209091200154600160a060020a0390811692508b1661276b836123cc565b600160a060020a031614156128585760095461278e90600163ffffffff612ae516565b60095584516001870196839187919081106127a557fe5b600160a060020a0392831660209182029092018101919091528382166000908152601182526040808220805460ff19166001908117909155808452818320805474ffffffffffffffffffffffffffffffffffffffffff1916815501829055928e168152600390915290812061281991612e94565b600160a060020a038b16600090815260066020526040812061283a91612eb5565b600160a060020a038b16600090815260046020526040812055612884565b835160018801978391869190811061286c57fe5b600160a060020a039092166020928302909101909101525b60019092019161272f565b86845285855283516128a8906008906020870190612d91565b506128b288612ce4565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8b866040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561292d578181015183820152602001612915565b50505050905001935050505060405180910390a15b5050505050505050505050565b3360008181526001602052604090205460a060020a900460ff1615156129e5576040805160e560020a62461bcd02815260206004820152602560248201527f4f6e6c792063616e6469646174652063616e2063616c6c20746869732066756e60448201527f6374696f6e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b3360009081526010602052604090205460ff1615612a4d576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964204f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080519081016040528043815260200184848080601f01602080910402602001604051908101604052809392919081815260200183838082843750505092909352505033600090815260126020908152604090912083518155838201518051919350612ac1926001850192910190612df6565b505050505050565b600c5481565b600082820183811015612ade57fe5b9392505050565b600082821115612af157fe5b50900390565b60085460005b81811015612be65782600160a060020a0316600882815481101515612b1e57fe5b600091825260209091200154600160a060020a03161415612bde57600880546000198401908110612b4b57fe5b60009182526020909120015460088054600160a060020a039092169183908110612b7157fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600880546000198401908110612bac57fe5b60009182526020909120018054600160a060020a03191690556008805490612bd8906000198301612e70565b50612be6565b600101612afd565b505050565b60075460005b81811015612be65782600160a060020a0316600782815481101515612c1257fe5b600091825260209091200154600160a060020a03161415612cdc57600780546000198401908110612c3f57fe5b60009182526020909120015460078054600160a060020a039092169183908110612c6557fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600780546000198401908110612ca057fe5b60009182526020909120018054600160a060020a03191690556007805490612ccc906000198301612e70565b50600a8054600019019055612be6565b600101612bf1565b600780546000198101919082908110612cf957fe5b60009182526020909120015460078054600160a060020a039092169184908110612d1f57fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556007805482908110612d5657fe5b60009182526020909120018054600160a060020a03191690556007805490612d82906000198301612e70565b5050600a805460001901905550565b828054828255906000526020600020908101928215612de6579160200282015b82811115612de65782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190612db1565b50612df2929150612ed3565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612e3757805160ff1916838001178555612e64565b82800160010185558215612e64579182015b82811115612e64578251825591602001919060010190612e49565b50612df2929150612ef7565b815481835581811115612be657600083815260209020612be6918101908301612ef7565b5080546000825590600052602060002090810190612eb29190612f11565b50565b5080546000825590600052602060002090810190612eb29190612ef7565b610f9291905b80821115612df2578054600160a060020a0319168155600101612ed9565b610f9291905b80821115612df25760008155600101612efd565b610f9291905b80821115612df2576000612f2b8282612f34565b50600101612f17565b50805460018160011615610100020316600290046000825580601f10612f5a5750612eb2565b601f016020900490600052602060002090810190612eb29190612ef75600496e76616c69642043616e646964617465000000000000000000000000000000a165627a7a72305820e276810d3fb0643b8f5745972bb7ebc597a961b67258d4aebbb789c52bf885ed0029` // DeployXDCValidator deploys a new Ethereum contract, binding an instance of XDCValidator to it. -func DeployXDCValidator(auth *bind.TransactOpts, backend bind.ContractBackend, _candidates []common.Address, _caps []*big.Int, _firstOwner common.Address, _minCandidateCap *big.Int, _minVoterCap *big.Int, _maxValidatorNumber *big.Int, _candidateWithdrawDelay *big.Int, _voterWithdrawDelay *big.Int, _grandMasters []common.Address, _minCandidateNum *big.Int) (common.Address, *types.Transaction, *XDCValidator, error) { +func DeployXDCValidator(auth *bind.TransactOpts, backend bind.ContractBackend, _candidates []common.Address, _caps []*big.Int, _firstOwner common.Address, _minCandidateCap *big.Int, _minVoterCap *big.Int, _maxValidatorNumber *big.Int, _candidateWithdrawDelay *big.Int, _voterWithdrawDelay *big.Int) (common.Address, *types.Transaction, *XDCValidator, error) { parsed, err := abi.JSON(strings.NewReader(XDCValidatorABI)) if err != nil { return common.Address{}, nil, nil, err } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(XDCValidatorBin), backend, _candidates, _caps, _firstOwner, _minCandidateCap, _minVoterCap, _maxValidatorNumber, _candidateWithdrawDelay, _voterWithdrawDelay, _grandMasters, _minCandidateNum) + address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(XDCValidatorBin), backend, _candidates, _caps, _firstOwner, _minCandidateCap, _minVoterCap, _maxValidatorNumber, _candidateWithdrawDelay, _voterWithdrawDelay) if err != nil { return common.Address{}, nil, nil, err } @@ -176,6 +176,32 @@ func (_XDCValidator *XDCValidatorTransactorRaw) Transact(opts *bind.TransactOpts return _XDCValidator.Contract.contract.Transact(opts, method, params...) } +// KYCString is a free data retrieval call binding the contract method 0x5b9cd8cc. +// +// Solidity: function KYCString( address, uint256) constant returns(string) +func (_XDCValidator *XDCValidatorCaller) KYCString(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (string, error) { + var ( + ret0 = new(string) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "KYCString", arg0, arg1) + return *ret0, err +} + +// KYCString is a free data retrieval call binding the contract method 0x5b9cd8cc. +// +// Solidity: function KYCString( address, uint256) constant returns(string) +func (_XDCValidator *XDCValidatorSession) KYCString(arg0 common.Address, arg1 *big.Int) (string, error) { + return _XDCValidator.Contract.KYCString(&_XDCValidator.CallOpts, arg0, arg1) +} + +// KYCString is a free data retrieval call binding the contract method 0x5b9cd8cc. +// +// Solidity: function KYCString( address, uint256) constant returns(string) +func (_XDCValidator *XDCValidatorCallerSession) KYCString(arg0 common.Address, arg1 *big.Int) (string, error) { + return _XDCValidator.Contract.KYCString(&_XDCValidator.CallOpts, arg0, arg1) +} + // CandidateCount is a free data retrieval call binding the contract method 0xa9a981a3. // // Solidity: function candidateCount() constant returns(uint256) @@ -332,32 +358,6 @@ func (_XDCValidator *XDCValidatorCallerSession) GetCandidates() ([]common.Addres return _XDCValidator.Contract.GetCandidates(&_XDCValidator.CallOpts) } -// GetGrandMasters is a free data retrieval call binding the contract method 0x52b3ed16. -// -// Solidity: function getGrandMasters() constant returns(address[]) -func (_XDCValidator *XDCValidatorCaller) GetGrandMasters(opts *bind.CallOpts) ([]common.Address, error) { - var ( - ret0 = new([]common.Address) - ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "getGrandMasters") - return *ret0, err -} - -// GetGrandMasters is a free data retrieval call binding the contract method 0x52b3ed16. -// -// Solidity: function getGrandMasters() constant returns(address[]) -func (_XDCValidator *XDCValidatorSession) GetGrandMasters() ([]common.Address, error) { - return _XDCValidator.Contract.GetGrandMasters(&_XDCValidator.CallOpts) -} - -// GetGrandMasters is a free data retrieval call binding the contract method 0x52b3ed16. -// -// Solidity: function getGrandMasters() constant returns(address[]) -func (_XDCValidator *XDCValidatorCallerSession) GetGrandMasters() ([]common.Address, error) { - return _XDCValidator.Contract.GetGrandMasters(&_XDCValidator.CallOpts) -} - // GetHashCount is a free data retrieval call binding the contract method 0xc45607df. // // Solidity: function getHashCount(_address address) constant returns(uint256) @@ -566,82 +566,56 @@ func (_XDCValidator *XDCValidatorCallerSession) GetWithdrawCap(_blockNumber *big return _XDCValidator.Contract.GetWithdrawCap(&_XDCValidator.CallOpts, _blockNumber) } -// GrandMasterMap is a free data retrieval call binding the contract method 0x5b6e3963. +// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. // -// Solidity: function grandMasterMap( address) constant returns(bool) -func (_XDCValidator *XDCValidatorCaller) GrandMasterMap(opts *bind.CallOpts, arg0 common.Address) (bool, error) { +// Solidity: function hasVotedInvalid( address, address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) HasVotedInvalid(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (bool, error) { var ( ret0 = new(bool) ) out := ret0 - err := _XDCValidator.contract.Call(opts, out, "grandMasterMap", arg0) - return *ret0, err -} - -// GrandMasterMap is a free data retrieval call binding the contract method 0x5b6e3963. -// -// Solidity: function grandMasterMap( address) constant returns(bool) -func (_XDCValidator *XDCValidatorSession) GrandMasterMap(arg0 common.Address) (bool, error) { - return _XDCValidator.Contract.GrandMasterMap(&_XDCValidator.CallOpts, arg0) -} - -// GrandMasterMap is a free data retrieval call binding the contract method 0x5b6e3963. -// -// Solidity: function grandMasterMap( address) constant returns(bool) -func (_XDCValidator *XDCValidatorCallerSession) GrandMasterMap(arg0 common.Address) (bool, error) { - return _XDCValidator.Contract.GrandMasterMap(&_XDCValidator.CallOpts, arg0) -} - -// GrandMasters is a free data retrieval call binding the contract method 0x6132cd83. -// -// Solidity: function grandMasters( uint256) constant returns(address) -func (_XDCValidator *XDCValidatorCaller) GrandMasters(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "grandMasters", arg0) + err := _XDCValidator.contract.Call(opts, out, "hasVotedInvalid", arg0, arg1) return *ret0, err } -// GrandMasters is a free data retrieval call binding the contract method 0x6132cd83. +// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. // -// Solidity: function grandMasters( uint256) constant returns(address) -func (_XDCValidator *XDCValidatorSession) GrandMasters(arg0 *big.Int) (common.Address, error) { - return _XDCValidator.Contract.GrandMasters(&_XDCValidator.CallOpts, arg0) +// Solidity: function hasVotedInvalid( address, address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) HasVotedInvalid(arg0 common.Address, arg1 common.Address) (bool, error) { + return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) } -// GrandMasters is a free data retrieval call binding the contract method 0x6132cd83. +// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. // -// Solidity: function grandMasters( uint256) constant returns(address) -func (_XDCValidator *XDCValidatorCallerSession) GrandMasters(arg0 *big.Int) (common.Address, error) { - return _XDCValidator.Contract.GrandMasters(&_XDCValidator.CallOpts, arg0) +// Solidity: function hasVotedInvalid( address, address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) HasVotedInvalid(arg0 common.Address, arg1 common.Address) (bool, error) { + return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) } -// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. +// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. // -// Solidity: function hasVotedInvalid( address, address) constant returns(bool) -func (_XDCValidator *XDCValidatorCaller) HasVotedInvalid(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (bool, error) { +// Solidity: function invalidCandidate( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) InvalidCandidate(opts *bind.CallOpts, arg0 common.Address) (bool, error) { var ( ret0 = new(bool) ) out := ret0 - err := _XDCValidator.contract.Call(opts, out, "hasVotedInvalid", arg0, arg1) + err := _XDCValidator.contract.Call(opts, out, "invalidCandidate", arg0) return *ret0, err } -// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. +// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. // -// Solidity: function hasVotedInvalid( address, address) constant returns(bool) -func (_XDCValidator *XDCValidatorSession) HasVotedInvalid(arg0 common.Address, arg1 common.Address) (bool, error) { - return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) +// Solidity: function invalidCandidate( address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) InvalidCandidate(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidCandidate(&_XDCValidator.CallOpts, arg0) } -// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8. +// InvalidCandidate is a free data retrieval call binding the contract method 0xb622f141. // -// Solidity: function hasVotedInvalid( address, address) constant returns(bool) -func (_XDCValidator *XDCValidatorCallerSession) HasVotedInvalid(arg0 common.Address, arg1 common.Address) (bool, error) { - return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1) +// Solidity: function invalidCandidate( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) InvalidCandidate(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidCandidate(&_XDCValidator.CallOpts, arg0) } // InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38. @@ -670,30 +644,56 @@ func (_XDCValidator *XDCValidatorCallerSession) InvalidKYCCount(arg0 common.Addr return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0) } +// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. +// +// Solidity: function invalidOwner( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCaller) InvalidOwner(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _XDCValidator.contract.Call(opts, out, "invalidOwner", arg0) + return *ret0, err +} + +// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. +// +// Solidity: function invalidOwner( address) constant returns(bool) +func (_XDCValidator *XDCValidatorSession) InvalidOwner(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidOwner(&_XDCValidator.CallOpts, arg0) +} + +// InvalidOwner is a free data retrieval call binding the contract method 0xdb11daef. +// +// Solidity: function invalidOwner( address) constant returns(bool) +func (_XDCValidator *XDCValidatorCallerSession) InvalidOwner(arg0 common.Address) (bool, error) { + return _XDCValidator.Contract.InvalidOwner(&_XDCValidator.CallOpts, arg0) +} + // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _invalidCandidate common.Address) (*big.Int, error) { +// Solidity: function invalidPercent(_owner address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _owner common.Address) (*big.Int, error) { var ( ret0 = new(*big.Int) ) out := ret0 - err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _invalidCandidate) + err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _owner) return *ret0, err } // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) -func (_XDCValidator *XDCValidatorSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { - return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) +// Solidity: function invalidPercent(_owner address) constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) InvalidPercent(_owner common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _owner) } // InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27. // -// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256) -func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) { - return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate) +// Solidity: function invalidPercent(_owner address) constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_owner common.Address) (*big.Int, error) { + return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _owner) } // IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93. @@ -722,30 +722,34 @@ func (_XDCValidator *XDCValidatorCallerSession) IsCandidate(_candidate common.Ad return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate) } -// KycString is a free data retrieval call binding the contract method 0x27a6296b. +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. // -// Solidity: function kycString( address, uint256) constant returns(string) -func (_XDCValidator *XDCValidatorCaller) KycString(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (string, error) { +// Solidity: function isOwner(owner address) constant returns(bool, uint256) +func (_XDCValidator *XDCValidatorCaller) IsOwner(opts *bind.CallOpts, owner common.Address) (bool, *big.Int, error) { var ( - ret0 = new(string) + ret0 = new(bool) + ret1 = new(*big.Int) ) - out := ret0 - err := _XDCValidator.contract.Call(opts, out, "kycString", arg0, arg1) - return *ret0, err + out := &[]interface{}{ + ret0, + ret1, + } + err := _XDCValidator.contract.Call(opts, out, "isOwner", owner) + return *ret0, *ret1, err } -// KycString is a free data retrieval call binding the contract method 0x27a6296b. +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. // -// Solidity: function kycString( address, uint256) constant returns(string) -func (_XDCValidator *XDCValidatorSession) KycString(arg0 common.Address, arg1 *big.Int) (string, error) { - return _XDCValidator.Contract.KycString(&_XDCValidator.CallOpts, arg0, arg1) +// Solidity: function isOwner(owner address) constant returns(bool, uint256) +func (_XDCValidator *XDCValidatorSession) IsOwner(owner common.Address) (bool, *big.Int, error) { + return _XDCValidator.Contract.IsOwner(&_XDCValidator.CallOpts, owner) } -// KycString is a free data retrieval call binding the contract method 0x27a6296b. +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. // -// Solidity: function kycString( address, uint256) constant returns(string) -func (_XDCValidator *XDCValidatorCallerSession) KycString(arg0 common.Address, arg1 *big.Int) (string, error) { - return _XDCValidator.Contract.KycString(&_XDCValidator.CallOpts, arg0, arg1) +// Solidity: function isOwner(owner address) constant returns(bool, uint256) +func (_XDCValidator *XDCValidatorCallerSession) IsOwner(owner common.Address) (bool, *big.Int, error) { + return _XDCValidator.Contract.IsOwner(&_XDCValidator.CallOpts, owner) } // MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4. @@ -800,56 +804,56 @@ func (_XDCValidator *XDCValidatorCallerSession) MinCandidateCap() (*big.Int, err return _XDCValidator.Contract.MinCandidateCap(&_XDCValidator.CallOpts) } -// MinCandidateNum is a free data retrieval call binding the contract method 0x49e971be. +// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. // -// Solidity: function minCandidateNum() constant returns(uint256) -func (_XDCValidator *XDCValidatorCaller) MinCandidateNum(opts *bind.CallOpts) (*big.Int, error) { +// Solidity: function minVoterCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) MinVoterCap(opts *bind.CallOpts) (*big.Int, error) { var ( ret0 = new(*big.Int) ) out := ret0 - err := _XDCValidator.contract.Call(opts, out, "minCandidateNum") + err := _XDCValidator.contract.Call(opts, out, "minVoterCap") return *ret0, err } -// MinCandidateNum is a free data retrieval call binding the contract method 0x49e971be. +// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. // -// Solidity: function minCandidateNum() constant returns(uint256) -func (_XDCValidator *XDCValidatorSession) MinCandidateNum() (*big.Int, error) { - return _XDCValidator.Contract.MinCandidateNum(&_XDCValidator.CallOpts) +// Solidity: function minVoterCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) MinVoterCap() (*big.Int, error) { + return _XDCValidator.Contract.MinVoterCap(&_XDCValidator.CallOpts) } -// MinCandidateNum is a free data retrieval call binding the contract method 0x49e971be. +// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. // -// Solidity: function minCandidateNum() constant returns(uint256) -func (_XDCValidator *XDCValidatorCallerSession) MinCandidateNum() (*big.Int, error) { - return _XDCValidator.Contract.MinCandidateNum(&_XDCValidator.CallOpts) +// Solidity: function minVoterCap() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) MinVoterCap() (*big.Int, error) { + return _XDCValidator.Contract.MinVoterCap(&_XDCValidator.CallOpts) } -// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. +// OwnerCount is a free data retrieval call binding the contract method 0x0db02622. // -// Solidity: function minVoterCap() constant returns(uint256) -func (_XDCValidator *XDCValidatorCaller) MinVoterCap(opts *bind.CallOpts) (*big.Int, error) { +// Solidity: function ownerCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorCaller) OwnerCount(opts *bind.CallOpts) (*big.Int, error) { var ( ret0 = new(*big.Int) ) out := ret0 - err := _XDCValidator.contract.Call(opts, out, "minVoterCap") + err := _XDCValidator.contract.Call(opts, out, "ownerCount") return *ret0, err } -// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. +// OwnerCount is a free data retrieval call binding the contract method 0x0db02622. // -// Solidity: function minVoterCap() constant returns(uint256) -func (_XDCValidator *XDCValidatorSession) MinVoterCap() (*big.Int, error) { - return _XDCValidator.Contract.MinVoterCap(&_XDCValidator.CallOpts) +// Solidity: function ownerCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorSession) OwnerCount() (*big.Int, error) { + return _XDCValidator.Contract.OwnerCount(&_XDCValidator.CallOpts) } -// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5. +// OwnerCount is a free data retrieval call binding the contract method 0x0db02622. // -// Solidity: function minVoterCap() constant returns(uint256) -func (_XDCValidator *XDCValidatorCallerSession) MinVoterCap() (*big.Int, error) { - return _XDCValidator.Contract.MinVoterCap(&_XDCValidator.CallOpts) +// Solidity: function ownerCount() constant returns(uint256) +func (_XDCValidator *XDCValidatorCallerSession) OwnerCount() (*big.Int, error) { + return _XDCValidator.Contract.OwnerCount(&_XDCValidator.CallOpts) } // OwnerToCandidate is a free data retrieval call binding the contract method 0x2a3640b1. @@ -904,6 +908,42 @@ func (_XDCValidator *XDCValidatorCallerSession) Owners(arg0 *big.Int) (common.Ad return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0) } +// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. +// +// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) +func (_XDCValidator *XDCValidatorCaller) PendingKYC(opts *bind.CallOpts, arg0 common.Address) (struct { + BlockNumber *big.Int + KycHash string +}, error) { + ret := new(struct { + BlockNumber *big.Int + KycHash string + }) + out := ret + err := _XDCValidator.contract.Call(opts, out, "pendingKYC", arg0) + return *ret, err +} + +// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. +// +// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) +func (_XDCValidator *XDCValidatorSession) PendingKYC(arg0 common.Address) (struct { + BlockNumber *big.Int + KycHash string +}, error) { + return _XDCValidator.Contract.PendingKYC(&_XDCValidator.CallOpts, arg0) +} + +// PendingKYC is a free data retrieval call binding the contract method 0x1c68951c. +// +// Solidity: function pendingKYC( address) constant returns(blockNumber uint256, kycHash string) +func (_XDCValidator *XDCValidatorCallerSession) PendingKYC(arg0 common.Address) (struct { + BlockNumber *big.Int + KycHash string +}, error) { + return _XDCValidator.Contract.PendingKYC(&_XDCValidator.CallOpts, arg0) +} + // ValidatorsState is a free data retrieval call binding the contract method 0x4110a489. // // Solidity: function validatorsState( address) constant returns(owner address, isCandidate bool, cap uint256) @@ -996,6 +1036,27 @@ func (_XDCValidator *XDCValidatorCallerSession) Voters(arg0 common.Address, arg1 return _XDCValidator.Contract.Voters(&_XDCValidator.CallOpts, arg0, arg1) } +// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. +// +// Solidity: function claimKYC() returns() +func (_XDCValidator *XDCValidatorTransactor) ClaimKYC(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "claimKYC") +} + +// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. +// +// Solidity: function claimKYC() returns() +func (_XDCValidator *XDCValidatorSession) ClaimKYC() (*types.Transaction, error) { + return _XDCValidator.Contract.ClaimKYC(&_XDCValidator.TransactOpts) +} + +// ClaimKYC is a paid mutator transaction binding the contract method 0x935ad0d1. +// +// Solidity: function claimKYC() returns() +func (_XDCValidator *XDCValidatorTransactorSession) ClaimKYC() (*types.Transaction, error) { + return _XDCValidator.Contract.ClaimKYC(&_XDCValidator.TransactOpts) +} + // Propose is a paid mutator transaction binding the contract method 0x01267951. // // Solidity: function propose(_candidate address) returns() @@ -1017,6 +1078,48 @@ func (_XDCValidator *XDCValidatorTransactorSession) Propose(_candidate common.Ad return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate) } +// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. +// +// Solidity: function removeCandidatesZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactor) RemoveCandidatesZeroAddresses(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "removeCandidatesZeroAddresses") +} + +// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. +// +// Solidity: function removeCandidatesZeroAddresses() returns() +func (_XDCValidator *XDCValidatorSession) RemoveCandidatesZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveCandidatesZeroAddresses(&_XDCValidator.TransactOpts) +} + +// RemoveCandidatesZeroAddresses is a paid mutator transaction binding the contract method 0x0999ec79. +// +// Solidity: function removeCandidatesZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactorSession) RemoveCandidatesZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveCandidatesZeroAddresses(&_XDCValidator.TransactOpts) +} + +// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. +// +// Solidity: function removeOwnersZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactor) RemoveOwnersZeroAddresses(opts *bind.TransactOpts) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "removeOwnersZeroAddresses") +} + +// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. +// +// Solidity: function removeOwnersZeroAddresses() returns() +func (_XDCValidator *XDCValidatorSession) RemoveOwnersZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveOwnersZeroAddresses(&_XDCValidator.TransactOpts) +} + +// RemoveOwnersZeroAddresses is a paid mutator transaction binding the contract method 0x681d8bf2. +// +// Solidity: function removeOwnersZeroAddresses() returns() +func (_XDCValidator *XDCValidatorTransactorSession) RemoveOwnersZeroAddresses() (*types.Transaction, error) { + return _XDCValidator.Contract.RemoveOwnersZeroAddresses(&_XDCValidator.TransactOpts) +} + // Resign is a paid mutator transaction binding the contract method 0xae6e43f5. // // Solidity: function resign(_candidate address) returns() @@ -1103,23 +1206,23 @@ func (_XDCValidator *XDCValidatorTransactorSession) Vote(_candidate common.Addre // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() -func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _invalidCandidate common.Address) (*types.Transaction, error) { - return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _invalidCandidate) +// Solidity: function voteInvalidKYC(_owner address) returns() +func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _owner common.Address) (*types.Transaction, error) { + return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _owner) } // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() -func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { - return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) +// Solidity: function voteInvalidKYC(_owner address) returns() +func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_owner common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _owner) } // VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d. // -// Solidity: function voteInvalidKYC(_invalidCandidate address) returns() -func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) { - return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate) +// Solidity: function voteInvalidKYC(_owner address) returns() +func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_owner common.Address) (*types.Transaction, error) { + return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _owner) } // Withdraw is a paid mutator transaction binding the contract method 0x441a3e70.