Esempio n. 1
0
        public void TestGreetingContract()
        {
            var serializer = new MyNoSqlTcpSerializer();


            var testContract = new GreetingContract
            {
                Name = "Test"
            };

            var rawData = serializer.Serialize(testContract);

            var memStream = new MemoryStream(rawData.ToArray())
            {
                Position = 0
            };


            var dataReader = new TcpDataReader();

            dataReader.NewPackage(memStream.ToArray());


            var result
                = (GreetingContract)serializer
                  .DeserializeAsync(dataReader)
                  .AsTestResult();

            Assert.AreEqual(testContract.Name, result.Name);
        }
        protected override ValueTask OnConnectAsync()
        {
            var readerVersion = GetReaderVersion.Value;

            readerVersion = readerVersion == null ? "" : ";ReaderVersion:" + readerVersion;

            var greetingsContract = new GreetingContract
            {
                Name = _appName + readerVersion
            };

            SendDataToSocket(greetingsContract);

            foreach (var tableToSubscribe in _subscriber.GetTablesToSubscribe())
            {
                var subscribePacket = new SubscribeContract
                {
                    TableName = tableToSubscribe
                };

                SendDataToSocket(subscribePacket);

                Console.WriteLine("Subscribed to MyNoSql table: " + tableToSubscribe);
            }

            return(new ValueTask());
        }
Esempio n. 3
0
        public async Task UpdateContractExpirationDate()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var oldExpiration = (await fx.Client.GetContractInfoAsync(fx.ContractRecord.Contract)).Expiration;
            var newExpiration = oldExpiration.AddMonths(12);
            var record        = await fx.Client.UpdateContractWithRecordAsync(new UpdateContractParams
            {
                Contract   = fx.ContractRecord.Contract,
                Expiration = newExpiration
            });

            var info = await fx.Client.GetContractInfoAsync(fx.ContractRecord.Contract);

            Assert.NotNull(info);
            Assert.Equal(fx.ContractRecord.Contract, info.Contract);
            Assert.Equal(fx.ContractRecord.Contract, info.Address);
            // This is what it should be.
            //Assert.Equal(newExpiration, info.Expiration);
            // This is what it is
            Assert.Equal(oldExpiration, info.Expiration);
            Assert.Equal(_network.PublicKey, info.Administrator);
            Assert.Equal(fx.ContractParams.RenewPeriod, info.RenewPeriod);
            Assert.Equal(fx.Memo, info.Memo);
        }
        public async Task CanAssociateTokenWithContract()
        {
            await using var fxContract = await GreetingContract.CreateAsync(_network);

            await using var fxToken = await TestToken.CreateAsync(_network);

            // Assert Not Associated
            var info = await fxContract.Client.GetContractInfoAsync(fxContract);

            Assert.Null(info.Tokens.FirstOrDefault(t => t.Token == fxToken.Record.Token));

            var receipt = await fxContract.Client.AssociateTokenAsync(fxToken.Record.Token, fxContract.ContractRecord.Contract, fxContract.PrivateKey);

            Assert.Equal(ResponseCode.Success, receipt.Status);

            info = await fxContract.Client.GetContractInfoAsync(fxContract);

            var association = info.Tokens.FirstOrDefault(t => t.Token == fxToken.Record.Token);

            Assert.NotNull(association);
            Assert.Equal(fxToken.Record.Token, association.Token);
            Assert.Equal(fxToken.Params.Symbol, association.Symbol);
            Assert.Equal(0UL, association.Balance);
            Assert.Equal(TokenKycStatus.Revoked, association.KycStatus);
            Assert.Equal(TokenTradableStatus.Tradable, association.TradableStatus);
        }
