mirror of
https://github.com/aljazceru/ark.git
synced 2025-12-18 20:54:20 +01:00
* Fixes * Fixes to domain layer: * Add Leaf bool field to know to fix the returned list of leaves * Add non-persisted UnsignedForfeitTxs to RoundFinalizationStarted * Store only error msg when round fails instead of full error * Fix wallet interface: * Add Close() to close conn with wallet * Add GetAsset() to fix missing asset err when calling Transfer() * Fix gocron scheduler to correctly run/build the project * Fix badger repo implementation: * Fix datadirs of projection stores * Return error if current round not found * Fix round event deserialization * Fix TxBuilder interface & dummy impl: * Pass asp pubkey as arg of the defined functions * Fix connectorsToInputArgs to return the right number of ins * Fix getTxid() to return the id of an hex encoded tx too * Fix createConnectors() to return a tx if there's only 1 connector * Add leaf bool field to psetWithLevel in case a leaf is not in the last level * Fix node's isLeaf() check * Move to hex encoded pubkeys instead of ark encoded * Fix app layer: * Add Start() and Stop() to the interface & Expect raw pubkeys instead of strings as args * Source & cache pubkey from wallet at startup * Drop usage of scheduler and schedule next task based on occurred round events * Increase verbosity * Use hex instead of ark encoding to store receveirs' pubkeys * Lower faucet amount from 100k to 10k sats in total * Fix finalizeRound() to persist round events even if it failed * Add view() to forfeitTxMap to enrich RoundFinalizationEvent with unsigned forfeit txs * Add app config * Fix interface layer: * Remove repo manager from handler factory * Fix GetEventStream to forward events to stream once they arrive from app layer * Return missing unsigned forfeit txs in RoundFinalizationEvent * Fix extracting user pubkey from address * Add log interceptors * Add config struct * Add factory * Clean interface * Add config and launcher * Tidy deps & Set defaut round interval to 30secs for dev mode
171 lines
3.7 KiB
Go
171 lines
3.7 KiB
Go
package appconfig
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/ark-network/ark/common"
|
|
"github.com/ark-network/ark/internal/core/application"
|
|
"github.com/ark-network/ark/internal/core/ports"
|
|
"github.com/ark-network/ark/internal/infrastructure/db"
|
|
oceanwallet "github.com/ark-network/ark/internal/infrastructure/ocean-wallet"
|
|
txbuilder "github.com/ark-network/ark/internal/infrastructure/tx-builder/dummy"
|
|
log "github.com/sirupsen/logrus"
|
|
"github.com/vulpemventures/go-elements/network"
|
|
)
|
|
|
|
var (
|
|
supportedDbs = supportedType{
|
|
"badger": {},
|
|
}
|
|
supportedSchedulers = supportedType{
|
|
"gocron": {},
|
|
}
|
|
supportedTxBuilders = supportedType{
|
|
"dummy": {},
|
|
}
|
|
)
|
|
|
|
type Config struct {
|
|
DbType string
|
|
DbDir string
|
|
RoundInterval int64
|
|
Network common.Network
|
|
SchedulerType string
|
|
TxBuilderType string
|
|
WalletAddr string
|
|
|
|
repo ports.RepoManager
|
|
svc application.Service
|
|
wallet ports.WalletService
|
|
txBuilder ports.TxBuilder
|
|
}
|
|
|
|
func (c *Config) Validate() error {
|
|
if !supportedDbs.supports(c.DbType) {
|
|
return fmt.Errorf("db type not supported, please select one of: %s", supportedDbs)
|
|
}
|
|
if !supportedSchedulers.supports(c.SchedulerType) {
|
|
return fmt.Errorf("scheduler type not supported, please select one of: %s", supportedSchedulers)
|
|
}
|
|
if !supportedTxBuilders.supports(c.TxBuilderType) {
|
|
return fmt.Errorf("tx builder type not supported, please select one of: %s", supportedTxBuilders)
|
|
}
|
|
if c.RoundInterval < 5 {
|
|
return fmt.Errorf("invalid round interval, must be at least 5 seconds")
|
|
}
|
|
if c.Network.Name != "liquid" && c.Network.Name != "testnet" {
|
|
return fmt.Errorf("invalid network, must be either liquid or testnet")
|
|
}
|
|
if len(c.WalletAddr) <= 0 {
|
|
return fmt.Errorf("missing onchain wallet address")
|
|
}
|
|
if err := c.repoManager(); err != nil {
|
|
return err
|
|
}
|
|
if err := c.walletService(); err != nil {
|
|
return fmt.Errorf("failed to connect to wallet: %s", err)
|
|
}
|
|
if err := c.txBuilderService(); err != nil {
|
|
return err
|
|
}
|
|
if err := c.appService(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *Config) AppService() application.Service {
|
|
return c.svc
|
|
}
|
|
|
|
func (c *Config) repoManager() error {
|
|
var svc ports.RepoManager
|
|
var err error
|
|
switch c.DbType {
|
|
case "badger":
|
|
logger := log.New()
|
|
svc, err = db.NewService(db.ServiceConfig{
|
|
EventStoreType: c.DbType,
|
|
RoundStoreType: c.DbType,
|
|
VtxoStoreType: c.DbType,
|
|
|
|
EventStoreConfig: []interface{}{c.DbDir, logger},
|
|
RoundStoreConfig: []interface{}{c.DbDir, logger},
|
|
VtxoStoreConfig: []interface{}{c.DbDir, logger},
|
|
})
|
|
default:
|
|
return fmt.Errorf("unknown db type")
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.repo = svc
|
|
return nil
|
|
}
|
|
|
|
func (c *Config) walletService() error {
|
|
svc, err := oceanwallet.NewService(c.WalletAddr)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.wallet = svc
|
|
return nil
|
|
}
|
|
|
|
func (c *Config) txBuilderService() error {
|
|
var svc ports.TxBuilder
|
|
var err error
|
|
net := c.mainChain()
|
|
switch c.TxBuilderType {
|
|
case "dummy":
|
|
svc = txbuilder.NewTxBuilder(net)
|
|
default:
|
|
err = fmt.Errorf("unknown db type")
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.txBuilder = svc
|
|
return nil
|
|
}
|
|
|
|
func (c *Config) appService() error {
|
|
net := c.mainChain()
|
|
svc, err := application.NewService(
|
|
c.RoundInterval, c.Network, net, c.wallet, c.repo, c.txBuilder,
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.svc = svc
|
|
return nil
|
|
}
|
|
|
|
func (c *Config) mainChain() network.Network {
|
|
net := network.Liquid
|
|
if c.Network.Name != "mainnet" {
|
|
net = network.Testnet
|
|
}
|
|
return net
|
|
}
|
|
|
|
type supportedType map[string]struct{}
|
|
|
|
func (t supportedType) String() string {
|
|
types := make([]string, 0, len(t))
|
|
for tt := range t {
|
|
types = append(types, tt)
|
|
}
|
|
return strings.Join(types, " | ")
|
|
}
|
|
|
|
func (t supportedType) supports(typeStr string) bool {
|
|
_, ok := t[typeStr]
|
|
return ok
|
|
}
|