refactored initialization

This commit is contained in:
Stephan D
2025-12-24 01:31:43 +01:00
parent e6626600cc
commit c941319c4e
19 changed files with 130 additions and 71 deletions

View File

@@ -3,6 +3,7 @@ package transfer
import (
"context"
"github.com/tech/sendico/gateway/chain/internal/service/gateway/rpcclient"
"github.com/tech/sendico/gateway/chain/internal/service/gateway/shared"
"github.com/tech/sendico/gateway/chain/storage"
clockpkg "github.com/tech/sendico/pkg/clock"
@@ -11,7 +12,7 @@ import (
type Deps struct {
Logger mlogger.Logger
Networks map[string]shared.Network
Networks *rpcclient.Registry
Storage storage.Repository
Clock clockpkg.Clock
EnsureRepository func(context.Context) error

View File

@@ -63,7 +63,7 @@ func (c *estimateTransferFeeCommand) Execute(ctx context.Context, req *chainv1.E
}
networkKey := strings.ToLower(strings.TrimSpace(sourceWallet.Network))
networkCfg, ok := c.deps.Networks[networkKey]
networkCfg, ok := c.deps.Networks.Network(networkKey)
if !ok {
c.deps.Logger.Warn("unsupported chain", zap.String("network", networkKey))
return gsresponse.InvalidArgument[chainv1.EstimateTransferFeeResponse](c.deps.Logger, mservice.ChainGateway, merrors.InvalidArgument("unsupported chain for wallet"))

View File

@@ -78,7 +78,7 @@ func (c *submitTransferCommand) Execute(ctx context.Context, req *chainv1.Submit
return gsresponse.InvalidArgument[chainv1.SubmitTransferResponse](c.deps.Logger, mservice.ChainGateway, merrors.InvalidArgument("organization_ref mismatch with wallet"))
}
networkKey := strings.ToLower(strings.TrimSpace(sourceWallet.Network))
networkCfg, ok := c.deps.Networks[networkKey]
networkCfg, ok := c.deps.Networks.Network(networkKey)
if !ok {
c.deps.Logger.Warn("unsupported chain", zap.String("network", networkKey))
return gsresponse.InvalidArgument[chainv1.SubmitTransferResponse](c.deps.Logger, mservice.ChainGateway, merrors.InvalidArgument("unsupported chain for wallet"))

View File

@@ -60,7 +60,7 @@ func (c *createManagedWalletCommand) Execute(ctx context.Context, req *chainv1.C
c.deps.Logger.Warn("unsupported chain", zap.Any("chain", asset.GetChain()))
return gsresponse.InvalidArgument[chainv1.CreateManagedWalletResponse](c.deps.Logger, mservice.ChainGateway, merrors.InvalidArgument("unsupported chain"))
}
networkCfg, ok := c.deps.Networks[chainKey]
networkCfg, ok := c.deps.Networks.Network(chainKey)
if !ok {
c.deps.Logger.Warn("unsupported chain in config", zap.String("chain", chainKey))
return gsresponse.InvalidArgument[chainv1.CreateManagedWalletResponse](c.deps.Logger, mservice.ChainGateway, merrors.InvalidArgument("unsupported chain"))

View File

@@ -5,7 +5,7 @@ import (
"time"
"github.com/tech/sendico/gateway/chain/internal/keymanager"
"github.com/tech/sendico/gateway/chain/internal/service/gateway/shared"
"github.com/tech/sendico/gateway/chain/internal/service/gateway/rpcclient"
"github.com/tech/sendico/gateway/chain/storage"
clockpkg "github.com/tech/sendico/pkg/clock"
"github.com/tech/sendico/pkg/mlogger"
@@ -13,7 +13,7 @@ import (
type Deps struct {
Logger mlogger.Logger
Networks map[string]shared.Network
Networks *rpcclient.Registry
KeyManager keymanager.Manager
Storage storage.Repository
Clock clockpkg.Clock

View File

@@ -2,6 +2,7 @@ package wallet
import (
"context"
"fmt"
"math/big"
"strings"
"time"
@@ -19,8 +20,18 @@ import (
func onChainWalletBalance(ctx context.Context, deps Deps, wallet *model.ManagedWallet) (*moneyv1.Money, error) {
logger := deps.Logger
registry := deps.Networks
networkKey := strings.ToLower(strings.TrimSpace(wallet.Network))
network := deps.Networks[networkKey]
network, ok := registry.Network(networkKey)
if !ok {
logger.Warn("Requested network is not configured",
zap.String("wallet_ref", wallet.WalletRef),
zap.String("network", networkKey),
)
return nil, merrors.Internal(fmt.Sprintf("Requested network '%s' is not configured", networkKey))
}
rpcURL := strings.TrimSpace(network.RPCURL)
logFields := []zap.Field{
@@ -32,55 +43,54 @@ func onChainWalletBalance(ctx context.Context, deps Deps, wallet *model.ManagedW
}
if rpcURL == "" {
logger.Warn("network rpc url is not configured", logFields...)
logger.Warn("Network rpc url is not configured", logFields...)
return nil, merrors.Internal("network rpc url is not configured")
}
contract := strings.TrimSpace(wallet.ContractAddress)
if contract == "" || !common.IsHexAddress(contract) {
logger.Warn("invalid contract address for balance fetch", logFields...)
logger.Warn("Invalid contract address for balance fetch", logFields...)
return nil, merrors.InvalidArgument("invalid contract address")
}
if wallet.DepositAddress == "" || !common.IsHexAddress(wallet.DepositAddress) {
logger.Warn("invalid wallet address for balance fetch", logFields...)
logger.Warn("Invalid wallet address for balance fetch", logFields...)
return nil, merrors.InvalidArgument("invalid wallet address")
}
logger.Info("fetching on-chain wallet balance", logFields...)
logger.Info("Fetching on-chain wallet balance", logFields...)
client, err := ethclient.DialContext(ctx, rpcURL)
client, err := registry.Client(networkKey)
if err != nil {
logger.Warn("failed to connect rpc", append(logFields, zap.Error(err))...)
return nil, merrors.Internal("failed to connect rpc: " + err.Error())
logger.Warn("Failed to fetch rpc client", append(logFields, zap.Error(err))...)
return nil, err
}
defer client.Close()
timeoutCtx, cancel := context.WithTimeout(ctx, 10*time.Second)
defer cancel()
tokenABI, err := abi.JSON(strings.NewReader(erc20ABIJSON))
if err != nil {
logger.Warn("failed to parse erc20 abi", append(logFields, zap.Error(err))...)
logger.Warn("Failed to parse erc20 abi", append(logFields, zap.Error(err))...)
return nil, merrors.Internal("failed to parse erc20 abi: " + err.Error())
}
tokenAddr := common.HexToAddress(contract)
walletAddr := common.HexToAddress(wallet.DepositAddress)
logger.Debug("calling token decimals", logFields...)
logger.Debug("Calling token decimals", logFields...)
decimals, err := readDecimals(timeoutCtx, client, tokenABI, tokenAddr)
if err != nil {
logger.Warn("token decimals call failed", append(logFields, zap.Error(err))...)
logger.Warn("Token decimals call failed", append(logFields, zap.Error(err))...)
return nil, err
}
logger.Debug("calling token balanceOf", append(logFields, zap.Uint8("decimals", decimals))...)
logger.Debug("Calling token balanceOf", append(logFields, zap.Uint8("decimals", decimals))...)
bal, err := readBalanceOf(timeoutCtx, client, tokenABI, tokenAddr, walletAddr)
if err != nil {
logger.Warn("token balanceOf call failed", append(logFields, zap.Uint8("decimals", decimals), zap.Error(err))...)
logger.Warn("Token balanceOf call failed", append(logFields, zap.Uint8("decimals", decimals), zap.Error(err))...)
return nil, err
}
dec := decimal.NewFromBigInt(bal, 0).Shift(-int32(decimals))
logger.Info("on-chain wallet balance fetched",
logger.Info("On-chain wallet balance fetched",
append(logFields,
zap.Uint8("decimals", decimals),
zap.String("balance_raw", bal.String()),