Esempio n. 5
0
        public async Task CanUpdateContractBytecode()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            await using var fx2 = await StatefulContract.SetupAsync(_network);

            var record = await fx.Client.UpdateContractWithRecordAsync(new UpdateContractParams
            {
                Contract = fx.ContractRecord.Contract,
                File     = fx2.FileRecord.File
            });

            var info = await fx.Client.GetContractInfoAsync(fx.ContractRecord.Contract);

            Assert.NotNull(info);
            Assert.Equal(fx.ContractRecord.Contract, info.Contract);
            Assert.Equal(fx.ContractRecord.Contract, info.Address);
            Assert.Equal(fx.ContractParams.Administrator, info.Administrator);
            Assert.Equal(fx.ContractParams.RenewPeriod, info.RenewPeriod);
            Assert.Equal(fx.Memo, info.Memo);

            // Call a method that was not part of the original contract to check update.
            // Note, this is a bug with the network, the call returned success but we are still
            // able to call the old contract method which should no longer exist.
            var callRecord = await fx.Client.CallContractWithRecordAsync(new CallContractParams
            {
                Contract     = fx.ContractRecord.Contract,
                Gas          = 30_000,
                FunctionName = "greet",
            });
Esempio n. 6
0
        public async Task CanUpdateAdminKey()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var(newPublicKey, newPrivateKey) = Generator.KeyPair();
            var newEndorsement   = new Endorsement(newPublicKey);
            var updatedSignatory = new Signatory(_network.Signatory, newPrivateKey);

            fx.Client.Configure(ctx => ctx.Signatory = updatedSignatory);
            var record = await fx.Client.UpdateContractWithRecordAsync(new UpdateContractParams
            {
                Contract      = fx.ContractRecord.Contract,
                Administrator = newEndorsement,
            });

            var info = await fx.Client.GetContractInfoAsync(fx.ContractRecord.Contract);

            Assert.NotNull(info);
            Assert.Equal(fx.ContractRecord.Contract, info.Contract);
            Assert.Equal(fx.ContractRecord.Contract, info.Address);
            Assert.Equal(newEndorsement, info.Administrator);
            Assert.Equal(fx.ContractParams.RenewPeriod, info.RenewPeriod);
            Assert.Equal(fx.Memo, info.Memo);
            Assert.Equal((ulong)fx.ContractParams.InitialBalance, info.Balance);
        }
Esempio n. 7
0
        public async Task CanUpdateRenewPeriod()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var newRenewal = TimeSpan.FromDays(Generator.Integer(180, 365));
            var pex        = await Assert.ThrowsAsync <PrecheckException>(async() =>
            {
                var record = await fx.Client.UpdateContractWithRecordAsync(new UpdateContractParams
                {
                    Contract    = fx.ContractRecord.Contract,
                    RenewPeriod = newRenewal,
                });
            });

            Assert.Equal(ResponseCode.AutorenewDurationNotInRange, pex.Status);
            Assert.StartsWith("Transaction Failed Pre-Check: AutorenewDurationNotInRange", pex.Message);

            var info = await fx.Client.GetContractInfoAsync(fx.ContractRecord.Contract);

            Assert.NotNull(info);
            Assert.Equal(fx.ContractRecord.Contract, info.Contract);
            Assert.Equal(fx.ContractRecord.Contract, info.Address);
            Assert.Equal(fx.ContractParams.Administrator, info.Administrator);
            Assert.Equal(fx.ContractParams.RenewPeriod, info.RenewPeriod);
            Assert.Equal(fx.Memo, info.Memo);
            Assert.Equal((ulong)fx.ContractParams.InitialBalance, info.Balance);
        }
Esempio n. 8
0
        public async Task CanGetCallContractRecord()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var record1 = await fx.Client.CallContractWithRecordAsync(new CallContractParams
            {
                Contract     = fx.ContractRecord.Contract,
                Gas          = await _network.TinybarsFromGas(400),
                FunctionName = "greet"
            }, ctx => ctx.Memo = "Call Contract");

            var record2 = await fx.Client.GetTransactionRecordAsync(record1.Id);

            var callRecord = Assert.IsType <CallContractRecord>(record2);

            Assert.Equal(record1.Id, callRecord.Id);
            Assert.Equal(record1.Status, callRecord.Status);
            Assert.Equal(record1.CurrentExchangeRate, callRecord.CurrentExchangeRate);
            Assert.Equal(record1.NextExchangeRate, callRecord.NextExchangeRate);
            Assert.Equal(record1.Hash.ToArray(), callRecord.Hash.ToArray());
            Assert.Equal(record1.Concensus, callRecord.Concensus);
            Assert.Equal(record1.Memo, callRecord.Memo);
            Assert.Equal(record1.Fee, callRecord.Fee);
            Assert.Equal(record1.CallResult.Error, callRecord.CallResult.Error);
            Assert.Equal(record1.CallResult.Bloom, callRecord.CallResult.Bloom);
            Assert.Equal(record1.CallResult.Gas, callRecord.CallResult.Gas);
            Assert.Equal(record1.CallResult.Events, callRecord.CallResult.Events);
            Assert.Equal(record1.CallResult.CreatedContracts, callRecord.CallResult.CreatedContracts);
            Assert.Equal(record1.CallResult.Result.As <string>(), callRecord.CallResult.Result.As <string>());
        }
