Пример #1
0
        public async Task AggregateNamespaceRentalExtensionShouldSucceed()
        {
            var signer = KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain);

            var transaction = RegisterNamespaceTransaction.CreateRootNamespace(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                "happy",
                10000)
                              .ToAggregate(PublicAccount.CreateFromPublicKey("B974668ABED344BE9C35EE257ACC246117EFFED939EAF42391AE995912F985FE", NetworkType.Types.MIJIN_TEST));

            var agg = AggregateTransaction.CreateComplete(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                new List <Transaction>()
            {
                transaction
            })
                      .SignWith(signer);

            await new TransactionHttp(host).Announce(agg);

            listener.TransactionStatus(Address.CreateFromPublicKey(signer.PublicKeyString, NetworkType.Types.MIJIN_TEST)).Subscribe(
                e =>
            {
                Console.WriteLine(e.Status);
            });

            var status = await listener.ConfirmedTransactionsGiven(Address.CreateFromPublicKey(signer.PublicKeyString, NetworkType.Types.MIJIN_TEST)).Where(e => e.TransactionInfo.Hash == agg.Hash).Take(1);


            Assert.AreEqual(signer.PublicKeyString, status.Signer.PublicKey);
        }
        public async Task <Transaction> AggregateTransfer(Account from, Address to, Mosaic mosaic, IMessage message, string GenerationHash)
        {
            var transferTransaction = TransferTransaction.Create(
                Deadline.Create(),
                Recipient.From(to),
                new List <Mosaic>()
            {
                mosaic
            },
                message,
                NetworkType);

            var aggregateTransaction = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                transferTransaction.ToAggregate(from.PublicAccount)
            }, NetworkType);

            var signedTransaction = from.Sign(aggregateTransaction, GenerationHash);

            WatchForFailure(signedTransaction);

            var tx = SiriusWebSocketClient.Listener.ConfirmedTransactionsGiven(from.Address).Take(1);

            await SiriusClient.TransactionHttp.Announce(signedTransaction);

            var result = await tx;

            return(result);
        }
        public async Task SignAggregateTransactionComplete()
        {
            var signerKey =
                KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain);

            var account = new Account(Config.PrivateKeySecond,
                                      NetworkType.Types.MIJIN_TEST);

            var aggregateTransaction = AggregateTransaction.CreateComplete(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                new List <Transaction>
            {
                TransferTransactionTests.CreateInnerTransferTransaction("nem:xem")
                .ToAggregate(PublicAccount.CreateFromPublicKey(signerKey.PublicKeyString, NetworkType.Types.MIJIN_TEST)),
                TransferTransactionTests.CreateInnerTransferTransaction("nem:xem")
                .ToAggregate(PublicAccount.CreateFromPublicKey(account.PublicKey, NetworkType.Types.MIJIN_TEST))
            })
                                       .SignWithAggregateCosigners(signerKey, new List <Account>()
            {
                Account.CreateFromPrivateKey(Config.PrivateKeySecond,
                                             NetworkType.Types.MIJIN_TEST)
            }
                                                                   );

            WatchForFailure(aggregateTransaction);

            await new TransactionHttp(host).Announce(aggregateTransaction);

            var status = await listener.ConfirmedTransactionsGiven(Address.CreateFromPublicKey(account.PublicKey, NetworkType.Types.MIJIN_TEST)).Where(e => e.TransactionInfo.Hash == aggregateTransaction.Hash).Take(1);

            Assert.AreEqual(signerKey.PublicKeyString, status.Signer.PublicKey);
        }
