Esempio n. 1
0
        private async Task <VotingItem> RegisterVotingItemAsync(int lastingDays, int optionsCount, bool isLockToken, Address sender,
                                                                int totalSnapshotNumber = int.MaxValue)
        {
            var startTime = TimestampHelper.GetUtcNow();
            var options   = Enumerable.Range(0, optionsCount).Select(_ => SampleAddress.AddressList[0].GetFormatted()).ToList();
            var input     = new VotingRegisterInput
            {
                TotalSnapshotNumber = totalSnapshotNumber,
                EndTimestamp        = startTime.AddDays(lastingDays),
                StartTimestamp      = startTime,
                Options             = { options },
                AcceptedCurrency    = EconomicSystemTestConstants.NativeTokenSymbol,
                IsLockToken         = isLockToken
            };
            var transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

            transactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            input.Options.Clear();
            var votingItemId = Hash.FromTwoHashes(Hash.FromMessage(input), Hash.FromMessage(sender));

            return(await VoteContractStub.GetVotingItem.CallAsync(new GetVotingItemInput
            {
                VotingItemId = votingItemId
            }));
        }
Esempio n. 2
0
        public async Task VoteContract_RegisterSuccess()
        {
            _options = GenerateOptions(3);
            var input = new VotingRegisterInput
            {
                Topic          = "Topic1",
                TotalEpoch     = 1,
                ActiveDays     = 100,
                StartTimestamp = DateTime.UtcNow.ToTimestamp(),
                Options        =
                {
                    _options
                },
                AcceptedCurrency = "ELF"
            };

            var transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

            transactionResult.Status.ShouldBe(TransactionResultStatus.Mined);

            //register again
            transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

            transactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
            transactionResult.Error.Contains("Voting event already exists").ShouldBeTrue();
        }
        public static Hash GetHash(this VotingRegisterInput votingItemInput, Address sponsorAddress)
        {
            var input = votingItemInput.Clone();

            input.Options.Clear();
            return(HashHelper.ConcatAndCompute(HashHelper.ComputeFrom(input), HashHelper.ComputeFrom(sponsorAddress)));
        }
Esempio n. 4
0
        public static Hash GetHash(this VotingRegisterInput votingItemInput, Address sponsorAddress)
        {
            var input = votingItemInput.Clone();

            input.Options.Clear();
            return(Hash.FromTwoHashes(Hash.FromMessage(input), Hash.FromMessage(sponsorAddress)));
        }
Esempio n. 5
0
        public override Empty Register(VotingRegisterInput input)
        {
            var votingItemId = AssertValidNewVotingItem(input);

            if (State.TokenContract.Value == null)
            {
                State.TokenContract.Value =
                    Context.GetContractAddressByName(SmartContractConstants.TokenContractSystemName);
            }

            // Accepted currency is in white list means this token symbol supports voting.
            //Length of symbol has been set and unnecessary to set length of AcceptedCurrency.
            var isInWhiteList = State.TokenContract.IsInWhiteList.Call(new IsInWhiteListInput
            {
                Symbol  = input.AcceptedCurrency,
                Address = Context.Self
            }).Value;

            Assert(isInWhiteList, "Claimed accepted token is not available for voting.");

            // Initialize voting event.
            var votingItem = new VotingItem
            {
                Sponsor                       = Context.Sender,
                VotingItemId                  = votingItemId,
                AcceptedCurrency              = input.AcceptedCurrency,
                IsLockToken                   = input.IsLockToken,
                TotalSnapshotNumber           = input.TotalSnapshotNumber,
                CurrentSnapshotNumber         = 1,
                CurrentSnapshotStartTimestamp = input.StartTimestamp,
                StartTimestamp                = input.StartTimestamp,
                EndTimestamp                  = input.EndTimestamp,
                RegisterTimestamp             = Context.CurrentBlockTime,
                Options                       = { input.Options }
            };

            State.VotingItems[votingItemId] = votingItem;

            // Initialize first voting going information of registered voting event.
            var votingResultHash = GetVotingResultHash(votingItemId, 1);

            State.VotingResults[votingResultHash] = new VotingResult
            {
                VotingItemId           = votingItemId,
                SnapshotNumber         = 1,
                SnapshotStartTimestamp = input.StartTimestamp
            };

            return(new Empty());
        }