Esempio n. 9
0
        public async Task CanUpdateTreasuryToContract()
        {
            await using var fxContract = await GreetingContract.CreateAsync(_network);

            await using var fxToken = await TestToken.CreateAsync(_network);

            // Note: Contract did not need to sign.
            await fxContract.Client.AssociateTokenAsync(fxToken, fxContract, fxContract.PrivateKey);

            var updateParams = new UpdateTokenParams
            {
                Token     = fxToken.Record.Token,
                Treasury  = fxContract.ContractRecord.Contract,
                Signatory = new Signatory(fxToken.AdminPrivateKey, fxContract.PrivateKey)
            };

            var receipt = await fxToken.Client.UpdateTokenAsync(updateParams);

            Assert.Equal(ResponseCode.Success, receipt.Status);

            var info = await fxToken.Client.GetTokenInfoAsync(fxToken.Record.Token);

            Assert.Equal(fxContract.ContractRecord.Contract, info.Treasury);

            Assert.Equal(fxToken.Params.Circulation, await fxToken.Client.GetContractTokenBalanceAsync(fxContract, fxToken));
        }
Esempio n. 10
0
        public async Task CanUpdateMultiplePropertiesInOneCall()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var(newPublicKey, newPrivateKey) = Generator.KeyPair();
            var newExpiration  = Generator.TruncatedFutureDate(2400, 4800);
            var newEndorsement = new Endorsement(newPublicKey);
            var newRenewal     = TimeSpan.FromDays(Generator.Integer(60, 90));
            var updatedPayer   = _network.PayerWithKeys(newPrivateKey);
            var newMemo        = Generator.Code(50);

            fx.Client.Configure(ctx => ctx.Payer = updatedPayer);
            var record = await fx.Client.UpdateContractWithRecordAsync(new UpdateContractParams
            {
                Contract      = fx.ContractRecord.Contract,
                Expiration    = newExpiration,
                Administrator = newEndorsement,
                RenewPeriod   = newRenewal,
                Memo          = newMemo
            });

            var info = await fx.Client.GetContractInfoAsync(fx.ContractRecord.Contract);

            Assert.NotNull(info);
            Assert.Equal(fx.ContractRecord.Contract, info.Contract);
            Assert.Equal(fx.ContractRecord.Contract, info.Address);
            //Assert.Equal(newExpiration, info.Expiration);
            Assert.Equal(newEndorsement, info.Administrator);
            Assert.Equal(newRenewal, info.RenewPeriod);
            Assert.Equal(newMemo, info.Memo);
        }
Esempio n. 11
0
        public async Task CanNotScheduleDelete()
        {
            var systemAddress = await _network.GetSystemDeleteAdminAddress();

            if (systemAddress is null)
            {
                _network.Output?.WriteLine("TEST SKIPPED: No access to System Delete Administrator Account.");
                return;
            }

            await using var fxContract = await GreetingContract.CreateAsync(_network);

            await using var fxPayer = await TestAccount.CreateAsync(_network, fx => fx.CreateParams.InitialBalance = 20_00_000_000);

            var tex = await Assert.ThrowsAsync <TransactionException>(async() =>
            {
                await fxContract.Client.SystemDeleteContractAsync(
                    fxContract.ContractRecord.Contract,
                    ctx =>
                {
                    ctx.Payer     = systemAddress;
                    ctx.Signatory = new Signatory(
                        _network.PrivateKey,
                        new PendingParams {
                        PendingPayer = fxPayer
                    }
                        );
                });
            });

            Assert.Equal(ResponseCode.ScheduledTransactionNotInWhitelist, tex.Status);
            Assert.StartsWith("Unable to schedule transaction, status: ScheduledTransactionNotInWhitelist", tex.Message);
        }
