コード例 #1
0
    public async Task CanGetStatefulContractBytecode()
    {
        await using var fx = await StatefulContract.CreateAsync(_network);

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

        Assert.False(bytecode.IsEmpty);
    }
コード例 #2
0
        public async Task CanRetrieveRecordFromContractCreateRemoved()
        {
            await using var fxContract = await StatefulContract.CreateAsync(_network);

            var records = await fxContract.Client.GetContractRecordsAsync(fxContract.ContractRecord.Contract);

            Assert.NotNull(records);
            Assert.Empty(records);
        }
コード例 #3
0
        public async Task CanGetStatefulContractAddressFromSmartContractAddress()
        {
            await using var fx = await StatefulContract.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);
        }
コード例 #4
0
        public async Task CanCreateAContractWithParameters()
        {
            await using var fx = await StatefulContract.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);
        }
コード例 #5
0
        public async Task ContractWithNoRecords()
        {
            await using var fx = await StatefulContract.CreateAsync(_network);

            var transactionCount = Generator.Integer(2, 5);

            for (int i = 0; i < transactionCount; i++)
            {
                await fx.Client.CallContractWithRecordAsync(new CallContractParams
                {
                    Contract     = fx.ContractRecord.Contract,
                    Gas          = 30_000,
                    FunctionName = "get_message"
                });
コード例 #6
0
        public async Task CanGetCreateContractRecipt()
        {
            await using var fx = await StatefulContract.CreateAsync(_network);

            var receipt = await fx.Client.GetReceiptAsync(fx.ContractRecord.Id);

            var createRecipt = Assert.IsType <CreateContractReceipt>(receipt);

            Assert.Equal(fx.ContractRecord.Id, createRecipt.Id);
            Assert.Equal(fx.ContractRecord.Status, createRecipt.Status);
            Assert.Equal(fx.ContractRecord.CurrentExchangeRate, createRecipt.CurrentExchangeRate);
            Assert.Equal(fx.ContractRecord.NextExchangeRate, createRecipt.NextExchangeRate);
            Assert.Equal(fx.ContractRecord.Contract, createRecipt.Contract);
        }
コード例 #7
0
    public async Task CreateWithoutRequiredContractParamsThrowsError()
    {
        var ex = await Assert.ThrowsAsync <TransactionException>(async() =>
        {
            await StatefulContract.CreateAsync(_network, async fx =>
            {
                fx.ContractParams.Arguments = null;
                await fx.Client.CreateContractAsync(fx.ContractParams);
            });
        });

        Assert.StartsWith("Unable to create contract, status: ContractRevertExecuted", ex.Message);
        Assert.Equal(ResponseCode.ContractRevertExecuted, ex.Status);
    }
コード例 #8
0
        public async Task CanCreateAContractWithStateAlternateSignatoryAsync()
        {
            await using var fx = await StatefulContract.CreateAsync(_network);

            var receipt = await fx.Client.CallContractAsync(new CallContractParams
            {
                Contract     = fx.ContractRecord.Contract,
                Gas          = await _network.TinybarsFromGas(400),
                FunctionName = "get_message",
                Signatory    = _network.PrivateKey
            }, ctx => ctx.Signatory = null);

            Assert.NotNull(receipt);
            Assert.Equal(ResponseCode.Success, receipt.Status);
        }
コード例 #9
0
        public async Task CanGetStatefulContractInfo()
        {
            await using var fx = await StatefulContract.CreateAsync(_network);

            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);  // Assume for now they are equal
            Assert.NotNull(info.SmartContractId);
            Assert.Equal(fx.ContractParams.Administrator, info.Administrator);
            Assert.InRange(info.Expiration, DateTime.UtcNow, DateTime.MaxValue);
            Assert.Equal(fx.ContractParams.RenewPeriod, info.RenewPeriod);
            Assert.InRange(info.Size, 0, fx.FileParams.Contents.Length);
            Assert.StartsWith("Stateful Contract Create: Instantiating Stateful Instance", info.Memo);
        }
コード例 #10
0
        public async Task CanRetrieveRecordFromContractCreate()
        {
            await using var fxContract = await StatefulContract.CreateAsync(_network);

            var records = await fxContract.Client.GetContractRecordsAsync(fxContract.ContractRecord.Contract);

            Assert.NotNull(records);
            Assert.Single(records);
            var record = records[0];

            Assert.Equal(ResponseCode.Success, record.Status);
            Assert.Equal(fxContract.ContractRecord.Id, record.Id);
            Assert.InRange(record.Fee, 0UL, ulong.MaxValue);
            Assert.StartsWith("Stateful Contract Create: Instantiating Stateful Instance", record.Memo);
            Assert.NotNull(record.Concensus);
            Assert.False(record.Hash.IsEmpty);
        }
コード例 #11
0
        public async Task CanCreateAContractAndSetStateAsync()
        {
            await using var fx = await StatefulContract.CreateAsync(_network);

            var newMessage = Generator.Code(50);
            var setRecord  = await fx.Client.CallContractWithRecordAsync(new CallContractParams
            {
                Contract     = fx.ContractRecord.Contract,
                Gas          = await _network.TinybarsFromGas(1200),
                FunctionName = "set_message",
                FunctionArgs = new object[] { newMessage }
            }, ctx => ctx.Memo = "Call Contract");

            Assert.NotNull(setRecord);
            Assert.Equal(ResponseCode.Success, setRecord.Status);
            Assert.False(setRecord.Hash.IsEmpty);
            Assert.NotNull(setRecord.Concensus);
            Assert.Equal("Call Contract", setRecord.Memo);
            Assert.InRange(setRecord.Fee, 0UL, ulong.MaxValue);
            Assert.Empty(setRecord.CallResult.Error);
            Assert.True(setRecord.CallResult.Bloom.IsEmpty);
            Assert.InRange(setRecord.CallResult.Gas, 0UL, 50_000UL);
            Assert.Empty(setRecord.CallResult.Events);
            Assert.Empty(setRecord.CallResult.CreatedContracts);

            var getRecord = await fx.Client.CallContractWithRecordAsync(new CallContractParams
            {
                Contract     = fx.ContractRecord.Contract,
                Gas          = await _network.TinybarsFromGas(400),
                FunctionName = "get_message"
            });

            Assert.NotNull(getRecord);
            Assert.Equal(ResponseCode.Success, getRecord.Status);
            Assert.False(getRecord.Hash.IsEmpty);
            Assert.NotNull(getRecord.Concensus);
            Assert.Empty(getRecord.Memo);
            Assert.InRange(getRecord.Fee, 0UL, ulong.MaxValue);
            Assert.Empty(getRecord.CallResult.Error);
            Assert.True(getRecord.CallResult.Bloom.IsEmpty);
            Assert.InRange(getRecord.CallResult.Gas, 0UL, 30_000UL);
            Assert.Empty(getRecord.CallResult.Events);
            Assert.Empty(getRecord.CallResult.CreatedContracts);
            Assert.Equal(newMessage, getRecord.CallResult.Result.As <string>());
            Assert.InRange(getRecord.CallResult.Gas, 0UL, 30_000UL);
        }
コード例 #12
0
        public async Task CanCreateAContractWithStateAsync()
        {
            await using var fx = await StatefulContract.CreateAsync(_network);

            var result = await fx.Client.QueryContractAsync(new QueryContractParams
            {
                Contract          = fx.ContractRecord.Contract,
                Gas               = await _network.TinybarsFromGas(400),
                ReturnValueCharge = await _network.TinybarsFromGas(400),
                FunctionName      = "get_message"
            });

            Assert.NotNull(result);
            Assert.Empty(result.Error);
            Assert.True(result.Bloom.IsEmpty);
            Assert.InRange(result.Gas, 0UL, ulong.MaxValue);
            Assert.Empty(result.Events);
            Assert.Equal(fx.ContractParams.Arguments[0] as string, result.Result.As <string>());
        }
コード例 #13
0
    public async Task CanCreateAContractAndSetStateAsync()
    {
        await using var fx = await StatefulContract.CreateAsync(_network);

        var newMessage = Generator.Code(50);
        var qex        = await Assert.ThrowsAsync <ContractException>(async() =>
        {
            await fx.Client.QueryContractAsync(new QueryContractParams
            {
                Contract          = fx.ContractRecord.Contract,
                Gas               = 30000,
                FunctionName      = "set_message",
                FunctionArgs      = new object[] { newMessage },
                ReturnValueCharge = 900
            });
        });

        Assert.Equal(ResponseCode.LocalCallModificationException, qex.Status);
        Assert.StartsWith("Contract Query Failed with Code: LocalCallModificationException", qex.Message);
    }
コード例 #14
0
        public async Task CanCreateAContractAndSetStateAsync()
        {
            await using var fx = await StatefulContract.CreateAsync(_network);

            var newMessage = Generator.Code(50);
            var pex        = await Assert.ThrowsAsync <PrecheckException>(async() =>
            {
                await fx.Client.QueryContractAsync(new QueryContractParams
                {
                    Contract          = fx.ContractRecord.Contract,
                    Gas               = await _network.TinybarsFromGas(400),
                    FunctionName      = "set_message",
                    FunctionArgs      = new object[] { newMessage },
                    ReturnValueCharge = 900
                });
            });

            Assert.Equal(ResponseCode.LocalCallModificationException, pex.Status);
            Assert.StartsWith("Transaction Failed Pre-Check: LocalCallModificationException", pex.Message);
        }
コード例 #15
0
        public async Task CanRetrieveRecordsFromContractMethodCalls()
        {
            await using var fxContract = await StatefulContract.CreateAsync(_network);

            var transactionCount = Generator.Integer(2, 3);

            for (int i = 0; i < transactionCount; i++)
            {
                await fxContract.Client.CallContractWithRecordAsync(new CallContractParams
                {
                    Contract     = fxContract.ContractRecord.Contract,
                    Gas          = await _network.TinybarsFromGas(400),
                    FunctionName = "get_message"
                });
            }
            var records = await fxContract.Client.GetContractRecordsAsync(fxContract.ContractRecord.Contract);

            Assert.NotNull(records);
            Assert.Empty(records);
        }
コード例 #16
0
        public async Task CanCreateAContractWithParameters()
        {
            await using var fx = await StatefulContract.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);

            Assert.Empty(fx.ContractRecord.CallResult.Error);
            Assert.True(fx.ContractRecord.CallResult.Bloom.IsEmpty);
            Assert.InRange(fx.ContractRecord.CallResult.Gas, 0UL, (ulong)fx.ContractParams.Gas);
            Assert.Empty(fx.ContractRecord.CallResult.Events);
            Assert.Empty(fx.ContractRecord.CallResult.CreatedContracts);
            Assert.Equal(0, fx.ContractRecord.CallResult.Result.Size);
            Assert.True(fx.ContractRecord.CallResult.Result.Data.IsEmpty);
        }