Esempio n. 6
0
        public async Task Register_With_Invalid_Timestamp()
        {
            var endTime = TimestampHelper.GetUtcNow();
            var input   = new VotingRegisterInput
            {
                TotalSnapshotNumber = 0,
                EndTimestamp        = endTime,
                StartTimestamp      = endTime.AddDays(1),
                Options             = { GenerateOptions(1) },
                AcceptedCurrency    = TestTokenSymbol,
                IsLockToken         = true
            };
            var transactionResult = (await VoteContractStub.Register.SendWithExceptionAsync(input)).TransactionResult;

            transactionResult.Error.ShouldContain("Invalid active time.");
        }
Esempio n. 7
0
        /// <summary>
        /// Initialize the related contracts=>TokenContract;
        /// </summary>
        private Hash AssertValidNewVotingItem(VotingRegisterInput input)
        {
            // Use input without options and sender's address to calculate voting item id.
            var votingItemId = input.GetHash(Context.Sender);

            Assert(State.VotingItems[votingItemId] == null, "Voting item already exists.");

            // total snapshot number can't be 0. At least one epoch is required.
            if (input.TotalSnapshotNumber == 0)
            {
                input.TotalSnapshotNumber = 1;
            }

            Assert(input.EndTimestamp > input.StartTimestamp, "Invalid active time.");

            Context.LogDebug(() => $"Voting item created by {Context.Sender}: {votingItemId.ToHex()}");

            return(votingItemId);
        }
Esempio n. 8
0
        public async Task VoteContract_Register_CurrencyNotSupportVoting_Test()
        {
            var startTime = TimestampHelper.GetUtcNow();
            var input     = new VotingRegisterInput
            {
                TotalSnapshotNumber = 5,
                EndTimestamp        = startTime.AddDays(100),
                StartTimestamp      = startTime,
                Options             =
                {
                    GenerateOptions(3)
                },
                AcceptedCurrency = "USDT",
                IsLockToken      = true
            };
            var transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

            transactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
            transactionResult.Error.Contains("Claimed accepted token is not available for voting").ShouldBeTrue();
        }
Esempio n. 9
0
        private async Task <TransactionResult> GenerateNewVoteEvent(string topic, int totalEpoch, int activeDays, int optionCount, bool delegated)
        {
            _options = GenerateOptions(optionCount);
            var input = new VotingRegisterInput
            {
                Topic          = topic,
                TotalEpoch     = totalEpoch,
                ActiveDays     = activeDays,
                StartTimestamp = DateTime.UtcNow.ToTimestamp(),
                Options        =
                {
                    _options
                },
                AcceptedCurrency = "ELF",
                Delegated        = delegated
            };

            var transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

            return(transactionResult);
        }
        public override Empty RegisterElectionVotingEvent(Empty input)
        {
            Assert(!State.VotingEventRegistered.Value, "Already registered.");

            State.VoteContract.Value = Context.GetContractAddressByName(SmartContractConstants.VoteContractSystemName);

            var votingRegisterInput = new VotingRegisterInput
            {
                IsLockToken         = false,
                AcceptedCurrency    = Context.Variables.NativeSymbol,
                TotalSnapshotNumber = long.MaxValue,
                StartTimestamp      = DateTime.MinValue.ToUniversalTime().ToTimestamp(),
                EndTimestamp        = DateTime.MaxValue.ToUniversalTime().ToTimestamp()
            };

            State.VoteContract.Register.Send(votingRegisterInput);

            State.MinerElectionVotingItemId.Value = Hash.FromTwoHashes(Hash.FromMessage(votingRegisterInput),
                                                                       Hash.FromMessage(Context.Self));

            State.VotingEventRegistered.Value = true;
            return(new Empty());
        }
Esempio n. 11
0
        /// <summary>
        /// Register a voting item.
        /// </summary>
        /// <param name="lastingDays"></param>
        /// <param name="optionsCount"></param>
        /// <param name="isLockToken"></param>
        /// <param name="sender"></param>
        /// <param name="totalSnapshotNumber"></param>
        /// <returns></returns>
        private async Task <VotingItem> RegisterVotingItemAsync(int lastingDays, int optionsCount, bool isLockToken, Address sender,
                                                                int totalSnapshotNumber = int.MaxValue)
        {
            var startTime = TimestampHelper.GetUtcNow();
            var input     = new VotingRegisterInput
            {
                TotalSnapshotNumber = totalSnapshotNumber,
                EndTimestamp        = startTime.AddDays(lastingDays),
                StartTimestamp      = startTime,
                Options             = { GenerateOptions(optionsCount) },
                AcceptedCurrency    = TestTokenSymbol,
                IsLockToken         = isLockToken
            };
            var transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

            transactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            input.Options.Clear();
            var votingItemId = Hash.FromTwoHashes(Hash.FromMessage(input), Hash.FromMessage(sender));

            return(await VoteContractStub.GetVotingItem.CallAsync(new GetVotingItemInput
            {
                VotingItemId = votingItemId
            }));
        }