Esempio n. 12
0
        public async Task CanNotScheduleUpdate()
        {
            await using var fxContract = await GreetingContract.CreateAsync(_network);

            await using var fxPayer = await TestAccount.CreateAsync(_network, fx => fx.CreateParams.InitialBalance = 20_00_000_000);

            var newMemo = Generator.Code(50);
            var tex     = await Assert.ThrowsAsync <TransactionException>(async() =>
            {
                await fxContract.Client.UpdateContractWithRecordAsync(new UpdateContractParams
                {
                    Contract  = fxContract.ContractRecord.Contract,
                    Memo      = newMemo,
                    Signatory = new Signatory(
                        fxContract.PrivateKey,
                        new PendingParams {
                        PendingPayer = fxPayer
                    }
                        )
                });
            });

            Assert.Equal(ResponseCode.ScheduledTransactionNotInWhitelist, tex.Status);
            Assert.StartsWith("Unable to schedule transaction, status: ScheduledTransactionNotInWhitelist", tex.Message);
        }
Esempio n. 13
0
        public async Task CanTransferTokensToContract()
        {
            await using var fxContract = await GreetingContract.CreateAsync(_network);

            await using var fxToken = await TestToken.CreateAsync(_network, fx =>
            {
                fx.Params.GrantKycEndorsement = null;
                fx.Params.InitializeSuspended = false;
            });

            await fxContract.Client.AssociateTokenAsync(fxToken.Record.Token, fxContract.ContractRecord.Contract, fxContract.PrivateKey);

            var xferAmount = fxToken.Params.Circulation / 3;

            var receipt = await fxContract.Client.TransferTokensAsync(fxToken, fxToken.TreasuryAccount, fxContract.ContractRecord.Contract, (long)xferAmount, fxToken.TreasuryAccount.PrivateKey);

            Assert.Equal(ResponseCode.Success, receipt.Status);

            var info = await fxContract.Client.GetContractInfoAsync(fxContract);

            var association = info.Tokens.FirstOrDefault(t => t.Token == fxToken.Record.Token);

            Assert.NotNull(association);
            Assert.Equal(fxToken.Record.Token, association.Token);
            Assert.Equal(fxToken.Params.Symbol, association.Symbol);
            Assert.Equal(xferAmount, association.Balance);
            Assert.Equal(TokenKycStatus.NotApplicable, association.KycStatus);
            Assert.Equal(TokenTradableStatus.Tradable, association.TradableStatus);
        }
Esempio n. 14
0
        public async Task CanDeleteContract()
        {
            var systemAddress = await _network.GetSystemDeleteAdminAddress();

            if (systemAddress is null)
            {
                _network.Output?.WriteLine("TEST SKIPPED: No access to System Delete Administrator Account.");
                return;
            }

            await using var fx = await GreetingContract.CreateAsync(_network);

            var receipt = await fx.Client.SystemDeleteContractAsync(fx.ContractRecord.Contract, ctx => ctx.Payer = systemAddress);

            Assert.Equal(ResponseCode.Success, receipt.Status);

            // But you still can't get the info
            var pex = await Assert.ThrowsAsync <PrecheckException>(async() =>
            {
                await fx.Client.GetContractInfoAsync(fx.ContractRecord.Contract);
            });

            Assert.Equal(ResponseCode.ContractDeleted, pex.Status);
            Assert.StartsWith("Transaction Failed Pre-Check: ContractDeleted", pex.Message);
        }