コード例 #17
0
    public async Task ErrorQueryContractWithoutFlagReturnsWithoutError()
    {
        await using var fx = await StatefulContract.CreateAsync(_network);

        var result = await fx.Client.QueryContractAsync(new QueryContractParams
        {
            Contract          = fx.ContractRecord.Contract,
            Gas               = 1,
            ReturnValueCharge = 4000,
            FunctionName      = "get_message",
            ThrowOnFail       = false
        });

        Assert.NotNull(result);
        Assert.Equal("INSUFFICIENT_GAS", result.Error);
        Assert.False(result.Bloom.IsEmpty);
        Assert.InRange(result.Gas, 0UL, ulong.MaxValue);
        Assert.Empty(result.Events);
        Assert.Equal(0, result.Result.Size);
        Assert.Empty(result.CreatedContracts);
    }
コード例 #18
0
        public async Task ErrorQueryContractWithoutFlagReturnsWithoutError()
        {
            await using var fx = await StatefulContract.CreateAsync(_network);

            var result = await fx.Client.QueryContractAsync(new QueryContractParams
            {
                Contract          = fx.ContractRecord.Contract,
                Gas               = 1,
                ReturnValueCharge = await _network.TinybarsFromGas(400),
                FunctionName      = "get_message",
                ThrowOnFail       = false
            });

            Assert.NotNull(result);
            Assert.Equal("Not enough gas for 'PUSH1' cause spending: invokeGas[1], gas[3], usedGas[0];", result.Error);
            Assert.True(result.Bloom.IsEmpty);
            Assert.InRange(result.Gas, 0UL, ulong.MaxValue);
            Assert.Empty(result.Events);
            Assert.Equal(0, result.Result.Size);
            Assert.Empty(result.CreatedContracts);
        }
