Add --datadir flag (#152)

* add --datadir flag

* map ENV variable to --datadir flag

* revert version var
This commit is contained in:
Louis Singer
2024-05-01 16:14:02 +02:00
committed by GitHub
parent 9e42c7f9f9
commit 3c9da99516
13 changed files with 144 additions and 128 deletions

View File

@@ -26,20 +26,20 @@ var balanceCommand = cli.Command{
func balanceAction(ctx *cli.Context) error { func balanceAction(ctx *cli.Context) error {
withExpiryDetails := ctx.Bool("expiry-details") withExpiryDetails := ctx.Bool("expiry-details")
client, cancel, err := getClientFromState() client, cancel, err := getClientFromState(ctx)
if err != nil { if err != nil {
return err return err
} }
defer cancel() defer cancel()
offchainAddr, onchainAddr, redemptionAddr, err := getAddress() offchainAddr, onchainAddr, redemptionAddr, err := getAddress(ctx)
if err != nil { if err != nil {
return err return err
} }
_, network := getNetwork() _, network := getNetwork(ctx)
// No need to check for error here becuase this function is called also by getAddress(). // No need to check for error here becuase this function is called also by getAddress().
// nolint:all // nolint:all
unilateralExitDelay, _ := getUnilateralExitDelay() unilateralExitDelay, _ := getUnilateralExitDelay(ctx)
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(3) wg.Add(3)
@@ -47,9 +47,9 @@ func balanceAction(ctx *cli.Context) error {
chRes := make(chan balanceRes, 3) chRes := make(chan balanceRes, 3)
go func() { go func() {
defer wg.Done() defer wg.Done()
explorer := NewExplorer() explorer := NewExplorer(ctx)
balance, amountByExpiration, err := getOffchainBalance( balance, amountByExpiration, err := getOffchainBalance(
ctx.Context, explorer, client, offchainAddr, withExpiryDetails, ctx, explorer, client, offchainAddr, withExpiryDetails,
) )
if err != nil { if err != nil {
chRes <- balanceRes{0, 0, nil, nil, err} chRes <- balanceRes{0, 0, nil, nil, err}
@@ -61,7 +61,7 @@ func balanceAction(ctx *cli.Context) error {
go func() { go func() {
defer wg.Done() defer wg.Done()
explorer := NewExplorer() explorer := NewExplorer(ctx)
balance, err := explorer.GetBalance(onchainAddr, network.AssetID) balance, err := explorer.GetBalance(onchainAddr, network.AssetID)
if err != nil { if err != nil {
chRes <- balanceRes{0, 0, nil, nil, err} chRes <- balanceRes{0, 0, nil, nil, err}
@@ -72,7 +72,7 @@ func balanceAction(ctx *cli.Context) error {
go func() { go func() {
defer wg.Done() defer wg.Done()
explorer := NewExplorer() explorer := NewExplorer(ctx)
spendableBalance, lockedBalance, err := explorer.GetRedeemedVtxosBalance( spendableBalance, lockedBalance, err := explorer.GetRedeemedVtxosBalance(
redemptionAddr, unilateralExitDelay, redemptionAddr, unilateralExitDelay,

View File

@@ -1,12 +1,12 @@
package main package main
import ( import (
"context"
"fmt" "fmt"
"strings" "strings"
"time" "time"
arkv1 "github.com/ark-network/ark/api-spec/protobuf/gen/ark/v1" arkv1 "github.com/ark-network/ark/api-spec/protobuf/gen/ark/v1"
"github.com/urfave/cli/v2"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials"
"google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/credentials/insecure"
@@ -21,10 +21,10 @@ type vtxo struct {
} }
func getVtxos( func getVtxos(
ctx context.Context, explorer Explorer, client arkv1.ArkServiceClient, ctx *cli.Context, explorer Explorer, client arkv1.ArkServiceClient,
addr string, withExpiration bool, addr string, withExpiration bool,
) ([]vtxo, error) { ) ([]vtxo, error) {
response, err := client.ListVtxos(ctx, &arkv1.ListVtxosRequest{ response, err := client.ListVtxos(ctx.Context, &arkv1.ListVtxosRequest{
Address: addr, Address: addr,
}) })
if err != nil { if err != nil {
@@ -45,13 +45,13 @@ func getVtxos(
return vtxos, nil return vtxos, nil
} }
redeemBranches, err := getRedeemBranches(ctx, explorer, client, vtxos) redeemBranches, err := getRedeemBranches(ctx.Context, explorer, client, vtxos)
if err != nil { if err != nil {
return nil, err return nil, err
} }
for vtxoTxid, branch := range redeemBranches { for vtxoTxid, branch := range redeemBranches {
expiration, err := branch.expireAt() expiration, err := branch.expireAt(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -67,8 +67,8 @@ func getVtxos(
return vtxos, nil return vtxos, nil
} }
func getClientFromState() (arkv1.ArkServiceClient, func(), error) { func getClientFromState(ctx *cli.Context) (arkv1.ArkServiceClient, func(), error) {
state, err := getState() state, err := getState(ctx)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }

View File

@@ -47,8 +47,8 @@ func hashPassword(password []byte) []byte {
return hash[:] return hash[:]
} }
func verifyPassword(password []byte) error { func verifyPassword(ctx *cli.Context, password []byte) error {
state, err := getState() state, err := getState(ctx)
if err != nil { if err != nil {
return err return err
} }
@@ -87,7 +87,7 @@ func readPassword(ctx *cli.Context, verify bool) ([]byte, error) {
} }
if verify { if verify {
if err := verifyPassword(password); err != nil { if err := verifyPassword(ctx, password); err != nil {
return nil, err return nil, err
} }
} }
@@ -96,7 +96,7 @@ func readPassword(ctx *cli.Context, verify bool) ([]byte, error) {
} }
func privateKeyFromPassword(ctx *cli.Context) (*secp256k1.PrivateKey, error) { func privateKeyFromPassword(ctx *cli.Context) (*secp256k1.PrivateKey, error) {
state, err := getState() state, err := getState(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -127,8 +127,8 @@ func privateKeyFromPassword(ctx *cli.Context) (*secp256k1.PrivateKey, error) {
return privateKey, nil return privateKey, nil
} }
func getWalletPublicKey() (*secp256k1.PublicKey, error) { func getWalletPublicKey(ctx *cli.Context) (*secp256k1.PublicKey, error) {
state, err := getState() state, err := getState(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -146,8 +146,8 @@ func getWalletPublicKey() (*secp256k1.PublicKey, error) {
return secp256k1.ParsePubKey(publicKeyBytes) return secp256k1.ParsePubKey(publicKeyBytes)
} }
func getAspPublicKey() (*secp256k1.PublicKey, error) { func getAspPublicKey(ctx *cli.Context) (*secp256k1.PublicKey, error) {
state, err := getState() state, err := getState(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -165,8 +165,8 @@ func getAspPublicKey() (*secp256k1.PublicKey, error) {
return secp256k1.ParsePubKey(pubKeyBytes) return secp256k1.ParsePubKey(pubKeyBytes)
} }
func getRoundLifetime() (int64, error) { func getRoundLifetime(ctx *cli.Context) (int64, error) {
state, err := getState() state, err := getState(ctx)
if err != nil { if err != nil {
return -1, err return -1, err
} }
@@ -183,8 +183,8 @@ func getRoundLifetime() (int64, error) {
return int64(roundLifetime), nil return int64(roundLifetime), nil
} }
func getUnilateralExitDelay() (int64, error) { func getUnilateralExitDelay(ctx *cli.Context) (int64, error) {
state, err := getState() state, err := getState(ctx)
if err != nil { if err != nil {
return -1, err return -1, err
} }
@@ -245,7 +245,7 @@ func coinSelect(vtxos []vtxo, amount uint64, sortByExpirationTime bool) ([]vtxo,
} }
func getOffchainBalance( func getOffchainBalance(
ctx context.Context, explorer Explorer, client arkv1.ArkServiceClient, ctx *cli.Context, explorer Explorer, client arkv1.ArkServiceClient,
addr string, withExpiration bool, addr string, withExpiration bool,
) (uint64, map[int64]uint64, error) { ) (uint64, map[int64]uint64, error) {
amountByExpiration := make(map[int64]uint64, 0) amountByExpiration := make(map[int64]uint64, 0)
@@ -272,8 +272,8 @@ func getOffchainBalance(
return balance, amountByExpiration, nil return balance, amountByExpiration, nil
} }
func getBaseURL() (string, error) { func getBaseURL(ctx *cli.Context) (string, error) {
state, err := getState() state, err := getState(ctx)
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -286,8 +286,8 @@ func getBaseURL() (string, error) {
return baseURL, nil return baseURL, nil
} }
func getTxBlocktime(txid string) (confirmed bool, blocktime int64, err error) { func getTxBlocktime(ctx *cli.Context, txid string) (confirmed bool, blocktime int64, err error) {
baseUrl, err := getBaseURL() baseUrl, err := getBaseURL(ctx)
if err != nil { if err != nil {
return false, 0, err return false, 0, err
} }
@@ -323,8 +323,8 @@ func getTxBlocktime(txid string) (confirmed bool, blocktime int64, err error) {
} }
func getNetwork() (*common.Network, *network.Network) { func getNetwork(ctx *cli.Context) (*common.Network, *network.Network) {
state, err := getState() state, err := getState(ctx)
if err != nil { if err != nil {
return &common.TestNet, &network.Testnet return &common.TestNet, &network.Testnet
} }
@@ -346,23 +346,23 @@ func networkFromString(net string) (*common.Network, *network.Network) {
return &common.Liquid, &network.Liquid return &common.Liquid, &network.Liquid
} }
func getAddress() (offchainAddr, onchainAddr, redemptionAddr string, err error) { func getAddress(ctx *cli.Context) (offchainAddr, onchainAddr, redemptionAddr string, err error) {
userPubkey, err := getWalletPublicKey() userPubkey, err := getWalletPublicKey(ctx)
if err != nil { if err != nil {
return return
} }
aspPubkey, err := getAspPublicKey() aspPubkey, err := getAspPublicKey(ctx)
if err != nil { if err != nil {
return return
} }
unilateralExitDelay, err := getUnilateralExitDelay() unilateralExitDelay, err := getUnilateralExitDelay(ctx)
if err != nil { if err != nil {
return return
} }
arkNet, liquidNet := getNetwork() arkNet, liquidNet := getNetwork(ctx)
arkAddr, err := common.EncodeAddress(arkNet.Addr, userPubkey, aspPubkey) arkAddr, err := common.EncodeAddress(arkNet.Addr, userPubkey, aspPubkey)
if err != nil { if err != nil {
@@ -382,7 +382,7 @@ func getAddress() (offchainAddr, onchainAddr, redemptionAddr string, err error)
return return
} }
_, net := getNetwork() _, net := getNetwork(ctx)
payment, err := payment.FromTweakedKey(vtxoTapKey, net, nil) payment, err := payment.FromTweakedKey(vtxoTapKey, net, nil)
if err != nil { if err != nil {
@@ -411,10 +411,10 @@ func printJSON(resp interface{}) error {
} }
func handleRoundStream( func handleRoundStream(
ctx context.Context, client arkv1.ArkServiceClient, paymentID string, ctx *cli.Context, client arkv1.ArkServiceClient, paymentID string,
vtxosToSign []vtxo, secKey *secp256k1.PrivateKey, receivers []*arkv1.Output, vtxosToSign []vtxo, secKey *secp256k1.PrivateKey, receivers []*arkv1.Output,
) (poolTxID string, err error) { ) (poolTxID string, err error) {
stream, err := client.GetEventStream(ctx, &arkv1.GetEventStreamRequest{}) stream, err := client.GetEventStream(ctx.Context, &arkv1.GetEventStreamRequest{})
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -424,7 +424,7 @@ func handleRoundStream(
PaymentId: paymentID, PaymentId: paymentID,
} }
for pingStop == nil { for pingStop == nil {
pingStop = ping(ctx, client, pingReq) pingStop = ping(ctx.Context, client, pingReq)
} }
defer pingStop() defer pingStop()
@@ -461,12 +461,12 @@ func handleRoundStream(
connectors := e.GetConnectors() connectors := e.GetConnectors()
aspPubkey, err := getAspPublicKey() aspPubkey, err := getAspPublicKey(ctx)
if err != nil { if err != nil {
return "", err return "", err
} }
roundLifetime, err := getRoundLifetime() roundLifetime, err := getRoundLifetime(ctx)
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -484,7 +484,7 @@ func handleRoundStream(
return "", err return "", err
} }
unilateralExitDelay, err := getUnilateralExitDelay() unilateralExitDelay, err := getUnilateralExitDelay(ctx)
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -578,7 +578,7 @@ func handleRoundStream(
fmt.Print("signing forfeit txs... ") fmt.Print("signing forfeit txs... ")
explorer := NewExplorer() explorer := NewExplorer(ctx)
connectorsTxids := make([]string, 0, len(connectors)) connectorsTxids := make([]string, 0, len(connectors))
for _, connector := range connectors { for _, connector := range connectors {
@@ -615,7 +615,7 @@ func handleRoundStream(
return "", fmt.Errorf("connector txid %s not found in the connectors list", connectorTxid) return "", fmt.Errorf("connector txid %s not found in the connectors list", connectorTxid)
} }
if err := signPset(pset, explorer, secKey); err != nil { if err := signPset(ctx, pset, explorer, secKey); err != nil {
return "", err return "", err
} }
@@ -635,14 +635,14 @@ func handleRoundStream(
fmt.Printf("\nno forfeit txs to sign, waiting for the next round...\n") fmt.Printf("\nno forfeit txs to sign, waiting for the next round...\n")
pingStop = nil pingStop = nil
for pingStop == nil { for pingStop == nil {
pingStop = ping(ctx, client, pingReq) pingStop = ping(ctx.Context, client, pingReq)
} }
continue continue
} }
fmt.Printf("%d signed\n", len(signedForfeits)) fmt.Printf("%d signed\n", len(signedForfeits))
fmt.Print("finalizing payment... ") fmt.Print("finalizing payment... ")
_, err = client.FinalizePayment(ctx, &arkv1.FinalizePaymentRequest{ _, err = client.FinalizePayment(ctx.Context, &arkv1.FinalizePaymentRequest{
SignedForfeitTxs: signedForfeits, SignedForfeitTxs: signedForfeits,
}) })
if err != nil { if err != nil {
@@ -889,9 +889,10 @@ func addVtxoInput(
} }
func coinSelectOnchain( func coinSelectOnchain(
ctx *cli.Context,
explorer Explorer, targetAmount uint64, exclude []utxo, explorer Explorer, targetAmount uint64, exclude []utxo,
) ([]utxo, []utxo, uint64, error) { ) ([]utxo, []utxo, uint64, error) {
_, onchainAddr, _, err := getAddress() _, onchainAddr, _, err := getAddress(ctx)
if err != nil { if err != nil {
return nil, nil, 0, err return nil, nil, 0, err
} }
@@ -922,17 +923,17 @@ func coinSelectOnchain(
return utxos, nil, selectedAmount - targetAmount, nil return utxos, nil, selectedAmount - targetAmount, nil
} }
userPubkey, err := getWalletPublicKey() userPubkey, err := getWalletPublicKey(ctx)
if err != nil { if err != nil {
return nil, nil, 0, err return nil, nil, 0, err
} }
aspPubkey, err := getAspPublicKey() aspPubkey, err := getAspPublicKey(ctx)
if err != nil { if err != nil {
return nil, nil, 0, err return nil, nil, 0, err
} }
unilateralExitDelay, err := getUnilateralExitDelay() unilateralExitDelay, err := getUnilateralExitDelay(ctx)
if err != nil { if err != nil {
return nil, nil, 0, err return nil, nil, 0, err
} }
@@ -944,7 +945,7 @@ func coinSelectOnchain(
return nil, nil, 0, err return nil, nil, 0, err
} }
_, net := getNetwork() _, net := getNetwork(ctx)
pay, err := payment.FromTweakedKey(vtxoTapKey, net, nil) pay, err := payment.FromTweakedKey(vtxoTapKey, net, nil)
if err != nil { if err != nil {
@@ -994,9 +995,10 @@ func coinSelectOnchain(
} }
func addInputs( func addInputs(
ctx *cli.Context,
updater *psetv2.Updater, utxos, delayedUtxos []utxo, net *network.Network, updater *psetv2.Updater, utxos, delayedUtxos []utxo, net *network.Network,
) error { ) error {
_, onchainAddr, _, err := getAddress() _, onchainAddr, _, err := getAddress(ctx)
if err != nil { if err != nil {
return err return err
} }
@@ -1041,17 +1043,17 @@ func addInputs(
} }
if len(delayedUtxos) > 0 { if len(delayedUtxos) > 0 {
userPubkey, err := getWalletPublicKey() userPubkey, err := getWalletPublicKey(ctx)
if err != nil { if err != nil {
return err return err
} }
aspPubkey, err := getAspPublicKey() aspPubkey, err := getAspPublicKey(ctx)
if err != nil { if err != nil {
return err return err
} }
unilateralExitDelay, err := getUnilateralExitDelay() unilateralExitDelay, err := getUnilateralExitDelay(ctx)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -11,7 +11,7 @@ var configCommand = cli.Command{
} }
func printConfigAction(ctx *cli.Context) error { func printConfigAction(ctx *cli.Context) error {
state, err := getState() state, err := getState(ctx)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -9,6 +9,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/urfave/cli/v2"
"github.com/vulpemventures/go-elements/psetv2" "github.com/vulpemventures/go-elements/psetv2"
"github.com/vulpemventures/go-elements/transaction" "github.com/vulpemventures/go-elements/transaction"
) )
@@ -39,8 +40,8 @@ type explorer struct {
baseUrl string baseUrl string
} }
func NewExplorer() Explorer { func NewExplorer(ctx *cli.Context) Explorer {
baseUrl, err := getBaseURL() baseUrl, err := getBaseURL(ctx)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@@ -1,7 +1,6 @@
package main package main
import ( import (
"context"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"io" "io"
@@ -69,7 +68,7 @@ func initAction(ctx *cli.Context) error {
explorerURL = explorerUrl[net] explorerURL = explorerUrl[net]
} }
if err := connectToAsp(ctx.Context, net, url, explorerURL); err != nil { if err := connectToAsp(ctx, net, url, explorerURL); err != nil {
return err return err
} }
@@ -78,7 +77,7 @@ func initAction(ctx *cli.Context) error {
return err return err
} }
return initWallet(key, password) return initWallet(ctx, key, password)
} }
func generateRandomPrivateKey() (*secp256k1.PrivateKey, error) { func generateRandomPrivateKey() (*secp256k1.PrivateKey, error) {
@@ -89,19 +88,19 @@ func generateRandomPrivateKey() (*secp256k1.PrivateKey, error) {
return privKey, nil return privKey, nil
} }
func connectToAsp(ctx context.Context, net, url, explorer string) error { func connectToAsp(ctx *cli.Context, net, url, explorer string) error {
client, close, err := getClient(url) client, close, err := getClient(url)
if err != nil { if err != nil {
return err return err
} }
defer close() defer close()
resp, err := client.GetInfo(ctx, &arkv1.GetInfoRequest{}) resp, err := client.GetInfo(ctx.Context, &arkv1.GetInfoRequest{})
if err != nil { if err != nil {
return err return err
} }
return setState(map[string]string{ return setState(ctx, map[string]string{
ASP_URL: url, ASP_URL: url,
NETWORK: net, NETWORK: net,
ASP_PUBKEY: resp.Pubkey, ASP_PUBKEY: resp.Pubkey,
@@ -111,7 +110,7 @@ func connectToAsp(ctx context.Context, net, url, explorer string) error {
}) })
} }
func initWallet(key string, password []byte) error { func initWallet(ctx *cli.Context, key string, password []byte) error {
var privateKey *secp256k1.PrivateKey var privateKey *secp256k1.PrivateKey
if len(key) <= 0 { if len(key) <= 0 {
privKey, err := generateRandomPrivateKey() privKey, err := generateRandomPrivateKey()
@@ -144,7 +143,7 @@ func initWallet(key string, password []byte) error {
PUBKEY: hex.EncodeToString(pubkey), PUBKEY: hex.EncodeToString(pubkey),
} }
if err := setState(state); err != nil { if err := setState(ctx, state); err != nil {
return err return err
} }

View File

@@ -15,6 +15,7 @@ import (
const ( const (
DATADIR_ENVVAR = "ARK_WALLET_DATADIR" DATADIR_ENVVAR = "ARK_WALLET_DATADIR"
STATE_FILE = "state.json" STATE_FILE = "state.json"
defaultNetwork = "liquid" defaultNetwork = "liquid"
@@ -32,8 +33,8 @@ const (
var ( var (
version = "alpha" version = "alpha"
datadir = common.AppDataDir("ark-cli", false) defaultDatadir = common.AppDataDir("ark-cli", false)
statePath = filepath.Join(datadir, STATE_FILE)
explorerUrl = map[string]string{ explorerUrl = map[string]string{
network.Liquid.Name: "https://blockstream.info/liquid/api", network.Liquid.Name: "https://blockstream.info/liquid/api",
network.Testnet.Name: "https://blockstream.info/liquidtestnet/api", network.Testnet.Name: "https://blockstream.info/liquidtestnet/api",
@@ -50,21 +51,17 @@ var (
PUBKEY: "", PUBKEY: "",
NETWORK: defaultNetwork, NETWORK: defaultNetwork,
} }
datadirFlag = &cli.StringFlag{
Name: "datadir",
Usage: "Specify the data directory",
Required: false,
Value: defaultDatadir,
EnvVars: []string{DATADIR_ENVVAR},
}
) )
func initCLIEnv() {
dir := cleanAndExpandPath(os.Getenv(DATADIR_ENVVAR))
if len(dir) <= 0 {
return
}
datadir = dir
statePath = filepath.Join(datadir, STATE_FILE)
}
func main() { func main() {
initCLIEnv()
app := cli.NewApp() app := cli.NewApp()
app.Version = version app.Version = version
@@ -81,8 +78,17 @@ func main() {
&sendCommand, &sendCommand,
&onboardCommand, &onboardCommand,
) )
app.Flags = []cli.Flag{
datadirFlag,
}
app.Before = func(ctx *cli.Context) error { app.Before = func(ctx *cli.Context) error {
datadir := cleanAndExpandPath(ctx.String("datadir"))
if err := ctx.Set("datadir", datadir); err != nil {
return err
}
if _, err := os.Stat(datadir); os.IsNotExist(err) { if _, err := os.Stat(datadir); os.IsNotExist(err) {
return os.Mkdir(datadir, os.ModeDir|0755) return os.Mkdir(datadir, os.ModeDir|0755)
} }
@@ -122,13 +128,15 @@ func cleanAndExpandPath(path string) string {
return filepath.Clean(os.ExpandEnv(path)) return filepath.Clean(os.ExpandEnv(path))
} }
func getState() (map[string]string, error) { func getState(ctx *cli.Context) (map[string]string, error) {
file, err := os.ReadFile(statePath) datadir := ctx.String("datadir")
stateFilePath := filepath.Join(datadir, STATE_FILE)
file, err := os.ReadFile(stateFilePath)
if err != nil { if err != nil {
if !os.IsNotExist(err) { if !os.IsNotExist(err) {
return nil, err return nil, err
} }
if err := setInitialState(); err != nil { if err := setInitialState(stateFilePath); err != nil {
return nil, err return nil, err
} }
return initialState, nil return initialState, nil
@@ -142,16 +150,16 @@ func getState() (map[string]string, error) {
return data, nil return data, nil
} }
func setInitialState() error { func setInitialState(stateFilePath string) error {
jsonString, err := json.Marshal(initialState) jsonString, err := json.Marshal(initialState)
if err != nil { if err != nil {
return err return err
} }
return os.WriteFile(statePath, jsonString, 0755) return os.WriteFile(stateFilePath, jsonString, 0755)
} }
func setState(data map[string]string) error { func setState(ctx *cli.Context, data map[string]string) error {
currentData, err := getState() currentData, err := getState(ctx)
if err != nil { if err != nil {
return err return err
} }
@@ -162,6 +170,10 @@ func setState(data map[string]string) error {
if err != nil { if err != nil {
return err return err
} }
datadir := ctx.String("datadir")
statePath := filepath.Join(datadir, STATE_FILE)
err = os.WriteFile(statePath, jsonString, 0755) err = os.WriteFile(statePath, jsonString, 0755)
if err != nil { if err != nil {
return fmt.Errorf("writing to file: %w", err) return fmt.Errorf("writing to file: %w", err)

View File

@@ -43,14 +43,14 @@ func onboardAction(ctx *cli.Context) error {
return fmt.Errorf("missing amount flag (--amount)") return fmt.Errorf("missing amount flag (--amount)")
} }
_, net := getNetwork() _, net := getNetwork(ctx)
userPubKey, err := getWalletPublicKey() userPubKey, err := getWalletPublicKey(ctx)
if err != nil { if err != nil {
return err return err
} }
client, cancel, err := getClientFromState() client, cancel, err := getClientFromState(ctx)
if err != nil { if err != nil {
return err return err
} }
@@ -71,17 +71,17 @@ func onboardAction(ctx *cli.Context) error {
return nil return nil
} }
aspPubkey, err := getAspPublicKey() aspPubkey, err := getAspPublicKey(ctx)
if err != nil { if err != nil {
return err return err
} }
roundLifetime, err := getRoundLifetime() roundLifetime, err := getRoundLifetime(ctx)
if err != nil { if err != nil {
return err return err
} }
unilateralExitDelay, err := getUnilateralExitDelay() unilateralExitDelay, err := getUnilateralExitDelay(ctx)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -11,7 +11,7 @@ var receiveCommand = cli.Command{
} }
func receiveAction(ctx *cli.Context) error { func receiveAction(ctx *cli.Context) error {
offchainAddr, onchainAddr, _, err := getAddress() offchainAddr, onchainAddr, _, err := getAddress(ctx)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -56,7 +56,7 @@ func redeemAction(ctx *cli.Context) error {
return fmt.Errorf("missing amount flag (--amount)") return fmt.Errorf("missing amount flag (--amount)")
} }
client, clean, err := getClientFromState() client, clean, err := getClientFromState(ctx)
if err != nil { if err != nil {
return err return err
} }
@@ -86,7 +86,7 @@ func collaborativeRedeem(
if err != nil { if err != nil {
return fmt.Errorf("invalid onchain address: unknown network") return fmt.Errorf("invalid onchain address: unknown network")
} }
_, liquidNet := getNetwork() _, liquidNet := getNetwork(ctx)
if net.Name != liquidNet.Name { if net.Name != liquidNet.Name {
return fmt.Errorf("invalid onchain address: must be for %s network", liquidNet.Name) return fmt.Errorf("invalid onchain address: must be for %s network", liquidNet.Name)
} }
@@ -96,7 +96,7 @@ func collaborativeRedeem(
addr = info.Address addr = info.Address
} }
offchainAddr, _, _, err := getAddress() offchainAddr, _, _, err := getAddress(ctx)
if err != nil { if err != nil {
return err return err
} }
@@ -108,9 +108,9 @@ func collaborativeRedeem(
}, },
} }
explorer := NewExplorer() explorer := NewExplorer(ctx)
vtxos, err := getVtxos(ctx.Context, explorer, client, offchainAddr, withExpiryCoinselect) vtxos, err := getVtxos(ctx, explorer, client, offchainAddr, withExpiryCoinselect)
if err != nil { if err != nil {
return err return err
} }
@@ -157,7 +157,7 @@ func collaborativeRedeem(
} }
poolTxID, err := handleRoundStream( poolTxID, err := handleRoundStream(
ctx.Context, ctx,
client, client,
registerResponse.GetId(), registerResponse.GetId(),
selectedCoins, selectedCoins,
@@ -178,13 +178,13 @@ func collaborativeRedeem(
} }
func unilateralRedeem(ctx *cli.Context, client arkv1.ArkServiceClient) error { func unilateralRedeem(ctx *cli.Context, client arkv1.ArkServiceClient) error {
offchainAddr, _, _, err := getAddress() offchainAddr, _, _, err := getAddress(ctx)
if err != nil { if err != nil {
return err return err
} }
explorer := NewExplorer() explorer := NewExplorer(ctx)
vtxos, err := getVtxos(ctx.Context, explorer, client, offchainAddr, false) vtxos, err := getVtxos(ctx, explorer, client, offchainAddr, false)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -87,7 +87,7 @@ func sendAction(ctx *cli.Context) error {
} }
} }
explorer := NewExplorer() explorer := NewExplorer(ctx)
if len(onchainReceivers) > 0 { if len(onchainReceivers) > 0 {
pset, err := sendOnchain(ctx, onchainReceivers) pset, err := sendOnchain(ctx, onchainReceivers)
@@ -117,7 +117,7 @@ func sendAction(ctx *cli.Context) error {
func sendOffchain(ctx *cli.Context, receivers []receiver) error { func sendOffchain(ctx *cli.Context, receivers []receiver) error {
withExpiryCoinselect := ctx.Bool("enable-expiry-coinselect") withExpiryCoinselect := ctx.Bool("enable-expiry-coinselect")
offchainAddr, _, _, err := getAddress() offchainAddr, _, _, err := getAddress(ctx)
if err != nil { if err != nil {
return err return err
} }
@@ -152,15 +152,15 @@ func sendOffchain(ctx *cli.Context, receivers []receiver) error {
}) })
sumOfReceivers += receiver.Amount sumOfReceivers += receiver.Amount
} }
client, close, err := getClientFromState() client, close, err := getClientFromState(ctx)
if err != nil { if err != nil {
return err return err
} }
defer close() defer close()
explorer := NewExplorer() explorer := NewExplorer(ctx)
vtxos, err := getVtxos(ctx.Context, explorer, client, offchainAddr, withExpiryCoinselect) vtxos, err := getVtxos(ctx, explorer, client, offchainAddr, withExpiryCoinselect)
if err != nil { if err != nil {
return err return err
} }
@@ -207,7 +207,7 @@ func sendOffchain(ctx *cli.Context, receivers []receiver) error {
} }
poolTxID, err := handleRoundStream( poolTxID, err := handleRoundStream(
ctx.Context, client, registerResponse.GetId(), ctx, client, registerResponse.GetId(),
selectedCoins, secKey, receiversOutput, selectedCoins, secKey, receiversOutput,
) )
if err != nil { if err != nil {
@@ -229,7 +229,7 @@ func sendOnchain(ctx *cli.Context, receivers []receiver) (string, error) {
return "", err return "", err
} }
_, net := getNetwork() _, net := getNetwork(ctx)
targetAmount := uint64(0) targetAmount := uint64(0)
for _, receiver := range receivers { for _, receiver := range receivers {
@@ -254,21 +254,21 @@ func sendOnchain(ctx *cli.Context, receivers []receiver) (string, error) {
} }
} }
explorer := NewExplorer() explorer := NewExplorer(ctx)
utxos, delayedUtxos, change, err := coinSelectOnchain( utxos, delayedUtxos, change, err := coinSelectOnchain(
explorer, targetAmount, nil, ctx, explorer, targetAmount, nil,
) )
if err != nil { if err != nil {
return "", err return "", err
} }
if err := addInputs(updater, utxos, delayedUtxos, net); err != nil { if err := addInputs(ctx, updater, utxos, delayedUtxos, net); err != nil {
return "", err return "", err
} }
if change > 0 { if change > 0 {
_, changeAddr, _, err := getAddress() _, changeAddr, _, err := getAddress(ctx)
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -307,18 +307,18 @@ func sendOnchain(ctx *cli.Context, receivers []receiver) (string, error) {
} }
// reselect the difference // reselect the difference
selected, delayedSelected, newChange, err := coinSelectOnchain( selected, delayedSelected, newChange, err := coinSelectOnchain(
explorer, feeAmount-change, append(utxos, delayedUtxos...), ctx, explorer, feeAmount-change, append(utxos, delayedUtxos...),
) )
if err != nil { if err != nil {
return "", err return "", err
} }
if err := addInputs(updater, selected, delayedSelected, net); err != nil { if err := addInputs(ctx, updater, selected, delayedSelected, net); err != nil {
return "", err return "", err
} }
if newChange > 0 { if newChange > 0 {
_, changeAddr, _, err := getAddress() _, changeAddr, _, err := getAddress(ctx)
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -354,7 +354,7 @@ func sendOnchain(ctx *cli.Context, receivers []receiver) (string, error) {
return "", err return "", err
} }
if err := signPset(updater.Pset, explorer, prvKey); err != nil { if err := signPset(ctx, updater.Pset, explorer, prvKey); err != nil {
return "", err return "", err
} }

View File

@@ -10,6 +10,7 @@ import (
"github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/txscript"
"github.com/decred/dcrd/dcrec/secp256k1/v4" "github.com/decred/dcrd/dcrec/secp256k1/v4"
"github.com/urfave/cli/v2"
"github.com/vulpemventures/go-elements/address" "github.com/vulpemventures/go-elements/address"
"github.com/vulpemventures/go-elements/payment" "github.com/vulpemventures/go-elements/payment"
"github.com/vulpemventures/go-elements/psetv2" "github.com/vulpemventures/go-elements/psetv2"
@@ -17,7 +18,7 @@ import (
) )
func signPset( func signPset(
pset *psetv2.Pset, explorer Explorer, prvKey *secp256k1.PrivateKey, ctx *cli.Context, pset *psetv2.Pset, explorer Explorer, prvKey *secp256k1.PrivateKey,
) error { ) error {
updater, err := psetv2.NewUpdater(pset) updater, err := psetv2.NewUpdater(pset)
if err != nil { if err != nil {
@@ -64,7 +65,7 @@ func signPset(
return err return err
} }
_, onchainAddr, _, err := getAddress() _, onchainAddr, _, err := getAddress(ctx)
if err != nil { if err != nil {
return err return err
} }
@@ -79,7 +80,7 @@ func signPset(
return err return err
} }
_, liquidNet := getNetwork() _, liquidNet := getNetwork(ctx)
prevoutsScripts := make([][]byte, 0) prevoutsScripts := make([][]byte, 0)
prevoutsValues := make([][]byte, 0) prevoutsValues := make([][]byte, 0)

View File

@@ -7,6 +7,7 @@ import (
"github.com/ark-network/ark/common/tree" "github.com/ark-network/ark/common/tree"
"github.com/btcsuite/btcd/btcec/v2/schnorr" "github.com/btcsuite/btcd/btcec/v2/schnorr"
"github.com/decred/dcrd/dcrec/secp256k1/v4" "github.com/decred/dcrd/dcrec/secp256k1/v4"
"github.com/urfave/cli/v2"
"github.com/vulpemventures/go-elements/psetv2" "github.com/vulpemventures/go-elements/psetv2"
"github.com/vulpemventures/go-elements/taproot" "github.com/vulpemventures/go-elements/taproot"
) )
@@ -115,10 +116,10 @@ func (r *redeemBranch) redeemPath() ([]string, error) {
return transactions, nil return transactions, nil
} }
func (r *redeemBranch) expireAt() (*time.Time, error) { func (r *redeemBranch) expireAt(ctx *cli.Context) (*time.Time, error) {
lastKnownBlocktime := int64(0) lastKnownBlocktime := int64(0)
confirmed, blocktime, _ := getTxBlocktime(r.vtxo.poolTxid) confirmed, blocktime, _ := getTxBlocktime(ctx, r.vtxo.poolTxid)
if confirmed { if confirmed {
lastKnownBlocktime = blocktime lastKnownBlocktime = blocktime
@@ -131,7 +132,7 @@ func (r *redeemBranch) expireAt() (*time.Time, error) {
utx, _ := pset.UnsignedTx() utx, _ := pset.UnsignedTx()
txid := utx.TxHash().String() txid := utx.TxHash().String()
confirmed, blocktime, err := getTxBlocktime(txid) confirmed, blocktime, err := getTxBlocktime(ctx, txid)
if err != nil { if err != nil {
break break
} }