Пример #4
0
        public void ShouldCreateAggregateTransactionAndSignWithMultipleCosignatories()
        {
            TransferTransaction transferTx = TransferTransaction.Create(
                NetworkType.Types.MIJIN_TEST,
                FakeDeadline.Create(),
                new Address("SBILTA367K2LX2FEXG5TFWAS7GEFYAGY7QLFBYKC", NetworkType.Types.MIJIN_TEST),
                new List <Mosaic>(),
                PlainMessage.Create("test-message")

                );

            AggregateTransaction aggregateTx = AggregateTransaction.CreateComplete(
                NetworkType.Types.MIJIN_TEST,
                FakeDeadline.Create(),
                new List <Transaction>()
            {
                transferTx.ToAggregate(new PublicAccount("B694186EE4AB0558CA4AFCFDD43B42114AE71094F5A1FC4A913FE9971CACD21D", NetworkType.Types.MIJIN_TEST))
            });

            Account cosignatoryAccount  = new Account("2a2b1f5d366a5dd5dc56c3c757cf4fe6c66e2787087692cf329d7a49a594658b", NetworkType.Types.MIJIN_TEST);
            Account cosignatoryAccount2 = new Account("b8afae6f4ad13a1b8aad047b488e0738a437c7389d4ff30c359ac068910c1d59", NetworkType.Types.MIJIN_TEST);

            SignedTransaction signedTransaction = cosignatoryAccount.SignTransactionWithCosignatories(aggregateTx, new List <Account>()
            {
                cosignatoryAccount2
            });

            Assert.AreEqual("2D010000", signedTransaction.Payload.Substring(0, 8));
            Assert.AreEqual("5100000051000000", signedTransaction.Payload.Substring(240, 16));
        }
        public async Task Should_Convert_Account_To_2to2_MultiSig()
        {
            //account = Account.CreateFromPrivateKey("6681DC3BBEEEDF213160A27DDCA551B7AC8DC3BB79B8BDC059DD2CEA7B2E9C42", NetworkType);
            //cosignatory1 = Account.CreateFromPrivateKey("3B2B0AE238CF78E65E0F0B7110F7B4E73B8C56AB0282F98D22A39BB67D127609", NetworkType);

            Log.WriteLine($"MultiSig account {Fixture.MultiSigAccount}");
            Log.WriteLine($"Cosignatory1 account {Fixture.Cosignatory1}");


            // Define a modify multisig account transaction to increase the minAprovalDelta in one unit
            var modifyMultisigAccountTransaction = ModifyMultisigAccountTransaction.Create(
                Deadline.Create(),
                1,
                0,
                new List <MultisigCosignatoryModification>
            {
            },
                Fixture.NetworkType);

            // Wrap the modify multisig account transaction in an aggregate transaction,
            // attaching the multisig public key as the signer
            var aggregateTransaction = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                modifyMultisigAccountTransaction.ToAggregate(Fixture.MultiSigAccount.PublicAccount)
            },
                Fixture.NetworkType
                );

            var signedTransaction = Fixture.Cosignatory1.Sign(aggregateTransaction, Fixture.GenerationHash);

            var cosignatory1ConfirmedTx = Fixture.SiriusWebSocketClient.Listener
                                          .ConfirmedTransactionsGiven(Fixture.Cosignatory1.Address).Take(1)
                                          .Timeout(TimeSpan.FromSeconds(2000));

            Log.WriteLine($"Going to announce aggregate completed transaction {signedTransaction.Hash}");

            // Announce the hash lock transaction
            await Fixture.SiriusClient.TransactionHttp.Announce(signedTransaction);

            Thread.Sleep(2000);
            var confirmedTx = await cosignatory1ConfirmedTx;

            // verify the account is multisig
            var multiSigAcc = await Fixture.SiriusClient.AccountHttp.GetMultisigAccountInfo(Fixture.MultiSigAccount.Address);

            Log.WriteLine($"Multisig account {multiSigAcc}");

            multiSigAcc.IsMultisig.Should().BeTrue();
            multiSigAcc.MinApproval.Should().Be(2);
            multiSigAcc.MinRemoval.Should().Be(1);
            multiSigAcc.Cosignatories.Should().HaveCount(2);
        }
        public async Task Should_Add_Metadata_To_Account()
        {
            var account = await Fixture.GenerateAccountWithCurrency(10000);

            Log.WriteLine($"Company Account {account.Address.Plain} \r\n Private Key: {account.PrivateKey} \r\n Public Key {account.PublicKey}");

            // await Fixture.SiriusWebSocketClient.Listener.Open();
            var metadatatrx          = AccountMetadataTransaction.Create(Deadline.Create(), account.PublicAccount, "test", "test", "", Fixture.NetworkType);
            var aggregateTransaction = AggregateTransaction.CreateBonded(
                Deadline.Create(),
                new List <Transaction>
            {
                metadatatrx.ToAggregate(account.PublicAccount),
            },
                Fixture.NetworkType);

            var aggregateTransactionsigned = account.Sign(aggregateTransaction, Fixture.GenerationHash);

            var hashLockTransaction = HashLockTransaction.Create(
                Deadline.Create(),
                //new Mosaic(new MosaicId("0BB1469B94E6FEF8"), 10),
                NetworkCurrencyMosaic.CreateRelative(10),
                (ulong)3650,
                aggregateTransactionsigned,
                Fixture.NetworkType);

            var hashLockTransactionSigned = account.Sign(hashLockTransaction, Fixture.GenerationHash);

            Log.WriteLine($"Going to announce hashlock transaction: {hashLockTransactionSigned.Hash}");
            await Fixture.SiriusClient.TransactionHttp.Announce(hashLockTransactionSigned);

            var hashLocktx = Fixture.SiriusWebSocketClient.Listener
                             .ConfirmedTransactionsGiven(account.Address).Take(1)
                             .Timeout(TimeSpan.FromSeconds(500));

            Fixture.WatchForFailure(hashLockTransactionSigned);
            var hashLockConfirmed = await hashLocktx;

            Log.WriteLine($"Request confirmed with hash lock transaction {hashLockConfirmed.TransactionInfo.Hash}");
            Thread.Sleep(4000);

            Log.WriteLine($"Going to announce aggregate transaction {aggregateTransactionsigned.Hash}");

            await Fixture.SiriusClient.TransactionHttp.AnnounceAggregateBonded(aggregateTransactionsigned);

            Fixture.WatchForFailure(aggregateTransactionsigned);
            var aggregateTransactiontx = Fixture.SiriusWebSocketClient.Listener
                                         .ConfirmedTransactionsGiven(account.Address).Take(1)
                                         .Timeout(TimeSpan.FromSeconds(500));

            //var aggregateTransactionConfirmed = await aggregateTransactiontx;
            //Log.WriteLine($" Request confirmed with aggregate transaction {aggregateTransactionConfirmed.TransactionInfo.Hash}");
        }
        private void ValidateAggregateTransaction(AggregateTransaction aggregateTransaction, string aggregateTransactionDTO)
        {
            var tx = JsonConvert.DeserializeObject <AggregateTransactionInfoDTO>(aggregateTransactionDTO);

            Assert.AreEqual(tx.Meta.Height, aggregateTransaction.TransactionInfo.Height);

            if (aggregateTransaction.TransactionInfo.Hash != null)
            {
                Assert.AreEqual(tx.Meta.Hash, aggregateTransaction.TransactionInfo.Hash);
            }
            if (aggregateTransaction.TransactionInfo.MerkleComponentHash != null)
            {
                Assert.AreEqual(tx.Meta.MerkleComponentHash, aggregateTransaction.TransactionInfo.MerkleComponentHash);
            }
            if (aggregateTransaction.TransactionInfo.Index != null)
            {
                Assert.AreEqual(tx.Meta.Index, aggregateTransaction.TransactionInfo.Index);
            }
            if (aggregateTransaction.TransactionInfo.Id != null)
            {
                Assert.AreEqual(tx.Meta.Id, aggregateTransaction.TransactionInfo.Id);
            }
            if (aggregateTransaction.TransactionInfo.AggregateHash != null)
            {
                Assert.AreEqual(tx.Transaction.InnerTransactions[0].Meta.AggregateHash, aggregateTransaction.InnerTransactions[0].TransactionInfo.AggregateHash);
            }
            if (aggregateTransaction.TransactionInfo.AggregateId != null)
            {
                Assert.AreEqual(tx.Transaction.InnerTransactions[0].Meta.AggregateId, aggregateTransaction.TransactionInfo.AggregateId);
            }

            Assert.AreEqual(tx.Transaction.Signature, aggregateTransaction.Signature);
            Assert.AreEqual(tx.Transaction.Signer, aggregateTransaction.Signer.PublicKey);
            int version = (int)Convert.ToInt64(tx.Transaction.Version.ToString("X").Substring(2, 2), 16);

            Assert.IsTrue(version == aggregateTransaction.Version);
            int type = (int)Convert.ToInt64(tx.Transaction.Version.ToString("X").Substring(0, 2), 16);

            Assert.IsTrue((byte)type == aggregateTransaction.NetworkType.GetNetworkByte());
            Assert.AreEqual(tx.Transaction.Fee, aggregateTransaction.Fee);
            Assert.IsNotNull(aggregateTransaction.Deadline);

            if (tx.Transaction.Cosignatures.Count > 0)
            {
                Assert.AreEqual(tx.Transaction.Cosignatures[0].Signature, aggregateTransaction.Cosignatures[0].Signature);
                Assert.AreEqual(tx.Transaction.Cosignatures[0].Signer, aggregateTransaction.Cosignatures[0].Signer.PublicKey);
            }

            for (var index = 0; index < aggregateTransaction.InnerTransactions.Count; index++)
            {
                ValidateStandaloneTransaction(aggregateTransaction.InnerTransactions[index], JObject.Parse(aggregateTransactionDTO)["transaction"]["transactions"].ToObject <List <JObject> >()[index].ToString());
            }
        }
        public async Task <MosaicId> CreateMosaic(Account account)
        {
            var nonce    = MosaicNonce.CreateRandom();
            var mosaicId = MosaicId.CreateFromNonce(nonce, account.PublicAccount.PublicKey);

            var mosaicDefinitionTransaction = MosaicDefinitionTransaction.Create(
                nonce,
                mosaicId,
                Deadline.Create(),
                MosaicProperties.Create(
                    supplyMutable: true,
                    transferable: true,
                    levyMutable: false,
                    divisibility: 0,
                    duration: 1000
                    ),
                NetworkType);

            var mosaicSupplyChangeTransaction = MosaicSupplyChangeTransaction.Create(
                Deadline.Create(),
                mosaicDefinitionTransaction.MosaicId,
                MosaicSupplyType.INCREASE,
                1000000,
                NetworkType);

            var aggregateTransaction = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                mosaicDefinitionTransaction.ToAggregate(account.PublicAccount),
                mosaicSupplyChangeTransaction.ToAggregate(account.PublicAccount)
            },
                NetworkType);

            var signedTransaction = account.Sign(aggregateTransaction, GenerationHash);

            WatchForFailure(signedTransaction);



            var tx = SiriusWebSocketClient.Listener.ConfirmedTransactionsGiven(account.Address).Take(1)
                     .Timeout(TimeSpan.FromSeconds(3000));

            await SiriusClient.TransactionHttp.Announce(signedTransaction);

            var result = await tx;


            return(mosaicId);
        }
