Skip to content

Commit 15d1e8b

Browse files
committed
bitcoin: implement combinepsbt
1 parent 867d04c commit 15d1e8b

File tree

5 files changed

+173
-0
lines changed

5 files changed

+173
-0
lines changed

gen/bitcoin/bitcoind/v1alpha/bitcoin.pb.go

Lines changed: 95 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gen/bitcoin/bitcoind/v1alpha/bitcoindv1alphaconnect/bitcoin.connect.go

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proto/bitcoin/bitcoind/v1alpha/bitcoin.proto

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ service BitcoinService {
6969
rpc CreateMultisig(CreateMultisigRequest) returns (CreateMultisigResponse);
7070
// PSBT handling
7171
rpc AnalyzePsbt(AnalyzePsbtRequest) returns (AnalyzePsbtResponse);
72+
rpc CombinePsbt(CombinePsbtRequest) returns (CombinePsbtResponse);
7273
}
7374

7475
message GetBlockchainInfoRequest {}
@@ -981,3 +982,12 @@ message AnalyzePsbtResponse {
981982
string next = 5;
982983
string error = 6;
983984
}
985+
986+
message CombinePsbtRequest {
987+
repeated string psbts = 1; // Array of base64 encoded PSBTs
988+
}
989+
990+
message CombinePsbtResponse {
991+
string psbt = 1; // Combined base64 encoded PSBT
992+
}
993+

server/commands/bitcoind.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,7 @@ type BumpFee struct {
77
type AnalyzePsbt struct {
88
Psbt string `json:"psbt"`
99
}
10+
11+
type CombinePsbt struct {
12+
Psbts []string `json:"psbts"`
13+
}

server/server.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func init() {
3838
btcjson.MustRegisterCmd("importdescriptors", new(btcjson.ImportMultiCmd), btcjson.UFWalletOnly)
3939
btcjson.MustRegisterCmd("bumpfee", new(commands.BumpFee), btcjson.UFWalletOnly)
4040
btcjson.MustRegisterCmd("analyzepsbt", new(commands.AnalyzePsbt), btcjson.UFWalletOnly)
41+
btcjson.MustRegisterCmd("combinepsbt", new(commands.CombinePsbt), btcjson.UFWalletOnly)
4142
}
4243

4344
type Bitcoind struct {
@@ -1319,6 +1320,40 @@ func (b *Bitcoind) AnalyzePsbt(ctx context.Context, c *connect.Request[pb.Analyz
13191320
})
13201321
}
13211322

1323+
// CombinePsbt implements bitcoindv1alphaconnect.BitcoinServiceHandler.
1324+
func (b *Bitcoind) CombinePsbt(ctx context.Context, c *connect.Request[pb.CombinePsbtRequest]) (*connect.Response[pb.CombinePsbtResponse], error) {
1325+
if len(c.Msg.Psbts) == 0 {
1326+
return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("at least one PSBT is required"))
1327+
}
1328+
1329+
return withCancel(ctx,
1330+
func(ctx context.Context) (string, error) {
1331+
cmd, err := btcjson.NewCmd("combinepsbt", c.Msg.Psbts)
1332+
if err != nil {
1333+
return "", err
1334+
}
1335+
1336+
res, err := rpcclient.ReceiveFuture(b.rpc.SendCmd(ctx, cmd))
1337+
if err != nil {
1338+
return "", fmt.Errorf("send combinepsbt: %w", err)
1339+
}
1340+
zerolog.Ctx(ctx).Err(err).
1341+
Msgf("combinepsbt response: %s", string(res))
1342+
1343+
var psbt string
1344+
if err := json.Unmarshal(res, &psbt); err != nil {
1345+
return "", fmt.Errorf("unmarshal combinepsbt response: %w", err)
1346+
}
1347+
1348+
return psbt, nil
1349+
},
1350+
func(r string) *pb.CombinePsbtResponse {
1351+
return &pb.CombinePsbtResponse{
1352+
Psbt: r,
1353+
}
1354+
})
1355+
}
1356+
13221357

13231358
// CreateWallet implements bitcoindv1alphaconnect.BitcoinServiceHandler.
13241359
func (b *Bitcoind) CreateWallet(ctx context.Context, c *connect.Request[pb.CreateWalletRequest]) (*connect.Response[pb.CreateWalletResponse], error) {

0 commit comments

Comments
 (0)