Ejemplo n.º 1
0
        protected override async Task InvokeAsyncBase(InvocationContext context)
        {
            var name = context.ParseResult.CommandResult.GetArgumentValueOrDefault <string>("name")?.Trim();

            if (name is null)
            {
                throw new CommandOptionRequiredException("name");
            }

            var dlc = await GetDLC("name", name);

            if (dlc is null)
            {
                throw new CommandException("name", "This DLC does not exist");
            }

            var psbt = context.ParsePSBT("setuppsbt", Network);

            var builder = dlc.GetBuilder(Network);

            if (builder.State.IsInitiator)
            {
                context.AssertState("name", dlc, true, DLCNextStep.Setup, Network);
                var key = await Repository.CreatePrivateKey();

                try
                {
                    var offer = builder.FundOffer(key.PrivateKey, psbt);
                    offer.OffererContractId = dlc.Id;
                    dlc.FundKeyPath         = key.KeyPath;
                    dlc.BuilderState        = builder.ExportStateJObject();
                    dlc.Offer = JObject.FromObject(offer, JsonSerializer.Create(Repository.JsonSettings));
                    await Repository.SaveDLC(dlc);

                    context.WriteObject(offer, Repository.JsonSettings);
                }
                catch (InvalidOperationException err)
                {
                    throw new CommandException("fundpsbt", err.Message);
                }
            }
            else
            {
                context.AssertState("name", dlc, false, DLCNextStep.Setup, Network);
                var k = await Repository.CreatePrivateKey();

                var accept = builder.FundAccept(k.PrivateKey, psbt);
                accept.AcceptorContractId = dlc.Id;
                dlc.FundKeyPath           = k.KeyPath;
                dlc.BuilderState          = builder.ExportStateJObject();
                dlc.Accept = JObject.FromObject(accept, JsonSerializer.Create(Repository.JsonSettings));
                await Repository.SaveDLC(dlc);

                context.WriteObject(accept, Repository.JsonSettings);
            }
        }
Ejemplo n.º 2
0
        protected override async Task InvokeAsyncBase(InvocationContext context)
        {
            var name = context.ParseResult.CommandResult.GetArgumentValueOrDefault <string>("name")?.Trim();

            if (name is null)
            {
                throw new CommandOptionRequiredException("name");
            }
            var dlc = await GetDLC("name", name);

            if (dlc?.BuilderState is null ||
                dlc?.OracleInfo is null)
            {
                throw new CommandException("name", "This DLC does not exist");
            }
            var builder = new DLCTransactionBuilder(dlc.BuilderState.ToString(), Network);
            var psbt    = context.ParsePSBT("signedpsbt", Network);

            if (!builder.State.IsInitiator)
            {
                context.AssertState("name", dlc, false, DLCNextStep.Fund, Network);
                var fullySigned = builder.Finalize(psbt);
                dlc.BuilderState = builder.ExportStateJObject();
                await Repository.SaveDLC(dlc);

                context.WriteTransaction(fullySigned, builder.State.Funding?.FundCoin, Network);
            }
            else
            {
                context.AssertState("name", dlc, true, DLCNextStep.Fund, Network);
                var key = await Repository.GetKey(dlc.FundKeyPath !);

                try
                {
                    var sign = builder.Sign2(key, psbt);
                    dlc.Sign         = sign;
                    dlc.BuilderState = builder.ExportStateJObject();
                    await Repository.SaveDLC(dlc);

                    context.WriteObject(sign, Repository.JsonSettings);
                }
                catch (Exception ex)
                {
                    throw new CommandException("signedpsbt", $"Invalid PSBT. ({ex.Message})");
                }
            }
        }
Ejemplo n.º 3
0
        private async Task HandleAccept(InvocationContext context, Accept accept)
        {
            var dlc = await GetDLC(accept.TemporaryContractId);

            context.AssertState("signed", dlc, true, DLCNextStep.CheckSigs, Network);
            var builder = new DLCTransactionBuilder(dlc.BuilderState !.ToString(), Network);

            try
            {
                builder.Sign1(accept);
                dlc.BuilderState = builder.ExportStateJObject();
                dlc.Accept       = accept;
                await Repository.SaveDLC(dlc);

                context.WritePSBT(builder.GetFundingPSBT());
            }
            catch (Exception ex)
            {
                throw new CommandException("signed", $"Invalid signatures. ({ex.Message})");
            }
        }
Ejemplo n.º 4
0
        private async Task HandleSign(InvocationContext context, Sign sign)
        {
            var dlc = await GetDLC(sign.ContractId);

            context.AssertState("signed", dlc, false, DLCNextStep.CheckSigs, Network);
            var builder = new DLCTransactionBuilder(dlc.BuilderState !.ToString(), Network);

            try
            {
                builder.Finalize1(sign);
                dlc.Sign         = sign;
                dlc.BuilderState = builder.ExportStateJObject();
                await Repository.SaveDLC(dlc);

                context.WritePSBT(builder.GetFundingPSBT());
            }
            catch (Exception ex)
            {
                throw new CommandException("signed", $"Invalid signatures. ({ex.Message})");
            }
        }
Ejemplo n.º 5
0
        private async Task HandleAccept(InvocationContext context, string signedMessageBase64)
        {
            var accept = Parse <Accept>(signedMessageBase64);
            var dlc    = await GetDLC(accept.OffererContractId);

            context.AssertState("signed", dlc, true, DLCNextStep.CheckSigs, Network);
            var builder = new DLCTransactionBuilder(dlc.BuilderState !.ToString(), Network);

            try
            {
                builder.Sign1(accept);
                dlc.BuilderState = builder.ExportStateJObject();
                dlc.Accept       = JObject.FromObject(accept, JsonSerializer.Create(Repository.JsonSettings));
                await Repository.SaveDLC(dlc);

                context.WritePSBT(builder.GetFundingPSBT());
            }
            catch (Exception ex)
            {
                throw new CommandException("signed", $"Invalid signatures. ({ex.Message})");
            }
        }