Esempio n. 1
0
        public async Task Receive_Dividends_By_TransactionId()
        {
            const int  lockTime    = 100;
            const long pocketMoney = 10000L;

            var candidate = (await Starter.GenerateCandidatesAsync(1))[0];
            var voterList = await Starter.GenerateVotersAsync(2, pocketMoney);

            // Check balance
            {
                var voteBalance = await Starter.GetBalanceAsync(Starter.GetAddress(voterList[0].KeyPair));

                voteBalance.ShouldBe(pocketMoney);
            }

            var txResult = await voterList[0].Vote(candidate.PublicKey, Amount, lockTime);

            txResult.Status.ShouldBe(TransactionResultStatus.Mined);
            var ticketsCount = SInt64Value.Parser.ParseFrom(await voterList[0].CallContractMethodAsync(
                                                                Starter.GetConsensusContractAddress(),
                                                                nameof(ConsensusContract.GetTicketsCount),
                                                                new Empty())).Value;

            var txId = Hash.Parser.ParseFrom(txResult.ReturnValue);
            // Check balance
            {
                var voteBalance = await Starter.GetBalanceAsync(Starter.GetAddress(voterList[0].KeyPair));

                voteBalance.ShouldBe(pocketMoney - ticketsCount);
            }

            //Change term
            await Miners.ChangeTermAsync(MiningInterval);

            await Miners.ChangeTermAsync(MiningInterval);

            await Starter.SetBlockchainAgeAsync(10);

            //Receive by other voter
            var receiveErrorResult = await voterList[1]
                                     .ExecuteConsensusContractMethodWithMiningAsync(
                nameof(ConsensusContract.ReceiveDividendsByTransactionId), txId);

            receiveErrorResult.Status.ShouldBe(TransactionResultStatus.Failed);
            receiveErrorResult.Error.Contains(ContractErrorCode.Message[ContractErrorCode.NoPermission]).ShouldBeTrue();

            //Check dividends
            var votingRecord          = await voterList[0].GetVotingRecord(txResult.TransactionId);
            var getAvailableDividends = SInt64Value.Parser.ParseFrom(
                await Starter.CallContractMethodAsync(Starter.GetDividendsContractAddress(),
                                                      nameof(DividendContract.GetAvailableDividends), votingRecord)).Value;

            {
                var voteBalance = await Starter.GetBalanceAsync(Starter.GetAddress(voterList[0].KeyPair));

                voteBalance.ShouldBe(pocketMoney - ticketsCount);

                //Receive
                var receiveResult = await voterList[0]
                                    .ExecuteConsensusContractMethodWithMiningAsync(
                    nameof(ConsensusContract.ReceiveDividendsByTransactionId), txId);
                receiveResult.Status.ShouldBe(TransactionResultStatus.Mined);

                //Validation
                var voteBalanceAfterReceive = await Starter.GetBalanceAsync(Starter.GetAddress(voterList[0].KeyPair));

                var receiveDividends = voteBalanceAfterReceive - voteBalance;
                getAvailableDividends.ShouldBe(receiveDividends);
            }
        }