Esempio n. 12
0
        public async Task VoteContract_RegisterFailed()
        {
            //invalid topic
            {
                var input = new VotingRegisterInput
                {
                    Topic      = string.Empty,
                    TotalEpoch = 1
                };

                var transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

                transactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.Error.Contains("Topic cannot be null or empty").ShouldBeTrue();
            }

            //without option
            {
                var input = new VotingRegisterInput
                {
                    Topic      = "test topic",
                    TotalEpoch = 2,
                    ActiveDays = 10
                };

                var transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

                transactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.Error.Contains("Options cannot be null or empty").ShouldBeTrue();
            }

            //endless vote event
            {
                var input = new VotingRegisterInput
                {
                    Topic      = "bp election topic",
                    TotalEpoch = 1,
                    ActiveDays = int.MaxValue,
                    Options    =
                    {
                        Address.Generate().GetFormatted()
                    }
                };

                var transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

                transactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.Error.Contains("Cannot created endless voting event").ShouldBeTrue();
            }

            //voting with not accepted currency
            {
                var input = new VotingRegisterInput
                {
                    Topic            = "bp election topic",
                    TotalEpoch       = 1,
                    ActiveDays       = 100,
                    StartTimestamp   = DateTime.UtcNow.ToTimestamp(),
                    AcceptedCurrency = "UTC",
                    Options          =
                    {
                        Address.Generate().GetFormatted()
                    }
                };

                var transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

                transactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.Error.Contains("Claimed accepted token is not available for voting").ShouldBeTrue();
            }
        }
Esempio n. 13
0
        public override Empty Register(VotingRegisterInput input)
        {
            input.Topic = input.Topic.Trim();

            if (input.TotalEpoch == 0)
            {
                input.TotalEpoch = 1;
            }

            Assert(!string.IsNullOrEmpty(input.Topic), "Topic cannot be null or empty.");
            Assert(input.TotalEpoch > 0, "Total epoch number must be greater than 0.");
            Assert(input.ActiveDays > 0, "Total active days must be greater than 0.");
            Assert(input.Options != null && input.Options.Any(), "Options cannot be null or empty.");

            if (input.ActiveDays == int.MaxValue)
            {
                Assert(input.TotalEpoch != 1, "Cannot created endless voting event.");
            }

            InitializeDependentContracts();

            if (input.StartTimestamp == null || input.StartTimestamp.ToDateTime() < Context.CurrentBlockTime)
            {
                input.StartTimestamp = Context.CurrentBlockTime.ToTimestamp();
            }

            var votingEvent = new VotingEvent
            {
                Sponsor = Context.Sender,
                Topic   = input.Topic
            };
            var votingEventHash = votingEvent.GetHash();

            Assert(State.VotingEvents[votingEventHash] == null, "Voting event already exists.");
            var isInWhiteList = State.TokenContract.IsInWhiteList.Call(new IsInWhiteListInput
            {
                Symbol  = input.AcceptedCurrency,
                Address = Context.Self
            }).Value;

            Assert(isInWhiteList, "Claimed accepted token is not available for voting.");

            // Initialize voting event.
            votingEvent.AcceptedCurrency = input.AcceptedCurrency;
            votingEvent.ActiveDays       = input.ActiveDays;
            votingEvent.Delegated        = input.Delegated;
            votingEvent.TotalEpoch       = input.TotalEpoch;
            votingEvent.Options.AddRange(input.Options);
            votingEvent.CurrentEpoch        = 1;
            votingEvent.EpochStartTimestamp = input.StartTimestamp;
            votingEvent.RegisterTimestamp   = Context.CurrentBlockTime.ToTimestamp();
            votingEvent.StartTimestamp      = input.StartTimestamp;

            State.VotingEvents[votingEventHash] = votingEvent;

            // Initialize first voting going information of registered voting event.
            var votingResultHash = Hash.FromMessage(new GetVotingResultInput
            {
                Sponsor     = Context.Sender,
                Topic       = input.Topic,
                EpochNumber = 1
            });

            State.VotingResults[votingResultHash] = new VotingResult
            {
                Topic       = input.Topic,
                Sponsor     = Context.Sender,
                EpochNumber = 1
            };

            return(new Empty());
        }