Пример #9
0
        public void Should_Serialize_And_Sign_LockFundTransaction()
        {
            var account         = Account.CreateFromPrivateKey("26b64cb10f005e5988a36744ca19e20d835ccc7c105aaa5f3b212da593180930", NetworkType.MIJIN_TEST);
            var generationHash  = "B750FC8ADD9FAB8C71F0BB90B6409C66946844F07C5CADB51F27A9FAF219BFC7";
            var network         = NetworkType.MIJIN_TEST;
            var multiSigAccount = Account.GenerateNewAccount(network);
            var coginatory1     = Account.GenerateNewAccount(network);
            var coginatory2     = Account.GenerateNewAccount(network);

            var coginatories = new List <MultisigCosignatoryModification>
            {
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    coginatory1.PublicAccount),
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    coginatory2.PublicAccount),
            };

            var convertIntoMultisigTransaction = ModifyMultisigAccountTransaction.Create(
                Deadline.Create(),
                1,
                1,
                coginatories,
                network);

            var aggregateTransaction = AggregateTransaction.CreateBonded(
                Deadline.Create(),
                new List <Transaction>
            {
                convertIntoMultisigTransaction.ToAggregate(multiSigAccount.PublicAccount)
            },
                network);


            var signedTransaction = multiSigAccount.Sign(aggregateTransaction, generationHash);

            var builder = new LockFundsTransactionBuilder();

            builder.SetDeadline(Deadline.Create())
            .SetDuration((ulong)700)
            .SetMosaic(NetworkCurrencyMosaic.CreateRelative(10))
            .SetSignedTransaction(signedTransaction)
            .SetNetworkType(network);

            var hashLockTransaction = builder.Build();

            var hashLockTransactionSigned = multiSigAccount.Sign(hashLockTransaction, generationHash);

            hashLockTransactionSigned.Payload.Should().NotBeNullOrEmpty();
            hashLockTransactionSigned.Hash.Should().NotBeNullOrEmpty();
        }
        public async Task Should_Convert_Account_To_2to2_MultiSig()
        {
            Log.WriteLine($"MultiSig account {Fixture.MultiSigAccount}");
            Log.WriteLine($"Cosignatory1 account {Fixture.Cosignatory1}");

            // Define a modify multisig account transaction to increase the minAprovalDelta in one unit
            var modifyMultisigAccountTransaction = ModifyMultisigAccountTransaction.Create(
                Deadline.Create(),
                1,
                0,
                new List <MultisigCosignatoryModification>
            {
            },
                Fixture.NetworkType);

            // Wrap the modify multisig account transaction in an aggregate transaction,
            // attaching the multisig public key as the signer
            var aggregateTransaction = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                modifyMultisigAccountTransaction.ToAggregate(Fixture.MultiSigAccount.PublicAccount)
            },
                Fixture.NetworkType
                );

            var signedTransaction = Fixture.Cosignatory1.Sign(aggregateTransaction, Fixture.GenerationHash);

            var cosignatory1ConfirmedTx = Fixture.SiriusWebSocketClient.Listener
                                          .ConfirmedTransactionsGiven(Fixture.Cosignatory1.Address).Take(1)
                                          .Timeout(TimeSpan.FromSeconds(8000));
            var result = await cosignatory1ConfirmedTx;

            Log.WriteLine($"Going to announce aggregate completed transaction {result.TransactionInfo.Hash}");

            // Announce the hash lock transaction
            await Fixture.SiriusClient.TransactionHttp.Announce(signedTransaction);

            Thread.Sleep(5000);

            // verify the account is multisig
            var multiSigAcc = await Fixture.SiriusClient.AccountHttp.GetMultisigAccountInfo(Fixture.MultiSigAccount.Address);

            Log.WriteLine($"Multisig account {multiSigAcc}");

            multiSigAcc.IsMultisig.Should().BeTrue();
            multiSigAcc.MinApproval.Should().Be(2);
            multiSigAcc.MinRemoval.Should().Be(1);
            multiSigAcc.Cosignatories.Should().HaveCount(2);
        }
        public void Should_Serialize_And_Sign_LockFundTransaction()
        {
            var account         = Account.CreateFromPrivateKey("26b64cb10f005e5988a36744ca19e20d835ccc7c105aaa5f3b212da593180930", NetworkType.TEST_NET);
            var generationHash  = "AC87FDA8FD94B72F3D0790A7D62F248111BD5E37B95B16E4216DA99C212530A5";
            var network         = NetworkType.TEST_NET;
            var multiSigAccount = Account.GenerateNewAccount(network);
            var coginatory1     = Account.GenerateNewAccount(network);
            var coginatory2     = Account.GenerateNewAccount(network);

            var coginatories = new List <MultisigCosignatoryModification>
            {
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    coginatory1.PublicAccount),
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    coginatory2.PublicAccount),
            };

            var convertIntoMultisigTransaction = ModifyMultisigAccountTransaction.Create(
                Deadline.Create(),
                1,
                1,
                coginatories,
                network);

            var aggregateTransaction = AggregateTransaction.CreateBonded(
                Deadline.Create(),
                new List <Transaction>
            {
                convertIntoMultisigTransaction.ToAggregate(multiSigAccount.PublicAccount)
            },
                network);

            var signedTransaction = multiSigAccount.Sign(aggregateTransaction, generationHash);

            var builder = new LockFundsTransactionBuilder();

            builder.SetDeadline(Deadline.Create())
            .SetDuration((ulong)700)
            .SetMosaic(NetworkCurrencyMosaic.CreateRelative(10))
            .SetSignedTransaction(signedTransaction)
            .SetNetworkType(network);

            var hashLockTransaction = builder.Build();

            var hashLockTransactionSigned = multiSigAccount.Sign(hashLockTransaction, generationHash);

            hashLockTransactionSigned.Payload.Should().NotBeNullOrEmpty();
            hashLockTransactionSigned.Hash.Should().NotBeNullOrEmpty();
        }
        public async Task Should_Send_Money_From_Multsi_From_1To2_Cosignatory()
        {
            var recipient = Account.GenerateNewAccount(Fixture.NetworkType);

            Log.WriteLine($"MultiSig account {Fixture.MultiSigAccount}");
            Log.WriteLine($"Recipient account {recipient}");
            Log.WriteLine($"Cosignatory1 account {Fixture.Cosignatory1}");
            var transferTransaction = TransferTransaction.Create(
                Deadline.Create(),
                Recipient.From(recipient.Address),
                new List <Mosaic> {
                NetworkCurrencyMosaic.CreateAbsolute(10)
            },
                PlainMessage.Create("sending 10 prx.xpx"),
                Fixture.NetworkType);

            var aggregateTransaction = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction> {
                transferTransaction.ToAggregate(Fixture.MultiSigAccount.PublicAccount)
            },
                Fixture.NetworkType);

            var signedTransaction = Fixture.Cosignatory1.Sign(aggregateTransaction, Fixture.GenerationHash);

            var cosignatory1ConfirmedTx = Fixture.SiriusWebSocketClient.Listener
                                          .ConfirmedTransactionsGiven(Fixture.Cosignatory1.Address).Take(1)
                                          .Timeout(TimeSpan.FromSeconds(2000));

            Log.WriteLine($"Going to announce aggregate bonded transaction {signedTransaction.Hash}");
            await Fixture.SiriusClient.TransactionHttp.Announce(signedTransaction);

            var result = await cosignatory1ConfirmedTx;

            Thread.Sleep(5000);

            if (result.IsConfirmed())
            {
                var recipientAccountInfo = await Fixture.SiriusClient.AccountHttp.GetAccountInfo(recipient.Address);

                Log.WriteLine($"Recipient info {recipientAccountInfo.Address}");

                recipientAccountInfo.Mosaics.Should().HaveCount(1);
                recipientAccountInfo.Mosaics[0].Amount.Should().Be(10);
            }
        }
        public async Task PartialTransactionWithMissingCosigner()
        {
            var keyPair = KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain);

            var keyPair2 = KeyPair.CreateFromPrivateKey("14A239D2ADB96753CFC160BB262F27B01BCCC8C74599F51771BC6BD39980F4E7");

            var aggregateBonded = AggregateTransaction.CreateBonded(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                new List <Transaction>
            {
                TransferTransactionTests.CreateInnerTransferTransaction(
                    "nem:xem").ToAggregate(PublicAccount.CreateFromPublicKey(keyPair2.PublicKeyString, NetworkType.Types.MIJIN_TEST)),
                TransferTransactionTests.CreateInnerTransferTransaction(
                    "nem:xem").ToAggregate(PublicAccount.CreateFromPublicKey(keyPair2.PublicKeyString, NetworkType.Types.MIJIN_TEST)),
            },
                null)
                                  .SignWith(keyPair);

            WatchForFailure(aggregateBonded);

            var hashLock = LockFundsTransaction.Create(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                0,
                new Mosaic(new MosaicId("nem:xem"), 10000000),
                10000,
                aggregateBonded
                )
                           .SignWith(KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain));

            WatchForFailure(hashLock);

            await new TransactionHttp(host).Announce(hashLock);

            var status = await listener.ConfirmedTransactionsGiven(Address.CreateFromPublicKey(hashLock.Signer, NetworkType.Types.MIJIN_TEST)).Where(e => e.TransactionInfo.Hash == hashLock.Hash).Take(1);

            Assert.AreEqual(keyPair.PublicKeyString, status.Signer.PublicKey);

            await new TransactionHttp(host).AnnounceAggregateBonded(aggregateBonded);

            var status2 = await listener.AggregateBondedAdded(Address.CreateFromPublicKey(aggregateBonded.Signer, NetworkType.Types.MIJIN_TEST)).Where(e => e.TransactionInfo.Hash == aggregateBonded.Hash).Take(1);

            Assert.AreEqual(keyPair.PublicKeyString, status2.Signer.PublicKey);
        }
        public async Task AggregateTransactionWithOnlyInitiator()
        {
            var keyPair = KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain);

            var aggregateTransaction = AggregateTransaction.CreateComplete(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                new List <Transaction>
            {
                TransferTransactionTests.CreateInnerTransferTransaction("nem:xem")
                .ToAggregate(PublicAccount.CreateFromPublicKey("B974668ABED344BE9C35EE257ACC246117EFFED939EAF42391AE995912F985FE", NetworkType.Types.MIJIN_TEST)),
            }
                ).SignWith(keyPair);

            await new TransactionHttp(host).Announce(aggregateTransaction);

            var status2 = await listener.ConfirmedTransactionsGiven(Address.CreateFromPublicKey(aggregateTransaction.Signer, NetworkType.Types.MIJIN_TEST)).Where(e => e.TransactionInfo.Hash == aggregateTransaction.Hash).Take(1);

            Assert.AreEqual(keyPair.PublicKeyString, status2.Signer.PublicKey);
        }
        public async Task LockFundsTransactionTest()
        {
            var signer = KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain);

            var aggregateTransaction = AggregateTransaction.CreateBonded(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                new List <Transaction>
            {
                TransferTransactionTests.CreateInnerTransferTransaction(
                    "nem:xem").ToAggregate(PublicAccount.CreateFromPublicKey("10CC07742437C205D9A0BC0434DC5B4879E002114753DE70CDC4C4BD0D93A64A", NetworkType.Types.MIJIN_TEST)),
                TransferTransactionTests.CreateInnerTransferTransaction(
                    "nem:xem").ToAggregate(PublicAccount.CreateFromPublicKey("A8FCF4371B9C4B26CE19A407BA803D3813647608D57ABC1550925A54AEE2C9EA", NetworkType.Types.MIJIN_TEST))
            },
                null)
                                       .SignWith(signer);

            var hashLock = LockFundsTransaction.Create(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                0,
                new Mosaic(new MosaicId("nem:xem"), 10000000),
                10000,
                aggregateTransaction)
                           .SignWith(KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain));

            WatchForFailure(hashLock);

            await new TransactionHttp(host).Announce(hashLock);

            var status = await listener.ConfirmedTransactionsGiven(Address.CreateFromPublicKey(hashLock.Signer, NetworkType.Types.MIJIN_TEST)).Where(e => e.TransactionInfo.Hash == hashLock.Hash).Take(1);

            Assert.AreEqual(signer.PublicKeyString, status.Signer.PublicKey);

            await new TransactionHttp(host).AnnounceAggregateBonded(aggregateTransaction);

            var status2 = await listener.AggregateBondedAdded(Address.CreateFromPublicKey(aggregateTransaction.Signer, NetworkType.Types.MIJIN_TEST)).Where(e => e.TransactionInfo.Hash == aggregateTransaction.Hash).Take(1);

            Assert.AreEqual(signer.PublicKeyString, status2.Signer.PublicKey);
        }
        public async Task AggregateTransactionWithMissingCosignatures()
        {
            var keyPair = KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain);

            var keyPair2 = KeyPair.CreateFromPrivateKey(Config.PrivateKeySecond);

            var aggregateTransaction = AggregateTransaction.CreateBonded(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                new List <Transaction>
            {
                RegisterNamespaceTransaction.CreateRootNamespace(NetworkType.Types.MIJIN_TEST, Deadline.CreateHours(2), "happy23", 10000)
                .ToAggregate(PublicAccount.CreateFromPublicKey(keyPair.PublicKeyString, NetworkType.Types.MIJIN_TEST)),
                TransferTransactionTests.CreateInnerTransferTransaction("nem:xem")
                .ToAggregate(PublicAccount.CreateFromPublicKey(keyPair2.PublicKeyString, NetworkType.Types.MIJIN_TEST)),
            },
                null
                ).SignWith(keyPair);

            WatchForFailure(aggregateTransaction);

            var hashLock = LockFundsTransaction.Create(NetworkType.Types.MIJIN_TEST, Deadline.CreateHours(2), 0, new Mosaic(new MosaicId("nem:xem"), 10000000), 10000, aggregateTransaction)
                           .SignWith(KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain));

            WatchForFailure(hashLock);

            await new TransactionHttp(host).Announce(hashLock);

            var status = await listener.ConfirmedTransactionsGiven(Address.CreateFromPublicKey(hashLock.Signer, NetworkType.Types.MIJIN_TEST)).Where(e => e.TransactionInfo.Hash == hashLock.Hash).Take(1);

            Assert.AreEqual(keyPair.PublicKeyString, status.Signer.PublicKey);

            await new TransactionHttp(host).AnnounceAggregateBonded(aggregateTransaction);

            var status2 = await listener.AggregateBondedAdded(Address.CreateFromPublicKey(aggregateTransaction.Signer, NetworkType.Types.MIJIN_TEST)).Where(e => e.TransactionInfo.Hash == aggregateTransaction.Hash).Take(1);

            Assert.AreEqual(keyPair.PublicKeyString, status2.Signer.PublicKey);
        }
