diff --git a/clightning/clightning_wallet.go b/clightning/clightning_wallet.go index bbdb8ad1..af9347c8 100644 --- a/clightning/clightning_wallet.go +++ b/clightning/clightning_wallet.go @@ -13,10 +13,10 @@ import ( "github.com/elementsproject/peerswap/version" ) -func (cl *ClightningClient) CreateOpeningTransaction(swapParams *swap.OpeningParams) (unpreparedTxHex string, fee uint64, vout uint32, err error) { +func (cl *ClightningClient) CreateOpeningTransaction(swapParams *swap.OpeningParams) (unpreparedTxHex, address string, fee uint64, vout uint32, err error) { addr, err := cl.bitcoinChain.CreateOpeningAddress(swapParams, onchain.BitcoinCsv) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } outputs := []*glightning.Outputs{ { @@ -26,7 +26,7 @@ func (cl *ClightningClient) CreateOpeningTransaction(swapParams *swap.OpeningPar } prepRes, err := cl.glightning.PrepareTx(outputs, &glightning.FeeRate{Directive: glightning.Urgent}, nil) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } // Backwards compatibility layer. Since `v23.05`, `preparetx` returns a @@ -34,27 +34,27 @@ func (cl *ClightningClient) CreateOpeningTransaction(swapParams *swap.OpeningPar // conversion of the psbt (from v2 to v0). isV2, err := version.CompareVersionStrings(cl.Version(), "v23.05") if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } if isV2 { res, err := cl.glightning.SetPSBTVersion(prepRes.Psbt, 0) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } prepRes.Psbt = res.Psbt } fee, err = cl.bitcoinChain.GetFeeSatsFromTx(prepRes.Psbt, prepRes.UnsignedTx) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } _, vout, err = cl.bitcoinChain.GetVoutAndVerify(prepRes.UnsignedTx, swapParams) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } cl.hexToIdMap[prepRes.UnsignedTx] = prepRes.TxId - return prepRes.UnsignedTx, fee, vout, nil + return prepRes.UnsignedTx, addr, fee, vout, nil } func (cl *ClightningClient) BroadcastOpeningTx(unpreparedTxHex string) (txId, txHex string, error error) { @@ -71,30 +71,30 @@ func (cl *ClightningClient) BroadcastOpeningTx(unpreparedTxHex string) (txId, tx return sendRes.TxId, sendRes.SignedTx, nil } -func (cl *ClightningClient) CreatePreimageSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (txId, txHex string, err error) { +func (cl *ClightningClient) CreatePreimageSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (txId, txHex, address string, err error) { _, vout, err := cl.bitcoinChain.GetVoutAndVerify(claimParams.OpeningTxHex, swapParams) if err != nil { - return "", "", err + return "", "", "", err } newAddr, err := cl.glightning.NewAddr() if err != nil { - return "", "", err + return "", "", "", err } tx, sigHash, redeemScript, err := cl.bitcoinChain.PrepareSpendingTransaction(swapParams, claimParams, newAddr, vout, 0, 0) if err != nil { - return "", "", err + return "", "", "", err } sigBytes, err := claimParams.Signer.Sign(sigHash) if err != nil { - return "", "", err + return "", "", "", err } preimage, err := lightning.MakePreimageFromStr(claimParams.Preimage) if err != nil { - return "", "", err + return "", "", "", err } tx.TxIn[0].Witness = onchain.GetPreimageWitness(sigBytes.Serialize(), preimage[:], redeemScript) @@ -103,37 +103,37 @@ func (cl *ClightningClient) CreatePreimageSpendingTransaction(swapParams *swap.O err = tx.Serialize(bytesBuffer) if err != nil { - return "", "", err + return "", "", "", err } txHex = hex.EncodeToString(bytesBuffer.Bytes()) txId, err = cl.gbitcoin.SendRawTx(txHex) if err != nil { - return "", "", err + return "", "", "", err } - return txId, txHex, nil + return txId, txHex, newAddr, nil } -func (cl *ClightningClient) CreateCsvSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (txId, txHex string, error error) { +func (cl *ClightningClient) CreateCsvSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (txId, txHex, address string, error error) { newAddr, err := cl.glightning.NewAddr() if err != nil { - return "", "", err + return "", "", "", err } _, vout, err := cl.bitcoinChain.GetVoutAndVerify(claimParams.OpeningTxHex, swapParams) if err != nil { - return "", "", err + return "", "", "", err } tx, sigHash, redeemScript, err := cl.bitcoinChain.PrepareSpendingTransaction(swapParams, claimParams, newAddr, vout, onchain.BitcoinCsv, 0) if err != nil { - return "", "", err + return "", "", "", err } sigBytes, err := claimParams.Signer.Sign(sigHash) if err != nil { - return "", "", err + return "", "", "", err } tx.TxIn[0].Witness = onchain.GetCsvWitness(sigBytes.Serialize(), redeemScript) @@ -142,43 +142,43 @@ func (cl *ClightningClient) CreateCsvSpendingTransaction(swapParams *swap.Openin err = tx.Serialize(bytesBuffer) if err != nil { - return "", "", err + return "", "", "", err } txHex = hex.EncodeToString(bytesBuffer.Bytes()) txId, err = cl.gbitcoin.SendRawTx(txHex) if err != nil { - return "", "", err + return "", "", "", err } - return txId, txHex, nil + return txId, txHex, address, nil } -func (cl *ClightningClient) CreateCoopSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams, takerSigner swap.Signer) (txId, txHex string, error error) { +func (cl *ClightningClient) CreateCoopSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams, takerSigner swap.Signer) (txId, txHex, address string, error error) { refundAddr, err := cl.NewAddress() if err != nil { - return "", "", err + return "", "", "", err } refundFee, err := cl.GetRefundFee() if err != nil { - return "", "", err + return "", "", "", err } _, vout, err := cl.bitcoinChain.GetVoutAndVerify(claimParams.OpeningTxHex, swapParams) if err != nil { - return "", "", err + return "", "", "", err } spendingTx, sigHashBytes, redeemScript, err := cl.bitcoinChain.PrepareSpendingTransaction(swapParams, claimParams, refundAddr, vout, 0, refundFee) if err != nil { - return "", "", err + return "", "", "", err } takerSig, err := takerSigner.Sign(sigHashBytes[:]) if err != nil { - return "", "", err + return "", "", "", err } makerSig, err := claimParams.Signer.Sign(sigHashBytes[:]) if err != nil { - return "", "", err + return "", "", "", err } spendingTx.TxIn[0].Witness = onchain.GetCooperativeWitness(takerSig.Serialize(), makerSig.Serialize(), redeemScript) @@ -187,23 +187,22 @@ func (cl *ClightningClient) CreateCoopSpendingTransaction(swapParams *swap.Openi err = spendingTx.Serialize(bytesBuffer) if err != nil { - return "", "", err + return "", "", "", err } txHex = hex.EncodeToString(bytesBuffer.Bytes()) txId, err = cl.gbitcoin.SendRawTx(txHex) if err != nil { - return "", "", err + return "", "", "", err } - return spendingTx.TxHash().String(), txHex, nil + return spendingTx.TxHash().String(), txHex, address, nil } -func (cl *ClightningClient) LabelTransaction(txId, label string) error { +func (cl *ClightningClient) SetLabel(txID, address, label string) error { // todo implement // This function assigns an identifiable label to the target transaction based on the txid. // Currently no such functionality is available, so it has not been implemented. - // Supported by lnd only. return nil } diff --git a/cmd/peerswap-plugin/main.go b/cmd/peerswap-plugin/main.go index dde274ce..470d50bf 100644 --- a/cmd/peerswap-plugin/main.go +++ b/cmd/peerswap-plugin/main.go @@ -182,6 +182,7 @@ func run(ctx context.Context, lightningPlugin *clightning.ClightningClient) erro config.Liquid.RpcUser, config.Liquid.RpcPassword, config.Liquid.RpcHost, + config.Liquid.RpcPasswordFile, config.Liquid.RpcPort, ) if err != nil { @@ -436,8 +437,9 @@ func getBitcoinClient(li *glightning.Lightning, pluginConfig *clightning.Config) rpcPassword := pluginConfig.Bitcoin.RpcPassword rpcHost := pluginConfig.Bitcoin.RpcHost rpcPort := pluginConfig.Bitcoin.RpcPort + ppcCookie := pluginConfig.Bitcoin.RpcPasswordFile - bitcoin := gbitcoin.NewBitcoin(rpcUser, rpcPassword) + bitcoin := gbitcoin.NewBitcoin(rpcUser, rpcPassword, ppcCookie) bitcoin.SetTimeout(10) err := bitcoin.StartUp(rpcHost, "", uint(rpcPort)) if err != nil { diff --git a/cmd/peerswaplnd/peerswapd/main.go b/cmd/peerswaplnd/peerswapd/main.go index c5650410..4c822614 100644 --- a/cmd/peerswaplnd/peerswapd/main.go +++ b/cmd/peerswaplnd/peerswapd/main.go @@ -205,6 +205,7 @@ func run() error { liquidConfig.RpcUser, liquidConfig.RpcPassword, liquidConfig.RpcHost, + liquidConfig.RpcPasswordFile, liquidConfig.RpcPort, ) if err != nil { @@ -441,7 +442,7 @@ func getBitcoinChain(ctx context.Context, li lnrpc.LightningClient) (*chaincfg.P } func getBitcoinClient(cfg *peerswaplnd.OnchainConfig) (*gbitcoin.Bitcoin, error) { - bitcoin := gbitcoin.NewBitcoin(cfg.RpcUser, cfg.RpcPassword) + bitcoin := gbitcoin.NewBitcoin(cfg.RpcUser, cfg.RpcPassword, cfg.RpcCookieFilePath) err := bitcoin.StartUp(cfg.RpcHost, "", cfg.RpcPort) if err != nil { return nil, err diff --git a/elements/client.go b/elements/client.go index 503837cf..635d921b 100644 --- a/elements/client.go +++ b/elements/client.go @@ -11,8 +11,8 @@ import ( type ElementsClientBuilder struct { } -func NewClient(rpcUser, rpcPassword, rpcHost string, rpcPort uint) (*gelements.Elements, error) { - c := gelements.NewElements(rpcUser, rpcPassword) +func NewClient(rpcUser, rpcPassword, rpcHost, RpcPasswordFile string, rpcPort uint) (*gelements.Elements, error) { + c := gelements.NewElements(rpcUser, rpcPassword, RpcPasswordFile) var backoff int64 = 1 for { diff --git a/go.mod b/go.mod index 3803ff86..bb096b64 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/btcsuite/btcd/btcutil v1.1.2 github.com/btcsuite/btcd/btcutil/psbt v1.1.5 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 - github.com/elementsproject/glightning v0.0.0-20231126051537-e32b4dae6cbb + github.com/elementsproject/glightning v0.0.0-20240224063423-55240d61b52a github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 github.com/jessevdk/go-flags v1.5.0 @@ -124,7 +124,7 @@ require ( golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/net v0.0.0-20221004154528-8021a29435af // indirect golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 // indirect - golang.org/x/sys v0.0.0-20221010160319-abe0a0adba9c // indirect + golang.org/x/sys v0.0.0-20221010160319-abe0a0adba9c golang.org/x/term v0.0.0-20220919170432-7a66f970e087 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect diff --git a/go.sum b/go.sum index 334d0b38..3cea8da6 100644 --- a/go.sum +++ b/go.sum @@ -186,12 +186,8 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dvyukov/go-fuzz v0.0.0-20220726122315-1d375ef9f9f6 h1:sE4tvxWw01v7K3MAHwKF2UF3xQbgy23PRURntuV1CkU= github.com/dvyukov/go-fuzz v0.0.0-20220726122315-1d375ef9f9f6/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= -github.com/elementsproject/glightning v0.0.0-20230508201707-c2410b204731 h1:OAY0lNrZiCO1lwlaGiVH4htwrih1AAxxpuWRA9qQYwI= -github.com/elementsproject/glightning v0.0.0-20230508201707-c2410b204731/go.mod h1:YAdIeSyx8VEhDCtEaGOJLmWNpPaQ3x4vYSAj9Vrppdo= -github.com/elementsproject/glightning v0.0.0-20230525134205-ef34d849f564 h1:orSb6yU9D1Ow9epbRZJVAfGF6vC1HxaPqg9zLWga6Hw= -github.com/elementsproject/glightning v0.0.0-20230525134205-ef34d849f564/go.mod h1:YAdIeSyx8VEhDCtEaGOJLmWNpPaQ3x4vYSAj9Vrppdo= -github.com/elementsproject/glightning v0.0.0-20231126051537-e32b4dae6cbb h1:ob08+u2vJvk9uFoPhwFe/DWom1pgUFLGh+VXUbfarWs= -github.com/elementsproject/glightning v0.0.0-20231126051537-e32b4dae6cbb/go.mod h1:YAdIeSyx8VEhDCtEaGOJLmWNpPaQ3x4vYSAj9Vrppdo= +github.com/elementsproject/glightning v0.0.0-20240224063423-55240d61b52a h1:xnVQmVqGmSs3m8zPQF4iYEYiUAmJx8MlT9vJ3lAaOjc= +github.com/elementsproject/glightning v0.0.0-20240224063423-55240d61b52a/go.mod h1:YAdIeSyx8VEhDCtEaGOJLmWNpPaQ3x4vYSAj9Vrppdo= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -669,6 +665,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusukeshimizu/glightning v0.0.0-20240214001938-06d9e0562297 h1:j/R71Kv5Cvgds6OrqTPKLx2/sBL3WTt1xyMETp5qHf8= +github.com/yusukeshimizu/glightning v0.0.0-20240214001938-06d9e0562297/go.mod h1:YAdIeSyx8VEhDCtEaGOJLmWNpPaQ3x4vYSAj9Vrppdo= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5-0.20200615073812-232d8fc87f50/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= diff --git a/lnd/lnd_test.go b/lnd/lnd_test.go index d8ac0398..671cf6be 100644 --- a/lnd/lnd_test.go +++ b/lnd/lnd_test.go @@ -10,6 +10,14 @@ import ( "encoding/base64" "encoding/hex" "fmt" + "io/ioutil" + "log" + "math/rand" + "path/filepath" + "strconv" + "testing" + "time" + "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/btcutil/psbt" @@ -29,13 +37,6 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials" "gopkg.in/macaroon.v2" - "io/ioutil" - "log" - "math/rand" - "path/filepath" - "strconv" - "testing" - "time" ) type Testthing struct { diff --git a/lnd/lnd_wallet.go b/lnd/lnd_wallet.go index adc36684..9f1bdec3 100644 --- a/lnd/lnd_wallet.go +++ b/lnd/lnd_wallet.go @@ -16,10 +16,10 @@ import ( "github.com/lightningnetwork/lnd/lnrpc/walletrpc" ) -func (l *Client) CreateOpeningTransaction(swapParams *swap.OpeningParams) (unpreparedTxHex string, fee uint64, vout uint32, err error) { +func (l *Client) CreateOpeningTransaction(swapParams *swap.OpeningParams) (unpreparedTxHex, address string, fee uint64, vout uint32, err error) { addr, err := l.bitcoinOnChain.CreateOpeningAddress(swapParams, onchain.BitcoinCsv) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } fundPsbtTemplate := &walletrpc.TxTemplate{ @@ -32,37 +32,37 @@ func (l *Client) CreateOpeningTransaction(swapParams *swap.OpeningParams) (unpre Fees: &walletrpc.FundPsbtRequest_TargetConf{TargetConf: 3}, }) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } unsignedPacket, err := psbt.NewFromRawBytes(bytes.NewReader(fundRes.FundedPsbt), false) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } bytesBuffer := new(bytes.Buffer) err = unsignedPacket.Serialize(bytesBuffer) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } finalizeRes, err := l.walletClient.FinalizePsbt(l.ctx, &walletrpc.FinalizePsbtRequest{ FundedPsbt: bytesBuffer.Bytes(), }) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } psbtString := base64.StdEncoding.EncodeToString(finalizeRes.SignedPsbt) rawTxHex := hex.EncodeToString(finalizeRes.RawFinalTx) fee, err = l.bitcoinOnChain.GetFeeSatsFromTx(psbtString, rawTxHex) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } _, vout, err = l.bitcoinOnChain.GetVoutAndVerify(rawTxHex, swapParams) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } - return rawTxHex, fee, vout, nil + return rawTxHex, address, fee, vout, nil } func (l *Client) BroadcastOpeningTx(unpreparedTxHex string) (txId, txHex string, error error) { @@ -83,29 +83,29 @@ func (l *Client) BroadcastOpeningTx(unpreparedTxHex string) (txId, txHex string, return openingTx.TxHash().String(), unpreparedTxHex, nil } -func (l *Client) CreatePreimageSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (string, string, error) { +func (l *Client) CreatePreimageSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (string, string, string, error) { _, vout, err := l.bitcoinOnChain.GetVoutAndVerify(claimParams.OpeningTxHex, swapParams) if err != nil { - return "", "", err + return "", "", "", err } newAddr, err := l.NewAddress() if err != nil { - return "", "", err + return "", "", "", err } tx, sigHash, redeemScript, err := l.bitcoinOnChain.PrepareSpendingTransaction(swapParams, claimParams, newAddr, vout, 0, 0) if err != nil { - return "", "", err + return "", "", "", err } sigBytes, err := claimParams.Signer.Sign(sigHash) if err != nil { - return "", "", err + return "", "", "", err } preimage, err := lightning.MakePreimageFromStr(claimParams.Preimage) if err != nil { - return "", "", err + return "", "", "", err } tx.TxIn[0].Witness = onchain.GetPreimageWitness(sigBytes.Serialize(), preimage[:], redeemScript) @@ -114,35 +114,35 @@ func (l *Client) CreatePreimageSpendingTransaction(swapParams *swap.OpeningParam err = tx.Serialize(bytesBuffer) if err != nil { - return "", "", err + return "", "", "", err } txHex := hex.EncodeToString(bytesBuffer.Bytes()) _, err = l.walletClient.PublishTransaction(l.ctx, &walletrpc.Transaction{TxHex: bytesBuffer.Bytes()}) if err != nil { - return "", "", err + return "", "", "", err } - return tx.TxHash().String(), txHex, nil + return tx.TxHash().String(), txHex, newAddr, nil } -func (l *Client) CreateCsvSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (string, string, error) { +func (l *Client) CreateCsvSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (string, string, string, error) { newAddr, err := l.NewAddress() if err != nil { - return "", "", err + return "", "", "", err } _, vout, err := l.bitcoinOnChain.GetVoutAndVerify(claimParams.OpeningTxHex, swapParams) if err != nil { - return "", "", err + return "", "", "", err } tx, sigHash, redeemScript, err := l.bitcoinOnChain.PrepareSpendingTransaction(swapParams, claimParams, newAddr, vout, onchain.BitcoinCsv, 0) if err != nil { - return "", "", err + return "", "", "", err } sigBytes, err := claimParams.Signer.Sign(sigHash) if err != nil { - return "", "", err + return "", "", "", err } tx.TxIn[0].Witness = onchain.GetCsvWitness(sigBytes.Serialize(), redeemScript) @@ -151,43 +151,43 @@ func (l *Client) CreateCsvSpendingTransaction(swapParams *swap.OpeningParams, cl err = tx.Serialize(bytesBuffer) if err != nil { - return "", "", err + return "", "", "", err } txHex := hex.EncodeToString(bytesBuffer.Bytes()) _, err = l.walletClient.PublishTransaction(l.ctx, &walletrpc.Transaction{TxHex: bytesBuffer.Bytes()}) if err != nil { - return "", "", err + return "", "", "", err } - return tx.TxHash().String(), txHex, nil + return tx.TxHash().String(), txHex, newAddr, nil } -func (l *Client) CreateCoopSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams, takerSigner swap.Signer) (txId, txHex string, error error) { +func (l *Client) CreateCoopSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams, takerSigner swap.Signer) (txId, txHex, address string, error error) { refundAddr, err := l.NewAddress() if err != nil { - return "", "", err + return "", "", "", err } refundFee, err := l.GetRefundFee() if err != nil { - return "", "", err + return "", "", "", err } _, vout, err := l.bitcoinOnChain.GetVoutAndVerify(claimParams.OpeningTxHex, swapParams) if err != nil { - return "", "", err + return "", "", "", err } spendingTx, sigHashBytes, redeemScript, err := l.bitcoinOnChain.PrepareSpendingTransaction(swapParams, claimParams, refundAddr, vout, 0, refundFee) if err != nil { - return "", "", err + return "", "", "", err } takerSig, err := takerSigner.Sign(sigHashBytes[:]) if err != nil { - return "", "", err + return "", "", "", err } makerSig, err := claimParams.Signer.Sign(sigHashBytes[:]) if err != nil { - return "", "", err + return "", "", "", err } spendingTx.TxIn[0].Witness = onchain.GetCooperativeWitness(takerSig.Serialize(), makerSig.Serialize(), redeemScript) @@ -196,22 +196,22 @@ func (l *Client) CreateCoopSpendingTransaction(swapParams *swap.OpeningParams, c err = spendingTx.Serialize(bytesBuffer) if err != nil { - return "", "", err + return "", "", "", err } txHex = hex.EncodeToString(bytesBuffer.Bytes()) _, err = l.walletClient.PublishTransaction(l.ctx, &walletrpc.Transaction{TxHex: bytesBuffer.Bytes()}) if err != nil { - return "", "", err + return "", "", "", err } - return spendingTx.TxHash().String(), txHex, nil + return spendingTx.TxHash().String(), txHex, refundAddr, nil } -// LabelTransaction labels a transaction with a given label. +// SetLabel labels a transaction with a given label. // This makes it easier to audit the transactions from faraday. // This is performed by LND's LabelTransaction RPC. -func (l *Client) LabelTransaction(txID, label string) error { +func (l *Client) SetLabel(txID, address, label string) error { txIDHash, err := chainhash.NewHashFromStr(txID) if err != nil { return err diff --git a/onchain/bitcoin.go b/onchain/bitcoin.go index 02ef14c7..d6fc0101 100644 --- a/onchain/bitcoin.go +++ b/onchain/bitcoin.go @@ -254,14 +254,6 @@ func (b *BitcoinOnChain) PrepareSpendingTransaction(swapParams *swap.OpeningPara return spendingTx, sigHash, redeemScript, nil } -func (b *BitcoinOnChain) LabelTransaction(txID, label string) error { - // TODO: implement - // This function assigns an identifiable label to the target transaction based on the txid. - // Currently no such functionality is available, so it has not been implemented. - // Supported by lnd only. - return nil -} - func (b *BitcoinOnChain) CreateOpeningAddress(params *swap.OpeningParams, csv uint32) (string, error) { redeemScript, err := ParamsToTxScript(params, csv) if err != nil { diff --git a/onchain/liquid.go b/onchain/liquid.go index 27e26a61..8dbd457d 100644 --- a/onchain/liquid.go +++ b/onchain/liquid.go @@ -57,10 +57,10 @@ func (l *LiquidOnChain) GetOnchainBalance() (uint64, error) { return l.liquidWallet.GetBalance() } -func (l *LiquidOnChain) CreateOpeningTransaction(swapParams *swap.OpeningParams) (unpreparedTxHex string, fee uint64, vout uint32, err error) { +func (l *LiquidOnChain) CreateOpeningTransaction(swapParams *swap.OpeningParams) (unpreparedTxHex, newAddress string, fee uint64, vout uint32, err error) { redeemScript, err := ParamsToTxScript(swapParams, LiquidCsv) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } scriptPubKey := []byte{0x00, 0x20} witnessProgram := sha256.Sum256(redeemScript) @@ -71,12 +71,12 @@ func (l *LiquidOnChain) CreateOpeningTransaction(swapParams *swap.OpeningParams) blindedScriptAddr, err := redeemPayment.ConfidentialWitnessScriptHash() if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } swapParams.OpeningAddress = blindedScriptAddr outputscript, err := address.ToOutputScript(blindedScriptAddr) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } output := transaction.NewTxOutput(l.asset, sats, outputscript) @@ -87,15 +87,15 @@ func (l *LiquidOnChain) CreateOpeningTransaction(swapParams *swap.OpeningParams) unpreparedTxHex, fee, err = l.liquidWallet.CreateFundedTransaction(tx) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } vout, err = l.VoutFromTxHex(unpreparedTxHex, redeemScript) if err != nil { - return "", 0, 0, err + return "", "", 0, 0, err } - return unpreparedTxHex, fee, vout, nil + return unpreparedTxHex, blindedScriptAddr, fee, vout, nil } func (l *LiquidOnChain) BroadcastOpeningTx(unpreparedTxHex string) (string, string, error) { @@ -111,121 +111,124 @@ func (l *LiquidOnChain) BroadcastOpeningTx(unpreparedTxHex string) (string, stri return txId, txHex, nil } -func (l *LiquidOnChain) CreatePreimageSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (string, string, error) { +func (l *LiquidOnChain) CreatePreimageSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (string, string, string, error) { newAddr, err := l.liquidWallet.GetAddress() if err != nil { - return "", "", err + return "", "", "", err } l.AddBlindingRandomFactors(claimParams) tx, sigBytes, redeemScript, err := l.prepareSpendingTransaction(swapParams, claimParams, newAddr, 0, 0) if err != nil { - return "", "", err + return "", "", "", err } txHex, err := tx.ToHex() if err != nil { - return "", "", err + return "", "", "", err } preimage, err := lightning.MakePreimageFromStr(claimParams.Preimage) if err != nil { - return "", "", err + return "", "", "", err } tx.Inputs[0].Witness = GetPreimageWitness(sigBytes, preimage[:], redeemScript) txHex, err = tx.ToHex() if err != nil { - return "", "", err + return "", "", "", err } - //txId, err = l.elements.SendRawTx(txHex) - //if err != nil { - // return "", "", err - //} txHex, err = tx.ToHex() if err != nil { - return "", "", err + return "", "", "", err } txId, err := l.elements.SendRawTx(txHex) if err != nil { - return "", "", err + return "", "", "", err } - return txId, txHex, nil + return txId, txHex, newAddr, nil } -func (l *LiquidOnChain) CreateCsvSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (txId, txHex string, error error) { +func (l *LiquidOnChain) CreateCsvSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (txId, txHex, address string, error error) { newAddr, err := l.liquidWallet.GetAddress() if err != nil { - return "", "", err + return "", "", "", err } l.AddBlindingRandomFactors(claimParams) tx, sigBytes, redeemScript, err := l.prepareSpendingTransaction(swapParams, claimParams, newAddr, LiquidCsv, 0) if err != nil { - return "", "", err + return "", "", "", err } tx.Inputs[0].Witness = GetCsvWitness(sigBytes, redeemScript) txHex, err = tx.ToHex() if err != nil { - return "", "", err + return "", "", "", err } txId, err = l.elements.SendRawTx(txHex) if err != nil { - return "", "", err + return "", "", "", err } - return txId, txHex, nil + return txId, txHex, newAddr, nil } -func (l *LiquidOnChain) CreateCoopSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams, takerSigner swap.Signer) (txId, txHex string, error error) { +func (l *LiquidOnChain) CreateCoopSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams, takerSigner swap.Signer) (txId, txHex, address string, error error) { refundAddr, err := l.NewAddress() if err != nil { - return "", "", err + return "", "", "", err } refundFee, err := l.getFee(l.getCoopClaimTxSize()) if err != nil { - return "", "", err + return "", "", "", err } redeemScript, err := ParamsToTxScript(swapParams, LiquidCsv) if err != nil { - return "", "", err + return "", "", "", err } err = l.AddBlindingRandomFactors(claimParams) if err != nil { - return "", "", err + return "", "", "", err } spendingTx, sigHash, err := l.createSpendingTransaction(claimParams.OpeningTxHex, swapParams.Amount, 0, l.asset, redeemScript, refundAddr, refundFee, swapParams.BlindingKey, claimParams.EphemeralKey, claimParams.OutputAssetBlindingFactor, claimParams.BlindingSeed) if err != nil { - return "", "", err + return "", "", "", err } takerSig, err := takerSigner.Sign(sigHash[:]) if err != nil { - return "", "", err + return "", "", "", err } makerSig, err := claimParams.Signer.Sign(sigHash[:]) if err != nil { - return "", "", err + return "", "", "", err } spendingTx.Inputs[0].Witness = GetCooperativeWitness(takerSig.Serialize(), makerSig.Serialize(), redeemScript) txHex, err = spendingTx.ToHex() if err != nil { - return "", "", err + return "", "", "", err } txId, err = l.elements.SendRawTx(txHex) if err != nil { - return "", "", err + return "", "", "", err } - return txId, txHex, nil + return txId, txHex, refundAddr, nil } -func (l *LiquidOnChain) LabelTransaction(txID, label string) error { - // TODO: implement - // This function assigns an identifiable label to the target transaction based on the txid. - // Currently no such functionality is available, so it has not been implemented. - // Supported by lnd only. - return nil +// SetLabelRequest is a request to label a transaction. +// https://developer.bitcoin.org/reference/rpc/setlabel.html +type SetLabelRequest struct { + Address string `json:"address"` + Label string `json:"label"` +} + +func (l *LiquidOnChain) Name() string { + return "LabelTransactionRequest" +} + +func (l *LiquidOnChain) SetLabel(txID, address, label string) error { + return l.elements.SetLabel(address, label) } func (l *LiquidOnChain) AddBlindingRandomFactors(claimParams *swap.ClaimParams) (err error) { @@ -444,7 +447,6 @@ func (l *LiquidOnChain) ValidateTx(openingParams *swap.OpeningParams, txHex stri // unblind output ubRes, err := confidential.UnblindOutputWithKey(openingTx.Outputs[vout], openingParams.BlindingKey.Serialize()) if err != nil { - return false, err } diff --git a/swap/actions.go b/swap/actions.go index 1744d174..bf458e5b 100644 --- a/swap/actions.go +++ b/swap/actions.go @@ -189,13 +189,13 @@ func (s *ClaimSwapTransactionWithPreimageAction) Execute(services *SwapServices, } if swap.ClaimTxId == "" { - txId, _, err := wallet.CreatePreimageSpendingTransaction(swap.GetOpeningParams(), swap.GetClaimParams()) + txId, _, address, err := wallet.CreatePreimageSpendingTransaction(swap.GetOpeningParams(), swap.GetClaimParams()) if err != nil { log.Infof("Error claiming tx with preimage %v", err) return Event_OnRetry } swap.ClaimTxId = txId - err = wallet.LabelTransaction(txId, labels.ClaimByInvoice(swap.GetId().Short())) + err = wallet.SetLabel(txId, address, labels.ClaimByInvoice(swap.GetId().Short())) if err != nil { log.Infof("Error labeling transaction. txid: %s, label: %s, error: %v", txId, labels.ClaimByInvoice(swap.GetId().Short()), err) @@ -239,7 +239,7 @@ func (c *CreateAndBroadcastOpeningTransaction) Execute(services *SwapServices, s } // Create the opening transaction - txHex, _, vout, err := wallet.CreateOpeningTransaction(&OpeningParams{ + txHex, address, _, vout, err := wallet.CreateOpeningTransaction(&OpeningParams{ TakerPubkey: swap.GetTakerPubkey(), MakerPubkey: swap.GetMakerPubkey(), ClaimPaymentHash: preimage.Hash().String(), @@ -255,7 +255,7 @@ func (c *CreateAndBroadcastOpeningTransaction) Execute(services *SwapServices, s // todo: idempotent states return swap.HandleError(err) } - err = wallet.LabelTransaction(txId, labels.Opening(swap.GetId().Short())) + err = wallet.SetLabel(txId, address, labels.Opening(swap.GetId().Short())) if err != nil { log.Infof("Error labeling transaction. txid: %s, label: %s, error: %v", txId, labels.Opening(swap.GetId().Short()), err) @@ -442,13 +442,13 @@ func (c *ClaimSwapTransactionWithCsv) Execute(services *SwapServices, swap *Swap } if swap.ClaimTxId == "" { - txId, _, err := wallet.CreateCsvSpendingTransaction(swap.GetOpeningParams(), swap.GetClaimParams()) + txId, _, address, err := wallet.CreateCsvSpendingTransaction(swap.GetOpeningParams(), swap.GetClaimParams()) if err != nil { swap.HandleError(err) return Event_OnRetry } swap.ClaimTxId = txId - err = wallet.LabelTransaction(txId, labels.ClaimByCsv(swap.GetId().Short())) + err = wallet.SetLabel(txId, address, labels.ClaimByCsv(swap.GetId().Short())) if err != nil { log.Infof("Error labeling transaction. txid: %s, label: %s, error: %v", txId, labels.ClaimByCsv(swap.GetId().Short()), err) @@ -474,12 +474,12 @@ func (c *ClaimSwapTransactionCoop) Execute(services *SwapServices, swap *SwapDat takerKey, _ := btcec.PrivKeyFromBytes(takerKeyBytes) if swap.ClaimTxId == "" { - txId, _, err := wallet.CreateCoopSpendingTransaction(swap.GetOpeningParams(), swap.GetClaimParams(), &Secp256k1Signer{key: takerKey}) + txId, _, address, err := wallet.CreateCoopSpendingTransaction(swap.GetOpeningParams(), swap.GetClaimParams(), &Secp256k1Signer{key: takerKey}) if err != nil { return swap.HandleError(err) } swap.ClaimTxId = txId - err = wallet.LabelTransaction(txId, labels.ClaimByCoop(swap.GetId().Short())) + err = wallet.SetLabel(txId, address, labels.ClaimByCoop(swap.GetId().Short())) if err != nil { log.Infof("Error labeling transaction. txid: %s, label: %s, error: %v", txId, labels.ClaimByCoop(swap.GetId().Short()), err) diff --git a/swap/services.go b/swap/services.go index 8bf11e53..a16b3de9 100644 --- a/swap/services.go +++ b/swap/services.go @@ -69,12 +69,12 @@ type Validator interface { } type Wallet interface { - CreateOpeningTransaction(swapParams *OpeningParams) (unpreparedTxHex string, fee uint64, vout uint32, err error) + CreateOpeningTransaction(swapParams *OpeningParams) (unpreparedTxHex, address string, fee uint64, vout uint32, err error) BroadcastOpeningTx(unpreparedTxHex string) (txId, txHex string, error error) - CreatePreimageSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams) (string, string, error) - CreateCsvSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams) (txId, txHex string, error error) - CreateCoopSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams, takerSigner Signer) (txId, txHex string, error error) - LabelTransaction(txId, label string) error + CreatePreimageSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams) (txId, txHex, address string, err error) + CreateCsvSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams) (txId, txHex, address string, error error) + CreateCoopSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams, takerSigner Signer) (txId, txHex, address string, error error) + SetLabel(txID, address, label string) error GetOutputScript(params *OpeningParams) ([]byte, error) NewAddress() (string, error) GetRefundFee() (uint64, error) diff --git a/swap/swap_out_sender_test.go b/swap/swap_out_sender_test.go index 57ca0a70..746e637d 100644 --- a/swap/swap_out_sender_test.go +++ b/swap/swap_out_sender_test.go @@ -442,23 +442,23 @@ func (d *dummyChain) TxIdFromHex(txHex string) (string, error) { return getRandom32ByteHexString(), nil } -func (d *dummyChain) CreatePreimageSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams) (string, string, error) { - return getRandom32ByteHexString(), "txhex", nil +func (d *dummyChain) CreatePreimageSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams) (string, string, string, error) { + return getRandom32ByteHexString(), "txhex", "addr", nil } -func (d *dummyChain) CreateCsvSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams) (txId, txHex string, error error) { - return getRandom32ByteHexString(), "txhex", nil +func (d *dummyChain) CreateCsvSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams) (txId, txHex, address string, error error) { + return getRandom32ByteHexString(), "txhex", "addr", nil } -func (d *dummyChain) CreateCoopSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams, takerSigner Signer) (txId, txHex string, error error) { - return getRandom32ByteHexString(), "txhex", nil +func (d *dummyChain) CreateCoopSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams, takerSigner Signer) (txId, txHex, address string, error error) { + return getRandom32ByteHexString(), "txhex", "addr", nil } func (d *dummyChain) AddWaitForConfirmationTx(swapId, txId string, vout, startingHeight uint32, wantscript []byte) { } -func (d *dummyChain) LabelTransaction(txId, label string) error { +func (d *dummyChain) SetLabel(txID, address, label string) error { return nil } @@ -478,8 +478,8 @@ func (d *dummyChain) GetFlatSwapOutFee() (uint64, error) { return 100, nil } -func (d *dummyChain) CreateOpeningTransaction(swapParams *OpeningParams) (unpreparedTxHex string, fee uint64, vout uint32, err error) { - return "txhex", 0, 0, nil +func (d *dummyChain) CreateOpeningTransaction(swapParams *OpeningParams) (unpreparedTxHex, address string, fee uint64, vout uint32, err error) { + return "txhex", "addr", 0, 0, nil } func (d *dummyChain) AddCsvCallback(f func(swapId string) error) { diff --git a/wallet/wallet_test.go b/wallet/wallet_test.go index ac333dbd..fd50c695 100644 --- a/wallet/wallet_test.go +++ b/wallet/wallet_test.go @@ -8,9 +8,10 @@ import ( "encoding/hex" "errors" "fmt" + "testing" + "github.com/elementsproject/glightning/gelements" "github.com/stretchr/testify/assert" - "testing" ) var (