diff --git a/cmd/bee/cmd/deploy.go b/cmd/bee/cmd/deploy.go index 04d78cb532f..bd067e2e38f 100644 --- a/cmd/bee/cmd/deploy.go +++ b/cmd/bee/cmd/deploy.go @@ -93,7 +93,6 @@ func (c *command) initDeployCmd() error { chequebookFactory, swapInitialDeposit, deployGasPrice, - true, ) if err != nil { return err diff --git a/pkg/debugapi/chequebook.go b/pkg/debugapi/chequebook.go index 71366e59917..651c4f65e0b 100644 --- a/pkg/debugapi/chequebook.go +++ b/pkg/debugapi/chequebook.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethersphere/bee/pkg/bigint" "github.com/ethersphere/bee/pkg/jsonhttp" + "github.com/ethersphere/bee/pkg/postage/postagecontract" "github.com/ethersphere/bee/pkg/sctx" "github.com/ethersphere/bee/pkg/settlement/swap" "github.com/ethersphere/bee/pkg/settlement/swap/chequebook" @@ -68,6 +69,12 @@ type chequebookLastChequesResponse struct { func (s *Service) chequebookBalanceHandler(w http.ResponseWriter, r *http.Request) { balance, err := s.chequebook.Balance(r.Context()) + if errors.Is(err, postagecontract.ErrChainDisabled) { + jsonhttp.MethodNotAllowed(w, err) + s.logger.Debugf("debug api: chequebook balance: %v", err) + s.logger.Error("debug api: cannot get chequebook balance") + return + } if err != nil { jsonhttp.InternalServerError(w, errChequebookBalance) s.logger.Debugf("debug api: chequebook balance: %v", err) diff --git a/pkg/debugapi/settlements.go b/pkg/debugapi/settlements.go index 9a7215097c1..fc6034471a4 100644 --- a/pkg/debugapi/settlements.go +++ b/pkg/debugapi/settlements.go @@ -11,6 +11,7 @@ import ( "github.com/ethersphere/bee/pkg/bigint" "github.com/ethersphere/bee/pkg/jsonhttp" + "github.com/ethersphere/bee/pkg/postage/postagecontract" "github.com/ethersphere/bee/pkg/settlement" "github.com/ethersphere/bee/pkg/swarm" "github.com/gorilla/mux" @@ -36,6 +37,12 @@ type settlementsResponse struct { func (s *Service) settlementsHandler(w http.ResponseWriter, r *http.Request) { settlementsSent, err := s.swap.SettlementsSent() + if errors.Is(err, postagecontract.ErrChainDisabled) { + jsonhttp.MethodNotAllowed(w, err) + s.logger.Debugf("debug api: sent settlements: %v", err) + s.logger.Error("debug api: can not get sent settlements") + return + } if err != nil { jsonhttp.InternalServerError(w, errCantSettlements) s.logger.Debugf("debug api: sent settlements: %v", err) diff --git a/pkg/node/chain.go b/pkg/node/chain.go index 8f969ebbb8e..c999ce0dddc 100644 --- a/pkg/node/chain.go +++ b/pkg/node/chain.go @@ -22,6 +22,7 @@ import ( "github.com/ethersphere/bee/pkg/crypto" "github.com/ethersphere/bee/pkg/logging" "github.com/ethersphere/bee/pkg/p2p/libp2p" + "github.com/ethersphere/bee/pkg/postage/postagecontract" "github.com/ethersphere/bee/pkg/sctx" "github.com/ethersphere/bee/pkg/settlement" "github.com/ethersphere/bee/pkg/settlement/swap" @@ -160,12 +161,7 @@ func InitChequebookService( chequebookFactory chequebook.Factory, initialDeposit string, deployGasPrice string, - chainEnabled bool, ) (chequebook.Service, error) { - if !chainEnabled { - return new(noOpChequebookService), nil - } - chequeSigner := chequebook.NewChequeSigner(signer, chainID) deposit, ok := new(big.Int).SetString(initialDeposit, 10) @@ -347,31 +343,31 @@ func GetTxNextBlock(ctx context.Context, logger logging.Logger, backend transact type noOpChequebookService struct{} func (m *noOpChequebookService) Deposit(context.Context, *big.Int) (hash common.Hash, err error) { - return hash, errors.New("chain disabled") + return hash, postagecontract.ErrChainDisabled } func (m *noOpChequebookService) Withdraw(context.Context, *big.Int) (hash common.Hash, err error) { - return hash, errors.New("chain disabled") + return hash, postagecontract.ErrChainDisabled } func (m *noOpChequebookService) WaitForDeposit(context.Context, common.Hash) error { - return errors.New("chain disabled") + return postagecontract.ErrChainDisabled } func (m *noOpChequebookService) Balance(context.Context) (*big.Int, error) { - return nil, errors.New("chain disabled") + return nil, postagecontract.ErrChainDisabled } func (m *noOpChequebookService) AvailableBalance(context.Context) (*big.Int, error) { - return nil, errors.New("chain disabled") + return nil, postagecontract.ErrChainDisabled } func (m *noOpChequebookService) Address() common.Address { return common.Address{} } func (m *noOpChequebookService) Issue(context.Context, common.Address, *big.Int, chequebook.SendChequeFunc) (*big.Int, error) { - return nil, errors.New("chain disabled") + return nil, postagecontract.ErrChainDisabled } func (m *noOpChequebookService) LastCheque(common.Address) (*chequebook.SignedCheque, error) { - return nil, errors.New("chain disabled") + return nil, postagecontract.ErrChainDisabled } func (m *noOpChequebookService) LastCheques() (map[common.Address]*chequebook.SignedCheque, error) { - return nil, errors.New("chain disabled") + return nil, postagecontract.ErrChainDisabled } // noOpChainBackend is a noOp implementation for transaction.Backend interface. diff --git a/pkg/node/node.go b/pkg/node/node.go index 4237269e0e1..d452e9abaf7 100644 --- a/pkg/node/node.go +++ b/pkg/node/node.go @@ -225,7 +225,7 @@ func NewBee(addr string, publicKey *ecdsa.PublicKey, signer crypto.Signer, netwo transactionService transaction.Service transactionMonitor transaction.Monitor chequebookFactory chequebook.Factory - chequebookService chequebook.Service + chequebookService chequebook.Service = new(noOpChequebookService) chequeStore chequebook.ChequeStore cashoutService chequebook.CashoutService pollingInterval = time.Duration(o.BlockTime) * time.Second @@ -343,7 +343,7 @@ func NewBee(addr string, publicKey *ecdsa.PublicKey, signer crypto.Signer, netwo return nil, fmt.Errorf("factory fail: %w", err) } - if o.ChequebookEnable { + if o.ChequebookEnable && chainEnabled { chequebookService, err = InitChequebookService( p2pCtx, logger, @@ -356,7 +356,6 @@ func NewBee(addr string, publicKey *ecdsa.PublicKey, signer crypto.Signer, netwo chequebookFactory, o.SwapInitialDeposit, o.DeployGasPrice, - chainEnabled, ) if err != nil { return nil, err @@ -869,8 +868,15 @@ func NewBee(addr string, publicKey *ecdsa.PublicKey, signer crypto.Signer, netwo if chainSyncer != nil { debugAPIService.MustRegisterMetrics(chainSyncer.Metrics()...) } + + var debugSwapService swap.Interface = swapService + + if !chainEnabled { + debugSwapService = new(swap.NoOpSwap) + } + // inject dependencies and configure full debug api http path routes - debugAPIService.Configure(swarmAddress, p2ps, pingPong, kad, lightNodes, storer, tagService, acc, pseudosettleService, o.SwapEnable, o.ChequebookEnable, swapService, chequebookService, batchStore, post, postageContractService, traversalService) + debugAPIService.Configure(swarmAddress, p2ps, pingPong, kad, lightNodes, storer, tagService, acc, pseudosettleService, o.SwapEnable, o.ChequebookEnable, debugSwapService, chequebookService, batchStore, post, postageContractService, traversalService) } if err := kad.Start(p2pCtx); err != nil { diff --git a/pkg/settlement/swap/swap.go b/pkg/settlement/swap/swap.go index 67110ae7ad8..0f0e4bbdd86 100644 --- a/pkg/settlement/swap/swap.go +++ b/pkg/settlement/swap/swap.go @@ -12,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethersphere/bee/pkg/logging" + "github.com/ethersphere/bee/pkg/postage/postagecontract" "github.com/ethersphere/bee/pkg/settlement" "github.com/ethersphere/bee/pkg/settlement/swap/chequebook" "github.com/ethersphere/bee/pkg/settlement/swap/swapprotocol" @@ -380,3 +381,54 @@ func (s *Service) GetDeductionByPeer(peer swarm.Address) (bool, error) { func (s *Service) AddDeductionByPeer(peer swarm.Address) error { return s.addressbook.AddDeductionBy(peer) } + +type NoOpSwap struct { +} + +func (*NoOpSwap) TotalSent(peer swarm.Address) (totalSent *big.Int, err error) { + return nil, postagecontract.ErrChainDisabled +} + +// TotalReceived returns the total amount received from a peer +func (*NoOpSwap) TotalReceived(peer swarm.Address) (totalSent *big.Int, err error) { + return nil, postagecontract.ErrChainDisabled +} + +// SettlementsSent returns sent settlements for each individual known peer +func (*NoOpSwap) SettlementsSent() (map[string]*big.Int, error) { + return nil, postagecontract.ErrChainDisabled +} + +// SettlementsReceived returns received settlements for each individual known peer +func (*NoOpSwap) SettlementsReceived() (map[string]*big.Int, error) { + return nil, postagecontract.ErrChainDisabled +} + +func (*NoOpSwap) LastSentCheque(peer swarm.Address) (*chequebook.SignedCheque, error) { + return nil, postagecontract.ErrChainDisabled +} + +// LastSentCheques returns the list of last sent cheques for all peers +func (*NoOpSwap) LastSentCheques() (map[string]*chequebook.SignedCheque, error) { + return nil, postagecontract.ErrChainDisabled +} + +// LastReceivedCheque returns the last received cheque for the peer +func (*NoOpSwap) LastReceivedCheque(peer swarm.Address) (*chequebook.SignedCheque, error) { + return nil, postagecontract.ErrChainDisabled +} + +// LastReceivedCheques returns the list of last received cheques for all peers +func (*NoOpSwap) LastReceivedCheques() (map[string]*chequebook.SignedCheque, error) { + return nil, postagecontract.ErrChainDisabled +} + +// CashCheque sends a cashing transaction for the last cheque of the peer +func (*NoOpSwap) CashCheque(ctx context.Context, peer swarm.Address) (common.Hash, error) { + return common.Hash{}, postagecontract.ErrChainDisabled +} + +// CashoutStatus gets the status of the latest cashout transaction for the peers chequebook +func (*NoOpSwap) CashoutStatus(ctx context.Context, peer swarm.Address) (*chequebook.CashoutStatus, error) { + return nil, postagecontract.ErrChainDisabled +}