Пример #17
0
        public void Should_Serialize_And_Sign_TransactionModifyMultisigAccountTransaction_AggregateBonded()
        {
            var account         = Account.CreateFromPrivateKey("26b64cb10f005e5988a36744ca19e20d835ccc7c105aaa5f3b212da593180930", NetworkType.MIJIN_TEST);
            var generationHash  = "B750FC8ADD9FAB8C71F0BB90B6409C66946844F07C5CADB51F27A9FAF219BFC7";
            var network         = NetworkType.MIJIN_TEST;
            var multiSigAccount = Account.GenerateNewAccount(network);
            var coginatory1     = Account.GenerateNewAccount(network);
            var coginatory2     = Account.GenerateNewAccount(network);

            var coginatories = new List <MultisigCosignatoryModification>
            {
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    coginatory1.PublicAccount),
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    coginatory2.PublicAccount),
            };

            var convertIntoMultisigTransaction = ModifyMultisigAccountTransaction.Create(
                Deadline.Create(),
                1,
                1,
                coginatories,
                network);

            var aggregateTransaction = AggregateTransaction.CreateBonded(
                Deadline.Create(),
                new List <Transaction>
            {
                convertIntoMultisigTransaction.ToAggregate(multiSigAccount.PublicAccount)
            },
                network);


            var signedTransaction = multiSigAccount.Sign(aggregateTransaction, generationHash);

            signedTransaction.Payload.Should().NotBeNullOrEmpty();
            signedTransaction.Hash.Should().NotBeNullOrEmpty();
        }
Пример #18
0
        //[TestMethod, Timeout(20000)]
        public async Task ListenForPartialTransactionAdded()
        {
            var keyPair = KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain);

            var aggregateTransaction = AggregateTransaction.CreateBonded(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                new List <Transaction>
            {
                TransferTransactionTests.CreateInnerTransferTransaction("nem:xem"),
            },
                null
                ).SignWith(keyPair);

            var hashLock = LockFundsTransaction.Create(NetworkType.Types.MIJIN_TEST, Deadline.CreateHours(2), 0, duration: 10000, mosaic: new Mosaic(new MosaicId("nem:xem"), 10000000), transaction: aggregateTransaction)
                           .SignWith(KeyPair.CreateFromPrivateKey(Config.PrivateKeyMain));

            await new TransactionHttp("http://" + Config.Domain + ":3000").Announce(hashLock);

            var listener = new Listener(Config.Domain);

            await listener.Open();

            await listener.ConfirmedTransactionsGiven(Address.CreateFromPublicKey(
                                                          keyPair.PublicKeyString,
                                                          NetworkType.Types.MIJIN_TEST)
                                                      ).Take(1);

            await new TransactionHttp("http://" + Config.Domain + ":3000").AnnounceAggregateBonded(aggregateTransaction);

            var result = await listener.AggregateBondedAdded(Address.CreateFromPublicKey(
                                                                 keyPair.PublicKeyString,
                                                                 NetworkType.Types.MIJIN_TEST)
                                                             ).Take(1);

            Assert.AreEqual("10CC07742437C205D9A0BC0434DC5B4879E002114753DE70CDC4C4BD0D93A64A", result.Signer);
        }
        public void Should_Serialize_And_Sign_TransactionModifyMultisigAccountTransaction_AggregateBonded()
        {
            var account         = Account.CreateFromPrivateKey("26b64cb10f005e5988a36744ca19e20d835ccc7c105aaa5f3b212da593180930", NetworkType.TEST_NET);
            var generationHash  = "AC87FDA8FD94B72F3D0790A7D62F248111BD5E37B95B16E4216DA99C212530A5";
            var network         = NetworkType.TEST_NET;
            var multiSigAccount = Account.GenerateNewAccount(network);
            var coginatory1     = Account.GenerateNewAccount(network);
            var coginatory2     = Account.GenerateNewAccount(network);

            var coginatories = new List <MultisigCosignatoryModification>
            {
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    coginatory1.PublicAccount),
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    coginatory2.PublicAccount),
            };

            var convertIntoMultisigTransaction = ModifyMultisigAccountTransaction.Create(
                Deadline.Create(),
                1,
                1,
                coginatories,
                network);

            var aggregateTransaction = AggregateTransaction.CreateBonded(
                Deadline.Create(),
                new List <Transaction>
            {
                convertIntoMultisigTransaction.ToAggregate(multiSigAccount.PublicAccount)
            },
                network);

            var signedTransaction = multiSigAccount.Sign(aggregateTransaction, generationHash);

            signedTransaction.Payload.Should().NotBeNullOrEmpty();
            signedTransaction.Hash.Should().NotBeNullOrEmpty();
        }