コード例 #19
0
        public async Task CanGetImutableStatefulContractInfo()
        {
            await using var fx = await StatefulContract.CreateAsync(_network, f =>
            {
                f.ContractParams.Administrator = null;
            });

            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);  // Assume for now they are equal
            Assert.NotNull(info.SmartContractId);
            // Immutable Contracts list their "contract" key as the administrator Key.
            Assert.Equal(KeyType.Contract, info.Administrator.Type);
            Assert.Equal(Abi.EncodeAddressPart(info.Contract).ToArray(), info.Administrator.PublicKey.ToArray());
            Assert.InRange(info.Expiration, DateTime.UtcNow, DateTime.MaxValue);
            Assert.Equal(fx.ContractParams.RenewPeriod, info.RenewPeriod);
            Assert.InRange(info.Size, 0, fx.FileParams.Contents.Length);
            Assert.StartsWith(fx.ContractParams.Memo, info.Memo);
            Assert.Equal((ulong)fx.ContractParams.InitialBalance, info.Balance);
        }
コード例 #20
0
        public async Task CanNotScheduleCallContract()
        {
            await using var fxPayer = await TestAccount.CreateAsync(_network, fx => fx.CreateParams.InitialBalance = 20_00_000_000);

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

            var tex = await Assert.ThrowsAsync <TransactionException>(async() =>
            {
                await fxContract.Client.CallContractWithRecordAsync(new CallContractParams
                {
                    Contract     = fxContract.ContractRecord.Contract,
                    Gas          = await _network.TinybarsFromGas(400),
                    FunctionName = "get_message",
                    Signatory    = new PendingParams {
                        PendingPayer = fxPayer
                    }
                });
            });

            Assert.Equal(ResponseCode.ScheduledTransactionNotInWhitelist, tex.Status);
            Assert.StartsWith("Unable to schedule transaction, status: ScheduledTransactionNotInWhitelist", tex.Message);
        }
