public void Test_StakeWithdraw() { _blockManager.TryBuildGenesisBlock(); GenerateBlocks(1, 1); _validatorStatusManager.Start(false); Assert.IsTrue(_validatorStatusManager.IsStarted()); Assert.IsFalse(_validatorStatusManager.IsWithdrawTriggered()); int blockNum = (int)_blockManager.GetHeight(); Assert.IsFalse(HardforkHeights.IsHardfork_9Active((ulong)blockNum)); while (!HardforkHeights.IsHardfork_9Active((ulong)blockNum)) { blockNum++; GenerateBlocks(blockNum, blockNum); } var systemContractReader = _container?.Resolve <ISystemContractReader>() ?? throw new Exception("Container is not loaded"); var stake = new Money(systemContractReader.GetStake()); Console.WriteLine($"Current stake is {stake}"); Assert.That(stake > Money.Zero, "Stake is zero"); _validatorStatusManager.WithdrawStakeAndStop(); Assert.IsTrue(_validatorStatusManager.IsStarted()); Assert.IsTrue(_validatorStatusManager.IsWithdrawTriggered()); // Test node is the only validator, so it is a next validator always // and it can't withdraw its stake. TODO: test to check withdraw is working //GenerateBlocks(50); //Assert.IsFalse(_validatorStatusManager.IsStarted()); }
/// <summary> /// ValidatorStatus: /// </summary> /// <param name="arguments"></param> /// <returns>tx hash</returns> public string ValidatorStatus(string[] arguments) { if (!_validatorStatusManager.IsStarted()) { return("Validator is off"); } if (_validatorStatusManager.IsWithdrawTriggered()) { return("Stake withdraw is triggered"); } return("Validator is on"); }
public string GetValidatorStatus() { if (!_validatorStatusManager.IsStarted()) { return("0x00"); } return(_validatorStatusManager.IsWithdrawTriggered() ? "0x002" : "0x01"); }
private JObject GetAccount(string?address = null) { address ??= _systemContractReader.NodeAddress().ToHex(); var publicKey = _systemContractReader.NodePublicKey().ToHex(); var addressUint160 = address.HexToBytes().ToUInt160(); var balance = _stateManager.LastApprovedSnapshot.Balances.GetBalance(addressUint160); var staked = _systemContractReader.GetStake(addressUint160).ToMoney(); var staking = _systemContractReader.GetStakerTotalStake(addressUint160).ToMoney(); var penalty = _systemContractReader.GetPenalty(addressUint160).ToMoney(); var isCurrentValidator = _stateManager.CurrentSnapshot.Validators .GetValidatorsPublicKeys().Any(pk => pk.Buffer.ToByteArray().SequenceEqual(_systemContractReader.NodePublicKey())); var isNextValidator = _systemContractReader.IsNextValidator(); var isPreviousValidator = _systemContractReader.IsPreviousValidator(); var isAbleToBeValidator = _systemContractReader.IsAbleToBeValidator(); var isStaker = !_systemContractReader.GetStake().IsZero(); var isAbleToBeStaker = balance.ToWei() > StakingContract.TokenUnitsInRoll; var isWalletLocked = _privateWallet.IsLocked(); var withdrawTriggered = _validatorStatusManager.IsWithdrawTriggered(); var isValidatorStatusManagerActive = _validatorStatusManager.IsStarted(); var withdrawRequestCycle = _systemContractReader.GetWithdrawRequestCycle(); string state; if (isValidatorStatusManagerActive && withdrawTriggered) { if (isNextValidator) { state = "StakeReserved"; } else if (withdrawRequestCycle == 0) { state = "SubmittingWithdrawRequest"; } else { state = "WaitingForTheNextCycleToWithdraw"; } } else if (isCurrentValidator) { state = "Validator"; } else if (isNextValidator) { state = "NextValidator"; } else if (isAbleToBeValidator) { state = "AbleToBeValidator"; } else if (isPreviousValidator) { state = "PreviousValidator"; } else if (isAbleToBeStaker) { state = "AbleToBeStaker"; } else { state = "Newbie"; } return(new JObject { ["address"] = address, ["publicKey"] = publicKey, ["balance"] = balance.ToString(), ["staked"] = staked.ToString(), ["staking"] = staking.ToString(), ["penalty"] = penalty.ToString(), ["state"] = state, ["online"] = isStaker, ["isWalletLocked"] = isWalletLocked, }); }