mirror of
https://github.com/aljazceru/ark.git
synced 2026-01-18 11:14:20 +01:00
* [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
259 lines
7.0 KiB
Go
259 lines
7.0 KiB
Go
package e2e_test
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
utils "github.com/ark-network/ark/server/test/e2e"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
const (
|
|
composePath = "../../../../docker-compose.clark.regtest.yml"
|
|
redeemAddress = "bcrt1q2wrgf2hrkfegt0t97cnv4g5yvfjua9k6vua54d"
|
|
)
|
|
|
|
func TestMain(m *testing.M) {
|
|
_, err := utils.RunCommand("docker", "compose", "-f", composePath, "up", "-d", "--build")
|
|
if err != nil {
|
|
fmt.Printf("error starting docker-compose: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
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)
|
|
}
|
|
|
|
time.Sleep(3 * time.Second)
|
|
|
|
_, err = runClarkCommand("init", "--asp-url", "localhost:7070", "--password", utils.Password, "--network", "regtest", "--explorer", "http://chopsticks:3000")
|
|
if err != nil {
|
|
fmt.Printf("error initializing ark config: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
code := m.Run()
|
|
|
|
_, err = utils.RunCommand("docker", "compose", "-f", composePath, "down")
|
|
if err != nil {
|
|
fmt.Printf("error stopping docker-compose: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
os.Exit(code)
|
|
}
|
|
|
|
func TestSendOffchain(t *testing.T) {
|
|
var receive utils.ArkReceive
|
|
receiveStr, err := runClarkCommand("receive")
|
|
require.NoError(t, err)
|
|
|
|
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
|
|
balanceStr, err := runClarkCommand("balance")
|
|
require.NoError(t, err)
|
|
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
|
|
require.NotZero(t, balance.Offchain.Total)
|
|
|
|
_, err = runClarkCommand("claim", "--password", utils.Password)
|
|
require.NoError(t, err)
|
|
|
|
balanceStr, err = runClarkCommand("balance")
|
|
require.NoError(t, err)
|
|
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
|
|
require.NotZero(t, balance.Offchain.Total)
|
|
}
|
|
|
|
func TestUnilateralExit(t *testing.T) {
|
|
var receive utils.ArkReceive
|
|
receiveStr, err := runClarkCommand("receive")
|
|
require.NoError(t, err)
|
|
|
|
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)
|
|
|
|
_, err = runClarkCommand("redeem", "--force", "--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.Zero(t, balance.Offchain.Total)
|
|
require.Greater(t, len(balance.Onchain.Locked), 0)
|
|
|
|
lockedBalance := balance.Onchain.Locked[0].Amount
|
|
require.NotZero(t, lockedBalance)
|
|
}
|
|
|
|
func TestCollaborativeExit(t *testing.T) {
|
|
var receive utils.ArkReceive
|
|
receiveStr, err := runClarkCommand("receive")
|
|
require.NoError(t, err)
|
|
|
|
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("redeem", "--amount", "1000", "--address", redeemAddress, "--password", utils.Password)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func runClarkCommand(arg ...string) (string, error) {
|
|
args := append([]string{"exec", "-t", "clarkd", "ark"}, arg...)
|
|
return utils.RunCommand("docker", args...)
|
|
}
|
|
|
|
func setupAspWallet() error {
|
|
adminHttpClient := &http.Client{
|
|
Timeout: 15 * time.Second,
|
|
}
|
|
|
|
req, err := http.NewRequest("GET", "http://localhost:7070/v1/admin/wallet/seed", nil)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to prepare generate seed request: %s", err)
|
|
}
|
|
req.Header.Set("Authorization", "Basic YWRtaW46YWRtaW4=")
|
|
|
|
seedResp, err := adminHttpClient.Do(req)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to generate seed: %s", err)
|
|
}
|
|
|
|
var seed struct {
|
|
Seed string `json:"seed"`
|
|
}
|
|
|
|
if err := json.NewDecoder(seedResp.Body).Decode(&seed); err != nil {
|
|
return fmt.Errorf("failed to parse response: %s", err)
|
|
}
|
|
|
|
reqBody := bytes.NewReader([]byte(fmt.Sprintf(`{"seed": "%s", "password": "%s"}`, seed.Seed, utils.Password)))
|
|
req, err = http.NewRequest("POST", "http://localhost:7070/v1/admin/wallet/create", reqBody)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to prepare wallet create request: %s", err)
|
|
}
|
|
req.Header.Set("Authorization", "Basic YWRtaW46YWRtaW4=")
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
if _, err := adminHttpClient.Do(req); err != nil {
|
|
return fmt.Errorf("failed to create wallet: %s", err)
|
|
}
|
|
|
|
reqBody = bytes.NewReader([]byte(fmt.Sprintf(`{"password": "%s"}`, utils.Password)))
|
|
req, err = http.NewRequest("POST", "http://localhost:7070/v1/admin/wallet/unlock", reqBody)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to prepare wallet unlock request: %s", err)
|
|
}
|
|
req.Header.Set("Authorization", "Basic YWRtaW46YWRtaW4=")
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
if _, err := adminHttpClient.Do(req); err != nil {
|
|
return fmt.Errorf("failed to unlock wallet: %s", err)
|
|
}
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
req, err = http.NewRequest("GET", "http://localhost:7070/v1/admin/wallet/address", nil)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to prepare new address request: %s", err)
|
|
}
|
|
req.Header.Set("Authorization", "Basic YWRtaW46YWRtaW4=")
|
|
|
|
resp, err := adminHttpClient.Do(req)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get new address: %s", err)
|
|
}
|
|
|
|
var addr struct {
|
|
Address string `json:"address"`
|
|
}
|
|
|
|
if err := json.NewDecoder(resp.Body).Decode(&addr); err != nil {
|
|
return fmt.Errorf("failed to parse response: %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)
|
|
}
|
|
|
|
_, 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
|
|
}
|