public void Fail_to_register_existing_domain()
        {
            var settings = chain.GetProtocolSettings();
            var alice    = chain.GetDefaultAccount("alice").ToScriptHash(settings.AddressVersion);
            var bob      = chain.GetDefaultAccount("bob").ToScriptHash(settings.AddressVersion);

            using var snapshot = fixture.GetSnapshot();

            var domainOwners = snapshot.GetContractStorages <Registrar>().StorageMap(DOMAIN_OWNERS_PREFIX);

            domainOwners.TryGetValue(DOMAIN_NAME, out var item).Should().BeTrue();
            item !.Should().Be(bob);

            using var engine  = new TestApplicationEngine(snapshot, settings, alice);
            using var monitor = engine.Monitor();
            engine.ExecuteScript <Registrar>(c => c.register(DOMAIN_NAME, alice));

            if (engine.State != VMState.HALT)
            {
                output.WriteLine($"FaultException: {engine.FaultException}");
            }

            monitor.Should().Raise("Log")
            .WithSender(engine)
            .WithArgs <LogEventArgs>(args => args.Message == "Domain already registered");

            engine.State.Should().Be(VMState.HALT);
            engine.ResultStack.Should().HaveCount(1);
            engine.ResultStack.Peek(0).Should().BeFalse();
        }
        public void Can_delete_existing_domain()
        {
            var settings = chain.GetProtocolSettings();
            var bob      = chain.GetDefaultAccount("bob").ToScriptHash(settings.AddressVersion);

            using var snapshot = fixture.GetSnapshot();

            var domainOwners = snapshot.GetContractStorages <Registrar>().StorageMap(0x00);

            domainOwners.TryGetValue(DOMAIN_NAME, out var item).Should().BeTrue();
            item !.Should().Be(bob);

            using var engine = new TestApplicationEngine(snapshot, settings, bob);
            engine.ExecuteScript <Registrar>(c => c.delete(DOMAIN_NAME));

            if (engine.State != VMState.HALT)
            {
                output.WriteLine($"FaultException: {engine.FaultException}");
            }

            engine.State.Should().Be(VMState.HALT);
            engine.ResultStack.Should().HaveCount(1);
            engine.ResultStack.Peek(0).Should().BeTrue();

            domainOwners = snapshot.GetContractStorages <Registrar>().StorageMap(DOMAIN_OWNERS_PREFIX);
            domainOwners.TryGetValue(DOMAIN_NAME, out _).Should().BeFalse();
        }
        public void Can_register_domain()
        {
            var settings = chain.GetProtocolSettings();
            var alice    = chain.GetDefaultAccount("alice").ToScriptHash(settings.AddressVersion);

            using var snapshot = fixture.GetSnapshot();

            // pretest check to ensure storage is empty as expected
            snapshot.GetContractStorages <Registrar>().Any().Should().BeFalse();

            // ExecuteScript converts the provided expression(s) into a Neo script
            // loads them into the engine and executes it
            using var engine = new TestApplicationEngine(snapshot, settings, alice);

            var logs = new List <string>();

            engine.Log += (sender, args) =>
            {
                logs.Add(args.Message);
            };

            engine.ExecuteScript <Registrar>(c => c.register(DOMAIN_NAME, alice));

            engine.State.Should().Be(VMState.HALT);
            engine.ResultStack.Should().HaveCount(1);
            engine.ResultStack.Peek(0).Should().BeTrue();

            // ensure correct storage item was created
            var storages = snapshot.GetContractStorages <Registrar>();

            storages.TryGetValue(DOMAIN_NAME_BYTES, out var item).Should().BeTrue();
            item !.Should().Be(alice);
        }
示例#4
0
        RpcInvokeResult Invoke(Neo.VM.Script script, Signer?signer = null)
        {
            var tx = TestApplicationEngine.CreateTestTransaction(signer);

            using var engine = script.Invoke(neoSystem.Settings, neoSystem.StoreView, tx);

            return(new RpcInvokeResult()
            {
                State = engine.State,
                Exception = engine.FaultException?.GetBaseException().Message ?? string.Empty,
                GasConsumed = engine.GasConsumed,
                Stack = engine.ResultStack.ToArray(),
                Script = string.Empty,
                Tx = string.Empty
            });
        }