Esempio n. 15
0
        public async Task CanUpdateMultiplePropertiesInOneCall()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var(newPublicKey, newPrivateKey) = Generator.KeyPair();
            var newExpiration    = Generator.TruncatedFutureDate(2400, 4800);
            var newEndorsement   = new Endorsement(newPublicKey);
            var updatedSignatory = new Signatory(_network.Signatory, newPrivateKey);
            var newMemo          = Generator.Code(50);

            fx.Client.Configure(ctx => ctx.Signatory = updatedSignatory);
            var record = await fx.Client.UpdateContractWithRecordAsync(new UpdateContractParams
            {
                Contract      = fx.ContractRecord.Contract,
                Expiration    = newExpiration,
                Administrator = newEndorsement,
                Memo          = newMemo
            });

            var info = await fx.Client.GetContractInfoAsync(fx.ContractRecord.Contract);

            Assert.NotNull(info);
            Assert.Equal(fx.ContractRecord.Contract, info.Contract);
            Assert.Equal(fx.ContractRecord.Contract, info.Address);
            Assert.Equal(newExpiration, info.Expiration);
            Assert.Equal(newEndorsement, info.Administrator);
            Assert.Equal(fx.ContractParams.RenewPeriod, info.RenewPeriod);
            Assert.Equal(newMemo, info.Memo);
            Assert.Equal((ulong)fx.ContractParams.InitialBalance, info.Balance);
        }
Esempio n. 16
0
        public async Task UpdatingContractWithoutAdminKeyRaisesError()
        {
            var(publicKey, privateKey) = Generator.KeyPair();
            await using var fx         = await GreetingContract.SetupAsync(_network);

            fx.ContractParams.Administrator          = publicKey;
            fx.Client.Configure(ctx => ctx.Signatory = new Signatory(ctx.Signatory, privateKey));
            await fx.CompleteCreateAsync();

            // First, Remove admin key from Payer's Account
            var tex = await Assert.ThrowsAsync <TransactionException>(async() =>
            {
                fx.Client.Configure(ctx => ctx.Signatory = new Signatory(_network.PrivateKey));
                await fx.Client.UpdateContractWithRecordAsync(new UpdateContractParams
                {
                    Contract = fx.ContractRecord.Contract,
                    Memo     = Generator.Code(50)
                });
            });

            Assert.Equal(ResponseCode.InvalidSignature, tex.Status);
            Assert.StartsWith("Unable to update Contract, status: InvalidSignature", tex.Message);

            // Try again with the admin key to prove we have the keys right
            var record = await fx.Client.UpdateContractWithRecordAsync(new UpdateContractParams
            {
                Signatory = new Signatory(_network.PrivateKey, privateKey),
                Contract  = fx.ContractRecord.Contract,
                Memo      = Generator.Code(50)
            });

            Assert.Equal(ResponseCode.Success, record.Status);
        }
Esempio n. 17
0
    public async Task CanDeleteContractUsingSignatory()
    {
        await using var fx = await GreetingContract.CreateAsync(_network);

        var record = await fx.Client.DeleteContractAsync(fx.ContractRecord.Contract, _network.Payer, fx.PrivateKey);

        Assert.Equal(ResponseCode.Success, record.Status);
    }
Esempio n. 18
0
        public async Task CanGetStatelessContractBytecode()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var bytecode = await fx.Client.GetContractBytecodeAsync(fx.ContractRecord.Contract);

            Assert.False(bytecode.IsEmpty);
        }
Esempio n. 19
0
        public async Task DeleteContractNotYetSupported()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var record = await fx.Client.DeleteContractAsync(fx.ContractRecord.Contract, _network.Payer);

            Assert.Equal(ResponseCode.Success, record.Status);
        }
        public async Task CanGetStatelessContractBytecode()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var bytecode = await fx.Client.GetContractBytecodeAsync(fx.ContractRecord.Contract);

            _network.Output.WriteLine($"Size {fx.FileParams.Contents.Length}");
            Assert.False(bytecode.IsEmpty);
        }
Esempio n. 21
0
        public async Task CanCreateContractWithoutReturningRecordData()
        {
            await using var fx = await GreetingContract.SetupAsync(_network);

            var receipt = await fx.Client.CreateContractAsync(fx.ContractParams);

            Assert.NotNull(receipt);
            Assert.NotNull(receipt.Contract);
            Assert.Equal(ResponseCode.Success, receipt.Status);
        }
Esempio n. 22
0
        public async Task CanGetStatelessContractAddressFromSmartContractAddress()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var info = await fx.Client.GetContractInfoAsync(fx.ContractRecord.Contract);

            var address = await fx.Client.GetAddressFromSmartContractId(info.SmartContractId);

            Assert.Equal(fx.ContractRecord.Contract, address);
        }
