diff --git a/api/gateway/chain/go.mod b/api/gateway/chain/go.mod index 0af8586..58d4cc0 100644 --- a/api/gateway/chain/go.mod +++ b/api/gateway/chain/go.mod @@ -22,7 +22,7 @@ require ( require ( github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251222215617-2e6965a531ff // indirect + github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251223223124-03e3cef63e04 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.24.4 // indirect github.com/bmatcuk/doublestar/v4 v4.9.1 // indirect diff --git a/api/gateway/chain/go.sum b/api/gateway/chain/go.sum index 9753684..b7d34cc 100644 --- a/api/gateway/chain/go.sum +++ b/api/gateway/chain/go.sum @@ -6,8 +6,8 @@ github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251222215617-2e6965a531ff h1:dkcn0B/pE1RTOeW9MB/fCxpKq0QaeWE6LkCmzURNE4g= -github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251222215617-2e6965a531ff/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= +github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251223223124-03e3cef63e04 h1:wCr/SrKzMrtW9wG85ApPfncRr7ajzkRevhsWnCkl2sE= +github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251223223124-03e3cef63e04/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= github.com/VictoriaMetrics/fastcache v1.13.0 h1:AW4mheMR5Vd9FkAPUv+NH6Nhw+fmbTMGMsNAoA/+4G0= github.com/VictoriaMetrics/fastcache v1.13.0/go.mod h1:hHXhl4DA2fTL2HTZDJFXWgW0LNjo6B+4aj2Wmng3TjU= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= diff --git a/api/gateway/chain/internal/server/internal/serverimp.go b/api/gateway/chain/internal/server/internal/serverimp.go index b6c6483..dcf876f 100644 --- a/api/gateway/chain/internal/server/internal/serverimp.go +++ b/api/gateway/chain/internal/server/internal/serverimp.go @@ -11,6 +11,7 @@ import ( "github.com/tech/sendico/gateway/chain/internal/keymanager" vaultmanager "github.com/tech/sendico/gateway/chain/internal/keymanager/vault" gatewayservice "github.com/tech/sendico/gateway/chain/internal/service/gateway" + "github.com/tech/sendico/gateway/chain/internal/service/gateway/rpcclient" gatewayshared "github.com/tech/sendico/gateway/chain/internal/service/gateway/shared" "github.com/tech/sendico/gateway/chain/storage" gatewaymongo "github.com/tech/sendico/gateway/chain/storage/mongo" @@ -31,6 +32,8 @@ type Imp struct { config *config app *grpcapp.App[storage.Repository] + + rpcClients *rpcclient.Clients } type config struct { @@ -85,6 +88,9 @@ func (i *Imp) Shutdown() { defer cancel() i.app.Shutdown(ctx) + if i.rpcClients != nil { + i.rpcClients.Close() + } } func (i *Imp) Start() error { @@ -104,6 +110,12 @@ func (i *Imp) Start() error { i.logger.Error("invalid chain network configuration", zap.Error(err)) return err } + rpcClients, err := rpcclient.Prepare(context.Background(), i.logger.Named("rpc"), networkConfigs) + if err != nil { + i.logger.Error("failed to prepare rpc clients", zap.Error(err)) + return err + } + i.rpcClients = rpcClients walletConfig := resolveServiceWallet(cl.Named("wallet"), cfg.ServiceWallet) keyManager, err := resolveKeyManager(i.logger.Named("key_manager"), cfg.KeyManagement) if err != nil { @@ -111,12 +123,13 @@ func (i *Imp) Start() error { } serviceFactory := func(logger mlogger.Logger, repo storage.Repository, producer msg.Producer) (grpcapp.Service, error) { - executor := gatewayservice.NewOnChainExecutor(logger, keyManager) + executor := gatewayservice.NewOnChainExecutor(logger, keyManager, rpcClients) opts := []gatewayservice.Option{ gatewayservice.WithNetworks(networkConfigs), gatewayservice.WithServiceWallet(walletConfig), gatewayservice.WithKeyManager(keyManager), gatewayservice.WithTransferExecutor(executor), + gatewayservice.WithRPCClients(rpcClients), gatewayservice.WithSettings(cfg.Settings), } return gatewayservice.NewService(logger, repo, producer, opts...), nil diff --git a/api/gateway/chain/internal/service/gateway/commands/transfer/deps.go b/api/gateway/chain/internal/service/gateway/commands/transfer/deps.go index e5621a7..8007bec 100644 --- a/api/gateway/chain/internal/service/gateway/commands/transfer/deps.go +++ b/api/gateway/chain/internal/service/gateway/commands/transfer/deps.go @@ -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 diff --git a/api/gateway/chain/internal/service/gateway/commands/transfer/fee.go b/api/gateway/chain/internal/service/gateway/commands/transfer/fee.go index a433659..2a9e9a3 100644 --- a/api/gateway/chain/internal/service/gateway/commands/transfer/fee.go +++ b/api/gateway/chain/internal/service/gateway/commands/transfer/fee.go @@ -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")) diff --git a/api/gateway/chain/internal/service/gateway/commands/transfer/submit.go b/api/gateway/chain/internal/service/gateway/commands/transfer/submit.go index e9f8151..52cbb9b 100644 --- a/api/gateway/chain/internal/service/gateway/commands/transfer/submit.go +++ b/api/gateway/chain/internal/service/gateway/commands/transfer/submit.go @@ -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")) diff --git a/api/gateway/chain/internal/service/gateway/commands/wallet/create.go b/api/gateway/chain/internal/service/gateway/commands/wallet/create.go index 83f2754..aaac415 100644 --- a/api/gateway/chain/internal/service/gateway/commands/wallet/create.go +++ b/api/gateway/chain/internal/service/gateway/commands/wallet/create.go @@ -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")) diff --git a/api/gateway/chain/internal/service/gateway/commands/wallet/deps.go b/api/gateway/chain/internal/service/gateway/commands/wallet/deps.go index 2f14ed5..9fbc88d 100644 --- a/api/gateway/chain/internal/service/gateway/commands/wallet/deps.go +++ b/api/gateway/chain/internal/service/gateway/commands/wallet/deps.go @@ -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 diff --git a/api/gateway/chain/internal/service/gateway/commands/wallet/onchain_balance.go b/api/gateway/chain/internal/service/gateway/commands/wallet/onchain_balance.go index 87a538c..2ac17ed 100644 --- a/api/gateway/chain/internal/service/gateway/commands/wallet/onchain_balance.go +++ b/api/gateway/chain/internal/service/gateway/commands/wallet/onchain_balance.go @@ -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()), diff --git a/api/gateway/chain/internal/service/gateway/executor.go b/api/gateway/chain/internal/service/gateway/executor.go index 14761f7..c705456 100644 --- a/api/gateway/chain/internal/service/gateway/executor.go +++ b/api/gateway/chain/internal/service/gateway/executor.go @@ -5,7 +5,6 @@ import ( "errors" "math/big" "strings" - "sync" "time" "github.com/ethereum/go-ethereum" @@ -14,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" "github.com/shopspring/decimal" + "github.com/tech/sendico/gateway/chain/internal/service/gateway/rpcclient" "github.com/tech/sendico/gateway/chain/internal/service/gateway/shared" "go.uber.org/zap" @@ -30,11 +30,11 @@ type TransferExecutor interface { } // NewOnChainExecutor constructs a TransferExecutor that talks to an EVM-compatible chain. -func NewOnChainExecutor(logger mlogger.Logger, keyManager keymanager.Manager) TransferExecutor { +func NewOnChainExecutor(logger mlogger.Logger, keyManager keymanager.Manager, clients *rpcclient.Clients) TransferExecutor { return &onChainExecutor{ logger: logger.Named("executor"), keyManager: keyManager, - clients: map[string]*ethclient.Client{}, + clients: clients, } } @@ -42,8 +42,7 @@ type onChainExecutor struct { logger mlogger.Logger keyManager keymanager.Manager - mu sync.Mutex - clients map[string]*ethclient.Client + clients *rpcclient.Clients } func (o *onChainExecutor) SubmitTransfer(ctx context.Context, transfer *model.Transfer, source *model.ManagedWallet, destinationAddress string, network shared.Network) (string, error) { @@ -80,7 +79,7 @@ func (o *onChainExecutor) SubmitTransfer(ctx context.Context, transfer *model.Tr zap.String("destination", strings.ToLower(destinationAddress)), ) - client, err := o.getClient(ctx, rpcURL) + client, err := o.clients.Client(network.Name) if err != nil { o.logger.Warn("failed to initialise rpc client", zap.String("network", network.Name), @@ -214,30 +213,6 @@ func (o *onChainExecutor) SubmitTransfer(ctx context.Context, transfer *model.Tr return txHash, nil } -func (o *onChainExecutor) getClient(ctx context.Context, rpcURL string) (*ethclient.Client, error) { - o.mu.Lock() - client, ok := o.clients[rpcURL] - o.mu.Unlock() - if ok { - return client, nil - } - - c, err := ethclient.DialContext(ctx, rpcURL) - if err != nil { - return nil, executorInternal("failed to connect to rpc "+rpcURL, err) - } - - o.mu.Lock() - defer o.mu.Unlock() - if existing, ok := o.clients[rpcURL]; ok { - // Another routine initialised it in the meantime; prefer the existing client and close the new one. - c.Close() - return existing, nil - } - o.clients[rpcURL] = c - return c, nil -} - func (o *onChainExecutor) AwaitConfirmation(ctx context.Context, network shared.Network, txHash string) (*types.Receipt, error) { if strings.TrimSpace(txHash) == "" { o.logger.Warn("missing transaction hash for confirmation", zap.String("network", network.Name)) @@ -249,7 +224,7 @@ func (o *onChainExecutor) AwaitConfirmation(ctx context.Context, network shared. return nil, executorInvalid("network rpc url is not configured") } - client, err := o.getClient(ctx, rpcURL) + client, err := o.clients.Client(network.Name) if err != nil { return nil, err } diff --git a/api/gateway/chain/internal/service/gateway/options.go b/api/gateway/chain/internal/service/gateway/options.go index 9d5db52..365dba4 100644 --- a/api/gateway/chain/internal/service/gateway/options.go +++ b/api/gateway/chain/internal/service/gateway/options.go @@ -4,6 +4,7 @@ import ( "strings" "github.com/tech/sendico/gateway/chain/internal/keymanager" + "github.com/tech/sendico/gateway/chain/internal/service/gateway/rpcclient" "github.com/tech/sendico/gateway/chain/internal/service/gateway/shared" clockpkg "github.com/tech/sendico/pkg/clock" ) @@ -25,6 +26,13 @@ func WithTransferExecutor(executor TransferExecutor) Option { } } +// WithRPCClients configures pre-initialised RPC clients. +func WithRPCClients(clients *rpcclient.Clients) Option { + return func(s *Service) { + s.rpcClients = clients + } +} + // WithNetworks configures supported blockchain networks. func WithNetworks(networks []shared.Network) Option { return func(s *Service) { diff --git a/api/gateway/chain/internal/service/gateway/rpcclient/clients.go b/api/gateway/chain/internal/service/gateway/rpcclient/clients.go index a434442..caba020 100644 --- a/api/gateway/chain/internal/service/gateway/rpcclient/clients.go +++ b/api/gateway/chain/internal/service/gateway/rpcclient/clients.go @@ -37,7 +37,7 @@ func Prepare(ctx context.Context, logger mlogger.Logger, networks []shared.Netwo name := strings.ToLower(strings.TrimSpace(network.Name)) rpcURL := strings.TrimSpace(network.RPCURL) if name == "" { - clientLogger.Warn("skipping network with empty name during rpc client preparation") + clientLogger.Warn("Skipping network with empty name during rpc client preparation") continue } if rpcURL == "" { @@ -74,7 +74,10 @@ func Prepare(ctx context.Context, logger mlogger.Logger, networks []shared.Netwo } if len(result.clients) == 0 { + clientLogger.Warn("No rpc clients were initialised") return nil, merrors.InvalidArgument("no rpc clients initialised") + } else { + clientLogger.Info("RPC clients initialised", zap.Int("count", len(result.clients))) } return result, nil diff --git a/api/gateway/chain/internal/service/gateway/rpcclient/registry.go b/api/gateway/chain/internal/service/gateway/rpcclient/registry.go new file mode 100644 index 0000000..8ccf4c4 --- /dev/null +++ b/api/gateway/chain/internal/service/gateway/rpcclient/registry.go @@ -0,0 +1,45 @@ +package rpcclient + +import ( + "strings" + + "github.com/ethereum/go-ethereum/ethclient" + "github.com/tech/sendico/gateway/chain/internal/service/gateway/shared" + "github.com/tech/sendico/pkg/merrors" +) + +// Registry binds static network metadata with prepared RPC clients. +type Registry struct { + networks map[string]shared.Network + clients *Clients +} + +// NewRegistry constructs a registry keyed by lower-cased network name. +func NewRegistry(networks map[string]shared.Network, clients *Clients) *Registry { + return &Registry{ + networks: networks, + clients: clients, + } +} + +// Network fetches network metadata by key (case-insensitive). +func (r *Registry) Network(key string) (shared.Network, bool) { + if r == nil || len(r.networks) == 0 { + return shared.Network{}, false + } + n, ok := r.networks[strings.ToLower(strings.TrimSpace(key))] + return n, ok +} + +// Client returns the prepared RPC client for the given network name. +func (r *Registry) Client(key string) (*ethclient.Client, error) { + if r == nil || r.clients == nil { + return nil, merrors.Internal("rpc clients not initialised") + } + return r.clients.Client(strings.ToLower(strings.TrimSpace(key))) +} + +// Networks exposes the registry map for iteration when needed. +func (r *Registry) Networks() map[string]shared.Network { + return r.networks +} diff --git a/api/gateway/chain/internal/service/gateway/service.go b/api/gateway/chain/internal/service/gateway/service.go index d6b0a62..a23e506 100644 --- a/api/gateway/chain/internal/service/gateway/service.go +++ b/api/gateway/chain/internal/service/gateway/service.go @@ -7,6 +7,7 @@ import ( "github.com/tech/sendico/gateway/chain/internal/service/gateway/commands" "github.com/tech/sendico/gateway/chain/internal/service/gateway/commands/transfer" "github.com/tech/sendico/gateway/chain/internal/service/gateway/commands/wallet" + "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" "github.com/tech/sendico/pkg/api/routers" @@ -38,11 +39,13 @@ type Service struct { settings CacheSettings - networks map[string]shared.Network - serviceWallet shared.ServiceWallet - keyManager keymanager.Manager - executor TransferExecutor - commands commands.Registry + networks map[string]shared.Network + serviceWallet shared.ServiceWallet + keyManager keymanager.Manager + executor TransferExecutor + rpcClients *rpcclient.Clients + networkRegistry *rpcclient.Registry + commands commands.Registry chainv1.UnimplementedChainGatewayServiceServer } @@ -73,6 +76,7 @@ func NewService(logger mlogger.Logger, repo storage.Repository, producer msg.Pro svc.networks = map[string]shared.Network{} } svc.settings = svc.settings.withDefaults() + svc.networkRegistry = rpcclient.NewRegistry(svc.networks, svc.rpcClients) svc.commands = commands.NewRegistry(commands.RegistryDeps{ Wallet: commandsWalletDeps(svc), @@ -131,7 +135,7 @@ func (s *Service) ensureRepository(ctx context.Context) error { func commandsWalletDeps(s *Service) wallet.Deps { return wallet.Deps{ Logger: s.logger.Named("command"), - Networks: s.networks, + Networks: s.networkRegistry, KeyManager: s.keyManager, Storage: s.storage, Clock: s.clock, @@ -143,7 +147,7 @@ func commandsWalletDeps(s *Service) wallet.Deps { func commandsTransferDeps(s *Service) transfer.Deps { return transfer.Deps{ Logger: s.logger.Named("transfer_cmd"), - Networks: s.networks, + Networks: s.networkRegistry, Storage: s.storage, Clock: s.clock, EnsureRepository: s.ensureRepository, diff --git a/api/pkg/api/routers/gsresponse/response_test.go b/api/pkg/api/routers/gsresponse/response_test.go index dba8d04..852f666 100644 --- a/api/pkg/api/routers/gsresponse/response_test.go +++ b/api/pkg/api/routers/gsresponse/response_test.go @@ -6,9 +6,9 @@ import ( "fmt" "testing" + "github.com/stretchr/testify/require" "github.com/tech/sendico/pkg/merrors" "github.com/tech/sendico/pkg/mservice" - "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson/primitive" "go.uber.org/zap" "google.golang.org/grpc/codes" @@ -32,7 +32,7 @@ func TestUnarySuccess(t *testing.T) { return Success(resp) } - unary := Unary[testRequest, testResponse](logger, mservice.Type("test"), handler) + unary := Unary(logger, mservice.Type("test"), handler) resp, err := unary(context.Background(), &testRequest{Value: "hello"}) require.NoError(t, err) require.NotNil(t, resp) diff --git a/api/server/go.mod b/api/server/go.mod index 28a0691..e1cb966 100644 --- a/api/server/go.mod +++ b/api/server/go.mod @@ -14,7 +14,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.41.0 github.com/aws/aws-sdk-go-v2/config v1.32.6 github.com/aws/aws-sdk-go-v2/credentials v1.19.6 - github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0 + github.com/aws/aws-sdk-go-v2/service/s3 v1.95.0 github.com/go-chi/chi/v5 v5.2.3 github.com/go-chi/cors v1.2.2 github.com/go-chi/jwtauth/v5 v5.3.3 diff --git a/api/server/go.sum b/api/server/go.sum index b6677c4..acfb903 100644 --- a/api/server/go.sum +++ b/api/server/go.sum @@ -32,8 +32,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 h1:oHjJHeUy github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16/go.mod h1:iRSNGgOYmiYwSCXxXaKb9HfOEj40+oTKn8pTxMlYkRM= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 h1:NSbvS17MlI2lurYgXnCOLvCFX38sBW4eiVER7+kkgsU= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16/go.mod h1:SwT8Tmqd4sA6G1qaGdzWCJN99bUmPGHfRwwq3G5Qb+A= -github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0 h1:SWTxh/EcUCDVqi/0s26V6pVUq0BBG7kx0tDTmF/hCgA= -github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0/go.mod h1:79S2BdqCJpScXZA2y+cpZuocWsjGjJINyXnOsf5DTz8= +github.com/aws/aws-sdk-go-v2/service/s3 v1.95.0 h1:MIWra+MSq53CFaXXAywB2qg9YvVZifkk6vEGl/1Qor0= +github.com/aws/aws-sdk-go-v2/service/s3 v1.95.0/go.mod h1:79S2BdqCJpScXZA2y+cpZuocWsjGjJINyXnOsf5DTz8= github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ= github.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU= github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 h1:aM/Q24rIlS3bRAhTyFurowU8A0SMyGDtEOY/l/s/1Uw= diff --git a/frontend/pweb/pubspec.yaml b/frontend/pweb/pubspec.yaml index 845e5b6..90c6636 100644 --- a/frontend/pweb/pubspec.yaml +++ b/frontend/pweb/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 2.2.0+14 +version: 2.2.1+14 environment: sdk: ^3.8.1 diff --git a/version b/version index e3a4f19..fae692e 100644 --- a/version +++ b/version @@ -1 +1 @@ -2.2.0 \ No newline at end of file +2.2.1 \ No newline at end of file