Пример #20
0
        public void CreateAAggregateTransactionViaStaticConstructor()
        {
            TransferTransaction transferTx = TransferTransaction.Create(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                new Address("SDGLFW-DSHILT-IUHGIB-H5UGX2-VYF5VN-JEKCCD-BR26", NetworkType.Types.MIJIN_TEST),
                new List <Mosaic>(),
                EmptyMessage.Create()
                );

            AggregateTransaction aggregateTx = AggregateTransaction.CreateComplete(
                NetworkType.Types.MIJIN_TEST,
                Deadline.CreateHours(2),
                new List <Transaction>()
            {
                transferTx.ToAggregate(new PublicAccount("9A49366406ACA952B88BADF5F1E9BE6CE4968141035A60BE503273EA65456B24", NetworkType.Types.MIJIN_TEST))
            });

            Assert.AreEqual(NetworkType.Types.MIJIN_TEST, aggregateTx.NetworkType);
            Assert.IsTrue(144 == aggregateTx.NetworkType.GetNetworkByte());
            Assert.IsTrue(DateTime.Now > aggregateTx.Deadline.GetLocalDateTime());
            Assert.AreEqual((ulong)0, aggregateTx.Fee);
            Assert.AreEqual(1, aggregateTx.InnerTransactions.Count);
        }
        public async Task Should_Convert_Account_To_1to2_MultiSig()
        {
            // Get current network type

            // Create an account to be converted to multisig with some money
            // var account = await GenerateAccountAndSendSomeMoney(100);
            Log.WriteLine($"MultiSig account {Fixture.MultiSigAccount}");

            // Create two other accounts
            // var cosignatory1 = Account.GenerateNewAccount(NetworkType);
            Log.WriteLine($"MultiSig cosignatory1 {Fixture.Cosignatory1}");

            // var cosignatory2 = Account.GenerateNewAccount(NetworkType);
            Log.WriteLine($"MultiSig cosignatory2 {Fixture.Cosignatory2}");

            // Create a modify multisig account transaction to convert the shared account into a multisig account
            // 1 to 2 multisig
            var multiSigBuilder = new ModifyMultisigAccountTransactionBuilder();

            multiSigBuilder.SetDeadline(Deadline.Create())
            .SetMinApprovalDelta(1)
            .SetMinRemovalDelta(1)
            .SetModifications(new List <MultisigCosignatoryModification>
            {
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    Fixture.Cosignatory1.PublicAccount),
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    Fixture.Cosignatory2.PublicAccount),
            })
            .SetNetworkType(Fixture.NetworkType);
            var convertIntoMultisigTransaction = multiSigBuilder.Build();

            // Create an aggregate bonded transaction, wrapping the modify multisig account transaction
            var aggregateTransaction = AggregateTransaction.CreateBonded(
                Deadline.Create(),
                new List <Transaction>
            {
                convertIntoMultisigTransaction.ToAggregate(Fixture.MultiSigAccount.PublicAccount)
            },
                Fixture.NetworkType);

            // Sign the aggregate transaction using the private key of the multisig account
            var signedTransaction = Fixture.MultiSigAccount.Sign(aggregateTransaction, Fixture.GenerationHash);

            // Before sending an aggregate bonded transaction,
            // the future multisig account needs to lock at least 10 cat.currency.
            // This transaction is required to prevent network spamming and ensure that
            // the inner transactions are cosigned
            var builder = new LockFundsTransactionBuilder();

            builder.SetDeadline(Deadline.Create())
            .SetDuration((ulong)700)
            .SetMosaic(NetworkCurrencyMosaic.CreateRelative(10))
            .SetSignedTransaction(signedTransaction)
            .SetNetworkType(Fixture.NetworkType);

            var hashLockTransaction = builder.Build();

            var hashLockTransactionSigned = Fixture.SeedAccount.Sign(hashLockTransaction, Fixture.GenerationHash);

            // register transaction with web socket
            try
            {
                var hashLocktx = Fixture.SiriusWebSocketClient.Listener
                                 .ConfirmedTransactionsGiven(Fixture.SeedAccount.Address).Take(1)
                                 .Timeout(TimeSpan.FromSeconds(500));

                Fixture.WatchForFailure(hashLockTransactionSigned);

                Log.WriteLine($"Going to announce hash lock transaction {hashLockTransactionSigned.Hash}");

                // Announce the hash lock transaction
                await Fixture.SiriusClient.TransactionHttp.Announce(hashLockTransactionSigned);

                // Wait for the hash lock transaction to be confirmed
                var hashLockConfirmed = await hashLocktx;

                // After the hash lock transaction has been confirmed,
                // announce the aggregate transaction.
                if (hashLockConfirmed.TransactionInfo.Hash == hashLockTransactionSigned.Hash)
                {
                    Fixture.WatchForFailure(signedTransaction);

                    Log.WriteLine($"Going to announce aggregate bonded transaction {signedTransaction.Hash}");

                    // Announce the hash lock transaction
                    await Fixture.SiriusClient.TransactionHttp.AnnounceAggregateBonded(signedTransaction);

                    // sleep for await
                    Thread.Sleep(5000);

                    // Cosign the aggregate transaction with cosignatory1
                    var cosignatory1Cosigned = Fixture.SiriusWebSocketClient.Listener.CosignatureAdded(Fixture.Cosignatory1.Address).Take(1).Timeout(TimeSpan.FromSeconds(2000));

                    var cosignatory1AggTxs = await Fixture.SiriusClient.AccountHttp.AggregateBondedTransactions(Fixture.Cosignatory1.PublicAccount);

                    foreach (AggregateTransaction tx in cosignatory1AggTxs.Transactions)
                    {
                        if (!tx.IsSignedByAccount(Fixture.Cosignatory1.PublicAccount))
                        {
                            var cosignatureSignedTransaction = CosignAggregateBondedTransaction(tx, Fixture.Cosignatory1);

                            Fixture.WatchForFailure(cosignatureSignedTransaction);

                            await Fixture.SiriusClient.TransactionHttp.AnnounceAggregateBondedCosignatureAsync(cosignatureSignedTransaction);

                            Thread.Sleep(8000);
                        }
                    }

                    // Cosign the aggregate transaction with cosignatory2
                    var cosignatory2Cosigned = Fixture.SiriusWebSocketClient.Listener
                                               .CosignatureAdded(Fixture.Cosignatory2.Address).Take(1)
                                               .Timeout(TimeSpan.FromSeconds(2000));
                    var cosignatory2AggTxs = await Fixture.SiriusClient.AccountHttp.AggregateBondedTransactions(Fixture.Cosignatory2.PublicAccount);

                    foreach (AggregateTransaction tx in cosignatory2AggTxs.Transactions)
                    {
                        if (!tx.IsSignedByAccount(Fixture.Cosignatory2.PublicAccount))
                        {
                            var cosignatureSignedTransaction = CosignAggregateBondedTransaction(tx, Fixture.Cosignatory2);

                            Fixture.WatchForFailure(cosignatureSignedTransaction);

                            await Fixture.SiriusClient.TransactionHttp.AnnounceAggregateBondedCosignatureAsync(cosignatureSignedTransaction);

                            Thread.Sleep(2000);
                        }
                    }

                    Thread.Sleep(10000);
                    // verify the account is multisig
                    var multiSigAcc = await Fixture.SiriusClient.AccountHttp.GetMultisigAccountInfo(Fixture.MultiSigAccount.Address);

                    Log.WriteLine($"Multisig account {multiSigAcc}");

                    multiSigAcc.IsMultisig.Should().BeTrue();
                    multiSigAcc.MinApproval.Should().Be(1);
                    multiSigAcc.MinRemoval.Should().Be(1);
                    multiSigAcc.Cosignatories.Should().HaveCount(2);

                    Log.WriteLine($"Completed");
                }
            }
            catch (Exception e)
            {
                Log.WriteLine(e.Message);
            }

            /*  finally
             * {
             *    try
             *    {
             *        //SiriusWebSocketClient.Listener.Close();
             *    }
             *    catch (Exception)
             *    {
             *        //do nothing
             *    }
             * }*/
        }
        public async Task Should_Add_Metadata_To_Namespace()
        {
            var account = await Fixture.GenerateAccountWithCurrency(10000);

            Log.WriteLine($"Company Account {account.Address.Plain} \r\n Private Key: {account.PrivateKey} \r\n Public Key {account.PublicKey}");
            var rootNs = "namespace_metadata_test";
            var rootId = new NamespaceId(rootNs);
            var registerRootTransaction = RegisterNamespaceTransaction.CreateRootNamespace(
                Deadline.Create(),
                rootNs,
                3650,
                Fixture.NetworkType);

            var aggregateTransactiontx = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                registerRootTransaction.ToAggregate(account.PublicAccount),
            },
                Fixture.NetworkType);
            var aggregateTransactionsigned = account.Sign(aggregateTransactiontx, Fixture.GenerationHash);
            await Fixture.SiriusWebSocketClient.Listener.Open();

            Log.WriteLine($"Going to announce aggregate transaction: {aggregateTransactionsigned.Hash}");
            await Fixture.SiriusClient.TransactionHttp.Announce(aggregateTransactionsigned);

            /*var aggregateTransactiontxs = Fixture.SiriusWebSocketClient.Listener
             *      .ConfirmedTransactionsGiven(account.Address).Take(1)
             *      .Timeout(TimeSpan.FromSeconds(500));
             *
             * var aggregateTransactionConfirmed = await aggregateTransactiontxs;
             * Log.WriteLine($" Request confirmed with aggregate transaction {aggregateTransactionConfirmed.TransactionInfo.Hash}");*/

            var metadatatrx = NamespaceMetadataTransaction.Create(
                Deadline.Create(),
                account.PublicAccount,
                rootId,
                "test_Namespace",
                "1",
                "",
                Fixture.NetworkType);
            var aggregateTransaction = AggregateTransaction.CreateBonded(
                Deadline.Create(),
                new List <Transaction>
            {
                metadatatrx.ToAggregate(account.PublicAccount),
            },
                Fixture.NetworkType);

            var aggregateTrxsigned = account.Sign(aggregateTransaction, Fixture.GenerationHash);

            Fixture.WatchForFailure(aggregateTrxsigned);
            /* Log.WriteLine($" {aggregateTransactionConfirmed.TransactionType}Request confirmed with aggregate transaction {aggregateTransactionConfirmed.TransactionInfo.Hash}");*/
            var hashLockTransaction = HashLockTransaction.Create(
                Deadline.Create(),
                //new Mosaic(new MosaicId("0BB1469B94E6FEF8"), 10),
                NetworkCurrencyMosaic.CreateRelative(10),
                (ulong)3650,
                aggregateTrxsigned,
                Fixture.NetworkType);

            var hashLockTransactionSigned = account.Sign(hashLockTransaction, Fixture.GenerationHash);

            Log.WriteLine($"Going to announce hashlock transaction: {hashLockTransactionSigned.Hash}");
            await Fixture.SiriusClient.TransactionHttp.Announce(hashLockTransactionSigned);

            var hashLocktx = Fixture.SiriusWebSocketClient.Listener
                             .ConfirmedTransactionsGiven(account.Address).Take(1)
                             .Timeout(TimeSpan.FromSeconds(500));

            Fixture.WatchForFailure(hashLockTransactionSigned);
            var hashLockConfirmed = await hashLocktx;

            Log.WriteLine($"Request confirmed with hash lock transaction {hashLockConfirmed.TransactionInfo.Hash}");

            Log.WriteLine($"Going to announce aggregate transaction {aggregateTrxsigned.Hash}");

            await Fixture.SiriusClient.TransactionHttp.AnnounceAggregateBonded(aggregateTrxsigned);

            Fixture.WatchForFailure(aggregateTrxsigned);
            var aggregateTrntx = Fixture.SiriusWebSocketClient.Listener
                                 .ConfirmedTransactionsGiven(account.Address).Take(1)
                                 .Timeout(TimeSpan.FromSeconds(500));

            var aggregateTrxConfirmed = await aggregateTrntx;

            Log.WriteLine($"Request confirmed with aggregate transaction {aggregateTrxConfirmed.TransactionInfo.Hash}");
        }
        public async Task Should_Add_Cosignatory()
        {
            Log.WriteLine($"MultiSig account {Fixture.MultiSigAccount}");
            Log.WriteLine($"Cosignatory1 account {Fixture.Cosignatory1}");
            Log.WriteLine($"Cosignatory3 account {Fixture.Cosignatory3}");

            // Define a modify multisig account transaction to increase the minAprovalDelta in one unit
            var modifyMultisigAccountTransaction = ModifyMultisigAccountTransaction.Create(
                Deadline.Create(),
                0,
                0,
                new List <MultisigCosignatoryModification>
            {
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    Fixture.Cosignatory1.PublicAccount),
                new MultisigCosignatoryModification(MultisigCosignatoryModificationType.ADD,
                                                    Fixture.Cosignatory3.PublicAccount),
            },
                Fixture.NetworkType);

            // Wrap the modify multisig account transaction in an aggregate transaction,
            // attaching the multisig public key as the signer
            var aggregateTransaction = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                modifyMultisigAccountTransaction.ToAggregate(Fixture.MultiSigAccount.PublicAccount)
            },
                Fixture.NetworkType
                );

            var signedTransaction = Fixture.MultiSigAccount.Sign(aggregateTransaction, Fixture.GenerationHash);

            Fixture.WatchForFailure(signedTransaction);

            // Before sending an aggregate bonded transaction,
            // the future multisig account needs to lock at least 10 cat.currency.
            // This transaction is required to prevent network spamming and ensure that
            // the inner transactions are cosigned
            var hashLockTransaction = HashLockTransaction.Create(
                Deadline.Create(),
                NetworkCurrencyMosaic.CreateRelative(10),
                (ulong)700,
                signedTransaction,
                Fixture.NetworkType);

            var hashLockTransactionSigned = Fixture.SeedAccount.Sign(hashLockTransaction, Fixture.GenerationHash);

            try
            {
                var hashLocktx = Fixture.SiriusWebSocketClient.Listener
                                 .ConfirmedTransactionsGiven(Fixture.Cosignatory1.Address).Take(1)
                                 .Timeout(TimeSpan.FromSeconds(500));
                Fixture.WatchForFailure(hashLockTransactionSigned);

                // Announce the hash lock transaction
                Log.WriteLine($"Going to announce hash lock transaction {hashLockTransactionSigned.Hash}");
                await Fixture.SiriusClient.TransactionHttp.Announce(hashLockTransactionSigned);

                var hashLockConfirmed = await hashLocktx;

                if (hashLockConfirmed.TransactionInfo.Hash == hashLockTransactionSigned.Hash)
                {
                    // Announce the AnnounceAggregateBonded transaction
                    await Fixture.SiriusClient.TransactionHttp.AnnounceAggregateBonded(signedTransaction);

                    Log.WriteLine($"Going to announce aggregate bonded transaction {signedTransaction.Hash}");

                    // sleep for await
                    Thread.Sleep(8000);
                    Fixture.WatchForFailure(signedTransaction);

                    var cosignatory3AggTxs = await Fixture.SiriusClient.AccountHttp.AggregateBondedTransactions(Fixture.Cosignatory3.PublicAccount);

                    foreach (AggregateTransaction tx in cosignatory3AggTxs.Transactions)
                    {
                        if (!tx.IsSignedByAccount(Fixture.Cosignatory3.PublicAccount))
                        {
                            var cosignatureSignedTransaction = CosignAggregateBondedTransaction(tx, Fixture.Cosignatory3);

                            Fixture.WatchForFailure(cosignatureSignedTransaction);
                            Log.WriteLine($"Going to announce cosign aggregate bonded transaction {cosignatureSignedTransaction.ParentHash}");
                            await Fixture.SiriusClient.TransactionHttp.AnnounceAggregateBondedCosignatureAsync(cosignatureSignedTransaction);

                            Thread.Sleep(2000);
                        }
                    }

                    var cosignatory2AggTxs = await Fixture.SiriusClient.AccountHttp.AggregateBondedTransactions(Fixture.Cosignatory2.PublicAccount);

                    foreach (AggregateTransaction tx in cosignatory2AggTxs.Transactions)
                    {
                        if (!tx.IsSignedByAccount(Fixture.Cosignatory2.PublicAccount))
                        {
                            var cosignatureSignedTransaction = CosignAggregateBondedTransaction(tx, Fixture.Cosignatory2);

                            Fixture.WatchForFailure(cosignatureSignedTransaction);

                            await Fixture.SiriusClient.TransactionHttp.AnnounceAggregateBondedCosignatureAsync(cosignatureSignedTransaction);

                            Thread.Sleep(2000);
                        }
                    }

                    Log.WriteLine($"Completed");
                }
            }
            catch (Exception e)
            {
                Log.WriteLine(e.Message);
            }
        }