コード例 #21
0
        public async Task CanCreateAContractWithStateAsync()
        {
            await using var fx = await StatefulContract.CreateAsync(_network);

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

            Assert.NotNull(record);
            Assert.Equal(ResponseCode.Success, record.Status);
            Assert.False(record.Hash.IsEmpty);
            Assert.NotNull(record.Concensus);
            Assert.Equal("Call Contract", record.Memo);
            Assert.InRange(record.Fee, 0UL, ulong.MaxValue);
            Assert.Empty(record.CallResult.Error);
            Assert.True(record.CallResult.Bloom.IsEmpty);
            Assert.InRange(record.CallResult.Gas, 0UL, 30_000UL);
            Assert.Empty(record.CallResult.Events);
            Assert.Equal(fx.ContractParams.Arguments[0] as string, record.CallResult.Result.As <string>());
        }
コード例 #22
0
    public async Task CallQueryAttemptingStateChangeFailsWithoutErrorWhenThrowOnFailFalse()
    {
        await using var fx = await StatefulContract.CreateAsync(_network);

        var newMessage = Generator.Code(50);
        var result     = await fx.Client.QueryContractAsync(new QueryContractParams
        {
            Contract          = fx.ContractRecord.Contract,
            Gas               = 30000,
            FunctionName      = "set_message",
            FunctionArgs      = new object[] { newMessage },
            ReturnValueCharge = 900,
            ThrowOnFail       = false
        });

        Assert.NotNull(result);
        Assert.Equal("ILLEGAL_STATE_CHANGE", result.Error);
        Assert.False(result.Bloom.IsEmpty);
        Assert.InRange(result.Gas, 0UL, ulong.MaxValue);
        Assert.Empty(result.Events);
        Assert.Equal(0, result.Result.Size);
        Assert.Empty(result.CreatedContracts);
    }