import { join } from "node:path"; import type { DataSourceOptions } from "typeorm"; import { SnakeNamingStrategy } from "typeorm-naming-strategies"; import { AdaptiveCurveIrmBorrowRateUpdate, Block, CreateMorphoChainlinkOracleV2Model, EnableIrm, EnableLltv, FlashLoan, IncrementNonce, MarketAccrueInterest, MarketBorrow, MarketCreateMarket, MarketLiquidate, MarketRepay, MarketSetFee, MarketSupply, MarketSupplyCollateral, MarketWithdraw, MarketWithdrawCollateral, MorphoVaultV1AdapterFactoryCreateMorphoVaultV1Adapter, MorphoVaultV1AdapterSetSkimRecipient, MorphoVaultV1AdapterSkim, PreLiquidationCreate, PreLiquidationPreLiquidate, PublicAllocatorFlowCaps, PublicAllocatorPublicReallocateTo, PublicAllocatorPublicWithdrawal, PublicAllocatorSetAdmin, PublicAllocatorSetFee, PublicAllocatorSetFlowCaps, PublicAllocatorTransferFee, SetAuthorization, SetFeeRecipient, SetOwner, VaultAccrueInterest, VaultAdminEvent, VaultCreateMetaMorpho, VaultDeposit, VaultOwnershipTransferStarted, VaultOwnershipTransferred, VaultReallocateSupply, VaultReallocateWithdraw, VaultRevokePendingCap, VaultRevokePendingGuardian, VaultRevokePendingMarketRemoval, VaultRevokePendingTimelock, VaultSetCap, VaultSetCurator, VaultSetFee, VaultSetFeeRecipient, VaultSetGuardian, VaultSetIsAllocator, VaultSetName, VaultSetSkimRecipient, VaultSetSupplyQueue, VaultSetSymbol, VaultSetTimelock, VaultSetWithdrawQueue, VaultSkim, VaultSubmitCap, VaultSubmitGuardian, VaultSubmitMarketRemoval, VaultSubmitTimelock, VaultTransfer, VaultUpdateLastTotalAssets, VaultUpdateLostAssets, VaultV2Abdicate, VaultV2AbsoluteCap, VaultV2Accept, VaultV2AccrueInterest, VaultV2AdapterRegistry, VaultV2AddAdapter, VaultV2Allocate, VaultV2Allocator, VaultV2AllowanceUpdatedByTransferFrom, VaultV2Approval, VaultV2AssetTransfer, VaultV2Constructor, VaultV2Curator, VaultV2Deallocate, VaultV2DecreaseAbsoluteCap, VaultV2DecreaseRelativeCap, VaultV2DecreaseTimelock, VaultV2Deposit, VaultV2FactoryCreateVaultV2, VaultV2ForceDeallocate, VaultV2IdleAssets, VaultV2IncreaseAbsoluteCap, VaultV2IncreaseRelativeCap, VaultV2IncreaseTimelock, VaultV2LastAccruedTotalAssets, VaultV2LiquidityAdapterAndData, VaultV2ManagementFee, VaultV2ManagementFeeRecipient, VaultV2MaxRate, VaultV2Name, VaultV2Owner, VaultV2PerformanceFee, VaultV2PerformanceFeeRecipient, VaultV2Permit, VaultV2RelativeCap, VaultV2RemoveAdapter, VaultV2Revoke, VaultV2Sentinel, VaultV2SetAdapterRegistry, VaultV2SetCurator, VaultV2SetForceDeallocatePenalty, VaultV2SetIsAllocator, VaultV2SetIsSentinel, VaultV2SetLiquidityAdapterAndData, VaultV2SetManagementFee, VaultV2SetManagementFeeRecipient, VaultV2SetMaxRate, VaultV2SetName, VaultV2SetOwner, VaultV2SetPerformanceFee, VaultV2SetPerformanceFeeRecipient, VaultV2SetReceiveAssetsGate, VaultV2SetReceiveSharesGate, VaultV2SetSendAssetsGate, VaultV2SetSendSharesGate, VaultV2SetSymbol, VaultV2Submit, VaultV2Symbol, VaultV2Timelock, VaultV2Transfer, VaultV2Withdraw, VaultWithdraw, } from "./entities"; export const entities = [ AdaptiveCurveIrmBorrowRateUpdate, Block, CreateMorphoChainlinkOracleV2Model, EnableIrm, EnableLltv, FlashLoan, IncrementNonce, MarketAccrueInterest, MarketBorrow, MarketCreateMarket, MarketLiquidate, MarketRepay, MarketSetFee, MarketSupply, MarketSupplyCollateral, MarketWithdraw, MarketWithdrawCollateral, PreLiquidationCreate, PreLiquidationPreLiquidate, PublicAllocatorFlowCaps, PublicAllocatorPublicReallocateTo, PublicAllocatorPublicWithdrawal, PublicAllocatorSetAdmin, PublicAllocatorSetFee, PublicAllocatorSetFlowCaps, PublicAllocatorTransferFee, SetAuthorization, SetFeeRecipient, SetOwner, VaultAccrueInterest, VaultAdminEvent, VaultCreateMetaMorpho, VaultDeposit, VaultOwnershipTransferStarted, VaultOwnershipTransferred, VaultReallocateSupply, VaultReallocateWithdraw, VaultRevokePendingCap, VaultRevokePendingGuardian, VaultRevokePendingMarketRemoval, VaultRevokePendingTimelock, VaultSetCap, VaultSetCurator, VaultSetFee, VaultSetFeeRecipient, VaultSetGuardian, VaultSetIsAllocator, VaultSetName, VaultSetSkimRecipient, VaultSetSupplyQueue, VaultSetSymbol, VaultSetTimelock, VaultSetWithdrawQueue, VaultSkim, VaultSubmitCap, VaultSubmitGuardian, VaultSubmitMarketRemoval, VaultSubmitTimelock, VaultTransfer, VaultUpdateLastTotalAssets, VaultUpdateLostAssets, VaultWithdraw, MorphoVaultV1AdapterFactoryCreateMorphoVaultV1Adapter, MorphoVaultV1AdapterSetSkimRecipient, MorphoVaultV1AdapterSkim, VaultV2Abdicate, VaultV2Accept, VaultV2AccrueInterest, VaultV2AddAdapter, VaultV2Allocate, VaultV2AllowanceUpdatedByTransferFrom, VaultV2Approval, VaultV2Constructor, VaultV2Deallocate, VaultV2DecreaseAbsoluteCap, VaultV2DecreaseRelativeCap, VaultV2DecreaseTimelock, VaultV2Deposit, VaultV2FactoryCreateVaultV2, VaultV2ForceDeallocate, VaultV2IncreaseAbsoluteCap, VaultV2IncreaseRelativeCap, VaultV2IncreaseTimelock, VaultV2Permit, VaultV2RemoveAdapter, VaultV2Revoke, VaultV2SetAdapterRegistry, VaultV2SetCurator, VaultV2SetForceDeallocatePenalty, VaultV2SetIsAllocator, VaultV2SetIsSentinel, VaultV2SetLiquidityAdapterAndData, VaultV2SetManagementFee, VaultV2SetManagementFeeRecipient, VaultV2SetMaxRate, VaultV2SetName, VaultV2SetOwner, VaultV2SetPerformanceFee, VaultV2SetPerformanceFeeRecipient, VaultV2SetReceiveAssetsGate, VaultV2SetReceiveSharesGate, VaultV2SetSendAssetsGate, VaultV2SetSendSharesGate, VaultV2SetSymbol, VaultV2Submit, VaultV2Transfer, VaultV2Withdraw, VaultV2AssetTransfer, /* Vault V2 views */ VaultV2Curator, VaultV2LiquidityAdapterAndData, VaultV2ManagementFee, VaultV2ManagementFeeRecipient, VaultV2MaxRate, VaultV2Name, VaultV2Owner, VaultV2PerformanceFee, VaultV2PerformanceFeeRecipient, VaultV2Symbol, VaultV2Timelock, VaultV2Allocator, VaultV2Sentinel, VaultV2AdapterRegistry, VaultV2LastAccruedTotalAssets, VaultV2AbsoluteCap, VaultV2RelativeCap, VaultV2IdleAssets, ]; export const dataSourceOptions = (env = process.env): DataSourceOptions => { const hasDbParams = Boolean(env.DB_NAME && env.DB_HOST && env.DB_PORT && env.DB_USER && env.DB_PASSWORD); if (!env.DB_URL && !hasDbParams) throw Error( "Database configuration missing. Please provide either DB_URL or all of: DB_NAME, DB_HOST, DB_PORT, DB_USER, DB_PASSWORD", ); const masterDbUrl = env.DB_URL ?? `postgresql://${env.DB_USER!}:${encodeURIComponent(env.DB_PASSWORD!)}@${env.DB_HOST!}:${env.DB_PORT!}/${env.DB_NAME!}`; const replicaDbUrl = env.READ_REPLICA_DATABASE_URL; return { type: "postgres", entities, migrations: [join(__dirname, "migrations", "*.{ts,js}")], migrationsTableName: "typeorm_migrations", logging: env.NODE_ENV === "development" || ["error", "warn"], synchronize: false, migrationsRun: false, schema: env.DB_SCHEMA || "indexer", namingStrategy: new SnakeNamingStrategy(), ssl: env.NODE_ENV === "production" ? { rejectUnauthorized: false } : false, ...(replicaDbUrl ? { replication: { master: { url: masterDbUrl }, slaves: [{ url: replicaDbUrl }], }, } : { url: masterDbUrl }), }; };