示例#1
0
    public async Task WrongPhaseAsync()
    {
        WabiSabiConfig cfg   = new();
        Round          round = WabiSabiFactory.CreateRound(cfg);

        using Arena arena = await ArenaBuilder.From(cfg).CreateAndStartAsync(round);

        await arena.TriggerAndWaitRoundAsync(TimeSpan.FromSeconds(21));

        // Refresh the Arena States because of vsize manipulation.
        await arena.TriggerAndWaitRoundAsync(TimeSpan.FromSeconds(21));

        round.Alices.Add(WabiSabiFactory.CreateAlice(round));

        foreach (Phase phase in Enum.GetValues(typeof(Phase)))
        {
            if (phase != Phase.OutputRegistration)
            {
                var req = WabiSabiFactory.CreateOutputRegistrationRequest(round);
                round.SetPhase(phase);
                var ex = await Assert.ThrowsAsync <WrongPhaseException>(async() => await arena.RegisterOutputAsync(req, CancellationToken.None));

                Assert.Equal(WabiSabiProtocolErrorCode.WrongPhase, ex.ErrorCode);
            }
        }

        await arena.StopAsync(CancellationToken.None);
    }
    public async Task WrongPhaseAsync()
    {
        WabiSabiConfig cfg = new();

        using Arena arena = await ArenaBuilder.From(cfg).CreateAndStartAsync();

        await arena.TriggerAndWaitRoundAsync(TimeSpan.FromSeconds(21));

        var round = arena.Rounds.First();

        round.MaxVsizeAllocationPerAlice = 11 + 31 + MultipartyTransactionParameters.SharedOverhead;

        round.Alices.Add(WabiSabiFactory.CreateAlice(round));

        foreach (Phase phase in Enum.GetValues(typeof(Phase)))
        {
            if (phase != Phase.OutputRegistration)
            {
                var req = WabiSabiFactory.CreateOutputRegistrationRequest(round);
                round.SetPhase(phase);
                var ex = await Assert.ThrowsAsync <WrongPhaseException>(async() => await arena.RegisterOutputAsync(req, CancellationToken.None));

                Assert.Equal(WabiSabiProtocolErrorCode.WrongPhase, ex.ErrorCode);
            }
        }

        await arena.StopAsync(CancellationToken.None);
    }
示例#3
0
        public async Task WrongPhaseAsync()
        {
            WabiSabiConfig cfg = new();

            using Arena arena = await WabiSabiFactory.CreateAndStartArenaAsync(cfg);

            await using ArenaRequestHandler handler = new(cfg, new Prison(), arena, new MockRpcClient());
            await arena.TriggerAndWaitRoundAsync(TimeSpan.FromSeconds(21)).ConfigureAwait(false);

            var round = arena.Rounds.First();

            round.Alices.Add(WabiSabiFactory.CreateAlice());

            foreach (Phase phase in Enum.GetValues(typeof(Phase)))
            {
                if (phase != Phase.OutputRegistration)
                {
                    var req = WabiSabiFactory.CreateOutputRegistrationRequest(round);
                    round.SetPhase(phase);
                    var ex = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await handler.RegisterOutputAsync(req, CancellationToken.None));

                    Assert.Equal(WabiSabiProtocolErrorCode.WrongPhase, ex.ErrorCode);
                }
            }

            await arena.StopAsync(CancellationToken.None);
        }
        public async Task RoundNotFoundAsync()
        {
            using Arena arena = await WabiSabiFactory.CreateAndStartArenaAsync();

            await using ArenaRequestHandler handler = new(new WabiSabiConfig(), new Prison(), arena, new MockRpcClient());
            var req = WabiSabiFactory.CreateOutputRegistrationRequest();
            var ex  = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await handler.RegisterOutputAsync(req));

            Assert.Equal(WabiSabiProtocolErrorCode.RoundNotFound, ex.ErrorCode);

            await arena.StopAsync(CancellationToken.None);
        }
    public async Task RoundNotFoundAsync()
    {
        var cfg = new WabiSabiConfig();
        var nonExistingRound = WabiSabiFactory.CreateRound(cfg);

        using Arena arena = await ArenaBuilder.Default.CreateAndStartAsync();

        var req = WabiSabiFactory.CreateOutputRegistrationRequest(nonExistingRound);
        var ex  = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await arena.RegisterOutputAsync(req, CancellationToken.None));

        Assert.Equal(WabiSabiProtocolErrorCode.RoundNotFound, ex.ErrorCode);

        await arena.StopAsync(CancellationToken.None);
    }
    public async Task SuccessAsync()
    {
        WabiSabiConfig cfg   = new();
        var            round = WabiSabiFactory.CreateRound(cfg);

        round.SetPhase(Phase.OutputRegistration);
        round.Alices.Add(WabiSabiFactory.CreateAlice(round));
        using Arena arena = await ArenaBuilder.From(cfg).CreateAndStartAsync(round);

        var req = WabiSabiFactory.CreateOutputRegistrationRequest(round);
        await arena.RegisterOutputAsync(req, CancellationToken.None);

        Assert.NotEmpty(round.Bobs);

        await arena.StopAsync(CancellationToken.None);
    }
    public async Task NotEnoughFundsAsync()
    {
        WabiSabiConfig cfg   = new() { MinRegistrableAmount = Money.Coins(2) };
        var            round = WabiSabiFactory.CreateRound(cfg);

        round.SetPhase(Phase.OutputRegistration);
        round.Alices.Add(WabiSabiFactory.CreateAlice(Money.Coins(1), round));
        using Arena arena = await ArenaBuilder.From(cfg).CreateAndStartAsync(round);

        var req = WabiSabiFactory.CreateOutputRegistrationRequest(round);

        var ex = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await arena.RegisterOutputAsync(req, CancellationToken.None));

        Assert.Equal(WabiSabiProtocolErrorCode.NotEnoughFunds, ex.ErrorCode);

        await arena.StopAsync(CancellationToken.None);
    }
    public async Task IncorrectRequestedVsizeCredentialsAsync()
    {
        WabiSabiConfig cfg   = new();
        var            round = WabiSabiFactory.CreateRound(cfg);

        round.SetPhase(Phase.OutputRegistration);
        round.Alices.Add(WabiSabiFactory.CreateAlice(round));
        using Arena arena = await ArenaBuilder.From(cfg).CreateAndStartAsync(round);

        var req = WabiSabiFactory.CreateOutputRegistrationRequest(round, vsize: 30);

        var ex = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await arena.RegisterOutputAsync(req, CancellationToken.None));

        Assert.Equal(WabiSabiProtocolErrorCode.IncorrectRequestedVsizeCredentials, ex.ErrorCode);

        await arena.StopAsync(CancellationToken.None);
    }
