/// <summary>
        /// Converts the transaction to the corresponding trytes representation
        /// </summary>
        /// <returns></returns>
        public string ToTransactionTrytes()
        {
            int[] valueTrits        = Converter.ToTrits("" + Value, 81);
            int[] timestampTrits    = Converter.ToTrits("" + Timestamp, 27);
            int[] currentIndexTrits = Converter.ToTrits("" + CurrentIndex, 27);
            int[] lastIndexTrits    = Converter.ToTrits("" + LastIndex, 27);

            if (this.AttachmentTimestamp <= 0)
            {
                AttachmentTimestamp = IotaUtils.CreateAttachmentTimeStampNow();
            }

            return(SignatureFragment
                   + Address
                   + Converter.ToTrytes(valueTrits)
                   + ObsoleteTag
                   + Converter.ToTrytes(timestampTrits)
                   + Converter.ToTrytes(currentIndexTrits)
                   + Converter.ToTrytes(lastIndexTrits)
                   + Bundle
                   + TrunkTransaction
                   + BranchTransaction
                   + Tag
                   + Converter.ToTrytes(Converter.ToTrits("" + this.AttachmentTimestamp, 27))           // AttachmentTime
                   + Converter.ToTrytes(Converter.ToTrits("" + this.AttachmentTimestampLowerBound, 27)) // AttachmentLowerBound
                   + Converter.ToTrytes(Converter.ToTrits("" + this.AttachmentTimestampUpperBound, 27)) // AttachmentUpperBound
                   + Nonce);
        }
Esempio n. 2
0
        public void GeneratedTryteTest()
        {
            var trytes = IotaUtils.GenerateRandomTrytes();

            Assert.AreEqual(81, trytes.Length);
            Assert.IsTrue(ContainsChars(trytes, Constants.TryteAlphabet));
        }
Esempio n. 3
0
        public async Task <string> ApproveTransaction(string transactionHash, ApproveTransactionType approveType)
        {
            var api = CreateIotaClient();
            //var address = await api.GetAddress(TestSeed2, 8);

            var emptyAddress = IotaUtils.GenerateRandomTrytes(81); // "".Pad(81);

            var transfer = new TransferItem()
            {
                Address = emptyAddress,
                Value   = 0,
                Message = "",
                Tag     = ""
            };

            while (true)
            {
                try
                {
                    CancellationTokenSource cts = new CancellationTokenSource();

                    var transactions    = transfer.CreateTransactions();
                    var trytesToPow     = transactions.GetTrytes().Single();
                    var toApproveResult = await api.IriApi.GetTransactionsToApprove(9);

                    var toApprove = toApproveResult.Result;

                    var diver = new PowDiver();
                    cts.CancelAfter(20000);
                    var trunk  = toApprove.TrunkTransaction;
                    var branch = toApprove.BranchTransaction;

                    if (approveType == ApproveTransactionType.Trunk)
                    {
                        trunk = transactionHash;
                    }
                    else
                    {
                        branch = transactionHash;
                    }

                    var trytesToSend = await diver.DoPow(trytesToPow.SetApproveTransactions(trunk, branch), 15, cts.Token);

                    await api.IriApi.BroadcastTransactions(trytesToSend);

                    await api.IriApi.StoreTransactions(trytesToSend);

                    var transaction = new TransactionItem(trytesToSend);

                    return(transaction.Hash);
                }
                catch (OperationCanceledException)
                {
                    continue;
                }
            }
        }
Esempio n. 4
0
        public void GenerateAddresses2()
        {
            Assert.AreEqual(ADDR_I0_S1, IotaUtils.GenerateAddress(ADDR_SEED, 0, 1).Address);
            Assert.AreEqual(ADDR_I0_S2, IotaUtils.GenerateAddress(ADDR_SEED, 0, 2).Address);
            Assert.AreEqual(ADDR_I0_S3, IotaUtils.GenerateAddress(ADDR_SEED, 0, 3).Address);

            Assert.AreEqual(ADDR_LS_I0_S1, IotaUtils.GenerateAddress(ADDR_SEED + ADDR_SEED, 0, 1).Address);
            Assert.AreEqual(ADDR_LS_I0_S2, IotaUtils.GenerateAddress(ADDR_SEED + ADDR_SEED, 0, 2).Address);
            Assert.AreEqual(ADDR_LS_I0_S3, IotaUtils.GenerateAddress(ADDR_SEED + ADDR_SEED, 0, 3).Address);
        }
Esempio n. 5
0
        public void CreateAddresses_FromSeed_CorrectAddressesReturned()
        {
            var seed = "ABM9ADN999VDXCHYJXDKUQITXAWQPBWZGYTBGTEIFWXOZTMHESEVHYLXWASWQFEJHUAKHIKSCA9AL9KMG";

            for (int i = 0; i < 10; i++)
            {
                var address = IotaUtils.GenerateAddress(seed, i, 2, System.Threading.CancellationToken.None);
                Console.WriteLine($"{i}: {address.AddressWithCheckSum}");
            }
        }