Пример #24
0
        public async Task Should_Create_Mosaic_With_Builder()
        {
            var account  = Fixture.SeedAccount;
            var nonce    = MosaicNonce.CreateRandom();
            var mosaicId = MosaicId.CreateFromNonce(nonce, account.PublicAccount.PublicKey);
            var builder  = new MosaicDefinitionTransactionBuilder();

            builder.SetNonce(nonce)
            .SetMosaicId(mosaicId)
            .SetMosaicProperties(MosaicProperties.Create(
                                     supplyMutable: true,
                                     transferable: true,
                                     levyMutable: false,
                                     divisibility: 0,
                                     duration: 1000
                                     ))
            .SetDeadline(Deadline.Create())
            .SetNetworkType(Fixture.NetworkType);

            /*
             * var mosaicDefinitionTransaction = MosaicDefinitionTransaction.Create(
             *  nonce,
             *  mosaicId,
             *  Deadline.Create(),
             *  MosaicProperties.Create(
             *      supplyMutable: true,
             *      transferable: true,
             *      levyMutable: false,
             *      divisibility: 0,
             *      duration: 1000
             *  ),
             *  Fixture.NetworkType);
             */
            var mosaicDefinitionTransaction = builder.Build();


            Log.WriteLine($"Going to create mosaic {mosaicId}");

            var supplyBuilder = new MosaicSupplyChangeTransactionBuilder();

            supplyBuilder
            .SetDeadline(Deadline.Create())
            .SetNetworkType(Fixture.NetworkType)
            .IncreaseSupplyFor(mosaicDefinitionTransaction.MosaicId)
            .SetDelta(1000000);

            var mosaicSupplyChangeTransaction = supplyBuilder.Build();

            /*
             * var mosaicSupplyChangeTransaction = MosaicSupplyChangeTransaction.Create(
             * Deadline.Create(),
             * mosaicDefinitionTransaction.MosaicId,
             * MosaicSupplyType.INCREASE,
             * 1000000,
             * Fixture.NetworkType);
             */

            var aggregateTransaction = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                mosaicDefinitionTransaction.ToAggregate(account.PublicAccount),
                mosaicSupplyChangeTransaction.ToAggregate(account.PublicAccount)
            },
                Fixture.NetworkType);

            var signedTransaction = account.Sign(aggregateTransaction, Fixture.GenerationHash);

            Fixture.WatchForFailure(signedTransaction);

            Log.WriteLine($"Going to announce transaction {signedTransaction.Hash}");

            var tx = Fixture.SiriusWebSocketClient.Listener.ConfirmedTransactionsGiven(account.Address).Take(1)
                     .Timeout(TimeSpan.FromSeconds(3000));

            await Fixture.SiriusClient.TransactionHttp.Announce(signedTransaction);

            var result = await tx;

            Log.WriteLine($"Request confirmed with transaction {result.TransactionInfo.Hash}");


            var mosaicInfo = await Fixture.SiriusClient.MosaicHttp.GetMosaic(mosaicDefinitionTransaction.MosaicId);

            Log.WriteLine($"Mosaic created {mosaicInfo}");

            mosaicInfo.Should().NotBeNull();
            mosaicInfo.Divisibility.Should().Be(0);
            mosaicInfo.Duration.Should().Be(1000);
            mosaicInfo.IsLevyMutable.Should().BeFalse();
            mosaicInfo.IsSupplyMutable.Should().BeTrue();
            mosaicInfo.IsTransferable.Should().BeTrue();
            mosaicInfo.Supply.Should().Be(1000000);
        }