示例#9
0
        public async Task TooMuchFundsAsync()
        {
            WabiSabiConfig cfg   = new() { MaxRegistrableAmount = Money.Coins(1.999m) };           // TODO migrate to MultipartyTransactionParameters
            var            round = WabiSabiFactory.CreateRound(cfg);

            round.SetPhase(Phase.OutputRegistration);
            round.Alices.Add(WabiSabiFactory.CreateAlice(Money.Coins(2), round));
            using Arena arena = await WabiSabiFactory.CreateAndStartArenaAsync(cfg, round);

            var req = WabiSabiFactory.CreateOutputRegistrationRequest(round);

            var ex = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await arena.RegisterOutputAsync(req, CancellationToken.None));

            Assert.Equal(WabiSabiProtocolErrorCode.TooMuchFunds, ex.ErrorCode);

            await arena.StopAsync(CancellationToken.None);
        }
        public async Task SuccessAsync()
        {
            WabiSabiConfig cfg   = new();
            var            round = WabiSabiFactory.CreateRound(cfg);

            round.SetPhase(Phase.OutputRegistration);
            round.Alices.Add(WabiSabiFactory.CreateAlice(round));
            using Arena arena = await WabiSabiFactory.CreateAndStartArenaAsync(cfg, round);

            await using ArenaRequestHandler handler = new(cfg, new Prison(), arena, new MockRpcClient());

            var req = WabiSabiFactory.CreateOutputRegistrationRequest(round);
            await handler.RegisterOutputAsync(req, CancellationToken.None);

            Assert.NotEmpty(round.Bobs);

            await arena.StopAsync(CancellationToken.None);
        }
        public async Task ScriptNotAllowedAsync()
        {
            WabiSabiConfig cfg   = new();
            var            round = WabiSabiFactory.CreateRound(cfg);

            round.SetPhase(Phase.OutputRegistration);
            using Arena arena = await WabiSabiFactory.CreateAndStartArenaAsync(cfg, round);

            using Key key = new();

            var req = WabiSabiFactory.CreateOutputRegistrationRequest(round, key.PubKey.GetAddress(ScriptPubKeyType.Legacy, Network.Main).ScriptPubKey);

            await using ArenaRequestHandler handler = new(cfg, new Prison(), arena, new MockRpcClient());
            var ex = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await handler.RegisterOutputAsync(req));

            Assert.Equal(WabiSabiProtocolErrorCode.ScriptNotAllowed, ex.ErrorCode);

            await arena.StopAsync(CancellationToken.None);
        }
        public async Task IncorrectRequestedVsizeCredentialsAsync()
        {
            WabiSabiConfig cfg   = new();
            var            round = WabiSabiFactory.CreateRound(cfg);

            round.SetPhase(Phase.OutputRegistration);
            round.Alices.Add(WabiSabiFactory.CreateAlice());
            using Arena arena = await WabiSabiFactory.CreateAndStartArenaAsync(cfg, round);

            await using ArenaRequestHandler handler = new(cfg, new Prison(), arena, new MockRpcClient());

            var req = WabiSabiFactory.CreateOutputRegistrationRequest(round, vsize: 30);

            var ex = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await handler.RegisterOutputAsync(req));

            Assert.Equal(WabiSabiProtocolErrorCode.IncorrectRequestedVsizeCredentials, ex.ErrorCode);

            await arena.StopAsync(CancellationToken.None);
        }
        public async Task TooMuchFundsAsync()
        {
            WabiSabiConfig cfg   = new() { MaxRegistrableAmount = Money.Coins(1.999m) };
            var            round = WabiSabiFactory.CreateRound(cfg);

            round.SetPhase(Phase.OutputRegistration);
            round.Alices.Add(WabiSabiFactory.CreateAlice(value: Money.Coins(2)));
            using Arena arena = await WabiSabiFactory.CreateAndStartArenaAsync(cfg, round);

            await using ArenaRequestHandler handler = new(cfg, new Prison(), arena, new MockRpcClient());

            var req = WabiSabiFactory.CreateOutputRegistrationRequest(round);

            var ex = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await handler.RegisterOutputAsync(req));

            Assert.Equal(WabiSabiProtocolErrorCode.TooMuchFunds, ex.ErrorCode);

            await arena.StopAsync(CancellationToken.None);
        }
    public async Task NonStandardOutputAsync()
    {
        WabiSabiConfig cfg   = new();
        var            round = WabiSabiFactory.CreateRound(cfg);

        round.MaxVsizeAllocationPerAlice += 13;
        using Arena arena = await ArenaBuilder.From(cfg).CreateAndStartAsync(round);

        round.SetPhase(Phase.OutputRegistration);
        round.Alices.Add(WabiSabiFactory.CreateAlice(Money.Coins(1), round));

        var sha256Bounty = Script.FromHex("aa20000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f87");
        var req          = WabiSabiFactory.CreateOutputRegistrationRequest(round, sha256Bounty);
        var ex           = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await arena.RegisterOutputAsync(req, CancellationToken.None));

        // The following assertion requires standardness to be checked before allowed script types
        Assert.Equal(WabiSabiProtocolErrorCode.NonStandardOutput, ex.ErrorCode);

        await arena.StopAsync(CancellationToken.None);
    }
    public async Task ScriptNotAllowedAsync()
    {
        WabiSabiConfig cfg   = new();
        var            round = WabiSabiFactory.CreateRound(cfg);

        round.MaxVsizeAllocationPerAlice = 11 + 34 + MultipartyTransactionParameters.SharedOverhead;

        using Arena arena = await ArenaBuilder.From(cfg).CreateAndStartAsync(round);

        using Key key = new();

        round.SetPhase(Phase.OutputRegistration);
        round.Alices.Add(WabiSabiFactory.CreateAlice(Money.Coins(1), round));

        var req = WabiSabiFactory.CreateOutputRegistrationRequest(round, key.PubKey.GetAddress(ScriptPubKeyType.Legacy, Network.Main).ScriptPubKey);
        var ex  = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await arena.RegisterOutputAsync(req, CancellationToken.None));

        Assert.Equal(WabiSabiProtocolErrorCode.ScriptNotAllowed, ex.ErrorCode);

        await arena.StopAsync(CancellationToken.None);
    }
        public async Task NonStandardOutputAsync()
        {
            WabiSabiConfig cfg   = new();
            var            round = WabiSabiFactory.CreateRound(cfg);

            round.SetPhase(Phase.OutputRegistration);
            using Arena arena = await WabiSabiFactory.CreateAndStartArenaAsync(cfg, round);

            using Key key = new();

            var sha256Bounty = Script.FromHex("aa20000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f87");
            var req          = WabiSabiFactory.CreateOutputRegistrationRequest(round, sha256Bounty);

            await using ArenaRequestHandler handler = new(cfg, new Prison(), arena, new MockRpcClient());
            var ex = await Assert.ThrowsAsync <WabiSabiProtocolException>(async() => await handler.RegisterOutputAsync(req));

            // The following assertion requires standardness to be checked before allowed script types
            Assert.Equal(WabiSabiProtocolErrorCode.NonStandardOutput, ex.ErrorCode);

            await arena.StopAsync(CancellationToken.None);
        }