2019-06-14 10:16:30 +00:00
|
|
|
package wallet
|
|
|
|
|
|
|
|
import (
|
2023-01-17 09:56:16 +00:00
|
|
|
"context"
|
2021-09-09 14:28:54 +00:00
|
|
|
"database/sql"
|
2023-02-20 09:32:45 +00:00
|
|
|
"time"
|
2019-06-14 10:16:30 +00:00
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/event"
|
|
|
|
"github.com/ethereum/go-ethereum/log"
|
|
|
|
"github.com/ethereum/go-ethereum/p2p"
|
2021-09-22 17:49:20 +00:00
|
|
|
gethrpc "github.com/ethereum/go-ethereum/rpc"
|
|
|
|
|
2022-05-18 11:31:45 +00:00
|
|
|
"github.com/status-im/status-go/account"
|
2022-05-10 07:48:05 +00:00
|
|
|
"github.com/status-im/status-go/multiaccounts/accounts"
|
2022-07-15 08:53:56 +00:00
|
|
|
"github.com/status-im/status-go/params"
|
2021-09-22 17:49:20 +00:00
|
|
|
"github.com/status-im/status-go/rpc"
|
2022-09-13 07:10:59 +00:00
|
|
|
"github.com/status-im/status-go/services/ens"
|
|
|
|
"github.com/status-im/status-go/services/stickers"
|
2023-03-21 13:52:14 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/collectibles"
|
2023-02-17 14:11:07 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/currency"
|
2022-11-15 12:14:41 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/history"
|
2023-02-21 09:05:16 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/market"
|
2023-03-21 13:52:14 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/thirdparty"
|
2023-02-28 08:14:37 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/thirdparty/coingecko"
|
2023-02-21 09:05:16 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/thirdparty/cryptocompare"
|
|
|
|
"github.com/status-im/status-go/services/wallet/thirdparty/opensea"
|
2022-09-13 07:10:59 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/token"
|
2021-09-09 14:28:54 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/transfer"
|
2022-12-01 09:19:32 +00:00
|
|
|
"github.com/status-im/status-go/services/wallet/walletevent"
|
2022-07-15 08:53:56 +00:00
|
|
|
"github.com/status-im/status-go/transactions"
|
2019-06-14 10:16:30 +00:00
|
|
|
)
|
|
|
|
|
2023-02-23 13:55:57 +00:00
|
|
|
type Connection struct {
|
|
|
|
Up bool `json:"up"`
|
|
|
|
LastCheckedAt int64 `json:"lastCheckedAt"`
|
|
|
|
}
|
|
|
|
|
2023-01-17 09:56:16 +00:00
|
|
|
type ConnectedResult struct {
|
2023-02-20 09:32:45 +00:00
|
|
|
Blockchains map[uint64]Connection `json:"blockchains"`
|
2023-02-21 09:05:16 +00:00
|
|
|
Market Connection `json:"market"`
|
|
|
|
Collectibles map[uint64]Connection `json:"collectibles"`
|
2023-01-17 09:56:16 +00:00
|
|
|
}
|
|
|
|
|
2019-06-14 10:16:30 +00:00
|
|
|
// NewService initializes service instance.
|
2022-07-15 08:53:56 +00:00
|
|
|
func NewService(
|
|
|
|
db *sql.DB,
|
|
|
|
accountsDB *accounts.Database,
|
|
|
|
rpcClient *rpc.Client,
|
|
|
|
accountFeed *event.Feed,
|
|
|
|
openseaAPIKey string,
|
|
|
|
gethManager *account.GethManager,
|
|
|
|
transactor *transactions.Transactor,
|
|
|
|
config *params.NodeConfig,
|
2022-09-13 07:10:59 +00:00
|
|
|
ens *ens.Service,
|
|
|
|
stickers *stickers.Service,
|
2023-03-21 13:52:14 +00:00
|
|
|
nftMetadataProvider thirdparty.NFTMetadataProvider,
|
2022-07-15 08:53:56 +00:00
|
|
|
) *Service {
|
2021-09-09 14:28:54 +00:00
|
|
|
cryptoOnRampManager := NewCryptoOnRampManager(&CryptoOnRampOptions{
|
|
|
|
dataSourceType: DataSourceStatic,
|
|
|
|
})
|
2022-12-01 09:19:32 +00:00
|
|
|
walletFeed := &event.Feed{}
|
|
|
|
signals := &walletevent.SignalsTransmitter{
|
|
|
|
Publisher: walletFeed,
|
|
|
|
}
|
2022-09-13 07:10:59 +00:00
|
|
|
tokenManager := token.NewTokenManager(db, rpcClient, rpcClient.NetworkManager)
|
2021-09-10 18:08:22 +00:00
|
|
|
savedAddressesManager := &SavedAddressesManager{db: db}
|
2023-02-15 12:28:19 +00:00
|
|
|
transactionManager := transfer.NewTransactionManager(db, gethManager, transactor, config, accountsDB)
|
|
|
|
transferController := transfer.NewTransferController(db, rpcClient, accountFeed, walletFeed, transactionManager)
|
2023-02-21 09:05:16 +00:00
|
|
|
cryptoCompare := cryptocompare.NewClient()
|
2023-02-28 08:14:37 +00:00
|
|
|
coingecko := coingecko.NewClient()
|
|
|
|
marketManager := market.NewManager(cryptoCompare, coingecko)
|
2023-02-21 09:05:16 +00:00
|
|
|
reader := NewReader(rpcClient, tokenManager, marketManager, accountsDB, walletFeed)
|
|
|
|
history := history.NewService(db, walletFeed, rpcClient, tokenManager, marketManager)
|
|
|
|
currency := currency.NewService(db, walletFeed, tokenManager, marketManager)
|
2023-03-21 13:52:14 +00:00
|
|
|
collectiblesManager := collectibles.NewManager(rpcClient, nftMetadataProvider, openseaAPIKey)
|
2019-06-14 10:16:30 +00:00
|
|
|
return &Service{
|
2022-05-10 07:48:05 +00:00
|
|
|
db: db,
|
|
|
|
accountsDB: accountsDB,
|
2021-09-22 17:49:20 +00:00
|
|
|
rpcClient: rpcClient,
|
2021-09-10 18:08:22 +00:00
|
|
|
tokenManager: tokenManager,
|
|
|
|
savedAddressesManager: savedAddressesManager,
|
|
|
|
transactionManager: transactionManager,
|
|
|
|
transferController: transferController,
|
|
|
|
cryptoOnRampManager: cryptoOnRampManager,
|
2023-03-21 13:52:14 +00:00
|
|
|
collectiblesManager: collectiblesManager,
|
2022-03-29 21:12:05 +00:00
|
|
|
feesManager: &FeeManager{rpcClient},
|
2022-05-18 11:31:45 +00:00
|
|
|
gethManager: gethManager,
|
2023-02-21 09:05:16 +00:00
|
|
|
marketManager: marketManager,
|
2022-09-13 07:10:59 +00:00
|
|
|
transactor: transactor,
|
|
|
|
ens: ens,
|
|
|
|
stickers: stickers,
|
2022-11-29 13:43:18 +00:00
|
|
|
feed: accountFeed,
|
2022-12-01 09:19:32 +00:00
|
|
|
signals: signals,
|
|
|
|
reader: reader,
|
2022-11-15 12:14:41 +00:00
|
|
|
history: history,
|
2023-02-17 14:11:07 +00:00
|
|
|
currency: currency,
|
2019-06-14 10:16:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Service is a wallet service.
|
|
|
|
type Service struct {
|
2022-05-10 07:48:05 +00:00
|
|
|
db *sql.DB
|
|
|
|
accountsDB *accounts.Database
|
2021-09-22 17:49:20 +00:00
|
|
|
rpcClient *rpc.Client
|
2021-09-10 18:08:22 +00:00
|
|
|
savedAddressesManager *SavedAddressesManager
|
2022-10-25 14:50:32 +00:00
|
|
|
tokenManager *token.Manager
|
2023-02-15 12:28:19 +00:00
|
|
|
transactionManager *transfer.TransactionManager
|
2021-09-10 18:08:22 +00:00
|
|
|
cryptoOnRampManager *CryptoOnRampManager
|
|
|
|
transferController *transfer.Controller
|
2022-03-29 21:12:05 +00:00
|
|
|
feesManager *FeeManager
|
2023-02-21 09:05:16 +00:00
|
|
|
marketManager *market.Manager
|
2021-09-10 18:08:22 +00:00
|
|
|
started bool
|
2023-03-21 13:52:14 +00:00
|
|
|
collectiblesManager *collectibles.Manager
|
2022-05-18 11:31:45 +00:00
|
|
|
gethManager *account.GethManager
|
2022-09-13 07:10:59 +00:00
|
|
|
transactor *transactions.Transactor
|
|
|
|
ens *ens.Service
|
|
|
|
stickers *stickers.Service
|
2022-11-29 13:43:18 +00:00
|
|
|
feed *event.Feed
|
2022-12-01 09:19:32 +00:00
|
|
|
signals *walletevent.SignalsTransmitter
|
|
|
|
reader *Reader
|
2022-11-15 12:14:41 +00:00
|
|
|
history *history.Service
|
2023-02-17 14:11:07 +00:00
|
|
|
currency *currency.Service
|
2019-06-14 10:16:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Start signals transmitter.
|
2021-06-30 11:40:54 +00:00
|
|
|
func (s *Service) Start() error {
|
2022-12-01 09:19:32 +00:00
|
|
|
s.transferController.Start()
|
2023-02-17 14:11:07 +00:00
|
|
|
s.currency.Start()
|
2022-12-01 09:19:32 +00:00
|
|
|
err := s.signals.Start()
|
2023-01-25 18:28:51 +00:00
|
|
|
s.history.Start()
|
2021-09-09 14:28:54 +00:00
|
|
|
s.started = true
|
|
|
|
return err
|
2019-06-14 10:16:30 +00:00
|
|
|
}
|
|
|
|
|
2020-10-28 07:56:14 +00:00
|
|
|
// GetFeed returns signals feed.
|
|
|
|
func (s *Service) GetFeed() *event.Feed {
|
2021-09-09 14:28:54 +00:00
|
|
|
return s.transferController.TransferFeed
|
2019-06-14 10:16:30 +00:00
|
|
|
}
|
|
|
|
|
2022-12-01 09:19:32 +00:00
|
|
|
// Stop reactor and close db.
|
2019-06-14 10:16:30 +00:00
|
|
|
func (s *Service) Stop() error {
|
|
|
|
log.Info("wallet will be stopped")
|
2022-12-01 09:19:32 +00:00
|
|
|
s.signals.Stop()
|
2021-09-09 14:28:54 +00:00
|
|
|
s.transferController.Stop()
|
2023-02-17 14:11:07 +00:00
|
|
|
s.currency.Stop()
|
2022-12-01 09:19:32 +00:00
|
|
|
s.reader.Stop()
|
2022-11-15 12:14:41 +00:00
|
|
|
s.history.Stop()
|
2021-09-09 14:28:54 +00:00
|
|
|
s.started = false
|
2019-06-14 10:16:30 +00:00
|
|
|
log.Info("wallet stopped")
|
2021-09-09 14:28:54 +00:00
|
|
|
return nil
|
2019-06-14 10:16:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// APIs returns list of available RPC APIs.
|
2021-09-22 17:49:20 +00:00
|
|
|
func (s *Service) APIs() []gethrpc.API {
|
|
|
|
return []gethrpc.API{
|
2019-06-14 10:16:30 +00:00
|
|
|
{
|
|
|
|
Namespace: "wallet",
|
|
|
|
Version: "0.1.0",
|
|
|
|
Service: NewAPI(s),
|
|
|
|
Public: true,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Protocols returns list of p2p protocols.
|
|
|
|
func (s *Service) Protocols() []p2p.Protocol {
|
|
|
|
return nil
|
|
|
|
}
|
2019-08-28 07:49:03 +00:00
|
|
|
|
2020-02-28 16:05:37 +00:00
|
|
|
func (s *Service) IsStarted() bool {
|
2020-08-18 08:44:56 +00:00
|
|
|
return s.started
|
2020-02-28 16:05:37 +00:00
|
|
|
}
|
2023-01-17 09:56:16 +00:00
|
|
|
|
|
|
|
func (s *Service) CheckConnected(ctx context.Context) *ConnectedResult {
|
2023-02-20 09:32:45 +00:00
|
|
|
networks, err := s.rpcClient.NetworkManager.Get(false)
|
|
|
|
blockchains := make(map[uint64]Connection)
|
|
|
|
if err == nil {
|
|
|
|
for _, network := range networks {
|
|
|
|
ethClient, err := s.rpcClient.EthClient(network.ChainID)
|
|
|
|
if err != nil {
|
|
|
|
blockchains[network.ChainID] = Connection{
|
|
|
|
Up: true,
|
|
|
|
LastCheckedAt: time.Now().Unix(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
blockchains[network.ChainID] = Connection{
|
|
|
|
Up: ethClient.IsConnected,
|
|
|
|
LastCheckedAt: ethClient.LastCheckedAt,
|
|
|
|
}
|
2023-02-23 13:55:57 +00:00
|
|
|
}
|
2023-01-17 09:56:16 +00:00
|
|
|
}
|
|
|
|
|
2023-02-21 09:05:16 +00:00
|
|
|
collectibles := make(map[uint64]Connection)
|
|
|
|
for chainID, client := range opensea.OpenseaClientInstances {
|
|
|
|
collectibles[chainID] = Connection{
|
2023-02-23 13:55:57 +00:00
|
|
|
Up: client.IsConnected,
|
|
|
|
LastCheckedAt: client.LastCheckedAt,
|
|
|
|
}
|
2023-01-17 09:56:16 +00:00
|
|
|
}
|
|
|
|
return &ConnectedResult{
|
2023-02-20 09:32:45 +00:00
|
|
|
Blockchains: blockchains,
|
2023-02-21 09:05:16 +00:00
|
|
|
Collectibles: collectibles,
|
|
|
|
Market: Connection{
|
|
|
|
Up: s.marketManager.IsConnected,
|
|
|
|
LastCheckedAt: s.marketManager.LastCheckedAt,
|
2023-02-23 13:55:57 +00:00
|
|
|
},
|
2023-01-17 09:56:16 +00:00
|
|
|
}
|
|
|
|
}
|