removed dead vars + front tracing

This commit is contained in:
Stephan D
2026-03-17 12:06:46 +01:00
parent b4cdd87ff3
commit aed45e23e1
17 changed files with 135 additions and 179 deletions

View File

@@ -4,7 +4,6 @@ matrix:
CHAIN_GATEWAY_DOCKERFILE: ci/prod/compose/chain_gateway.dockerfile
CHAIN_GATEWAY_MONGO_SECRET_PATH: sendico/db
CHAIN_GATEWAY_RPC_SECRET_PATH: sendico/gateway/chain
CHAIN_GATEWAY_WALLET_SECRET_PATH: sendico/gateway/chain/wallet
CHAIN_GATEWAY_VAULT_SECRET_PATH: sendico/gateway/chain/vault
labels:

View File

@@ -56,11 +56,6 @@ chains:
- symbol: USDC
contract: "0x75faf114eafb1bdbe2f0316df893fd58ce46aa4d"
service_wallet:
chain: arbitrum_sepolia
address_env: CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS
private_key_env: CHAIN_GATEWAY_SERVICE_WALLET_KEY
key_management:
driver: vault
settings:

View File

@@ -53,11 +53,6 @@ chains:
- symbol: USDC
contract: "0xaf88d065e77c8cc2239327c5edb3a432268e5831"
service_wallet:
chain: arbitrum_one
address_env: CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS
private_key_env: CHAIN_GATEWAY_SERVICE_WALLET_KEY
key_management:
driver: vault
settings:

View File