Пример #25
0
        public async Task Should_Link_Namespace_To_Mosaic()
        {
            #region Create mosaic

            var account = await Fixture.GenerateAccountWithCurrency(1500);

            var nonce = MosaicNonce.CreateRandom();

            var mosaicDefinitionTransaction = MosaicDefinitionTransaction.Create(
                nonce,
                MosaicId.CreateFromNonce(nonce, account.PublicAccount.PublicKey),
                Deadline.Create(),
                MosaicProperties.Create(
                    supplyMutable: true,
                    transferable: true,
                    levyMutable: false,
                    divisibility: 0,
                    duration: 1000
                    ),
                Fixture.NetworkType);

            var mosaicSupplyChangeTransaction = MosaicSupplyChangeTransaction.Create(
                Deadline.Create(),
                mosaicDefinitionTransaction.MosaicId,
                MosaicSupplyType.INCREASE,
                1000000,
                Fixture.NetworkType);

            var aggregateTransaction = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                mosaicDefinitionTransaction.ToAggregate(account.PublicAccount),
                mosaicSupplyChangeTransaction.ToAggregate(account.PublicAccount)
            },
                Fixture.NetworkType);

            var signedTransaction = account.Sign(aggregateTransaction, Fixture.GenerationHash);

            Log.WriteLine($"Going to announce transaction {signedTransaction.Hash}");

            var tx = Fixture.SiriusWebSocketClient.Listener.ConfirmedTransactionsGiven(account.Address).Take(1)
                     .Timeout(TimeSpan.FromSeconds(3000));

            await Fixture.SiriusClient.TransactionHttp.Announce(signedTransaction);

            var result = await tx;
            Log.WriteLine($"Request confirmed with transaction {result.TransactionInfo.Hash}");

            var mosaicInfo = await Fixture.SiriusClient.MosaicHttp.GetMosaic(mosaicDefinitionTransaction.MosaicId);

            mosaicInfo.Should().NotBeNull();
            mosaicInfo.Divisibility.Should().Be(0);
            mosaicInfo.Duration.Should().Be(1000);
            mosaicInfo.IsLevyMutable.Should().BeFalse();
            mosaicInfo.IsSupplyMutable.Should().BeTrue();
            mosaicInfo.IsTransferable.Should().BeTrue();
            mosaicInfo.Supply.Should().Be(1000000);
            #endregion

            #region register new namespace
            var namespaceName = "nsp" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 6);
            var registerNamespaceTransaction = RegisterNamespaceTransaction.CreateRootNamespace(
                Deadline.Create(),
                namespaceName,
                100,
                Fixture.NetworkType
                );

            var registeredNsSignedTransaction = account.Sign(registerNamespaceTransaction, Fixture.GenerationHash);

            tx = Fixture.SiriusWebSocketClient.Listener.ConfirmedTransactionsGiven(account.Address).Take(1)
                 .Timeout(TimeSpan.FromSeconds(3000));

            await Fixture.SiriusClient.TransactionHttp.Announce(registeredNsSignedTransaction);

            Log.WriteLine(
                $"Registered namespace {namespaceName} for account {account.Address.Plain} with transaction {registeredNsSignedTransaction.Hash}");

            result = await tx;

            Log.WriteLine($"Request confirmed with transaction {result.TransactionInfo.Hash}");

            var expectedId = new NamespaceId(namespaceName);

            var nsInfo = await Fixture.SiriusClient.NamespaceHttp.GetNamespace(expectedId);

            Log.WriteLine(
                $"Retrieved namespace {namespaceName} successfully. The namespace HexId {nsInfo.Id.HexId}");
            nsInfo.Should().NotBeNull();
            #endregion

            #region Link namespace to the mosaic
            var mosaicAliasTransaction = AliasTransaction.CreateForMosaic(
                mosaicInfo.MosaicId,
                nsInfo.Id,
                AliasActionType.LINK,
                Deadline.Create(),
                Fixture.NetworkType
                );

            tx = Fixture.SiriusWebSocketClient.Listener.ConfirmedTransactionsGiven(account.Address).Take(1);

            var aliasSignedTransaction = account.Sign(mosaicAliasTransaction, Fixture.GenerationHash);

            Fixture.WatchForFailure(aliasSignedTransaction);

            await Fixture.SiriusClient.TransactionHttp.Announce(aliasSignedTransaction);

            result = await tx;

            Log.WriteLine($"Request confirmed with transaction {result.TransactionInfo.Hash}");


            nsInfo = await Fixture.SiriusClient.NamespaceHttp.GetNamespace(expectedId);

            nsInfo.Should().NotBeNull();
            nsInfo.HasAlias.Should().BeTrue();
            nsInfo.Alias.Type.Should().BeEquivalentTo(AliasType.MOSAIC_ID);
            nsInfo.Alias.MosaicId.HexId.Should().BeEquivalentTo(mosaicInfo.MosaicId.HexId);

            #endregion

            #region Send mosaic using namespace alias to recipient

            var newAccount = Account.GenerateNewAccount(Fixture.NetworkType);

            var transferTransaction = TransferTransaction.Create(
                Deadline.Create(),
                Recipient.From(newAccount.Address),
                new List <Mosaic>()
            {
                new Mosaic(nsInfo.Id, 10)
            },
                PlainMessage.Create("Send some mosaic to new address"),
                Fixture.NetworkType);

            var tx2 = Fixture.SiriusWebSocketClient.Listener.ConfirmedTransactionsGiven(newAccount.Address).Take(1)
                      .Timeout(TimeSpan.FromSeconds(3000));

            var nsSignedTransferTransaction = account.Sign(transferTransaction, Fixture.GenerationHash);

            Fixture.WatchForFailure(nsSignedTransferTransaction);

            await Fixture.SiriusClient.TransactionHttp.Announce(nsSignedTransferTransaction);

            var result2 = await tx2;

            Log.WriteLine($"Request confirmed with transaction {result2.TransactionInfo.Hash}");

            var newAccountInfo = await Fixture.SiriusClient.AccountHttp.GetAccountInfo(newAccount.Address);

            Log.WriteLine($"Account {newAccountInfo.Address.Plain} with mosaic {newAccountInfo.Mosaics[0]} after transfer to the namespace alias");

            var expectedMosaicAmount = Convert.ToUInt64(10);
            newAccountInfo.Mosaics[0].Id.Id.Should().Be(mosaicInfo.MosaicId.Id);
            newAccountInfo.Mosaics[0]?.Amount.Should().Be(expectedMosaicAmount);
            #endregion
        }