Esempio n. 23
0
        public async Task CanCreateAContractAsync()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var record = await fx.Client.CallContractWithRecordAsync(new CallContractParams
            {
                Contract     = fx.ContractRecord.Contract,
                Gas          = 30_000,
                FunctionName = "greet"
            });
Esempio n. 24
0
        public async Task DeleteContractWithMissingReturnToAddressRaisesError()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var ane = await Assert.ThrowsAsync <ArgumentNullException>(async() =>
            {
                await fx.Client.DeleteContractAsync(fx.ContractRecord.Contract, null);
            });

            Assert.Equal("transferToAddress", ane.ParamName);
            Assert.StartsWith("Transfer address is missing. Please check that it is not null.", ane.Message);
        }
Esempio n. 25
0
        public async Task ContractAddressForTokenSymbolRaisesError()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            var pex = await Assert.ThrowsAsync <PrecheckException>(async() =>
            {
                await fx.Client.GetTokenInfoAsync(fx.ContractRecord.Contract);
            });

            Assert.Equal(ResponseCode.InvalidTokenId, pex.Status);
            Assert.StartsWith("Transaction Failed Pre-Check: InvalidTokenId", pex.Message);
        }
Esempio n. 26
0
        public async Task MissingFileAddressRaisesError()
        {
            await using var fx = await GreetingContract.SetupAsync(_network);

            fx.ContractParams.File = null;
            var ex = await Assert.ThrowsAsync <ArgumentNullException>(async() => {
                await fx.Client.CreateContractAsync(fx.ContractParams);
            });

            Assert.StartsWith("The File Address containing the contract is missing, it cannot be null.", ex.Message);
            Assert.Equal("File", ex.ParamName);
        }
Esempio n. 27
0
        public async Task MissingGasRaisesError()
        {
            await using var fx = await GreetingContract.SetupAsync(_network);

            fx.ContractParams.Gas = 0;
            var ex = await Assert.ThrowsAsync <TransactionException>(async() => {
                await fx.Client.CreateContractAsync(fx.ContractParams);
            });

            Assert.StartsWith("Unable to create contract, status: InsufficientGas", ex.Message);
            Assert.Equal(ResponseCode.InsufficientGas, ex.Status);
        }
Esempio n. 28
0
        public async Task SendingCryptoToNonPayableContractRaisesError()
        {
            await using var fx = await GreetingContract.SetupAsync(_network);

            fx.ContractParams.InitialBalance = 10;
            var ex = await Assert.ThrowsAsync <TransactionException>(async() => {
                await fx.Client.CreateContractAsync(fx.ContractParams);
            });

            Assert.StartsWith("Unable to create contract, status: ContractRevertExecuted", ex.Message);
            Assert.Equal(ResponseCode.ContractRevertExecuted, ex.Status);
        }
Esempio n. 29
0
        public async Task InvalidRenewPeriodRaisesError()
        {
            await using var fx = await GreetingContract.SetupAsync(_network);

            fx.ContractParams.RenewPeriod = TimeSpan.FromTicks(1);
            var ex = await Assert.ThrowsAsync <PrecheckException>(async() => {
                await fx.Client.CreateContractAsync(fx.ContractParams);
            });

            Assert.StartsWith("Transaction Failed Pre-Check: AutorenewDurationNotInRange", ex.Message);
            Assert.Equal(ResponseCode.AutorenewDurationNotInRange, ex.Status);
        }
Esempio n. 30
0
        public async Task CanCreateAContractAsync()
        {
            await using var fx = await GreetingContract.CreateAsync(_network);

            Assert.NotNull(fx.ContractRecord);
            Assert.NotNull(fx.ContractRecord.Contract);
            Assert.Equal(ResponseCode.Success, fx.ContractRecord.Status);
            Assert.NotEmpty(fx.ContractRecord.Hash.ToArray());
            Assert.NotNull(fx.ContractRecord.Concensus);
            Assert.NotNull(fx.ContractRecord.Memo);
            Assert.InRange(fx.ContractRecord.Fee, 0UL, ulong.MaxValue);
        }