@@ -43,7 +43,6 @@ type Imp struct {
type config struct {
*grpcapp.Config `yaml:",inline"`
Chains []chainConfig `yaml:"chains"`
ServiceWallet serviceWalletConfig `yaml:"service_wallet"`
KeyManagement keymanager.Config `yaml:"key_management"`
Settings gatewayservice.CacheSettings `yaml:"cache"`
}
@@ -57,13 +56,6 @@ type chainConfig struct {
GasTopUpPolicy *gasTopUpPolicyConfig `yaml:"gas_topup_policy"`
}
type serviceWalletConfig struct {
Chain pmodel.ChainNetwork `yaml:"chain"`
Address string `yaml:"address"`
AddressEnv string `yaml:"address_env"`
PrivateKeyEnv string `yaml:"private_key_env"`
}
type tokenConfig struct {
Symbol string `yaml:"symbol"`
Contract string `yaml:"contract"`
@@ -138,7 +130,6 @@ func (i *Imp) Start() error {
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 {
return err
@@ -156,7 +147,6 @@ func (i *Imp) Start() error {
opts := []gatewayservice.Option{
gatewayservice.WithDiscoveryInvokeURI(invokeURI),
gatewayservice.WithNetworks(networkConfigs),
gatewayservice.WithServiceWallet(walletConfig),
gatewayservice.WithKeyManager(keyManager),
gatewayservice.WithRPCClients(rpcClients),
gatewayservice.WithDriverRegistry(driverRegistry),
@@ -325,32 +315,6 @@ func parseGasTopUpRule(chainName pmodel.ChainNetwork, label string, cfg gasTopUp
}, true, nil
}
func resolveServiceWallet(logger mlogger.Logger, cfg serviceWalletConfig) gatewayshared.ServiceWallet {
address := strings.TrimSpace(cfg.Address)
if address == "" && cfg.AddressEnv != "" {
address = strings.TrimSpace(os.Getenv(cfg.AddressEnv))
}
privateKey := strings.TrimSpace(os.Getenv(cfg.PrivateKeyEnv))
if address == "" {
if cfg.AddressEnv != "" {
logger.Warn("Service wallet address not configured", zap.String("env", cfg.AddressEnv))
} else {
logger.Warn("Service wallet address not configured", zap.String("chain", string(cfg.Chain)))
}
}
if privateKey == "" {
logger.Warn("Service wallet private key not configured", zap.String("env", cfg.PrivateKeyEnv))
}
return gatewayshared.ServiceWallet{
Network: cfg.Chain,
Address: address,
PrivateKey: privateKey,
}
}
func resolveKeyManager(logger mlogger.Logger, cfg keymanager.Config) (keymanager.Manager, error) {
driver := strings.ToLower(strings.TrimSpace(string(cfg.Driver)))
if driver == "" {

View File

@@ -55,13 +55,6 @@ func WithNetworks(networks []shared.Network) Option {
}
}
// WithServiceWallet configures the service wallet binding.
func WithServiceWallet(wallet shared.ServiceWallet) Option {
return func(s *Service) {
s.serviceWallet = wallet
}
}
// WithDriverRegistry configures the chain driver registry.
func WithDriverRegistry(registry *drivers.Registry) Option {
return func(s *Service) {

View File

@@ -49,7 +49,6 @@ type Service struct {
outbox gatewayoutbox.ReliableRuntime
networks map[pmodel.ChainNetwork]shared.Network
serviceWallet shared.ServiceWallet
keyManager keymanager.Manager
rpcClients *rpcclient.Clients
networkRegistry *rpcclient.Registry

View File

@@ -700,7 +700,6 @@ func newTestServiceWithRepository(t *testing.T, repo storage.Repository) *Servic
svc := NewService(logger, repo, nil,
WithKeyManager(&fakeKeyManager{}),
WithNetworks(networks),
WithServiceWallet(shared.ServiceWallet{Network: "ethereum_mainnet", Address: "0xservice"}),
WithDriverRegistry(driverRegistry),
)
return svc

View File

@@ -201,13 +201,6 @@ type TokenContract struct {
ContractAddress string
}
// ServiceWallet captures the managed service wallet configuration.
type ServiceWallet struct {
Network pmodel.ChainNetwork
Address string
PrivateKey string
}
func ProtoToMoney(money *moneyv1.Money) *paymenttypes.Money {
if money == nil {
return &paymenttypes.Money{}

View File

@@ -5,6 +5,7 @@ API_PROTOCOL=https
SERVICE_HOST=dev.sendico.io
WS_PROTOCOL=wss
CADDY_ACME_CA=https://acme-v02.api.letsencrypt.org/directory
FRONTEND_FLUTTER_BUILD_ARGS=--source-maps
SSH_HOST=178.57.67.136
SSH_USER=cloud

View File

@@ -46,8 +46,6 @@ services:
NATS_USER: ${NATS_USER}
NATS_PASSWORD: ${NATS_PASSWORD}
CHAIN_GATEWAY_RPC_URL: ${CHAIN_GATEWAY_RPC_URL}
CHAIN_GATEWAY_SERVICE_WALLET_KEY: ${CHAIN_GATEWAY_SERVICE_WALLET_KEY}
CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS: ${CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS}
VAULT_TOKEN_FILE: /run/vault/token
command: ["--config.file", "/app/config.yml"]
ports:

View File

@@ -2,6 +2,8 @@
FROM dart:latest AS web_builder
ARG FRONTEND_FLUTTER_BUILD_ARGS=""
RUN apt-get update && apt-get install -y --no-install-recommends \
git \
curl \
@@ -36,7 +38,7 @@ RUN flutter clean \
WORKDIR /home/flutteruser/app/pweb
RUN flutter clean \
&& flutter pub get \
&& flutter build web --release --no-tree-shake-icons
&& flutter build web --release --no-tree-shake-icons ${FRONTEND_FLUTTER_BUILD_ARGS}
FROM caddy:alpine AS runtime

View File

@@ -20,8 +20,6 @@ REQUIRED_SECRETS=(
CHAIN_GATEWAY_MONGO_USER
CHAIN_GATEWAY_MONGO_PASSWORD
CHAIN_GATEWAY_RPC_URL
CHAIN_GATEWAY_SERVICE_WALLET_KEY
CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS
NATS_USER
NATS_PASSWORD
NATS_URL
@@ -46,8 +44,6 @@ b64enc() {
CHAIN_GATEWAY_MONGO_USER_B64="$(b64enc "${CHAIN_GATEWAY_MONGO_USER}")"
CHAIN_GATEWAY_MONGO_PASSWORD_B64="$(b64enc "${CHAIN_GATEWAY_MONGO_PASSWORD}")"
CHAIN_GATEWAY_RPC_URL_B64="$(b64enc "${CHAIN_GATEWAY_RPC_URL}")"
CHAIN_GATEWAY_SERVICE_WALLET_KEY_B64="$(b64enc "${CHAIN_GATEWAY_SERVICE_WALLET_KEY}")"
CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS_B64="$(b64enc "${CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS}")"
CHAIN_GATEWAY_VAULT_ROLE_ID_B64="$(b64enc "${CHAIN_GATEWAY_VAULT_ROLE_ID:-}")"
CHAIN_GATEWAY_VAULT_SECRET_ID_B64="$(b64enc "${CHAIN_GATEWAY_VAULT_SECRET_ID:-}")"
NATS_USER_B64="$(b64enc "${NATS_USER}")"
@@ -87,8 +83,6 @@ ssh "${SSH_OPTS[@]}" "$REMOTE_TARGET" \
CHAIN_GATEWAY_MONGO_USER_B64="$CHAIN_GATEWAY_MONGO_USER_B64" \
CHAIN_GATEWAY_MONGO_PASSWORD_B64="$CHAIN_GATEWAY_MONGO_PASSWORD_B64" \
CHAIN_GATEWAY_RPC_URL_B64="$CHAIN_GATEWAY_RPC_URL_B64" \
CHAIN_GATEWAY_SERVICE_WALLET_KEY_B64="$CHAIN_GATEWAY_SERVICE_WALLET_KEY_B64" \
CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS_B64="$CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS_B64" \
CHAIN_GATEWAY_VAULT_ROLE_ID_B64="$CHAIN_GATEWAY_VAULT_ROLE_ID_B64" \
CHAIN_GATEWAY_VAULT_SECRET_ID_B64="$CHAIN_GATEWAY_VAULT_SECRET_ID_B64" \
NATS_USER_B64="$NATS_USER_B64" \
@@ -144,8 +138,6 @@ decode_b64() {
CHAIN_GATEWAY_MONGO_USER="$(decode_b64 "$CHAIN_GATEWAY_MONGO_USER_B64")"
CHAIN_GATEWAY_MONGO_PASSWORD="$(decode_b64 "$CHAIN_GATEWAY_MONGO_PASSWORD_B64")"
CHAIN_GATEWAY_RPC_URL="$(decode_b64 "$CHAIN_GATEWAY_RPC_URL_B64")"
CHAIN_GATEWAY_SERVICE_WALLET_KEY="$(decode_b64 "$CHAIN_GATEWAY_SERVICE_WALLET_KEY_B64")"
CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS="$(decode_b64 "$CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS_B64")"
NATS_USER="$(decode_b64 "$NATS_USER_B64")"
NATS_PASSWORD="$(decode_b64 "$NATS_PASSWORD_B64")"
NATS_URL="$(decode_b64 "$NATS_URL_B64")"
@@ -159,7 +151,6 @@ fi
export CHAIN_GATEWAY_MONGO_USER CHAIN_GATEWAY_MONGO_PASSWORD
export CHAIN_GATEWAY_RPC_URL
export CHAIN_GATEWAY_SERVICE_WALLET_KEY CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS
export CHAIN_GATEWAY_VAULT_ROLE_ID CHAIN_GATEWAY_VAULT_SECRET_ID
export NATS_USER NATS_PASSWORD NATS_URL
if [[ -z "${CHAIN_GATEWAY_VAULT_ROLE_ID:-}" || -z "${CHAIN_GATEWAY_VAULT_SECRET_ID:-}" ]]; then

View File

@@ -156,11 +156,6 @@ if [[ -f ../env/dev-vault-seed.env ]]; then
vault kv put -mount=kv sendico/gateway/chain \
arbitrum_rpc_url="$(decode_b64 "${CHAIN_GATEWAY_RPC_URL_B64:-}")" >/dev/null
docker exec -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_TOKEN="${ROOT_TOKEN}" dev-vault \
vault kv put -mount=kv sendico/gateway/chain/wallet \
private_key="$(decode_b64 "${CHAIN_GATEWAY_WALLET_PRIVATE_KEY_B64:-}")" \
address="$(decode_b64 "${CHAIN_GATEWAY_WALLET_ADDRESS_B64:-}")" >/dev/null
docker exec -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_TOKEN="${ROOT_TOKEN}" dev-vault \
vault kv put -mount=kv sendico/gateway/tron \
rpc_url="$(decode_b64 "${TRON_GATEWAY_RPC_URL_B64:-}")" \

View File

@@ -40,7 +40,6 @@ load_runtime_env_bundle "${CHAIN_GATEWAY_ENV_NAME}"
CHAIN_GATEWAY_MONGO_SECRET_PATH="${CHAIN_GATEWAY_MONGO_SECRET_PATH:?missing CHAIN_GATEWAY_MONGO_SECRET_PATH}"
CHAIN_GATEWAY_RPC_SECRET_PATH="${CHAIN_GATEWAY_RPC_SECRET_PATH:?missing CHAIN_GATEWAY_RPC_SECRET_PATH}"
CHAIN_GATEWAY_WALLET_SECRET_PATH="${CHAIN_GATEWAY_WALLET_SECRET_PATH:?missing CHAIN_GATEWAY_WALLET_SECRET_PATH}"
CHAIN_GATEWAY_VAULT_SECRET_PATH="${CHAIN_GATEWAY_VAULT_SECRET_PATH:?missing CHAIN_GATEWAY_VAULT_SECRET_PATH}"
export CHAIN_GATEWAY_MONGO_USER="$(sh ci/scripts/common/runtime_kv_get.sh kv_get kv "${CHAIN_GATEWAY_MONGO_SECRET_PATH}" user)"
@@ -48,9 +47,6 @@ export CHAIN_GATEWAY_MONGO_PASSWORD="$(sh ci/scripts/common/runtime_kv_get.sh kv
export CHAIN_GATEWAY_RPC_URL="$(sh ci/scripts/common/runtime_kv_get.sh kv_get kv "${CHAIN_GATEWAY_RPC_SECRET_PATH}" arbitrum_rpc_url)"
export CHAIN_GATEWAY_SERVICE_WALLET_KEY="$(sh ci/scripts/common/runtime_kv_get.sh kv_get kv "${CHAIN_GATEWAY_WALLET_SECRET_PATH}" private_key)"
export CHAIN_GATEWAY_SERVICE_WALLET_ADDRESS="$(sh ci/scripts/common/runtime_kv_get.sh kv_get kv "${CHAIN_GATEWAY_WALLET_SECRET_PATH}" address || true)"
if [ "${CI_RUNTIME_ENV_NAME:-prod}" != "devserver" ]; then
export CHAIN_GATEWAY_VAULT_ROLE_ID="$(sh ci/scripts/common/runtime_kv_get.sh kv_get kv "${CHAIN_GATEWAY_VAULT_SECRET_PATH}" role_id)"
export CHAIN_GATEWAY_VAULT_SECRET_ID="$(sh ci/scripts/common/runtime_kv_get.sh kv_get kv "${CHAIN_GATEWAY_VAULT_SECRET_PATH}" secret_id)"

View File

@@ -70,6 +70,7 @@ fi
--dockerfile "${FRONTEND_DOCKERFILE}" \
--destination "${REGISTRY_URL}/${FRONTEND_IMAGE_PATH}:${IMAGE_TAG}" \
--build-arg APP_VERSION="${APP_V}" \
--build-arg FRONTEND_FLUTTER_BUILD_ARGS="${FRONTEND_FLUTTER_BUILD_ARGS:-}" \
--build-arg GIT_REV="${GIT_REV}" \
--build-arg BUILD_BRANCH="${BUILD_BRANCH}" \
--build-arg BUILD_DATE="${BUILD_DATE}" \

View File

@@ -74,8 +74,6 @@ seed_field NOTIFICATION_TELEGRAM_BOT_TOKEN_B64 sendico/notification/telegram bot
seed_field NOTIFICATION_TELEGRAM_CHAT_ID_B64 sendico/notification/telegram chat_id
seed_field NOTIFICATION_TELEGRAM_THREAD_ID_B64 sendico/notification/telegram thread_id 1
seed_field CHAIN_GATEWAY_RPC_URL_B64 sendico/gateway/chain arbitrum_rpc_url
seed_field CHAIN_GATEWAY_WALLET_PRIVATE_KEY_B64 sendico/gateway/chain/wallet private_key
seed_field CHAIN_GATEWAY_WALLET_ADDRESS_B64 sendico/gateway/chain/wallet address 1
seed_field TRON_GATEWAY_RPC_URL_B64 sendico/gateway/tron rpc_url
seed_field TRON_GATEWAY_GRPC_URL_B64 sendico/gateway/tron grpc_url 1
seed_field TRON_GATEWAY_GRPC_TOKEN_B64 sendico/gateway/tron grpc_token 1

View File

@@ -1,3 +1,5 @@
import 'dart:ui' show PlatformDispatcher;
import 'package:flutter/material.dart';
// ignore: depend_on_referenced_packages
@@ -35,6 +37,8 @@ import 'package:pweb/services/posthog.dart';
import 'package:pweb/providers/account.dart';
import 'package:pweb/providers/locale.dart';
final _bootstrapLogger = Logger('bootstrap');
void _setupLogging() {
Logger.root.level = Level.ALL;
Logger.root.onRecord.listen((record) {
@@ -45,102 +49,135 @@ void _setupLogging() {
});
}
void _setupErrorHandling() {
FlutterError.onError = (details) {
FlutterError.presentError(details);
_bootstrapLogger.severe(
'FlutterError: ${details.exceptionAsString()}',
details.exception,
details.stack,
);
};
PlatformDispatcher.instance.onError = (error, stack) {
_bootstrapLogger.severe('Uncaught platform error', error, stack);
return false;
};
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Constants.initialize();
await PosthogService.initialize();
_setupLogging();
setUrlStrategy(PathUrlStrategy());
GoRouter.optionURLReflectsImperativeAPIs = true;
_setupErrorHandling();
initializeTimeagoLocales();
try {
await Constants.initialize();
await PosthogService.initialize();
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider<LocaleProvider>(
create: (_) => PwebLocaleProvider(null),
),
ChangeNotifierProxyProvider<LocaleProvider, AccountProvider>(
create: (_) => PwebAccountProvider(),
update: (context, localeProvider, provider) =>
provider!..updateProvider(localeProvider),
),
ChangeNotifierProxyProvider<AccountProvider, TwoFactorProvider>(
create: (_) => TwoFactorProvider(),
update: (context, accountProvider, provider) =>
provider!..update(accountProvider),
),
ChangeNotifierProxyProvider<AccountProvider, OrganizationsProvider>(
//TODO controll scope of the provider
create: (_) => OrganizationsProvider(),
lazy: false,
update: (_, accountProvider, organizations) =>
organizations!..updateAccount(accountProvider),
),
ChangeNotifierProxyProvider<OrganizationsProvider, PermissionsProvider>(
create: (_) => PermissionsProvider(),
update: (context, orgnization, provider) =>
provider!..update(orgnization),
),
ChangeNotifierProxyProvider<OrganizationsProvider, EmployeesProvider>(
create: (_) => EmployeesProvider(),
update: (context, organizations, provider) =>
provider!..updateProviders(organizations),
),
ChangeNotifierProxyProvider<OrganizationsProvider, PaymentsProvider>(
create: (_) => PaymentsProvider(),
update: (context, organizations, provider) =>
provider!..update(organizations),
),
ChangeNotifierProvider(create: (_) => EmailVerificationProvider()),
ChangeNotifierProxyProvider<OrganizationsProvider, RecipientsProvider>(
create: (_) => RecipientsProvider(),
update: (context, organizations, provider) =>
provider!..updateProviders(organizations),
),
ChangeNotifierProxyProvider<OrganizationsProvider, InvitationsProvider>(
create: (_) => InvitationsProvider(),
update: (context, organizations, provider) =>
provider!..updateProviders(organizations),
),
ChangeNotifierProxyProvider2<
OrganizationsProvider,
RecipientsProvider,
PaymentMethodsProvider
>(
create: (_) => PaymentMethodsProvider(),
update: (context, organizations, recipients, provider) =>
provider!..updateProviders(organizations, recipients),
),
ChangeNotifierProvider(create: (_) => InvitationListViewModel()),
ChangeNotifierProxyProvider<OrganizationsProvider, WalletsProvider>(
create: (_) => WalletsProvider(ApiWalletsService()),
update: (context, organizations, provider) =>
provider!..update(organizations),
),
ChangeNotifierProxyProvider<
OrganizationsProvider,
LedgerAccountsProvider
>(
create: (_) => LedgerAccountsProvider(LedgerService()),
update: (context, organizations, provider) =>
provider!..update(organizations),
),
ChangeNotifierProxyProvider<
LedgerAccountsProvider,
LedgerBalanceMaskController
>(
create: (_) => LedgerBalanceMaskController(),
update: (context, ledger, controller) => controller!..update(ledger),
),
ChangeNotifierProxyProvider<WalletsProvider, WalletsController>(
create: (_) => WalletsController(),
update: (_, wallets, controller) => controller!..update(wallets),
),
],
child: const PayApp(),
),
);
setUrlStrategy(PathUrlStrategy());
GoRouter.optionURLReflectsImperativeAPIs = true;
initializeTimeagoLocales();
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider<LocaleProvider>(
create: (_) => PwebLocaleProvider(null),
),
ChangeNotifierProxyProvider<LocaleProvider, AccountProvider>(
create: (_) => PwebAccountProvider(),
update: (context, localeProvider, provider) =>
provider!..updateProvider(localeProvider),
),
ChangeNotifierProxyProvider<AccountProvider, TwoFactorProvider>(
create: (_) => TwoFactorProvider(),
update: (context, accountProvider, provider) =>
provider!..update(accountProvider),
),
ChangeNotifierProxyProvider<AccountProvider, OrganizationsProvider>(
//TODO controll scope of the provider
create: (_) => OrganizationsProvider(),
lazy: false,
update: (_, accountProvider, organizations) =>
organizations!..updateAccount(accountProvider),
),
ChangeNotifierProxyProvider<
OrganizationsProvider,
PermissionsProvider
>(
create: (_) => PermissionsProvider(),
update: (context, orgnization, provider) =>
provider!..update(orgnization),
),
ChangeNotifierProxyProvider<OrganizationsProvider, EmployeesProvider>(
create: (_) => EmployeesProvider(),
update: (context, organizations, provider) =>
provider!..updateProviders(organizations),
),
ChangeNotifierProxyProvider<OrganizationsProvider, PaymentsProvider>(
create: (_) => PaymentsProvider(),
update: (context, organizations, provider) =>
provider!..update(organizations),
),
ChangeNotifierProvider(create: (_) => EmailVerificationProvider()),
ChangeNotifierProxyProvider<
OrganizationsProvider,
RecipientsProvider
>(
create: (_) => RecipientsProvider(),
update: (context, organizations, provider) =>
provider!..updateProviders(organizations),
),
ChangeNotifierProxyProvider<
OrganizationsProvider,
InvitationsProvider
>(
create: (_) => InvitationsProvider(),
update: (context, organizations, provider) =>
provider!..updateProviders(organizations),
),
ChangeNotifierProxyProvider2<
OrganizationsProvider,
RecipientsProvider,
PaymentMethodsProvider
>(
create: (_) => PaymentMethodsProvider(),
update: (context, organizations, recipients, provider) =>
provider!..updateProviders(organizations, recipients),
),
ChangeNotifierProvider(create: (_) => InvitationListViewModel()),
ChangeNotifierProxyProvider<OrganizationsProvider, WalletsProvider>(
create: (_) => WalletsProvider(ApiWalletsService()),
update: (context, organizations, provider) =>
provider!..update(organizations),
),
ChangeNotifierProxyProvider<
OrganizationsProvider,
LedgerAccountsProvider
>(
create: (_) => LedgerAccountsProvider(LedgerService()),
update: (context, organizations, provider) =>
provider!..update(organizations),
),
ChangeNotifierProxyProvider<
LedgerAccountsProvider,
LedgerBalanceMaskController
>(
create: (_) => LedgerBalanceMaskController(),
update: (context, ledger, controller) =>
controller!..update(ledger),
),
ChangeNotifierProxyProvider<WalletsProvider, WalletsController>(
create: (_) => WalletsController(),
update: (_, wallets, controller) => controller!..update(wallets),
),
],
child: const PayApp(),
),
);
} catch (error, stack) {
_bootstrapLogger.severe('Bootstrap failed', error, stack);
rethrow;
}
}