コード例 #1
0
        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());
        }
コード例 #2
0
ファイル: ConsoleCommands.cs プロジェクト: LAToken/lachain
 /// <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");
 }
コード例 #3
0
 public string GetValidatorStatus()
 {
     if (!_validatorStatusManager.IsStarted())
     {
         return("0x00");
     }
     return(_validatorStatusManager.IsWithdrawTriggered() ? "0x002" : "0x01");
 }
コード例 #4
0
ファイル: FrontEndService.cs プロジェクト: LAToken/lachain
        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,
            });
        }