|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/hex"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/btcsuite/btcd/btcec/v2"
|
|
|
|
"github.com/btcsuite/btcd/btcutil/hdkeychain"
|
|
|
|
"github.com/btcsuite/btcd/chaincfg"
|
|
|
|
"github.com/lightninglabs/chantools/lnd"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
var sweepTimeLockManualCases = []struct {
|
|
|
|
baseKey string
|
|
|
|
keyIndex uint32
|
|
|
|
timeLockAddr string
|
|
|
|
remoteRevPubKey string
|
|
|
|
}{{
|
|
|
|
// New format with ECDH revocation root.
|
|
|
|
baseKey: "tprv8dgoXnQWBN4CGGceRYMW495kWcrUZKZVFwMmbzpduFp1D4pi" +
|
|
|
|
"3B2t37zTG5Fx66XWPDQYi3Q5vqDgmmZ5ffrqZ9H4s2EhJu9WaJjY3SKaWDK",
|
|
|
|
keyIndex: 7,
|
|
|
|
timeLockAddr: "bcrt1qf9zv4qtxh27c954rhlzg4tx58xh0vgssuu0csrlep0jdnv" +
|
|
|
|
"lx9xesmcl5qx",
|
|
|
|
remoteRevPubKey: "03235261ed5aaaf9fec0e91d5e1a4d17f1a2c7442f1c43806d" +
|
|
|
|
"32c9bd34abd002a3",
|
|
|
|
}, {
|
|
|
|
// Old format with plain private key as revocation root.
|
|
|
|
baseKey: "tprv8dgoXnQWBN4CGGceRYMW495kWcrUZKZVFwMmbzpduFp1D4pi" +
|
|
|
|
"3B2t37zTG5Fx66XWPDQYi3Q5vqDgmmZ5ffrqZ9H4s2EhJu9WaJjY3SKaWDK",
|
|
|
|
keyIndex: 6,
|
|
|
|
timeLockAddr: "bcrt1qa5rrlswxefc870k7rsza5hhqd37uytczldjk5t0vzd95u9" +
|
|
|
|
"hs8xlsfdc3zf",
|
|
|
|
remoteRevPubKey: "03e82cdf164ce5aba253890e066129f134ca8d7e072ce5ad55" +
|
|
|
|
"c721b9a13545ee04",
|
|
|
|
}, {
|
|
|
|
// New format with ECDH revocation root.
|
|
|
|
baseKey: "tprv8fCiPGhoYhWESQg3kgubCizcHo21drnP9Fa5j9fFKCmbME" +
|
|
|
|
"ipgodofyXcf4NFhD4k55GM1Ym3JUUDonpEXcsjnyTDUMmkzMK9pCnGPH3NJ5i",
|
|
|
|
keyIndex: 0,
|
|
|
|
timeLockAddr: "bcrt1qmkyn0tqx6mpg5aujgjhzaw27rvvymdfc3xhgawp48zy8v" +
|
|
|
|
"3rlw45qzmjqrr",
|
|
|
|
remoteRevPubKey: "02dfecdc259a7e1cff36a67328ded3b4dae30369a3035e4f91" +
|
|
|
|
"1ce7ac4a80b28e5d",
|
|
|
|
}, {
|
|
|
|
// Old format with plain private key as revocation root. Test data
|
|
|
|
// created with lnd v0.12.0-beta (old shachain root creation)
|
|
|
|
baseKey: "tprv8e3Mee42NcUd2MbwxBCJyEEhvKa8KqjiDR76M7ym4DJSfZk" +
|
|
|
|
"fDyA46XZeA4kTj8YKktWrjGBDThxxcL4HBF89jDKseu24XtugVMNsm3GhHwK",
|
|
|
|
keyIndex: 0,
|
|
|
|
timeLockAddr: "bcrt1qux548e45wlg9sufhgd8ldfzqrapl303g5sj7xg5w637sge" +
|
|
|
|
"dst0wsk0xags",
|
|
|
|
remoteRevPubKey: "03647afa9c04025e997a5b7ecd2dd949f8f60f6880a94af73a" +
|
|
|
|
"0d4f48f166d127d1",
|
|
|
|
}, {
|
|
|
|
// New format with ECDH revocation root but this test data was created
|
|
|
|
// when already the old format was present, this leads to the situation
|
|
|
|
// where the idx for the shachain root (revocation root) is equal to
|
|
|
|
// the delay basepoint index. Normally when starting a node after
|
|
|
|
// lnd with the version v0.13.0-beta onwords, the index is always
|
|
|
|
// +1 compared to the delay basepoint index.
|
|
|
|
baseKey: "tprv8e3Mee42NcUd2MbwxBCJyEEhvKa8KqjiDR76M7ym4DJSfZ" +
|
|
|
|
"kfDyA46XZeA4kTj8YKktWrjGBDThxxcL4HBF89jDKseu24XtugVMNsm3GhHwK",
|
|
|
|
keyIndex: 1,
|
|
|
|
timeLockAddr: "bcrt1qsj7c97fj9xh8znlkjtg4x45xstypk5zp3kcnt5f5u6ps" +
|
|
|
|
"rhetju2srseqrh",
|
|
|
|
remoteRevPubKey: "0341692a025ad552c62689a630ff24d9439e3752d8e0ac5cb4" +
|
|
|
|
"1b5e71ab2bd46d0f",
|
|
|
|
}}
|
|
|
|
|
|
|
|
func TestSweepTimeLockManual(t *testing.T) {
|
|
|
|
for _, tc := range sweepTimeLockManualCases {
|
|
|
|
// First, we need to parse the lock addr and make sure we can
|
|
|
|
// brute force the script with the information we have. If not,
|
|
|
|
// we can't continue anyway.
|
|
|
|
lockScript, err := lnd.GetP2WSHScript(
|
|
|
|
tc.timeLockAddr, &chaincfg.RegressionNetParams,
|
|
|
|
)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
baseKey, err := hdkeychain.NewKeyFromString(tc.baseKey)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
revPubKeyBytes, _ := hex.DecodeString(tc.remoteRevPubKey)
|
|
|
|
revPubKey, _ := btcec.ParsePubKey(revPubKeyBytes)
|
|
|
|
|
|
|
|
_, _, _, _, _, err = tryKey(
|
|
|
|
baseKey, revPubKey, 0, defaultCsvLimit, lockScript,
|
|
|
|
tc.keyIndex, 500,
|
|
|
|
)
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
}
|