diff --git a/clightning/clightning_wallet.go b/clightning/clightning_wallet.go index bbdb8ad1..7e77cd76 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,24 +187,20 @@ 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 { - // 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 (cl *ClightningClient) SetLabel(txID, address, label string) error { + return cl.gbitcoin.SetLabel(address, label) } func (cl *ClightningClient) NewAddress() (string, error) { diff --git a/go.mod b/go.mod index 3803ff86..fb47192b 100644 --- a/go.mod +++ b/go.mod @@ -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 @@ -151,3 +151,5 @@ require ( // This fork contains some options we need to reconnect to lnd. replace github.com/grpc-ecosystem/go-grpc-middleware => github.com/nepet/go-grpc-middleware v1.3.1-0.20220824133300-340e95267339 + +replace github.com/elementsproject/glightning => github.com/yusukeshimizu/glightning v0.0.0-20240214001938-06d9e0562297 diff --git a/go.sum b/go.sum index 334d0b38..bf227568 100644 --- a/go.sum +++ b/go.sum @@ -186,12 +186,6 @@ 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/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 +663,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..4169d96e 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, peerswapLabel) 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, peerswapLabel) 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, peerswapLabel) 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, peerswapLabel) if err != nil { log.Infof("Error labeling transaction. txid: %s, label: %s, error: %v", txId, labels.ClaimByCoop(swap.GetId().Short()), err) @@ -721,7 +721,7 @@ type ValidateTxAndPayClaimInvoiceAction struct{} func (p *ValidateTxAndPayClaimInvoiceAction) Execute(services *SwapServices, swap *SwapData) EventType { lc := services.lightning - onchain, _, validator, err := services.getOnChainServices(swap.GetChain()) + onchain, wallet, validator, err := services.getOnChainServices(swap.GetChain()) if err != nil { return swap.HandleError(err) } @@ -734,6 +734,10 @@ func (p *ValidateTxAndPayClaimInvoiceAction) Execute(services *SwapServices, swa if !ok { return swap.HandleError(errors.New("tx is not valid")) } + err = wallet.SetLabel(swap.GetOpeningTxId(), swap.GetOpeningParams().OpeningAddress, peerswapLabel) + if err != nil { + log.Infof("Error labeling trnasaction %v", err) + } var retryTime time.Duration = 120 * time.Second var interval time.Duration = 10 * time.Second 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 (