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());
        }
Exemple #2
0
 /// <summary>
 /// Stake:
 ///  stake amount
 /// </summary>
 /// <param name="arguments"></param>
 /// <returns>stake tx hash</returns>
 public string NewStake(string[] arguments)
 {
     if (_validatorStatusManager.IsStarted())
     {
         return("ERROR: Withdraw current stake first");
     }
     if (arguments.Length == 0)
     {
         _validatorStatusManager.Start(false);
     }
     else
     {
         _validatorStatusManager.StartWithStake(Money.Parse(arguments[0]).ToUInt256());
     }
     return("Validator is started");
 }
Exemple #3
0
        public string StartValidator()
        {
            if (_privateWallet.GetWalletInstance() is null)
            {
                return("wallet_locked");
            }

            Logger.LogDebug("validator start command received");
            if (_validatorStatusManager.IsStarted())
            {
                return("withdraw previous stake first");
            }

            _validatorStatusManager.Start(false);

            return("validator_started");
        }
Exemple #4
0
        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,
            });
        }