Esempio n. 6
0
        public void GenerateAddresses1()
        {
            var res1 = IotaUtils.GenerateAddress(TEST_SEED1, 0, 1).Address;

            Assert.AreEqual(res1, TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_1);

            var res2 = IotaUtils.GenerateAddress(TEST_SEED1, 0, 2).Address;

            Assert.AreEqual(res2, TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2);

            var res3 = IotaUtils.GenerateAddress(TEST_SEED1, 0, 3).Address;

            Assert.AreEqual(res3, TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_3);
        }
Esempio n. 7
0
        /// <summary>
        /// Generates an address and gets transactions.
        /// </summary>
        /// <param name="seed">The seed from which an address should be generated</param>
        /// <param name="index">The index of the address</param>
        /// <param name="cancellationToken">The CancellationToken</param>
        /// <returns></returns>
        private async Task <AddressItem> GenerateAddressAsync(string seed, int index, CancellationToken cancellationToken)
        {
            await TaskIota.Yield().ConfigureAwait(false);

            // need yield because new address generation is very costly

            var addressItem = IotaUtils.GenerateAddress(seed, index, AddressSecurity, cancellationToken);

            cancellationToken.ThrowIfCancellationRequested();

            await RenewTransactions(addressItem);

            return(addressItem);
        }
Esempio n. 8
0
        public async Task SendVeryEmptyTransactionTest()
        {
            var api = CreateIotaClient();

            var emptyAddress = IotaUtils.GenerateRandomTrytes(81); // "".Pad(81);

            var transfer = new TransferItem()
            {
                Address = emptyAddress,
                Value   = 0,
                Message = null,
                Tag     = null
            };

            while (true)
            {
                try
                {
                    CancellationTokenSource cts = new CancellationTokenSource();

                    var transactions    = transfer.CreateTransactions();
                    var trytesToPow     = transactions.GetTrytes().Single();
                    var toApproveResult = await api.IriApi.GetTransactionsToApprove(9);

                    var toApprove = toApproveResult.Result;
                    var diver     = new PowDiver();
                    //cts.CancelAfter(15000);
                    var trunk  = toApprove.TrunkTransaction;
                    var branch = toApprove.BranchTransaction;


                    var trytesToSend = await diver.DoPow(trytesToPow.SetApproveTransactions(trunk, branch), 15, cts.Token);

                    await api.IriApi.BroadcastTransactions(trytesToSend);

                    await api.IriApi.StoreTransactions(trytesToSend);

                    var transaction = new TransactionItem(trytesToSend);
                }
                catch (OperationCanceledException)
                {
                    continue;
                }
            }
        }
Esempio n. 9
0
        private static IEnumerable <TransactionItem> CreateDepositTransaction(TransferItem transferItem)
        {
            var timestamp = IotaUtils.CreateTimeStampNow().ToString();
            var tag       = transferItem.Tag.ValidateTrytes(nameof(transferItem.Tag)).Pad(27);

            var messages = ChunksUpto(transferItem.Message, 2187).ToArray();

            for (int i = 0; i < messages.Length; i++)
            {
                var message = messages[i].ValidateTrytes(nameof(transferItem.Message)).Pad(2187);

                var transactionItem = new TransactionItem()
                {
                    Address           = transferItem.Address,
                    SignatureFragment = message,
                    Value             = (i == 0 ? transferItem.Value : 0).ToString(),
                    Timestamp         = timestamp,
                    Tag = tag,
                };

                yield return(transactionItem);
            }
        }
Esempio n. 10
0
 public void GerateAddressesWithChecksum()
 {
     Assert.AreEqual(FIRST_ADDR, IotaUtils.GenerateAddress(TEST_SEED, 0, 2).AddressWithCheckSum);
     Assert.AreEqual(SIXTH_ADDR, IotaUtils.GenerateAddress(TEST_SEED, 5, 2).AddressWithCheckSum);
 }
Esempio n. 11
0
        private static IEnumerable <TransactionItem> CreateWithdrawalTransactions(string tag, long withdrawAmount, string reminderAddress, params AddressItem[] addressItems)
        {
            if (string.IsNullOrWhiteSpace(reminderAddress))
            {
                throw new ArgumentNullException(nameof(reminderAddress));
            }

            tag = tag.ValidateTrytes(nameof(tag)).Pad(27);

            foreach (var addressItem in addressItems)
            {
                if (addressItem.Balance <= 0)
                {
                    continue;
                }

                var timestamp = IotaUtils.CreateTimeStampNow().ToString();

                var amount = addressItem.Balance;
                withdrawAmount -= amount;

                var transactionItem = new TransactionItem()
                {
                    Address   = addressItem.Address,
                    Value     = (-amount).ToString(), // withdraw all amount
                    Timestamp = timestamp,
                    Tag       = tag
                };
                yield return(transactionItem);

                transactionItem = new TransactionItem()
                {
                    Address   = addressItem.Address,
                    Value     = "0",
                    Timestamp = timestamp,
                    Tag       = tag
                };
                yield return(transactionItem);



                if (withdrawAmount < 0) // deposit remind amount to reminder address
                {
                    var message = "".Pad(2187);

                    transactionItem = new TransactionItem()
                    {
                        Address           = reminderAddress,
                        Value             = Math.Abs(withdrawAmount).ToString(),
                        Timestamp         = timestamp,
                        SignatureFragment = message,
                        Tag = tag
                    };
                    yield return(transactionItem);
                }

                if (withdrawAmount <= 0)
                {
                    break;
                }
            }
        }