Пример #26
0
        public async Task Should_Increase_Mosaic_Supply()
        {
            var account = Fixture.SeedAccount;

            var nonce    = MosaicNonce.CreateRandom();
            var mosaicId = MosaicId.CreateFromNonce(nonce, account.PublicAccount.PublicKey);

            var mosaicDefinitionTransaction = MosaicDefinitionTransaction.Create(
                nonce,
                mosaicId,
                Deadline.Create(),
                MosaicProperties.Create(
                    supplyMutable: true,
                    transferable: true,
                    levyMutable: false,
                    divisibility: 3,
                    duration: 1000
                    ),
                Fixture.NetworkType);

            Log.WriteLine($"Going to create mosaic {mosaicId}");

            var mosaicSupplyChangeTransaction = MosaicSupplyChangeTransaction.Create(
                Deadline.Create(),
                mosaicDefinitionTransaction.MosaicId,
                MosaicSupplyType.INCREASE,
                1000000,
                Fixture.NetworkType);

            var aggregateTransaction = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                mosaicDefinitionTransaction.ToAggregate(account.PublicAccount),
                mosaicSupplyChangeTransaction.ToAggregate(account.PublicAccount)
            },
                Fixture.NetworkType);

            var signedTransaction = account.Sign(aggregateTransaction, Fixture.GenerationHash);

            Log.WriteLine($"Going to announce transaction {signedTransaction.Hash}");

            var tx = Fixture.SiriusWebSocketClient.Listener.ConfirmedTransactionsGiven(account.Address).Take(1)
                     .Timeout(TimeSpan.FromSeconds(3000));

            await Fixture.SiriusClient.TransactionHttp.Announce(signedTransaction);

            var result = await tx;

            Log.WriteLine($"Request confirmed with transaction {result.TransactionInfo.Hash}");



            var mosaicDecreaseSupplyChangeTransaction = MosaicSupplyChangeTransaction.Create(
                Deadline.Create(),
                mosaicDefinitionTransaction.MosaicId,
                MosaicSupplyType.INCREASE,
                500000,
                Fixture.NetworkType);

            const ulong expectedAmount = 1000000 + 500000;

            var signedDecreaseTransaction = account.Sign(mosaicDecreaseSupplyChangeTransaction, Fixture.GenerationHash);
            await Fixture.SiriusClient.TransactionHttp.Announce(signedDecreaseTransaction);

            var result2 = await tx;

            Log.WriteLine($"Request confirmed with transaction {result2.TransactionInfo.Hash}");

            var mosaicInfo = await Fixture.SiriusClient.MosaicHttp.GetMosaic(mosaicDefinitionTransaction.MosaicId);

            mosaicInfo.Should().NotBeNull();
            mosaicInfo.Divisibility.Should().Be(3);
            mosaicInfo.Duration.Should().Be(1000);
            mosaicInfo.IsLevyMutable.Should().BeFalse();
            mosaicInfo.IsSupplyMutable.Should().BeTrue();
            mosaicInfo.IsTransferable.Should().BeTrue();
            mosaicInfo.Supply.Should().Be(expectedAmount);
        }
        public async Task Should_Add_Metadata_To_Mosaic()
        {
            var account = await Fixture.GenerateAccountWithCurrency(10000);

            Log.WriteLine($"Company Account {account.Address.Plain} \r\n Private Key: {account.PrivateKey} \r\n Public Key {account.PublicKey}");
            var nonce    = MosaicNonce.CreateRandom();
            var mosaicId = MosaicId.CreateFromNonce(nonce, account.PublicAccount.PublicKey);

            var mosaicDefinitionTransaction = MosaicDefinitionTransaction.Create(
                nonce,
                mosaicId,
                Deadline.Create(),
                MosaicProperties.Create(
                    supplyMutable: true,
                    transferable: true,
                    levyMutable: false,
                    divisibility: 6,
                    duration: 0
                    ),
                Fixture.NetworkType);

            Log.WriteLine($"Going to create mosaic {mosaicDefinitionTransaction.MosaicId.HexId}");

            var mosaicSupplyChangeTransaction = MosaicSupplyChangeTransaction.Create(
                Deadline.Create(),
                mosaicDefinitionTransaction.MosaicId,
                MosaicSupplyType.INCREASE,
                1000,
                Fixture.NetworkType);
            var aggregateTransactiontx = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                mosaicDefinitionTransaction.ToAggregate(account.PublicAccount),
                mosaicSupplyChangeTransaction.ToAggregate(account.PublicAccount)
            },
                Fixture.NetworkType);
            var aggregateTransactionsigned = account.Sign(aggregateTransactiontx, Fixture.GenerationHash);
            await Fixture.SiriusWebSocketClient.Listener.Open();

            Log.WriteLine($"Going to announce aggregate transaction: {aggregateTransactionsigned.Hash}");
            await Fixture.SiriusClient.TransactionHttp.Announce(aggregateTransactionsigned);

            var metadatatrx = MosaicMetadataTransaction.Create(
                Deadline.Create(),
                account.PublicAccount,
                mosaicDefinitionTransaction.MosaicId,
                "test_mosaic",
                "1",
                "",
                Fixture.NetworkType);
            var aggregateTransaction = AggregateTransaction.CreateBonded(
                Deadline.Create(),
                new List <Transaction>
            {
                metadatatrx.ToAggregate(account.PublicAccount),
            },
                Fixture.NetworkType);

            var aggregateTrxsigned = account.Sign(aggregateTransaction, Fixture.GenerationHash);

            Fixture.WatchForFailure(aggregateTransactionsigned);

            var hashLockTransaction = HashLockTransaction.Create(
                Deadline.Create(),
                //new Mosaic(new MosaicId("0BB1469B94E6FEF8"), 10),
                NetworkCurrencyMosaic.CreateRelative(10),
                (ulong)3650,
                aggregateTrxsigned,
                Fixture.NetworkType);

            var hashLockTransactionSigned = account.Sign(hashLockTransaction, Fixture.GenerationHash);

            Log.WriteLine($"Going to announce hashlock transaction: {hashLockTransactionSigned.Hash}");
            await Fixture.SiriusClient.TransactionHttp.Announce(hashLockTransactionSigned);

            var hashLocktx = Fixture.SiriusWebSocketClient.Listener
                             .ConfirmedTransactionsGiven(account.Address).Take(1)
                             .Timeout(TimeSpan.FromSeconds(500));

            Fixture.WatchForFailure(hashLockTransactionSigned);
            var hashLockConfirmed = await hashLocktx;

            Log.WriteLine($"Request confirmed with hash lock transaction {hashLockConfirmed.TransactionInfo.Hash}");

            Log.WriteLine($"Going to announce aggregate transaction {aggregateTransactionsigned.Hash}");

            await Fixture.SiriusClient.TransactionHttp.AnnounceAggregateBonded(aggregateTransactionsigned);

            Fixture.WatchForFailure(aggregateTransactionsigned);
            var aggregateTrntx = Fixture.SiriusWebSocketClient.Listener
                                 .ConfirmedTransactionsGiven(account.Address).Take(1)
                                 .Timeout(TimeSpan.FromSeconds(500));

            var MosaicMetadataDetail = await Fixture.SiriusClient.MetadataHttp.SearchMetadata(new MetadataQueryParams(1, Order.ASC, 1, Address.CreateFromRawAddress(account.Address.ToString()), null, null, null));

            Log.WriteLine($"Metadata mosaic {MosaicMetadataDetail}");
        }
Пример #28
0
 /// <summary>
 /// Signs the transaction with cosignatories.
 /// </summary>
 /// <param name="transaction">The transaction.</param>
 /// <param name="cosignatories">The cosignatories.</param>
 /// <returns>SignedTransaction.</returns>
 public SignedTransaction SignTransactionWithCosignatories(AggregateTransaction transaction, List <Account> cosignatories)
 {
     return(transaction.SignWithAggregateCosigners(KeyPair, cosignatories));
 }
Пример #29
0
        public async Task Should_Create_Aggregate_Root_And_SubNamespace()
        {
            var bobAccount = await Fixture.GenerateAccountWithCurrency(500);


            var rootNs = "nsp" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 6);
            var subNs  = "subnp" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 6);

            var rootId  = new NamespaceId(rootNs);
            var childId = new NamespaceId(rootNs + "." + subNs);

            Log.WriteLine($"Going to create aggregate root {rootId} and child namespace {childId}");

            var registerRootTransaction = RegisterNamespaceTransaction.CreateRootNamespace(
                Deadline.Create(),
                rootNs,
                100,
                Fixture.NetworkType
                );

            var registerChildTransaction = RegisterNamespaceTransaction.CreateSubNamespace(
                Deadline.Create(),
                subNs,
                rootId,
                Fixture.NetworkType
                );

            var aggregateTransaction = AggregateTransaction.CreateComplete(
                Deadline.Create(),
                new List <Transaction>
            {
                registerRootTransaction.ToAggregate(bobAccount.PublicAccount),
                registerChildTransaction.ToAggregate(bobAccount.PublicAccount)
            }, Fixture.NetworkType);

            var signedTransaction = bobAccount.Sign(aggregateTransaction, Fixture.GenerationHash);

            Log.WriteLine($"Going to announce transaction {signedTransaction.Hash}");

            var tx = Fixture.SiriusWebSocketClient.Listener.ConfirmedTransactionsGiven(bobAccount.Address).Take(1)
                     .Timeout(TimeSpan.FromSeconds(3000));

            await Fixture.SiriusClient.TransactionHttp.Announce(signedTransaction);

            var result = await tx;

            Log.WriteLine($"Request confirmed with transaction {result.TransactionInfo.Hash}");


            result.TransactionType.Should().BeEquivalentTo(EntityType.AGGREGATE_COMPLETE);

            /*
             * var rootNsInfo = await Fixture.SiriusClient.NamespaceHttp.GetNamespace(rootId).Timeout(_fixture.DefaultTimeout);
             * rootNsInfo.Should().NotBeNull();
             * rootNsInfo.IsRoot.Should().BeTrue();
             *
             * var subNsInfo = await Fixture.SiriusClient.NamespaceHttp.GetNamespace(childId).Timeout(_fixture.DefaultTimeout);
             * subNsInfo.Should().NotBeNull();
             * subNsInfo.IsSubNamespace.Should().BeTrue();
             */

            //Verify the root namespace and sub namespace owned by the account
            var nsInfos = await Fixture.SiriusClient.NamespaceHttp.GetNamespacesFromAccount(bobAccount.Address, null);

            nsInfos.Should().HaveCount(2);
            nsInfos.Single(ns => ns.Id.HexId == rootId.HexId).Should().NotBeNull();
            nsInfos.Single(ns => ns.Id.HexId == childId.HexId).Should().NotBeNull();

            //Verify the name of the namespaces
            var nsNames = await Fixture.SiriusClient.NamespaceHttp.GetNamespacesNames(new List <NamespaceId>
            {
                rootId,
                childId
            });

            nsNames.Should().HaveCount(2);
            nsNames.Select(ns => ns.Name == rootId.Name).Should().NotBeNull();
            nsNames.Select(ns => ns.Name == childId.Name).Should().NotBeNull();
        }
        private CosignatureSignedTransaction CosignAggregateBondedTransaction(AggregateTransaction transaction, Account account)
        {
            var cosignatureTransaction = CosignatureTransaction.Create(transaction);

            return(account.SignCosignatureTransaction(cosignatureTransaction));
        }