New boarding protocol (#279)

* [domain] add reverse boarding inputs in Payment struct

* [tx-builder] support reverse boarding script

* [wallet] add GetTransaction

* [api-spec][application] add reverse boarding support in covenantless

* [config] add reverse boarding config

* [api-spec] add ReverseBoardingAddress RPC

* [domain][application] support empty forfeits txs in EndFinalization events

* [tx-builder] optional connector output in round tx

* [btc-embedded] fix getTx and taproot finalizer

* whitelist ReverseBoardingAddress RPC

* [test] add reverse boarding integration test

* [client] support reverse boarding

* [sdk] support reverse boarding

* [e2e] add sleep time after faucet

* [test] run using bitcoin-core RPC

* [tx-builder] fix GetSweepInput

* [application][tx-builder] support reverse onboarding in covenant

* [cli] support reverse onboarding in covenant CLI

* [test] rework integration tests

* [sdk] remove onchain wallet, replace by onboarding address

* remove old onboarding protocols

* [sdk] Fix RegisterPayment

* [e2e] add more funds to covenant ASP

* [e2e] add sleeping time

* several fixes

* descriptor boarding

* remove boarding delay from info

* [sdk] implement descriptor boarding

* go mod tidy

* fixes and revert error msgs

* move descriptor pkg to common

* add replace in go.mod

* [sdk] fix unit tests

* rename DescriptorInput --> BoardingInput

* genrest in SDK

* remove boarding input from domain

* remove all "reverse boarding"

* rename "onboarding" ==> "boarding"

* remove outdate payment unit test

* use tmpfs docker volument for compose testing files

* several fixes
This commit is contained in:
Louis Singer
2024-09-04 19:21:26 +02:00
committed by GitHub
parent 8cba9c9d42
commit 4da76ec88b
113 changed files with 5627 additions and 4430 deletions

View File

@@ -17,6 +17,7 @@ import (
const (
composePath = "../../../../docker-compose.regtest.yml"
ONE_BTC = 1_0000_0000
redeemAddr = "ert1p7hffs7y50jy8l34g334yke9cntzahml40xm2hx90g34jq8mqu7zsezhwcc"
)
func TestMain(m *testing.M) {
@@ -26,6 +27,8 @@ func TestMain(m *testing.M) {
os.Exit(1)
}
fmt.Println("waiting for docker containers to start...")
time.Sleep(10 * time.Second)
if err := setupAspWallet(); err != nil {
@@ -41,26 +44,6 @@ func TestMain(m *testing.M) {
os.Exit(1)
}
var receive utils.ArkReceive
receiveStr, err := runArkCommand("receive")
if err != nil {
fmt.Printf("error getting ark receive addresses: %s", err)
os.Exit(1)
}
if err := json.Unmarshal([]byte(receiveStr), &receive); err != nil {
fmt.Printf("error unmarshalling ark receive addresses: %s", err)
os.Exit(1)
}
_, err = utils.RunCommand("nigiri", "faucet", "--liquid", receive.Onchain)
if err != nil {
fmt.Printf("error funding ark account: %s", err)
os.Exit(1)
}
time.Sleep(5 * time.Second)
code := m.Run()
_, err = utils.RunCommand("docker", "compose", "-f", composePath, "down")
@@ -71,37 +54,23 @@ func TestMain(m *testing.M) {
os.Exit(code)
}
func TestOnboard(t *testing.T) {
var balance utils.ArkBalance
balanceStr, err := runArkCommand("balance")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
balanceBefore := balance.Offchain.Total
_, err = runArkCommand("onboard", "--amount", "1000", "--password", utils.Password)
require.NoError(t, err)
err = utils.GenerateBlock()
require.NoError(t, err)
balanceStr, err = runArkCommand("balance")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
require.Equal(t, balanceBefore+1000, balance.Offchain.Total)
}
func TestSendOffchain(t *testing.T) {
_, err := runArkCommand("onboard", "--amount", "1000", "--password", utils.Password)
require.NoError(t, err)
err = utils.GenerateBlock()
require.NoError(t, err)
var receive utils.ArkReceive
receiveStr, err := runArkCommand("receive")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(receiveStr), &receive))
_, err = utils.RunCommand("nigiri", "faucet", "--liquid", receive.Boarding)
require.NoError(t, err)
time.Sleep(5 * time.Second)
_, err = runArkCommand("claim", "--password", utils.Password)
require.NoError(t, err)
time.Sleep(3 * time.Second)
_, err = runArkCommand("send", "--amount", "1000", "--to", receive.Offchain, "--password", utils.Password)
require.NoError(t, err)
@@ -113,17 +82,27 @@ func TestSendOffchain(t *testing.T) {
}
func TestUnilateralExit(t *testing.T) {
_, err := runArkCommand("onboard", "--amount", "1000", "--password", utils.Password)
var receive utils.ArkReceive
receiveStr, err := runArkCommand("receive")
require.NoError(t, err)
err = utils.GenerateBlock()
require.NoError(t, json.Unmarshal([]byte(receiveStr), &receive))
_, err = utils.RunCommand("nigiri", "faucet", "--liquid", receive.Boarding)
require.NoError(t, err)
time.Sleep(5 * time.Second)
_, err = runArkCommand("claim", "--password", utils.Password)
require.NoError(t, err)
time.Sleep(3 * time.Second)
var balance utils.ArkBalance
balanceStr, err := runArkCommand("balance")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
require.NotZero(t, balance.Offchain.Total)
require.Len(t, balance.Onchain.Locked, 0)
_, err = runArkCommand("redeem", "--force", "--password", utils.Password)
require.NoError(t, err)
@@ -144,35 +123,24 @@ func TestUnilateralExit(t *testing.T) {
}
func TestCollaborativeExit(t *testing.T) {
_, err := runArkCommand("onboard", "--amount", "1000", "--password", utils.Password)
require.NoError(t, err)
err = utils.GenerateBlock()
require.NoError(t, err)
var receive utils.ArkReceive
receiveStr, err := runArkCommand("receive")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(receiveStr), &receive))
var balance utils.ArkBalance
balanceStr, err := runArkCommand("balance")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
balanceBefore := balance.Offchain.Total
balanceOnchainBefore := balance.Onchain.Spendable
_, err = runArkCommand("redeem", "--amount", "1000", "--address", receive.Onchain, "--password", utils.Password)
_, err = utils.RunCommand("nigiri", "faucet", "--liquid", receive.Boarding)
require.NoError(t, err)
time.Sleep(5 * time.Second)
balanceStr, err = runArkCommand("balance")
_, err = runArkCommand("claim", "--password", utils.Password)
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
require.Equal(t, balanceBefore-1000, balance.Offchain.Total)
require.Equal(t, balanceOnchainBefore+1000, balance.Onchain.Spendable)
time.Sleep(3 * time.Second)
_, err = runArkCommand("redeem", "--amount", "10000", "--address", redeemAddr, "--password", utils.Password)
require.NoError(t, err)
}
func runArkCommand(arg ...string) (string, error) {
@@ -258,6 +226,14 @@ func setupAspWallet() error {
if _, err := utils.RunCommand("nigiri", "faucet", "--liquid", addr.Address); err != nil {
return fmt.Errorf("failed to fund wallet: %s", err)
}
if _, err := utils.RunCommand("nigiri", "faucet", "--liquid", addr.Address); err != nil {
return fmt.Errorf("failed to fund wallet: %s", err)
}
if _, err := utils.RunCommand("nigiri", "faucet", "--liquid", addr.Address); err != nil {
return fmt.Errorf("failed to fund wallet: %s", err)
}
time.Sleep(5 * time.Second)
return nil
}

View File

@@ -14,8 +14,8 @@ import (
)
const (
composePath = "../../../../docker-compose.clark.regtest.yml"
ONE_BTC = 1_0000_0000
composePath = "../../../../docker-compose.clark.regtest.yml"
redeemAddress = "bcrt1q2wrgf2hrkfegt0t97cnv4g5yvfjua9k6vua54d"
)
func TestMain(m *testing.M) {
@@ -27,6 +27,11 @@ func TestMain(m *testing.M) {
time.Sleep(10 * time.Second)
if err := utils.GenerateBlock(); err != nil {
fmt.Printf("error generating block: %s", err)
os.Exit(1)
}
if err := setupAspWallet(); err != nil {
fmt.Println(err)
os.Exit(1)
@@ -40,26 +45,6 @@ func TestMain(m *testing.M) {
os.Exit(1)
}
var receive utils.ArkReceive
receiveStr, err := runClarkCommand("receive")
if err != nil {
fmt.Printf("error getting ark receive addresses: %s", err)
os.Exit(1)
}
if err := json.Unmarshal([]byte(receiveStr), &receive); err != nil {
fmt.Printf("error unmarshalling ark receive addresses: %s", err)
os.Exit(1)
}
_, err = utils.RunCommand("nigiri", "faucet", receive.Onchain)
if err != nil {
fmt.Printf("error funding ark account: %s", err)
os.Exit(1)
}
time.Sleep(5 * time.Second)
code := m.Run()
_, err = utils.RunCommand("docker", "compose", "-f", composePath, "down")
@@ -70,38 +55,25 @@ func TestMain(m *testing.M) {
os.Exit(code)
}
func TestOnboard(t *testing.T) {
var balance utils.ArkBalance
balanceStr, err := runClarkCommand("balance")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
balanceBefore := balance.Offchain.Total
_, err = runClarkCommand("onboard", "--amount", "1000", "--password", utils.Password)
require.NoError(t, err)
err = utils.GenerateBlock()
require.NoError(t, err)
balanceStr, err = runClarkCommand("balance")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
require.Equal(t, balanceBefore+1000, balance.Offchain.Total)
}
func TestSendOffchain(t *testing.T) {
_, err := runClarkCommand("onboard", "--amount", "1000", "--password", utils.Password)
require.NoError(t, err)
err = utils.GenerateBlock()
require.NoError(t, err)
var receive utils.ArkReceive
receiveStr, err := runClarkCommand("receive")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(receiveStr), &receive))
_, err = runClarkCommand("send", "--amount", "1000", "--to", receive.Offchain, "--password", utils.Password)
err = json.Unmarshal([]byte(receiveStr), &receive)
require.NoError(t, err)
_, err = utils.RunCommand("nigiri", "faucet", receive.Boarding)
require.NoError(t, err)
time.Sleep(5 * time.Second)
_, err = runClarkCommand("claim", "--password", utils.Password)
require.NoError(t, err)
time.Sleep(3 * time.Second)
_, err = runClarkCommand("send", "--amount", "10000", "--to", receive.Offchain, "--password", utils.Password)
require.NoError(t, err)
var balance utils.ArkBalance
@@ -120,17 +92,28 @@ func TestSendOffchain(t *testing.T) {
}
func TestUnilateralExit(t *testing.T) {
_, err := runClarkCommand("onboard", "--amount", "1000", "--password", utils.Password)
var receive utils.ArkReceive
receiveStr, err := runClarkCommand("receive")
require.NoError(t, err)
err = utils.GenerateBlock()
err = json.Unmarshal([]byte(receiveStr), &receive)
require.NoError(t, err)
_, err = utils.RunCommand("nigiri", "faucet", receive.Boarding)
require.NoError(t, err)
time.Sleep(5 * time.Second)
_, err = runClarkCommand("claim", "--password", utils.Password)
require.NoError(t, err)
time.Sleep(3 * time.Second)
var balance utils.ArkBalance
balanceStr, err := runClarkCommand("balance")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
require.NotZero(t, balance.Offchain.Total)
require.Len(t, balance.Onchain.Locked, 0)
_, err = runClarkCommand("redeem", "--force", "--password", utils.Password)
require.NoError(t, err)
@@ -149,35 +132,25 @@ func TestUnilateralExit(t *testing.T) {
}
func TestCollaborativeExit(t *testing.T) {
_, err := runClarkCommand("onboard", "--amount", "1000", "--password", utils.Password)
require.NoError(t, err)
err = utils.GenerateBlock()
require.NoError(t, err)
var receive utils.ArkReceive
receiveStr, err := runClarkCommand("receive")
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(receiveStr), &receive))
var balance utils.ArkBalance
balanceStr, err := runClarkCommand("balance")
err = json.Unmarshal([]byte(receiveStr), &receive)
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
balanceBefore := balance.Offchain.Total
balanceOnchainBefore := balance.Onchain.Spendable
_, err = runClarkCommand("redeem", "--amount", "1000", "--address", receive.Onchain, "--password", utils.Password)
_, err = utils.RunCommand("nigiri", "faucet", receive.Boarding)
require.NoError(t, err)
time.Sleep(5 * time.Second)
balanceStr, err = runClarkCommand("balance")
_, err = runClarkCommand("claim", "--password", utils.Password)
require.NoError(t, err)
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
require.Equal(t, balanceBefore-1000, balance.Offchain.Total)
require.Equal(t, balanceOnchainBefore+1000, balance.Onchain.Spendable)
time.Sleep(3 * time.Second)
_, err = runClarkCommand("redeem", "--amount", "1000", "--address", redeemAddress, "--password", utils.Password)
require.NoError(t, err)
}
func runClarkCommand(arg ...string) (string, error) {
@@ -259,5 +232,27 @@ func setupAspWallet() error {
return fmt.Errorf("failed to fund wallet: %s", err)
}
_, err = utils.RunCommand("nigiri", "faucet", addr.Address)
if err != nil {
return fmt.Errorf("failed to fund wallet: %s", err)
}
_, err = utils.RunCommand("nigiri", "faucet", addr.Address)
if err != nil {
return fmt.Errorf("failed to fund wallet: %s", err)
}
_, err = utils.RunCommand("nigiri", "faucet", addr.Address)
if err != nil {
return fmt.Errorf("failed to fund wallet: %s", err)
}
_, err = utils.RunCommand("nigiri", "faucet", addr.Address)
if err != nil {
return fmt.Errorf("failed to fund wallet: %s", err)
}
time.Sleep(5 * time.Second)
return nil
}

View File

@@ -28,11 +28,7 @@ type ArkBalance struct {
type ArkReceive struct {
Offchain string `json:"offchain_address"`
Onchain string `json:"onchain_address"`
}
type ArkTrustedOnboard struct {
OnboardAddress string `json:"onboard_address"`
Boarding string `json:"boarding_address"`
}
func GenerateBlock() error {