示例#5
0
    public void seller_has_9900_neo()
    {
        var settings = chain.GetProtocolSettings();
        var seller   = chain.GetDefaultAccount("seller").ToScriptHash(settings.AddressVersion);

        using var builder = new ScriptBuilder();
        builder.EmitContractCall <Nep17Token>(NativeContracts.NeoToken, c => c.balanceOf(seller));

        using var snapshot = fixture.GetSnapshot();
        using var engine   = new TestApplicationEngine(snapshot, settings, seller);
        engine.ExecuteScript(builder.ToArray());

        engine.State.Should().Be(VMState.HALT);
        engine.ResultStack.Should().HaveCount(1);
        engine.ResultStack.Peek(0).Should().BeEquivalentTo(9900);
    }
示例#6
0
    public void seller_has_one_sale_listed()
    {
        var settings = chain.GetProtocolSettings();
        var seller   = chain.GetDefaultAccount("seller").ToScriptHash(settings.AddressVersion);

        using var snapshot = fixture.GetSnapshot();
        using var builder  = new ScriptBuilder();
        builder.EmitContractCall <SafePurchase>(snapshot, c => c.sales(seller));

        using var engine = new TestApplicationEngine(snapshot, settings, seller);
        engine.ExecuteScript(builder.ToArray());

        engine.State.Should().Be(VMState.HALT);
        engine.ResultStack.Should().HaveCount(1);
        var result = engine.ResultStack.Pop <Neo.VM.Types.Map>();

        result.Count.Should().Be(1);
    }
示例#7
0
        public void Can_delete_existing_domain()
        {
            var settings = chain.GetProtocolSettings();
            var bob      = chain.GetDefaultAccount("bob").ToScriptHash(settings.AddressVersion);

            using var snapshot = fixture.GetSnapshot();

            var storages = snapshot.GetContractStorages <Registrar>();

            storages.TryGetValue(DOMAIN_NAME_BYTES, out var item).Should().BeTrue();
            item !.Should().Be(bob);

            using var engine = new TestApplicationEngine(snapshot, settings, bob);
            engine.ExecuteScript <Registrar>(c => c.delete(DOMAIN_NAME));

            engine.State.Should().Be(VMState.HALT);
            engine.ResultStack.Should().HaveCount(1);
            engine.ResultStack.Peek(0).Should().BeTrue();

            snapshot.GetContractStorages <Registrar>().Any().Should().BeFalse();
        }
        public void Can_register_domain()
        {
            var settings = chain.GetProtocolSettings();
            var alice    = chain.GetDefaultAccount("alice").ToScriptHash(settings.AddressVersion);
            var owen     = chain.GetDefaultAccount("owen").ToScriptHash(settings.AddressVersion);

            using var snapshot = fixture.GetSnapshot();

            // ExecuteScript converts the provided expression(s) into a Neo script
            // loads them into the engine and executes it
            using var engine = new TestApplicationEngine(snapshot, settings, alice);

            var logs = new List <string>();

            engine.Log += (sender, args) =>
            {
                logs.Add(args.Message);
            };

            engine.ExecuteScript <Registrar>(c => c.register(DOMAIN_NAME, alice));

            if (engine.State != VMState.HALT)
            {
                output.WriteLine($"FaultException: {engine.FaultException}");
            }
            engine.State.Should().Be(VMState.HALT);
            engine.ResultStack.Should().HaveCount(1);
            engine.ResultStack.Peek(0).Should().BeTrue();

            // ensure correct storage item was created
            var storages     = snapshot.GetContractStorages <Registrar>();
            var domainOwners = storages.StorageMap(DOMAIN_OWNERS_PREFIX);

            domainOwners.TryGetValue(DOMAIN_NAME, out var item).Should().BeTrue();
            item !.Should().Be(alice);
        }