diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1a7212d758..7045b85669 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,9 +29,14 @@ Every PR must include: 2. **Environment/Infrastructure updates** (config, environment variables) 3. **Service updates** (if DTOs/interfaces changed) 4. **Frontend synchronization** (if API contracts changed) +5. **Cron job inventory** (if a `@DfxCron` job was added, removed or re-scheduled) — [docs/cron-jobs.md](docs/cron-jobs.md) Missing any of these = changes requested. +Routes carry a sixth obligation: any change to the set of endpoints — added, removed, renamed or +re-scoped — must be reflected in [docs/endpoints.md](docs/endpoints.md) in the same PR, together +with the `Tests` state of anything converted. See *Endpoint Inventory* below. + ### Before Merge - Fix all linter errors and warnings (never disable lint rules without justification) @@ -510,6 +515,32 @@ export class SupportIssueController { - Status 200 for GET (not 201) - Plain string responses are annoying — return JSON objects +### Endpoint Inventory + +[docs/endpoints.md](docs/endpoints.md) lists every route this service exposes. **Any change to the set of routes must be reflected there in the same PR** — adding, removing, renaming or re-scoping an endpoint, and equally a change to a `@Controller` base path, which moves every route beneath it. + +Two details are easy to get wrong when editing the list by hand: + +- a file may declare more than one `@Controller` class, and a route belongs to the scope that **precedes** it, not to the first one in the file — `custody.controller.ts` declares both `custody` and `custody/admin` +- `@Controller()` without an argument puts its routes at the root, not under a prefix +- a route's version comes from `@Version` on the handler, otherwise from the `@Controller` scope, otherwise the configured default — six paths exist twice under different versions, so method and path alone do not identify a row + +To verify a change, compare against the routes the framework logs at startup: every `Mapped {, }` line is one registered route. If a route you added does not appear there, it is not reachable — two routing decorators on the same handler, for instance, keep only one path. + +[docs/load-sites.md](docs/load-sites.md) is the companion inventory: every place in the code that reads from the database, with the mechanism and the measured column count. It is generated, not hand-maintained, but the rule it documents is worth knowing before writing a query: + +- the `find` family applies eager relations and expands them recursively — a plain `findOne()` on `UserData` already selects 253 columns across 8 joins +- `createQueryBuilder` does not, but still loads every column of the root entity unless `.select([...])` narrows it +- `.select('alias')` is **not** a projection — the argument is the entity alias, not a field list +- a query builder carrying `.update()`, `.delete()` or `.insert()` is a write statement and loads nothing — the same goes for a raw `SELECT pg_advisory_xact_lock(...)`, which returns no rows; neither is part of that inventory + +The target state is that every read path selects the fields it returns and nothing more. Two rules apply while we get there, and both are checked in review: + +- **A read path is converted only when its tests reach `4/4`** against the four levels in [docs/read-path-projections.md](docs/read-path-projections.md). A projection that drops a field does not crash — it answers 200 with a wrong value. Converting without the tests trades a slow query for a silent defect. +- **Record the state in the `Tests` column of [docs/endpoints.md](docs/endpoints.md) in the same PR that changes the code.** An unrecorded conversion is treated as untested. + +See [docs/read-path-projections.md](docs/read-path-projections.md) for the reasoning, the criteria for converting an endpoint, and what each of the four levels asserts. + ### Cron Jobs Use `@DfxCron` (custom wrapper with built-in locking, process control, and error handling). It replaces `@Cron` + `@Lock` + `DisabledProcess` — never combine these manually with `@DfxCron`. @@ -530,6 +561,12 @@ async processPayments(): Promise { } ``` +Declare a `process` flag unless the job maintains the disabled set itself. Without one the job +runs unconditionally and cannot be switched off without a deploy. + +[docs/cron-jobs.md](docs/cron-jobs.md) lists every scheduled job with its interval and flag. +**Adding, removing or re-scheduling a job must be reflected there in the same PR.** + Prefer longer intervals (15min) over aggressive polling (1min). Only use short intervals when truly needed. ### Await Discipline diff --git a/docs/endpoints.md b/docs/endpoints.md new file mode 100644 index 0000000000..f9c00a8dfa --- /dev/null +++ b/docs/endpoints.md @@ -0,0 +1,648 @@ +# HTTP endpoints + +Every HTTP endpoint this service exposes: **534 handlers** across 94 controller files. 296 are marked `@ApiExcludeEndpoint` and do not appear in the public Swagger schema. + +## Columns + +| Column | Meaning | +| ------ | ------- | +| **Ver** | API version in the URL. `1` is the default and needs no decorator; `2` comes from `@Controller({ version: [...] })`; `neutral` marks `@Version(VERSION_NEUTRAL)`, which is served without a version prefix. Six paths exist twice under different versions — an older, deprecated handler and its replacement — so the version is what makes a row unique. | +| **Dep** | `yes` when the handler carries `@ApiOperation({ deprecated: true })` | +| **Swagger** | `public` — in the Swagger schema; `hidden` — carries `@ApiExcludeEndpoint` | +| **Data access** | What the endpoint reads, taken over **all** load sites it can reach — a permission check, a lookup and the actual query all count. `whole rows` — at least one of them fetches every column of an entity; `projected` — every read names the fields it needs; `caller-defined` — the field list comes from the request, and without one every column is loaded; `none` — no read at all (external services, in-memory caches, files, pure write paths). | +| **Max cols** | Widest single query the endpoint can trigger, measured against the real entity metadata. `—` means no measurable site, not zero. | +| **Tests** | State against the four levels in [read-path-projections.md](read-path-projections.md#test-definition). `n/a` — the definition does not apply (the endpoint reads nothing, or its field list comes from the caller); `not yet` — the endpoint has not been converted, so nothing can be missing from it yet; `0/4` to `4/4` — levels satisfied. **A converted endpoint counts as done only at `4/4`.** | +| **Spec** | `yes` when some spec file names this controller and calls this handler. A weak signal and a lower bound — it says a test touches the endpoint, not that it covers it, and it misses specs that drive a route over HTTP without naming the handler. | + +## The target state + +Every read path in this service is to select the fields it returns, and nothing more. This document is the work list for getting there and the record of where we stand. + +Two rules follow from that, and both are binding: + +1. **An endpoint counts as converted only when its tests reach `4/4`** against the four levels in [read-path-projections.md](read-path-projections.md#test-definition). A projection without them is worse than no projection: a forgotten field does not crash, it returns a wrong value with a 200, and in a service moving money that can run for weeks unnoticed. Anything short of `4/4` is unfinished work, not a partial success. +2. **The state of every endpoint is recorded here**, in the `Tests` column, and kept in sync with the code in the same pull request that changes it. An undocumented conversion is indistinguishable from one that was never tested. + +Today 4 endpoints read only what they return and 432 do not, so the column reads `not yet` almost everywhere. That is the point of recording it: the number is the distance to the target. + +## What the numbers say + +| Data access | Endpoints | Share | +| ----------- | --------: | ----: | +| `whole rows` | 432 | 81 % | +| `none` | 98 | 18 % | +| `projected` | 2 | 0 % | +| `caller-defined` | 2 | 0 % | + +Two endpoints read only what they return: `PUT /log/financial/validity`, whose query names `log.id` and `log.valid`, and `POST /gs/debug`, which assembles its select list from the request. `POST /gs/db` and `POST /gs/db/custom` project only when the caller sends a field list — `request.select(query.select)` — and load the full table otherwise. How far the test suite actually covers those reads is recorded per site in [read-path-projections.md](read-path-projections.md#which-endpoints-these-apply-to); the short answer is that the projection behind `PUT /log/financial/validity` is never executed in a test. + +Among the 432 that fetch whole rows, the widest query they can trigger is **308 columns** at the median; 320 exceed 100, 90 exceed 500 and 19 exceed 1000. Postgres refuses a statement with more than 1664 columns, which is what broke every invoice and receipt in production once a single column was added elsewhere. + +### How to read this column, and how not to + +`Data access` is a statement about the **union** of everything an endpoint touches, not about one designated data path. An endpoint marked `whole rows` may well answer from raw SQL and still be marked, because a permission check on the way loads a full `UserData` row. That is deliberate: the question the column answers is *does this endpoint load more than it needs*, and for that any one offending site is enough. It does **not** say where the bulk of the work happens — [load-sites.md](load-sites.md) does, per site and with measured column counts. + +### Deprecation + +24 handlers carry `@ApiOperation({ deprecated: true })`: 21 of them fetch whole rows, 3 read nothing. They are what the duplicated paths are about — an older handler and its replacement served side by side under different versions. Note that deprecation does not follow the version: `GET /kyc/countries` is marked on **both** the v1 and the v2 handler. + +### Limits of this classification + +Stated exactly, so the numbers can be checked rather than believed: + +- **436 of 534 endpoints rest on a call graph that is not fully resolved** — a target chosen at runtime, a method reached through inheritance, an entity manager handed into a transaction callback. This does not weaken the `whole rows` group: an unresolved edge can only add load sites, never remove one, so 432 is a lower bound. +- All 98 endpoints marked `none` are the opposite case: their graph resolved completely, or the remaining target was read in the source (27 of them, listed below). None of them rests on an unresolved edge. +- The 2 `projected` and 2 `caller-defined` endpoints do each carry an unresolved edge — a call through the entity manager inside a transaction callback. Their reads were read in the source, but the classification is not proven exhaustive the way the `none` group is. +- 3 endpoints in the `whole rows` group have no measured column count and show `—`: `POST /payIn/retry`, `GET /support/issue/:id/message/:messageId/file`, `PUT /userData/:id/volumes`. The classification holds; only the width is unknown. + +### Two controller classes may share a name + +`KycController`, `KycClientController` and `KycService` each exist twice, in different subdomains: the deprecated v1 generation under `generic/user/models/kyc/` and the current one under `generic/kyc/`. Rows are therefore not identified by the handler column alone — the file column is what separates them. The same holds for the 57 strategy classes that repeat a name once per family (`BitcoinStrategy` exists eight times), though none of those serves a route. + +### Endpoints resolved by reading the source + +For 27 endpoints the call graph ends at a target chosen at runtime. Each was read in the source and recorded here rather than left unknown, so the judgement is visible and can be challenged: + +| Endpoint | Why it reads nothing | +| -------- | -------------------- | +| `POST /alchemy/addressWebhook` | HMAC check against a key held in memory | +| `GET /alchemy/addresses/:webhookId` | third-party SDK (`alchemy.notify`), no table of ours | +| `GET /auth/alby` | builds an OAuth URL; the pending state lives in memory | +| `POST /bank/yapeal/webhook` | hands off through an rxjs subject — the loading happens in the subscriber, not in the request path | +| `GET /dex/check-liquidity` | strategy registry; no strategy under `dex/strategies/{check,purchase,sell}-liquidity` contains a load site | +| `POST /dex/purchase-liquidity` | same registry as `GET /dex/check-liquidity` | +| `POST /dex/reserve-liquidity` | same registry as `GET /dex/check-liquidity` | +| `GET /dex/transfer-completion` | same registry as `GET /dex/check-liquidity` | +| `POST /dex/transfer-liquidity` | same registry as `GET /dex/check-liquidity` | +| `GET /exchange/:exchange/balances` | callback onto an exchange client, no entity involved | +| `GET /exchange/:exchange/price` | same callback as `GET /exchange/:exchange/balances` | +| `GET /exchange/:exchange/trade` | same callback as `GET /exchange/:exchange/balances` | +| `POST /exchange/:exchange/trade` | same callback as `GET /exchange/:exchange/balances` | +| `GET /exchange/:exchange/trade/history` | same callback as `GET /exchange/:exchange/balances` | +| `POST /exchange/:exchange/withdraw` | same callback as `GET /exchange/:exchange/balances` | +| `GET /exchange/:exchange/withdraw/:id` | same callback as `GET /exchange/:exchange/balances` | +| `POST /paymentLink/integrations/kucoin/webhook/cancel` | signature check; the services it reaches contain no load site | +| `POST /paymentLink/integrations/kucoin/webhook/success` | signature check; the services it reaches contain no load site | +| `POST /payout` | a factory builds the entity, then `save()` — a pure write path | +| `GET /realunit/brokerbot/buyPrice` | price from an in-memory cache, otherwise from the chain | +| `GET /realunit/brokerbot/buyShares` | same cache as `GET /realunit/brokerbot/buyPrice` | +| `GET /realunit/brokerbot/price` | same cache as `GET /realunit/brokerbot/buyPrice` | +| `GET /realunit/quote/buyPrice` | same cache as `GET /realunit/brokerbot/buyPrice` | +| `GET /realunit/quote/buyShares` | same cache as `GET /realunit/brokerbot/buyPrice` | +| `GET /realunit/quote/price` | same cache as `GET /realunit/brokerbot/buyPrice` | +| `POST /tatum/addressWebhook` | signature check, then a third-party SDK | +| `GET /version` | reads `dist/version.txt` from disk | + +[read-path-projections.md](read-path-projections.md) explains the background, the criteria for converting an endpoint, and how the result is tested. + +## How the values are produced + +- **Endpoints** — from the routing decorators in `src/**/*.controller.ts`, each attributed to the `@Controller` scope preceding it. Decorators between the route and the method are skipped by counting parentheses, so a multi-line `@UseGuards(` cannot be mistaken for the handler. Cross-checked in both directions against the routes the framework registers at startup: all 526 distinct method/path pairs match, with no entry left over on either side. +- **Ver** — from `@Version` on the handler, otherwise from the `@Controller` scope, otherwise the configured default. Note that the version follows the class, not the folder: the controllers under `generic/kyc/` are not uniformly v2 — `KycAdminController` carries no version decorator and is therefore served under the default. +- **Data access** — the union over the call graph, following injected fields, locally constructed repositories and multi-line call chains. `find*` pulls in eager relations, `createQueryBuilder` does not, `.select([...])` is the only form that narrows the column list, and `.update()/.delete()/.insert()` are writes that load nothing. +- **Max cols** — the query is built from the real entity metadata and its SELECT list counted. Not an estimate. + +## Known discrepancy + +`POST /paymentLink/integrations/kucoin/webhook/cancel` appears in the source but is **not registered at runtime**: its handler in `c2b-payment-link.controller.ts` carries two `@Post` decorators, and the framework stores a single path per handler, so only `.../webhook/success` takes effect. Listed below for completeness and marked accordingly. + +## Endpoints + +| Method | Ver | Dep | Path | Swagger | Data access | Max cols | Tests | Spec | Handler | File | +| ------ | --- | --- | ---- | ------- | ----------- | -------: | ----- | ---- | ------- | ---- | +| GET | neutral | | `/` | hidden | none | — | n/a | | `AppController.home` | `app.controller.ts` | +| POST | 1 | | `/CustodyProvider` | hidden | none | — | n/a | | `CustodyProviderController.createCustodyProvider` | `subdomains/generic/user/models/custody-provider/custody-provider.controller.ts` | +| PUT | 1 | | `/CustodyProvider/:id` | hidden | whole rows | 6 | not yet | | `CustodyProviderController.updateCustodyProvider` | `subdomains/generic/user/models/custody-provider/custody-provider.controller.ts` | +| POST | 1 | | `/admin/lightning/rotate-webhook-secrets` | hidden | none | — | n/a | | `AdminController.rotateLightningWebhookSecrets` | `subdomains/generic/admin/admin.controller.ts` | +| POST | 1 | | `/admin/mail` | hidden | whole rows | 13 | not yet | | `AdminController.sendMail` | `subdomains/generic/admin/admin.controller.ts` | +| POST | 1 | | `/admin/payout` | hidden | whole rows | 156 | not yet | | `AdminController.payout` | `subdomains/generic/admin/admin.controller.ts` | +| POST | 1 | | `/admin/sendLetter` | hidden | none | — | n/a | | `AdminController.sendLetter` | `subdomains/generic/admin/admin.controller.ts` | +| POST | 1 | | `/alchemy/addressWebhook` | hidden | none | — | n/a | | `AlchemyController.addressWebhook` | `integration/alchemy/controllers/alchemy.controller.ts` | +| GET | 1 | | `/alchemy/addresses/:webhookId` | hidden | none | — | n/a | | `AlchemyController.addresses` | `integration/alchemy/controllers/alchemy.controller.ts` | +| GET | 1 | | `/app` | hidden | whole rows | 6 | not yet | | `AppController.createRefNew` | `app.controller.ts` | +| GET | 1 | | `/app/:app` | hidden | whole rows | 6 | not yet | | `AppController.redirectToStore` | `app.controller.ts` | +| GET | 1 | | `/app/advertisements` | hidden | none | — | n/a | | `AppController.getAds` | `app.controller.ts` | +| GET | 1 | | `/app/announcements` | hidden | none | — | n/a | | `AppController.getAnnouncements` | `app.controller.ts` | +| GET | 1 | | `/app/settings/flags` | hidden | none | — | n/a | | `AppController.getFlags` | `app.controller.ts` | +| GET | 1 | | `/asset` | public | whole rows | 33 | not yet | | `AssetController.getAllAsset` | `shared/models/asset/asset.controller.ts` | +| PUT | 1 | | `/asset/:id` | hidden | whole rows | 33 | not yet | | `AssetController.updateAsset` | `shared/models/asset/asset.controller.ts` | +| POST | 1 | | `/auth` | public | whole rows | 643 | not yet | | `AuthController.authenticate` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| GET | 1 | | `/auth/2fa` | public | whole rows | 253 | not yet | | `AuthController.check2fa` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| POST | 1 | | `/auth/2fa` | public | whole rows | 253 | not yet | | `AuthController.setup2fa` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| POST | 1 | | `/auth/2fa/verify` | public | whole rows | 253 | not yet | | `AuthController.verify2fa` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| GET | 1 | | `/auth/alby` | hidden | none | — | n/a | | `AuthController.signInWithAlby` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| GET | 1 | | `/auth/alby/redirect/:id` | hidden | whole rows | 643 | not yet | | `AuthController.redirectAlby` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| GET | 1 | | `/auth/challenge` | public | whole rows | 20 | not yet | | `AuthController.companyChallenge` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| POST | 1 | | `/auth/mail` | public | whole rows | 643 | not yet | | `AuthController.signInByMail` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| GET | 1 | | `/auth/mail/confirm` | hidden | whole rows | 470 | not yet | | `AuthController.executeMerge` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| GET | 1 | | `/auth/mail/redirect` | hidden | whole rows | 643 | not yet | | `AuthController.redirectMail` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| POST | 1 | | `/auth/signIn` | hidden | whole rows | 643 | not yet | | `AuthController.signIn` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| GET | 1 | | `/auth/signMessage` | public | none | — | n/a | | `AuthController.getSignMessage` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| POST | 1 | | `/auth/signUp` | hidden | whole rows | 643 | not yet | | `AuthController.signUp` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| GET | 1 | | `/auth/verifySignature` | hidden | whole rows | 6 | not yet | | `AuthController.verifySignMessage` | `subdomains/generic/user/models/auth/auth.controller.ts` | +| GET | 1 | | `/balance/pdf` | public | whole rows | 40 | not yet | | `BalanceController.getBalancePdf` | `subdomains/supporting/balance/controllers/balance.controller.ts` | +| GET | 1 | | `/balance/pdf/blockchains` | public | none | — | n/a | | `BalanceController.getSupportedBlockchains` | `subdomains/supporting/balance/controllers/balance.controller.ts` | +| GET | 1 | | `/bank` | public | whole rows | 46 | not yet | | `BankController.getAllBanks` | `subdomains/supporting/bank/bank/bank.controller.ts` | +| PUT | 1 | | `/bank/receiveIban` | public | whole rows | 101 | not yet | yes | `BankController.checkReceiveIban` | `subdomains/supporting/bank/bank/bank.controller.ts` | +| POST | 1 | | `/bank/yapeal/webhook` | hidden | none | — | n/a | | `YapealWebhookController.handleYapealWebhook` | `integration/bank/controllers/yapeal-webhook.controller.ts` | +| GET | 1 | | `/bankAccount` | public | whole rows | 261 | not yet | | `BankAccountController.getAllUserBankAccount` | `subdomains/supporting/bank/bank-account/bank-account.controller.ts` | +| POST | 1 | | `/bankAccount` | public | whole rows | 261 | not yet | | `BankAccountController.createBankAccount` | `subdomains/supporting/bank/bank-account/bank-account.controller.ts` | +| PUT | 1 | | `/bankAccount/:id` | public | whole rows | 261 | not yet | | `BankAccountController.updateBankAccount` | `subdomains/supporting/bank/bank-account/bank-account.controller.ts` | +| POST | 1 | | `/bankAccount/bic` | hidden | whole rows | 26 | not yet | | `BankAccountController.addBankAccountBic` | `subdomains/supporting/bank/bank-account/bank-account.controller.ts` | +| POST | 1 | | `/bankAccount/iban` | hidden | whole rows | 26 | not yet | | `BankAccountController.addBankAccountIban` | `subdomains/supporting/bank/bank-account/bank-account.controller.ts` | +| PUT | 1 | | `/bankData/:id` | hidden | whole rows | 31 | not yet | | `BankDataController.updateBankData` | `subdomains/generic/user/models/bank-data/bank-data.controller.ts` | +| PUT | 1 | | `/bankData/:id/nameCheck` | hidden | whole rows | 276 | not yet | | `BankDataController.doNameCheck` | `subdomains/generic/user/models/bank-data/bank-data.controller.ts` | +| POST | 1 | | `/bankTx` | hidden | whole rows | 61 | not yet | | `BankTxController.uploadSepaFiles` | `subdomains/supporting/bank-tx/bank-tx/bank-tx.controller.ts` | +| PUT | 1 | | `/bankTx/:id` | hidden | whole rows | 1051 | not yet | | `BankTxController.update` | `subdomains/supporting/bank-tx/bank-tx/bank-tx.controller.ts` | +| DELETE | 1 | | `/bankTx/:id/buyCrypto` | hidden | whole rows | 247 | not yet | | `BankTxController.reset` | `subdomains/supporting/bank-tx/bank-tx/bank-tx.controller.ts` | +| PUT | 1 | | `/bankTxRepeat/:id` | hidden | whole rows | 308 | not yet | | `BankTxRepeatController.update` | `subdomains/supporting/bank-tx/bank-tx-repeat/bank-tx-repeat.controller.ts` | +| PUT | 1 | | `/bankTxReturn/:id` | hidden | whole rows | 438 | not yet | | `BankTxReturnController.update` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.controller.ts` | +| POST | 1 | | `/bankTxReturn/:id/refund` | hidden | whole rows | 727 | not yet | | `BankTxReturnController.refundBuyCrypto` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.controller.ts` | +| POST | 1 | | `/blockchain/balances` | public | whole rows | 33 | not yet | | `BlockchainApiController.getBalances` | `integration/blockchain/api/controllers/blockchain-api.controller.ts` | +| POST | 1 | | `/blockchain/broadcast` | public | none | — | n/a | | `BlockchainApiController.broadcastTransaction` | `integration/blockchain/api/controllers/blockchain-api.controller.ts` | +| POST | 1 | | `/blockchain/transaction` | public | whole rows | 33 | not yet | | `BlockchainApiController.createTransaction` | `integration/blockchain/api/controllers/blockchain-api.controller.ts` | +| GET | 1 | | `/buy` | hidden | whole rows | 308 | not yet | | `BuyController.getAllBuy` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| POST | 1 | | `/buy` | hidden | whole rows | 364 | not yet | | `BuyController.createBuy` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| GET | 1 | | `/buy/:id` | public | whole rows | 308 | not yet | | `BuyController.getBuy` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| PUT | 1 | | `/buy/:id` | hidden | whole rows | 308 | not yet | | `BuyController.updateBuyRoute` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| GET | 1 | | `/buy/:id/history` | hidden | whole rows | 497 | not yet | | `BuyController.getBuyRouteHistory` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| PUT | 1 | | `/buy/paymentInfos` | public | whole rows | 364 | not yet | | `BuyController.createBuyWithPaymentInfo` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| PUT | 1 | | `/buy/paymentInfos/:id/confirm` | public | whole rows | 504 | not yet | | `BuyController.confirmBuy` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| PUT | 1 | | `/buy/paymentInfos/:id/invoice` | public | whole rows | 504 | not yet | yes | `BuyController.generateInvoicePDF` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| GET | 1 | | `/buy/personalIban` | public | whole rows | 331 | not yet | | `BuyController.getAllPersonalIbans` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| POST | 1 | | `/buy/personalIban` | public | whole rows | 253 | not yet | | `BuyController.createPersonalIban` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| PUT | 1 | | `/buy/quote` | public | whole rows | 143 | not yet | | `BuyController.getBuyQuote` | `subdomains/core/buy-crypto/routes/buy/buy.controller.ts` | +| PUT | 1 | | `/buyCrypto/:id` | hidden | whole rows | 1090 | not yet | | `BuyCryptoController.update` | `subdomains/core/buy-crypto/process/buy-crypto.controller.ts` | +| DELETE | 1 | | `/buyCrypto/:id/amlCheck` | hidden | whole rows | 422 | not yet | | `BuyCryptoController.resetAmlCheck` | `subdomains/core/buy-crypto/process/buy-crypto.controller.ts` | +| PUT | 1 | | `/buyCrypto/:id/amlCheck` | hidden | whole rows | 1090 | not yet | | `BuyCryptoController.manualPassAmlCheck` | `subdomains/core/buy-crypto/process/buy-crypto.controller.ts` | +| POST | 1 | | `/buyCrypto/:id/refund` | hidden | whole rows | 1051 | not yet | | `BuyCryptoController.refundBuyCrypto` | `subdomains/core/buy-crypto/process/buy-crypto.controller.ts` | +| POST | 1 | | `/buyCrypto/:id/scorechain` | hidden | whole rows | 717 | not yet | | `BuyCryptoController.retriggerScorechain` | `subdomains/core/buy-crypto/process/buy-crypto.controller.ts` | +| POST | 1 | | `/buyCrypto/:id/webhook` | hidden | whole rows | 844 | not yet | | `BuyCryptoController.triggerWebhook` | `subdomains/core/buy-crypto/process/buy-crypto.controller.ts` | +| PUT | 1 | | `/buyCrypto/refVolumes` | hidden | whole rows | 77 | not yet | | `BuyCryptoController.updateRefVolumes` | `subdomains/core/buy-crypto/process/buy-crypto.controller.ts` | +| PUT | 1 | | `/buyCrypto/volumes` | hidden | whole rows | 487 | not yet | | `BuyCryptoController.updateBuyVolumes` | `subdomains/core/buy-crypto/process/buy-crypto.controller.ts` | +| PUT | 1 | | `/buyFiat/:id` | hidden | whole rows | 1033 | not yet | | `BuyFiatController.update` | `subdomains/core/sell-crypto/process/buy-fiat.controller.ts` | +| DELETE | 1 | | `/buyFiat/:id/amlCheck` | hidden | whole rows | 490 | not yet | | `BuyFiatController.resetAmlCheck` | `subdomains/core/sell-crypto/process/buy-fiat.controller.ts` | +| PUT | 1 | | `/buyFiat/:id/amlCheck` | hidden | whole rows | 1033 | not yet | | `BuyFiatController.manualPassAmlCheck` | `subdomains/core/sell-crypto/process/buy-fiat.controller.ts` | +| POST | 1 | | `/buyFiat/:id/refund` | hidden | whole rows | 803 | not yet | | `BuyFiatController.refundBuyFiat` | `subdomains/core/sell-crypto/process/buy-fiat.controller.ts` | +| POST | 1 | | `/buyFiat/:id/scorechain` | hidden | whole rows | 517 | not yet | | `BuyFiatController.retriggerScorechain` | `subdomains/core/sell-crypto/process/buy-fiat.controller.ts` | +| POST | 1 | | `/buyFiat/:id/webhook` | hidden | whole rows | 644 | not yet | | `BuyFiatController.triggerWebhook` | `subdomains/core/sell-crypto/process/buy-fiat.controller.ts` | +| PUT | 1 | | `/buyFiat/refVolumes` | hidden | whole rows | 77 | not yet | | `BuyFiatController.updateRefVolumes` | `subdomains/core/sell-crypto/process/buy-fiat.controller.ts` | +| PUT | 1 | | `/buyFiat/volumes` | hidden | whole rows | 308 | not yet | | `BuyFiatController.updateVolumes` | `subdomains/core/sell-crypto/process/buy-fiat.controller.ts` | +| GET | 1 | | `/country` | public | whole rows | 23 | not yet | | `CountryController.getAllCountry` | `shared/models/country/country.controller.ts` | +| GET | 1 | | `/cryptoRoute` | hidden | none | — | n/a | | `CryptoRouteController.getAllCrypto` | `subdomains/core/buy-crypto/routes/swap/crypto-route.controller.ts` | +| POST | 1 | | `/cryptoRoute` | hidden | none | — | n/a | | `CryptoRouteController.createCrypto` | `subdomains/core/buy-crypto/routes/swap/crypto-route.controller.ts` | +| GET | 1 | | `/cryptoRoute/:id` | hidden | none | — | n/a | | `CryptoRouteController.getCrypto` | `subdomains/core/buy-crypto/routes/swap/crypto-route.controller.ts` | +| PUT | 1 | | `/cryptoRoute/:id` | hidden | none | — | n/a | | `CryptoRouteController.updateCryptoRoute` | `subdomains/core/buy-crypto/routes/swap/crypto-route.controller.ts` | +| GET | 1 | | `/cryptoRoute/:id/history` | hidden | none | — | n/a | | `CryptoRouteController.getCryptoRouteHistory` | `subdomains/core/buy-crypto/routes/swap/crypto-route.controller.ts` | +| GET | 1 | | `/custody` | public | whole rows | 253 | not yet | | `CustodyController.getUserCustodyBalance` | `subdomains/core/custody/controllers/custody.controller.ts` | +| POST | 1 | | `/custody` | public | whole rows | 364 | not yet | | `CustodyController.createCustodyAccount` | `subdomains/core/custody/controllers/custody.controller.ts` | +| GET | 1 | | `/custody/account` | public | whole rows | 253 | not yet | | `CustodyAccountController.getCustodyAccounts` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| POST | 1 | | `/custody/account` | public | whole rows | 253 | not yet | | `CustodyAccountController.createCustodyAccount` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| GET | 1 | | `/custody/account/:id` | public | whole rows | 253 | not yet | | `CustodyAccountController.getCustodyAccount` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| PUT | 1 | | `/custody/account/:id` | public | whole rows | 253 | not yet | | `CustodyAccountController.updateCustodyAccount` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| GET | 1 | | `/custody/account/:id/access` | public | whole rows | 238 | not yet | | `CustodyAccountController.getAccessList` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| POST | 1 | | `/custody/account/:id/access` | public | whole rows | 253 | not yet | | `CustodyAccountController.grantAccess` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| DELETE | 1 | | `/custody/account/:id/access/:accessId` | public | whole rows | 238 | not yet | | `CustodyAccountController.revokeAccess` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| PUT | 1 | | `/custody/account/:id/access/:accessId` | public | whole rows | 238 | not yet | | `CustodyAccountController.updateAccess` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| GET | 1 | | `/custody/account/:id/balance` | public | whole rows | 253 | not yet | | `CustodyAccountController.getAccountBalance` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| GET | 1 | | `/custody/account/:id/history` | public | whole rows | 253 | not yet | | `CustodyAccountController.getAccountHistory` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| GET | 1 | | `/custody/account/:id/order` | public | whole rows | 253 | not yet | | `CustodyAccountController.getAccountOrders` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| GET | 1 | | `/custody/account/:id/pdf` | public | whole rows | 253 | not yet | | `CustodyAccountController.getAccountPdf` | `subdomains/core/custody/controllers/custody-account.controller.ts` | +| POST | 1 | | `/custody/admin/order/:id/approve` | public | whole rows | 217 | not yet | | `CustodyAdminController.approveOrder` | `subdomains/core/custody/controllers/custody.controller.ts` | +| GET | 1 | | `/custody/admin/orders` | public | whole rows | 525 | not yet | | `CustodyAdminController.getOrders` | `subdomains/core/custody/controllers/custody.controller.ts` | +| PUT | 1 | | `/custody/admin/user/:id/balance` | public | whole rows | 308 | not yet | | `CustodyAdminController.updateUserBalance` | `subdomains/core/custody/controllers/custody.controller.ts` | +| GET | 1 | | `/custody/history` | public | whole rows | 253 | not yet | | `CustodyController.getUserCustodyHistory` | `subdomains/core/custody/controllers/custody.controller.ts` | +| GET | 1 | | `/custody/order` | public | whole rows | 19 | not yet | | `CustodyController.getOrders` | `subdomains/core/custody/controllers/custody.controller.ts` | +| POST | 1 | | `/custody/order` | public | whole rows | 364 | not yet | | `CustodyController.createOrder` | `subdomains/core/custody/controllers/custody.controller.ts` | +| POST | 1 | | `/custody/order/:id/confirm` | public | whole rows | 525 | not yet | | `CustodyController.confirmOrder` | `subdomains/core/custody/controllers/custody.controller.ts` | +| GET | 1 | | `/custody/pdf` | public | whole rows | 253 | not yet | | `CustodyController.getCustodyPdf` | `subdomains/core/custody/controllers/custody.controller.ts` | +| GET | 1 | | `/dashboard/accounting/ledger/accounts` | hidden | whole rows | 54 | not yet | yes | `LedgerController.getAccounts` | `subdomains/core/accounting/controllers/ledger.controller.ts` | +| GET | 1 | | `/dashboard/accounting/ledger/accounts/:accountId/legs` | hidden | whole rows | 30 | not yet | yes | `LedgerController.getAccountDetail` | `subdomains/core/accounting/controllers/ledger.controller.ts` | +| GET | 1 | | `/dashboard/accounting/ledger/equity-comparison` | hidden | whole rows | 54 | not yet | yes | `LedgerController.getEquityComparison` | `subdomains/core/accounting/controllers/ledger.controller.ts` | +| GET | 1 | | `/dashboard/accounting/ledger/margin` | hidden | whole rows | 11 | not yet | yes | `LedgerController.getMargin` | `subdomains/core/accounting/controllers/ledger.controller.ts` | +| GET | 1 | | `/dashboard/accounting/ledger/reconciliation` | hidden | whole rows | 54 | not yet | yes | `LedgerController.getReconStatus` | `subdomains/core/accounting/controllers/ledger.controller.ts` | +| GET | 1 | | `/dashboard/accounting/ledger/suspense` | hidden | whole rows | 11 | not yet | yes | `LedgerController.getSuspense` | `subdomains/core/accounting/controllers/ledger.controller.ts` | +| GET | 1 | | `/dashboard/financial/changes` | hidden | whole rows | 11 | not yet | | `DashboardFinancialController.getFinancialChanges` | `subdomains/supporting/dashboard/dashboard-financial.controller.ts` | +| GET | 1 | | `/dashboard/financial/changes/latest` | hidden | whole rows | 11 | not yet | | `DashboardFinancialController.getLatestChanges` | `subdomains/supporting/dashboard/dashboard-financial.controller.ts` | +| GET | 1 | | `/dashboard/financial/latest` | hidden | none | — | n/a | | `DashboardFinancialController.getLatestBalance` | `subdomains/supporting/dashboard/dashboard-financial.controller.ts` | +| GET | 1 | | `/dashboard/financial/log` | hidden | whole rows | 33 | not yet | yes | `DashboardFinancialController.getFinancialLog` | `subdomains/supporting/dashboard/dashboard-financial.controller.ts` | +| GET | 1 | | `/dashboard/financial/reconciliation` | hidden | whole rows | 229 | not yet | | `DashboardReconciliationController.getReconciliation` | `subdomains/supporting/dashboard/dashboard-reconciliation.controller.ts` | +| GET | 1 | | `/dashboard/financial/reconciliation/overview` | hidden | whole rows | 229 | not yet | | `DashboardReconciliationController.getOverview` | `subdomains/supporting/dashboard/dashboard-reconciliation.controller.ts` | +| GET | 1 | | `/dashboard/financial/ref-recipients` | hidden | whole rows | 25 | not yet | | `DashboardFinancialController.getRefRewardRecipients` | `subdomains/supporting/dashboard/dashboard-financial.controller.ts` | +| POST | 1 | | `/deposit` | hidden | whole rows | 6 | not yet | | `DepositController.createDeposits` | `subdomains/supporting/address-pool/deposit/deposit.controller.ts` | +| PUT | 1 | | `/deposit/lightningWebhook` | hidden | none | — | n/a | | `DepositController.updateLightningDepositWebhook` | `subdomains/supporting/address-pool/deposit/deposit.controller.ts` | +| GET | 1 | | `/deuro/info` | public | whole rows | 11 | not yet | | `DEuroController.getInfo` | `integration/blockchain/deuro/controllers/deuro.controller.ts` | +| GET | 1 | | `/dex/check-liquidity` | hidden | none | — | n/a | | `DexController.checkLiquidity` | `subdomains/supporting/dex/dex.controller.ts` | +| PUT | 1 | | `/dex/complete-orders` | hidden | whole rows | 156 | not yet | | `DexController.completeOrders` | `subdomains/supporting/dex/dex.controller.ts` | +| GET | 1 | | `/dex/liquidity-after-purchase` | hidden | whole rows | 156 | not yet | | `DexController.fetchTargetLiquidityAfterPurchase` | `subdomains/supporting/dex/dex.controller.ts` | +| POST | 1 | | `/dex/purchase-liquidity` | hidden | none | — | n/a | | `DexController.purchaseLiquidity` | `subdomains/supporting/dex/dex.controller.ts` | +| POST | 1 | | `/dex/reserve-liquidity` | hidden | none | — | n/a | | `DexController.reserveLiquidity` | `subdomains/supporting/dex/dex.controller.ts` | +| GET | 1 | | `/dex/transfer-completion` | hidden | none | — | n/a | | `DexController.checkTransferCompletion` | `subdomains/supporting/dex/dex.controller.ts` | +| POST | 1 | | `/dex/transfer-liquidity` | hidden | none | — | n/a | | `DexController.transferLiquidity` | `subdomains/supporting/dex/dex.controller.ts` | +| GET | 1 | | `/exchange/:exchange/balances` | hidden | none | — | n/a | | `ExchangeController.getBalance` | `integration/exchange/controllers/exchange.controller.ts` | +| GET | 1 | | `/exchange/:exchange/price` | hidden | none | — | n/a | | `ExchangeController.getPrice` | `integration/exchange/controllers/exchange.controller.ts` | +| PUT | 1 | | `/exchange/:exchange/sync` | hidden | whole rows | 40 | not yet | | `ExchangeController.syncExchange` | `integration/exchange/controllers/exchange.controller.ts` | +| GET | 1 | | `/exchange/:exchange/trade` | hidden | none | — | n/a | | `ExchangeController.getTrades` | `integration/exchange/controllers/exchange.controller.ts` | +| POST | 1 | | `/exchange/:exchange/trade` | hidden | none | — | n/a | | `ExchangeController.trade` | `integration/exchange/controllers/exchange.controller.ts` | +| GET | 1 | | `/exchange/:exchange/trade/history` | hidden | none | — | n/a | | `ExchangeController.getTradeHistory` | `integration/exchange/controllers/exchange.controller.ts` | +| POST | 1 | | `/exchange/:exchange/withdraw` | hidden | none | — | n/a | | `ExchangeController.withdrawFunds` | `integration/exchange/controllers/exchange.controller.ts` | +| GET | 1 | | `/exchange/:exchange/withdraw/:id` | hidden | none | — | n/a | | `ExchangeController.getWithdraw` | `integration/exchange/controllers/exchange.controller.ts` | +| GET | 1 | | `/exchange/trade/:id` | hidden | none | — | n/a | | `ExchangeController.getTrade` | `integration/exchange/controllers/exchange.controller.ts` | +| POST | 1 | | `/faucet` | hidden | whole rows | 308 | not yet | | `FaucetRequestController.faucetRequest` | `subdomains/core/faucet-request/controller/faucet-request.controller.ts` | +| POST | 1 | | `/fee` | hidden | whole rows | 65 | not yet | | `FeeController.createFee` | `subdomains/supporting/payment/controllers/fee.controller.ts` | +| GET | 1 | | `/fiat` | public | whole rows | 23 | not yet | yes | `FiatController.getAllFiat` | `shared/models/fiat/fiat.controller.ts` | +| POST | 1 | | `/fiatOutput` | hidden | whole rows | 377 | not yet | | `FiatOutputController.create` | `subdomains/supporting/fiat-output/fiat-output.controller.ts` | +| PUT | 1 | | `/fiatOutput/:id` | hidden | whole rows | 59 | not yet | | `FiatOutputController.update` | `subdomains/supporting/fiat-output/fiat-output.controller.ts` | +| GET | 1 | | `/frankencoin/info` | public | whole rows | 11 | not yet | | `FrankencoinController.getInfo` | `integration/blockchain/frankencoin/controllers/frankencoin.controller.ts` | +| POST | 1 | | `/gs/db` | hidden | caller-defined | 13 | n/a | yes | `GsController.getDbData` | `subdomains/generic/gs/gs.controller.ts` | +| POST | 1 | | `/gs/db/custom` | hidden | caller-defined | — | n/a | yes | `GsController.getExtendedData` | `subdomains/generic/gs/gs.controller.ts` | +| POST | 1 | | `/gs/debug` | hidden | projected | — | n/a | yes | `GsController.executeDebugQuery` | `subdomains/generic/gs/gs.controller.ts` | +| POST | 1 | | `/gs/evm/bridgeApproval` | hidden | whole rows | 33 | not yet | | `GsEvmController.approveBridge` | `subdomains/generic/gs/gs-evm.controller.ts` | +| POST | 1 | | `/gs/evm/coinTransaction` | hidden | whole rows | 6 | not yet | | `GsEvmController.sendCoinTransaction` | `subdomains/generic/gs/gs-evm.controller.ts` | +| POST | 1 | | `/gs/evm/contractApproval` | hidden | whole rows | 33 | not yet | | `GsEvmController.approveContract` | `subdomains/generic/gs/gs-evm.controller.ts` | +| POST | 1 | | `/gs/evm/contractTransaction` | hidden | none | — | n/a | | `GsEvmController.sendContractTransaction` | `subdomains/generic/gs/gs-evm.controller.ts` | +| POST | 1 | | `/gs/evm/rawTransaction` | hidden | whole rows | 6 | not yet | | `GsEvmController.sendRawTransaction` | `subdomains/generic/gs/gs-evm.controller.ts` | +| POST | 1 | | `/gs/evm/tokenTransaction` | hidden | whole rows | 33 | not yet | | `GsEvmController.sendTokenTransaction` | `subdomains/generic/gs/gs-evm.controller.ts` | +| GET | 1 | | `/gs/support` | hidden | whole rows | 907 | not yet | yes | `GsController.getSupportData` | `subdomains/generic/gs/gs.controller.ts` | +| GET | neutral | | `/health` | public | none | — | n/a | | `HealthController.getHealth` | `subdomains/core/monitoring/health.controller.ts` | +| GET | neutral | | `/health/banking` | public | none | — | n/a | | `HealthController.getBankingHealth` | `subdomains/core/monitoring/health.controller.ts` | +| GET | neutral | | `/health/external` | public | none | — | n/a | | `HealthController.getExternalHealth` | `subdomains/core/monitoring/health.controller.ts` | +| GET | neutral | | `/health/liquidity` | public | none | — | n/a | | `HealthController.getLiquidityHealth` | `subdomains/core/monitoring/health.controller.ts` | +| GET | neutral | | `/health/nodes` | public | none | — | n/a | | `HealthController.getNodeHealth` | `subdomains/core/monitoring/health.controller.ts` | +| GET | neutral | | `/health/payment` | public | none | — | n/a | | `HealthController.getPaymentHealth` | `subdomains/core/monitoring/health.controller.ts` | +| GET | 1 | | `/history` | hidden | whole rows | 1363 | not yet | | `HistoryController.getHistory` | `subdomains/core/history/controllers/history.controller.ts` | +| GET | 1 | | `/history/:exportType` | hidden | whole rows | 1363 | not yet | | `HistoryController.getApiHistory` | `subdomains/core/history/controllers/history.controller.ts` | +| GET | 1 | | `/history/csv` | hidden | none | — | n/a | | `HistoryController.getCsv` | `subdomains/core/history/controllers/history.controller.ts` | +| POST | 1 | | `/history/csv` | hidden | whole rows | 1363 | not yet | | `HistoryController.createCsv` | `subdomains/core/history/controllers/history.controller.ts` | +| GET | 1 | | `/ikna/bfs/:id` | hidden | none | — | n/a | | `IknaController.getBfsResult` | `integration/ikna/controllers/ikna.controller.ts` | +| POST | 1 | | `/ikna/bfs/address` | hidden | none | — | n/a | | `IknaController.createBfsAddressRequest` | `integration/ikna/controllers/ikna.controller.ts` | +| GET | 1 | | `/ikna/tag` | hidden | none | — | n/a | | `IknaController.getIknaAddressTag` | `integration/ikna/controllers/ikna.controller.ts` | +| GET | 1 | | `/juice/info` | public | whole rows | 11 | not yet | | `JuiceController.getInfo` | `integration/blockchain/juice/controllers/juice.controller.ts` | +| GET | 1 | yes | `/kyc` | public | whole rows | 351 | not yet | | `KycController.getKycProgressV1` | `subdomains/generic/user/models/kyc/kyc.controller.ts` | +| GET | 2 | | `/kyc` | public | whole rows | 351 | not yet | | `KycController.getKycLevel` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| POST | 1 | yes | `/kyc` | public | whole rows | 351 | not yet | | `KycController.requestKycV1` | `subdomains/generic/user/models/kyc/kyc.controller.ts` | +| PUT | 2 | | `/kyc` | public | whole rows | 364 | not yet | | `KycController.continueKyc` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| GET | 2 | | `/kyc/2fa` | public | whole rows | 253 | not yet | | `KycController.check2fa` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| POST | 2 | | `/kyc/2fa` | public | whole rows | 253 | not yet | | `KycController.start2fa` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| POST | 2 | | `/kyc/2fa/verify` | public | whole rows | 253 | not yet | | `KycController.verify2fa` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| GET | 1 | yes | `/kyc/:code` | public | whole rows | 351 | not yet | | `KycController.getKycProgressByCodeV1` | `subdomains/generic/user/models/kyc/kyc.controller.ts` | +| POST | 1 | yes | `/kyc/:code` | public | whole rows | 351 | not yet | | `KycController.requestKycByCodeV1` | `subdomains/generic/user/models/kyc/kyc.controller.ts` | +| GET | 1 | yes | `/kyc/:code/countries` | public | whole rows | 351 | not yet | | `KycController.getKycCountriesByCodeV1` | `subdomains/generic/user/models/kyc/kyc.controller.ts` | +| GET | 1 | yes | `/kyc/:id/documents` | public | whole rows | 328 | not yet | | `KycClientController.getKycFilesV1` | `subdomains/generic/user/models/kyc/kyc.controller.ts` | +| GET | 1 | yes | `/kyc/:id/documents/:type` | public | whole rows | 328 | not yet | | `KycClientController.getKycFileV1` | `subdomains/generic/user/models/kyc/kyc.controller.ts` | +| GET | 2 | | `/kyc/:step` | hidden | whole rows | 364 | not yet | | `KycController.initiateStep` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| DELETE | 1 | | `/kyc/admin/blacklist/ip` | hidden | none | — | n/a | | `KycAdminController.deleteIpToBlacklist` | `subdomains/generic/kyc/controllers/kyc-admin.controller.ts` | +| PUT | 1 | | `/kyc/admin/blacklist/ip` | hidden | whole rows | 12 | not yet | | `KycAdminController.addIpToBlacklist` | `subdomains/generic/kyc/controllers/kyc-admin.controller.ts` | +| POST | 1 | | `/kyc/admin/ident/file/sync` | hidden | whole rows | 243 | not yet | | `KycAdminController.syncIdentFiles` | `subdomains/generic/kyc/controllers/kyc-admin.controller.ts` | +| POST | 1 | | `/kyc/admin/log` | hidden | whole rows | 253 | not yet | | `KycAdminController.createLog` | `subdomains/generic/kyc/controllers/kyc-admin.controller.ts` | +| PUT | 1 | | `/kyc/admin/log/:id` | hidden | whole rows | 17 | not yet | | `KycAdminController.updateLog` | `subdomains/generic/kyc/controllers/kyc-admin.controller.ts` | +| PUT | 1 | | `/kyc/admin/nameCheck/:id` | hidden | whole rows | 245 | not yet | | `KycAdminController.updateNameCheckLog` | `subdomains/generic/kyc/controllers/kyc-admin.controller.ts` | +| PUT | 1 | | `/kyc/admin/step/:id` | hidden | whole rows | 385 | not yet | | `KycAdminController.updateKycStep` | `subdomains/generic/kyc/controllers/kyc-admin.controller.ts` | +| POST | 1 | | `/kyc/admin/webhook` | hidden | whole rows | 364 | not yet | | `KycAdminController.triggerWebhook` | `subdomains/generic/kyc/controllers/kyc-admin.controller.ts` | +| GET | 2 | | `/kyc/client/payments` | public | whole rows | 1092 | not yet | | `KycClientController.getAllPayments` | `subdomains/generic/kyc/controllers/kyc-client.controller.ts` | +| GET | 2 | | `/kyc/client/users` | public | whole rows | 20 | not yet | | `KycClientController.getAllKycData` | `subdomains/generic/kyc/controllers/kyc-client.controller.ts` | +| GET | 2 | | `/kyc/client/users/:id/documents` | public | whole rows | 78 | not yet | | `KycClientController.getKycFiles` | `subdomains/generic/kyc/controllers/kyc-client.controller.ts` | +| GET | 2 | | `/kyc/client/users/:id/documents/:type` | public | whole rows | 78 | not yet | | `KycClientController.getKycFile` | `subdomains/generic/kyc/controllers/kyc-client.controller.ts` | +| GET | 2 | | `/kyc/client/users/:id/payments` | public | whole rows | 1092 | not yet | | `KycClientController.getUserPayments` | `subdomains/generic/kyc/controllers/kyc-client.controller.ts` | +| GET | 1 | yes | `/kyc/countries` | public | whole rows | 351 | not yet | | `KycController.getKycCountriesV1` | `subdomains/generic/user/models/kyc/kyc.controller.ts` | +| GET | 2 | yes | `/kyc/countries` | public | whole rows | 351 | not yet | | `KycController.getKycCountries` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| DELETE | 2 | | `/kyc/data/:type/:id` | public | whole rows | 351 | not yet | | `KycController.cancelStep` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/additional/:id` | public | whole rows | 364 | not yet | | `KycController.updateAdditionalDocumentsData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/address/:id` | public | whole rows | 364 | not yet | | `KycController.updateAddressChangeData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/authority/:id` | public | whole rows | 364 | not yet | | `KycController.updateAuthorityData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/beneficial/:id` | public | whole rows | 364 | not yet | | `KycController.updateBeneficialData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/confirmation/:id` | public | whole rows | 364 | not yet | | `KycController.updateSoleProprietorshipConfirmationData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/contact/:id` | public | whole rows | 364 | not yet | | `KycController.updateContactData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| GET | 2 | | `/kyc/data/financial/:id` | public | whole rows | 351 | not yet | | `KycController.getFinancialData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/financial/:id` | public | whole rows | 364 | not yet | | `KycController.updateFinancialData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/legal/:id` | public | whole rows | 364 | not yet | | `KycController.updateCommercialRegisterData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/name/:id` | public | whole rows | 364 | not yet | | `KycController.updateNameChangeData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/nationality/:id` | public | whole rows | 364 | not yet | | `KycController.updateNationalityData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/operational/:id` | public | whole rows | 364 | not yet | | `KycController.updateOperationalData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/owner/:id` | public | whole rows | 364 | not yet | | `KycController.updateOwnerDirectoryData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/payment/:id` | public | whole rows | 364 | not yet | | `KycController.updatePaymentsData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/personal/:id` | public | whole rows | 364 | not yet | | `KycController.updatePersonalData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/phone/:id` | public | whole rows | 364 | not yet | | `KycController.updatePhoneChangeData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/recall/:id` | public | whole rows | 364 | not yet | | `KycController.updateRecallAgreement` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/recommendation/:id` | public | whole rows | 643 | not yet | | `KycController.updateRecommendationData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/residence/:id` | public | whole rows | 364 | not yet | | `KycController.updateResidencePermitData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/signatory/:id` | public | whole rows | 364 | not yet | | `KycController.updateSignatoryPowerData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/data/statutes/:id` | public | whole rows | 364 | not yet | | `KycController.updateStatutesData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| GET | 2 | | `/kyc/file/:id` | public | whole rows | 264 | not yet | | `KycController.getFile` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 2 | | `/kyc/ident/manual/:id` | public | whole rows | 364 | not yet | | `KycController.updateIdentData` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| POST | 2 | | `/kyc/ident/sumsub` | hidden | whole rows | 364 | not yet | | `KycController.sumsubWebhook` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| DELETE | 2 | | `/kyc/transfer` | hidden | whole rows | 351 | not yet | | `KycController.removeKycClient` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| POST | 2 | | `/kyc/transfer` | hidden | whole rows | 364 | not yet | | `KycController.addKycClient` | `subdomains/generic/kyc/controllers/kyc.controller.ts` | +| PUT | 1 | yes | `/kyc/transfer` | public | whole rows | 364 | not yet | | `KycController.transferKycDataV1` | `subdomains/generic/user/models/kyc/kyc.controller.ts` | +| GET | 1 | yes | `/kyc/users` | public | whole rows | 328 | not yet | | `KycClientController.getAllKycDataV1` | `subdomains/generic/user/models/kyc/kyc.controller.ts` | +| GET | 1 | | `/language` | public | whole rows | 7 | not yet | | `LanguageController.getAllLanguage` | `shared/models/language/language.controller.ts` | +| PUT | 1 | | `/limitRequest/:id` | hidden | whole rows | 434 | not yet | | `LimitRequestController.updateUserData` | `subdomains/supporting/support-issue/limit-request.controller.ts` | +| GET | 1 | | `/liquidityManagement/balance` | hidden | whole rows | 40 | not yet | | `LiquidityBalanceController.getBalances` | `subdomains/core/liquidity-management/controllers/balance.controller.ts` | +| PUT | 1 | | `/liquidityManagement/order/:id/resolveUncertain` | hidden | whole rows | 139 | not yet | | `LiquidityManagementOrderController.resolveUncertainOrder` | `subdomains/core/liquidity-management/controllers/order.controller.ts` | +| GET | 1 | | `/liquidityManagement/order/in-progress` | hidden | whole rows | 139 | not yet | | `LiquidityManagementOrderController.getProcessingOrders` | `subdomains/core/liquidity-management/controllers/order.controller.ts` | +| GET | 1 | | `/liquidityManagement/pipeline/:id/status` | hidden | whole rows | 112 | not yet | | `LiquidityManagementPipelineController.getPipelineStatus` | `subdomains/core/liquidity-management/controllers/pipeline.controller.ts` | +| POST | 1 | | `/liquidityManagement/pipeline/buy` | hidden | whole rows | 112 | not yet | | `LiquidityManagementPipelineController.buyLiquidity` | `subdomains/core/liquidity-management/controllers/pipeline.controller.ts` | +| GET | 1 | | `/liquidityManagement/pipeline/in-progress` | hidden | whole rows | 112 | not yet | | `LiquidityManagementPipelineController.getProcessingPipelines` | `subdomains/core/liquidity-management/controllers/pipeline.controller.ts` | +| POST | 1 | | `/liquidityManagement/pipeline/sell` | hidden | whole rows | 112 | not yet | | `LiquidityManagementPipelineController.sellLiquidity` | `subdomains/core/liquidity-management/controllers/pipeline.controller.ts` | +| GET | 1 | | `/liquidityManagement/pipeline/stopped` | hidden | whole rows | 112 | not yet | | `LiquidityManagementPipelineController.getStoppedPipelines` | `subdomains/core/liquidity-management/controllers/pipeline.controller.ts` | +| POST | 1 | | `/liquidityManagement/rule` | hidden | whole rows | 83 | not yet | | `LiquidityManagementRuleController.createRule` | `subdomains/core/liquidity-management/controllers/rule.controller.ts` | +| GET | 1 | | `/liquidityManagement/rule/:id` | hidden | whole rows | 83 | not yet | | `LiquidityManagementRuleController.getRule` | `subdomains/core/liquidity-management/controllers/rule.controller.ts` | +| PUT | 1 | | `/liquidityManagement/rule/:id` | hidden | whole rows | 83 | not yet | | `LiquidityManagementRuleController.updateRule` | `subdomains/core/liquidity-management/controllers/rule.controller.ts` | +| PATCH | 1 | | `/liquidityManagement/rule/:id/deactivate` | hidden | whole rows | 83 | not yet | | `LiquidityManagementRuleController.deactivateRule` | `subdomains/core/liquidity-management/controllers/rule.controller.ts` | +| PATCH | 1 | | `/liquidityManagement/rule/:id/reactivate` | hidden | whole rows | 83 | not yet | | `LiquidityManagementRuleController.reactivateRule` | `subdomains/core/liquidity-management/controllers/rule.controller.ts` | +| PATCH | 1 | | `/liquidityManagement/rule/:id/settings` | hidden | whole rows | 83 | not yet | | `LiquidityManagementRuleController.setReactivationTime` | `subdomains/core/liquidity-management/controllers/rule.controller.ts` | +| GET | 1 | | `/lnurla` | public | whole rows | 643 | not yet | | `AuthLnurlController.signInWithLnurlAuth` | `subdomains/generic/user/models/auth/auth-lnurl.controller.ts` | +| POST | 1 | | `/lnurla` | public | none | — | n/a | | `AuthLnurlController.getLnurlAuth` | `subdomains/generic/user/models/auth/auth-lnurl.controller.ts` | +| GET | 1 | | `/lnurla/status` | public | none | — | n/a | | `AuthLnurlController.lnurlAuthStatus` | `subdomains/generic/user/models/auth/auth-lnurl.controller.ts` | +| GET | 1 | | `/lnurld/:id` | public | none | — | n/a | yes | `LnurldForwardController.lnurldForward` | `subdomains/generic/forwarding/controllers/lnurld-forward.controller.ts` | +| GET | 1 | | `/lnurld/cb/:id/:var` | public | none | — | n/a | yes | `LnurldForwardController.lnurldCallbackForward` | `subdomains/generic/forwarding/controllers/lnurld-forward.controller.ts` | +| GET | 1 | | `/lnurlp/:id` | public | whole rows | 545 | not yet | yes | `LnUrlPForwardController.lnUrlPForward` | `subdomains/generic/forwarding/controllers/lnurlp-forward.controller.ts` | +| POST | 1 | | `/lnurlp/:id` | public | whole rows | 545 | not yet | | `LnUrlPForwardController.activatePublicPayment` | `subdomains/generic/forwarding/controllers/lnurlp-forward.controller.ts` | +| DELETE | 1 | | `/lnurlp/cancel/:id` | public | whole rows | 545 | not yet | | `LnUrlPForwardController.cancelPayment` | `subdomains/generic/forwarding/controllers/lnurlp-forward.controller.ts` | +| GET | 1 | | `/lnurlp/cb/:id` | public | whole rows | 545 | not yet | yes | `LnUrlPForwardController.lnUrlPCallbackForward` | `subdomains/generic/forwarding/controllers/lnurlp-forward.controller.ts` | +| GET | 1 | | `/lnurlp/tx/:id` | public | whole rows | 545 | not yet | | `LnUrlPForwardController.txHexForward` | `subdomains/generic/forwarding/controllers/lnurlp-forward.controller.ts` | +| GET | 1 | | `/lnurlp/wait/:id` | public | whole rows | 545 | not yet | | `LnUrlPForwardController.waitForPayment` | `subdomains/generic/forwarding/controllers/lnurlp-forward.controller.ts` | +| GET | 1 | | `/lnurlw/:id` | public | none | — | n/a | yes | `LnUrlWForwardController.lnUrlWForward` | `subdomains/generic/forwarding/controllers/lnurlw-forward.controller.ts` | +| GET | 1 | | `/lnurlw/cb/:id` | public | none | — | n/a | yes | `LnUrlWForwardController.lnUrlWCallbackForward` | `subdomains/generic/forwarding/controllers/lnurlw-forward.controller.ts` | +| POST | 1 | | `/log` | hidden | whole rows | 11 | not yet | | `LogController.create` | `subdomains/supporting/log/log.controller.ts` | +| PUT | 1 | | `/log/:id` | hidden | whole rows | 11 | not yet | | `LogController.update` | `subdomains/supporting/log/log.controller.ts` | +| POST | 1 | | `/log/clientError` | public | none | — | n/a | yes | `ClientErrorController.logError` | `subdomains/supporting/log/client-error.controller.ts` | +| PUT | 1 | | `/log/financial/validity` | hidden | projected | 11 | 0/4 | | `LogController.setFinancialLogValidity` | `subdomains/supporting/log/log.controller.ts` | +| GET | 1 | | `/monitoring/data` | hidden | none | — | n/a | | `MonitoringController.getSystemState` | `subdomains/core/monitoring/monitoring.controller.ts` | +| POST | 1 | | `/monitoring/data` | hidden | none | — | n/a | | `MonitoringController.onWebhook` | `subdomains/core/monitoring/monitoring.controller.ts` | +| GET | 1 | | `/mros` | hidden | whole rows | 243 | not yet | | `MrosController.getAll` | `subdomains/supporting/mros/mros.controller.ts` | +| POST | 1 | | `/mros` | hidden | whole rows | 253 | not yet | | `MrosController.createMros` | `subdomains/supporting/mros/mros.controller.ts` | +| GET | 1 | | `/mros/:id` | hidden | whole rows | 243 | not yet | | `MrosController.getById` | `subdomains/supporting/mros/mros.controller.ts` | +| PUT | 1 | | `/mros/:id` | hidden | whole rows | 98 | not yet | | `MrosController.updateMros` | `subdomains/supporting/mros/mros.controller.ts` | +| POST | 1 | | `/node/:node/:mode/cmd` | hidden | none | — | n/a | | `NodeController.cmdForMode` | `integration/blockchain/bitcoin/node/node.controller.ts` | +| POST | 1 | | `/node/:node/:mode/rpc` | hidden | none | — | n/a | | `NodeController.rpcForMode` | `integration/blockchain/bitcoin/node/node.controller.ts` | +| GET | 1 | | `/node/:node/:mode/tx/:txId` | hidden | none | — | n/a | | `NodeController.waitForTxForMode` | `integration/blockchain/bitcoin/node/node.controller.ts` | +| POST | 1 | | `/node/:node/cmd` | hidden | none | — | n/a | | `NodeController.cmd` | `integration/blockchain/bitcoin/node/node.controller.ts` | +| POST | 1 | | `/node/:node/rpc` | hidden | none | — | n/a | | `NodeController.rpc` | `integration/blockchain/bitcoin/node/node.controller.ts` | +| GET | 1 | | `/node/:node/tx/:txId` | hidden | none | — | n/a | | `NodeController.waitForTx` | `integration/blockchain/bitcoin/node/node.controller.ts` | +| POST | 1 | | `/notification/send-mail` | hidden | whole rows | 13 | not yet | | `NotificationController.sendMail` | `subdomains/supporting/notification/notification.controller.ts` | +| POST | 1 | | `/payIn` | hidden | whole rows | 545 | not yet | | `PayInController.createPayIn` | `subdomains/supporting/payin/controllers/payin.controller.ts` | +| POST | 1 | | `/payIn/lnurlpDeposit/:uniqueId` | hidden | none | — | n/a | | `PayInWebhookController.deposit` | `subdomains/supporting/payin/controllers/payin-webhook.controller.ts` | +| POST | 1 | | `/payIn/lnurlpPayment/:uniqueId` | hidden | none | — | n/a | | `PayInWebhookController.payment` | `subdomains/supporting/payin/controllers/payin-webhook.controller.ts` | +| POST | 1 | | `/payIn/poll` | hidden | none | — | n/a | | `PayInController.pollAddress` | `subdomains/supporting/payin/controllers/payin.controller.ts` | +| POST | 1 | | `/payIn/retry` | hidden | whole rows | — | not yet | | `PayInController.retryUncertainSend` | `subdomains/supporting/payin/controllers/payin.controller.ts` | +| GET | 1 | | `/paymentLink` | public | whole rows | 513 | not yet | yes | `PaymentLinkController.getAllPaymentLinks` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| POST | 1 | | `/paymentLink` | public | whole rows | 545 | not yet | | `PaymentLinkController.createPaymentLink` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| PUT | 1 | | `/paymentLink` | public | whole rows | 513 | not yet | | `PaymentLinkController.updatePaymentLink` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| DELETE | 1 | | `/paymentLink/:id` | hidden | whole rows | 195 | not yet | | `PaymentLinkController.deletePaymentLink` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| PUT | 1 | | `/paymentLink/:id` | hidden | whole rows | 513 | not yet | | `PaymentLinkController.updatePaymentLinkAdmin` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| PUT | 1 | | `/paymentLink/:id/pos` | hidden | whole rows | 513 | not yet | | `PaymentLinkController.createPosLinkAdmin` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| PUT | 1 | | `/paymentLink/assign` | public | whole rows | 513 | not yet | yes | `PaymentLinkController.assignPaymentLink` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| GET | 1 | | `/paymentLink/config` | public | whole rows | 253 | not yet | | `PaymentLinkController.getUserPaymentLinksConfig` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| PUT | 1 | | `/paymentLink/config` | public | whole rows | 253 | not yet | | `PaymentLinkController.updateUserPaymentLinksConfig` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| GET | 1 | | `/paymentLink/history` | public | whole rows | 545 | not yet | | `PaymentLinkController.getPaymentHistory` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| POST | 1 | | `/paymentLink/integration/binance/activate/:id` | hidden | whole rows | 513 | not yet | | `C2BPaymentLinkController.activateBinancePay` | `subdomains/core/payment-link/controllers/c2b-payment-link.controller.ts` | +| POST | 1 | | `/paymentLink/integration/binance/webhook` | hidden | whole rows | 545 | not yet | | `C2BPaymentLinkController.binancePayWebhook` | `subdomains/core/payment-link/controllers/c2b-payment-link.controller.ts` | +| POST | 1 | | `/paymentLink/integration/kucoin/activate/:id` | hidden | whole rows | 513 | not yet | | `C2BPaymentLinkController.activateKucoinPay` | `subdomains/core/payment-link/controllers/c2b-payment-link.controller.ts` | +| POST | 1 | | `/paymentLink/integrations/kucoin/webhook/cancel` ⚠️ | hidden | none | — | n/a | | `C2BPaymentLinkController.kucoinPayWebhook` | `subdomains/core/payment-link/controllers/c2b-payment-link.controller.ts` | +| POST | 1 | | `/paymentLink/integrations/kucoin/webhook/success` | hidden | none | — | n/a | | `C2BPaymentLinkController.kucoinPayWebhook` | `subdomains/core/payment-link/controllers/c2b-payment-link.controller.ts` | +| GET | 1 | | `/paymentLink/locations` | public | whole rows | 513 | not yet | | `PaymentLinkController.getLocations` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| POST | 1 | | `/paymentLink/merchant` | public | whole rows | 253 | not yet | | `PaymentLinkController.createMerchant` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| DELETE | 1 | | `/paymentLink/payment` | public | whole rows | 545 | not yet | | `PaymentLinkController.cancelPayment` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| GET | 1 | | `/paymentLink/payment` | hidden | whole rows | 545 | not yet | yes | `PaymentLinkController.createInvoicePayment` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| POST | 1 | | `/paymentLink/payment` | public | whole rows | 545 | not yet | | `PaymentLinkController.createPayment` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| PUT | 1 | | `/paymentLink/payment/:id` | hidden | whole rows | 545 | not yet | | `PaymentLinkController.updatePaymentLinkPayment` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| PUT | 1 | | `/paymentLink/payment/confirm` | public | whole rows | 513 | not yet | | `PaymentLinkController.confirmPayment` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| GET | 1 | | `/paymentLink/payment/wait` | public | whole rows | 513 | not yet | | `PaymentLinkController.waitForPayment` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| PUT | 1 | | `/paymentLink/pos` | public | whole rows | 513 | not yet | | `PaymentLinkController.createPosLink` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| GET | 1 | | `/paymentLink/recipient` | hidden | whole rows | 472 | not yet | | `PaymentLinkController.getPaymentRecipient` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| GET | 1 | | `/paymentLink/standard` | public | none | — | n/a | | `PaymentStandardController.getAll` | `subdomains/core/payment-link/controllers/payment-standard.controller.ts` | +| GET | 1 | | `/paymentLink/standard/:id` | public | none | — | n/a | | `PaymentStandardController.getById` | `subdomains/core/payment-link/controllers/payment-standard.controller.ts` | +| GET | 1 | | `/paymentLink/stickers` | hidden | whole rows | 513 | not yet | yes | `PaymentLinkController.generateOcpStickers` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| GET | 1 | | `/paymentLink/walletApp` | public | whole rows | 33 | not yet | | `WalletAppController.getAll` | `subdomains/core/payment-link/controllers/wallet-app.controller.ts` | +| GET | 1 | | `/paymentLink/walletApp/:id` | public | whole rows | 33 | not yet | | `WalletAppController.getById` | `subdomains/core/payment-link/controllers/wallet-app.controller.ts` | +| GET | 1 | | `/paymentLink/walletApp/recommended` | public | whole rows | 33 | not yet | | `WalletAppController.getRecommended` | `subdomains/core/payment-link/controllers/wallet-app.controller.ts` | +| POST | 1 | | `/payout` | hidden | none | — | n/a | | `PayoutController.doPayout` | `subdomains/supporting/payout/payout.controller.ts` | +| GET | 1 | | `/payout/completion` | hidden | whole rows | 123 | not yet | | `PayoutController.checkOrderCompletion` | `subdomains/supporting/payout/payout.controller.ts` | +| POST | 1 | | `/payout/retry` | hidden | whole rows | 123 | not yet | | `PayoutController.retryUncertainPayout` | `subdomains/supporting/payout/payout.controller.ts` | +| POST | 1 | | `/payout/speedup` | hidden | whole rows | 123 | not yet | | `PayoutController.speedupTransaction` | `subdomains/supporting/payout/payout.controller.ts` | +| GET | neutral | | `/pl` | hidden | whole rows | 545 | not yet | | `PaymentForwardController.lnUrlPForward` | `subdomains/generic/forwarding/controllers/payment-forward.controller.ts` | +| GET | 1 | | `/plp` | hidden | whole rows | 545 | not yet | | `PaymentLinkShortController.createInvoicePayment` | `subdomains/core/payment-link/controllers/payment-link.controller.ts` | +| GET | 1 | | `/pricing` | hidden | none | — | n/a | | `PricingController.getRawPrice` | `subdomains/supporting/pricing/pricing.controller.ts` | +| PUT | 1 | | `/pricing` | hidden | whole rows | 53 | not yet | | `PricingController.updatePrices` | `subdomains/supporting/pricing/pricing.controller.ts` | +| GET | 1 | | `/pricing/price` | hidden | whole rows | 33 | not yet | | `PricingController.getPrice` | `subdomains/supporting/pricing/pricing.controller.ts` | +| GET | 1 | | `/realunit/account/:address` | public | whole rows | 40 | not yet | | `RealUnitController.getAccountSummary` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/account/:address/history` | public | none | — | n/a | | `RealUnitController.getAccountHistory` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/admin/quotes` | hidden | whole rows | 112 | not yet | | `RealUnitController.getAdminQuotes` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/admin/quotes/:id/confirm-payment` | hidden | whole rows | 1051 | not yet | | `RealUnitController.confirmPaymentReceived` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/admin/registration/:id/forward` | hidden | whole rows | 493 | not yet | yes | `RealUnitController.forwardRegistration` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/admin/transactions` | hidden | whole rows | 362 | not yet | | `RealUnitController.getAdminTransactions` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| POST | 1 | | `/realunit/balance/pdf` | public | whole rows | 308 | not yet | yes | `RealUnitController.getBalancePdf` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | yes | `/realunit/brokerbot/buyPrice` | public | none | — | n/a | | `RealUnitController.getBrokerbotBuyPrice` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | yes | `/realunit/brokerbot/buyShares` | public | none | — | n/a | | `RealUnitController.getBrokerbotBuyShares` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | yes | `/realunit/brokerbot/info` | public | whole rows | 33 | not yet | | `RealUnitController.getBrokerbotInfo` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | yes | `/realunit/brokerbot/price` | public | none | — | n/a | | `RealUnitController.getBrokerbotPrice` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | yes | `/realunit/brokerbot/sellPrice` | public | whole rows | 308 | not yet | | `RealUnitController.getBrokerbotSellPrice` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | yes | `/realunit/brokerbot/sellShares` | public | whole rows | 308 | not yet | | `RealUnitController.getBrokerbotSellShares` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/buy` | public | whole rows | 364 | not yet | yes | `RealUnitController.getPaymentInfo` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/buy/:id/confirm` | public | whole rows | 504 | not yet | | `RealUnitController.confirmBuy` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/compliance/customers` | hidden | whole rows | 308 | not yet | | `RealUnitComplianceController.searchCustomers` | `subdomains/supporting/realunit/controllers/realunit-compliance.controller.ts` | +| GET | 1 | | `/realunit/compliance/customers/:id` | hidden | whole rows | 826 | not yet | | `RealUnitComplianceController.getCustomer` | `subdomains/supporting/realunit/controllers/realunit-compliance.controller.ts` | +| GET | 1 | | `/realunit/compliance/customers/:id/dossier` | hidden | whole rows | 264 | not yet | | `RealUnitComplianceController.downloadCustomerDossier` | `subdomains/supporting/realunit/controllers/realunit-compliance.controller.ts` | +| GET | 1 | | `/realunit/compliance/customers/:id/files` | hidden | whole rows | 264 | not yet | | `RealUnitComplianceController.getCustomerFiles` | `subdomains/supporting/realunit/controllers/realunit-compliance.controller.ts` | +| GET | 1 | | `/realunit/compliance/customers/:id/files/:uid` | hidden | whole rows | 264 | not yet | | `RealUnitComplianceController.downloadCustomerFile` | `subdomains/supporting/realunit/controllers/realunit-compliance.controller.ts` | +| GET | 1 | | `/realunit/confirm-aktionariat` | public | whole rows | 15 | not yet | yes | `RealUnitController.confirmAktionariat` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/holders` | public | none | — | n/a | | `RealUnitController.getHolders` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/legal` | public | whole rows | 308 | not yet | yes | `RealUnitLegalController.getLegal` | `subdomains/supporting/realunit/controllers/realunit-legal.controller.ts` | +| PUT | 1 | | `/realunit/legal` | public | whole rows | 308 | not yet | yes | `RealUnitLegalController.acceptLegal` | `subdomains/supporting/realunit/controllers/realunit-legal.controller.ts` | +| GET | 1 | | `/realunit/pay/:id/status` | public | whole rows | 32 | not yet | yes | `RealUnitController.getOcpPayStatus` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/pay/submit` | public | whole rows | 545 | not yet | yes | `RealUnitController.submitOcpPay` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/pay/unsigned-transaction` | public | whole rows | 545 | not yet | yes | `RealUnitController.getOcpPayUnsignedTransaction` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/price` | public | whole rows | 33 | not yet | | `RealUnitController.getRealUnitPrice` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/price/history` | public | whole rows | 40 | not yet | | `RealUnitController.getHistoricalPrice` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/quote/buyPrice` | public | none | — | n/a | | `RealUnitController.getQuoteBuyPrice` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/quote/buyShares` | public | none | — | n/a | | `RealUnitController.getQuoteBuyShares` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/quote/info` | public | whole rows | 33 | not yet | | `RealUnitController.getQuoteInfo` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/quote/price` | public | none | — | n/a | | `RealUnitController.getQuotePrice` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/quote/sellPrice` | public | whole rows | 308 | not yet | | `RealUnitController.getQuoteSellPrice` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/quote/sellShares` | public | whole rows | 308 | not yet | | `RealUnitController.getQuoteSellShares` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| POST | 1 | | `/realunit/register/complete` | public | whole rows | 493 | not yet | yes | `RealUnitController.completeRegistration` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/register/date` | public | none | — | n/a | yes | `RealUnitController.getRegistrationDate` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| POST | 1 | | `/realunit/register/email` | public | whole rows | 364 | not yet | yes | `RealUnitController.registerEmail` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/register/status` | public | whole rows | 308 | not yet | yes | `RealUnitController.isRegistered` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| POST | 1 | | `/realunit/register/wallet` | public | whole rows | 493 | not yet | yes | `RealUnitController.completeRegistrationForWalletAddress` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/registration` | public | whole rows | 308 | not yet | yes | `RealUnitController.getRegistrationInfo` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/sell` | public | whole rows | 308 | not yet | yes | `RealUnitController.getSellPaymentInfo` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/sell/:id/broadcast` | public | whole rows | 504 | not yet | | `RealUnitController.broadcastSellTransaction` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/sell/:id/confirm` | public | whole rows | 504 | not yet | | `RealUnitController.confirmSell` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/sell/:id/unsigned-transactions` | public | whole rows | 504 | not yet | | `RealUnitController.getSellUnsignedTransactions` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/support/:id` | hidden | whole rows | 421 | not yet | | `RealUnitSupportController.updateSupportIssue` | `subdomains/supporting/realunit/controllers/realunit-support.controller.ts` | +| GET | 1 | | `/realunit/support/:id/data` | hidden | whole rows | 951 | not yet | | `RealUnitSupportController.getIssueData` | `subdomains/supporting/realunit/controllers/realunit-support.controller.ts` | +| POST | 1 | | `/realunit/support/:id/message` | hidden | whole rows | 441 | not yet | | `RealUnitSupportController.createSupportMessage` | `subdomains/supporting/realunit/controllers/realunit-support.controller.ts` | +| GET | 1 | | `/realunit/support/:id/message/:messageId/file` | hidden | whole rows | 421 | not yet | | `RealUnitSupportController.getFile` | `subdomains/supporting/realunit/controllers/realunit-support.controller.ts` | +| GET | 1 | | `/realunit/support/:id/messages` | hidden | whole rows | 428 | not yet | | `RealUnitSupportController.getIssueMessages` | `subdomains/supporting/realunit/controllers/realunit-support.controller.ts` | +| GET | 1 | | `/realunit/support/activity` | hidden | whole rows | 99 | not yet | | `RealUnitSupportController.getSupportIssueActivity` | `subdomains/supporting/realunit/controllers/realunit-support.controller.ts` | +| GET | 1 | | `/realunit/support/clerks` | hidden | none | — | n/a | | `RealUnitSupportController.getRealUnitSupportClerks` | `subdomains/supporting/realunit/controllers/realunit-support.controller.ts` | +| GET | 1 | | `/realunit/support/counts` | hidden | whole rows | 99 | not yet | | `RealUnitSupportController.getSupportIssueCounts` | `subdomains/supporting/realunit/controllers/realunit-support.controller.ts` | +| GET | 1 | | `/realunit/support/list` | hidden | whole rows | 99 | not yet | | `RealUnitSupportController.getSupportIssueList` | `subdomains/supporting/realunit/controllers/realunit-support.controller.ts` | +| GET | 1 | | `/realunit/support/statistics` | hidden | whole rows | 99 | not yet | | `RealUnitSupportController.getSupportIssueStatistics` | `subdomains/supporting/realunit/controllers/realunit-support.controller.ts` | +| PUT | 1 | | `/realunit/swap` | public | whole rows | 308 | not yet | yes | `RealUnitController.getSwapPaymentInfo` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/swap/:id/broadcast` | public | whole rows | 504 | not yet | yes | `RealUnitController.broadcastSwapTransaction` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/swap/:id/unsigned-transaction` | public | whole rows | 504 | not yet | yes | `RealUnitController.getSwapUnsignedTransaction` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/realunit/tokenInfo` | public | none | — | n/a | | `RealUnitController.getTokenInfo` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| POST | 1 | | `/realunit/transactions/receipt/multi` | public | whole rows | 308 | not yet | | `RealUnitController.generateHistoryMultiReceipt` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| POST | 1 | | `/realunit/transactions/receipt/single` | public | whole rows | 308 | not yet | | `RealUnitController.generateHistoryReceipt` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/transfer` | public | whole rows | 308 | not yet | yes | `RealUnitController.prepareTransfer` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| PUT | 1 | | `/realunit/transfer/:id/confirm` | public | whole rows | 87 | not yet | yes | `RealUnitController.confirmTransfer` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | yes | `/realunit/wallet/status` | public | whole rows | 308 | not yet | yes | `RealUnitController.getWalletStatus` | `subdomains/supporting/realunit/controllers/realunit.controller.ts` | +| GET | 1 | | `/recall` | hidden | whole rows | 174 | not yet | | `RecallController.getAll` | `subdomains/supporting/recall/recall.controller.ts` | +| POST | 1 | | `/recall` | hidden | whole rows | 308 | not yet | | `RecallController.createRecall` | `subdomains/supporting/recall/recall.controller.ts` | +| GET | 1 | | `/recall/:id` | hidden | whole rows | 174 | not yet | | `RecallController.getById` | `subdomains/supporting/recall/recall.controller.ts` | +| PUT | 1 | | `/recall/:id` | hidden | whole rows | 308 | not yet | | `RecallController.updateRecall` | `subdomains/supporting/recall/recall.controller.ts` | +| GET | 1 | | `/recommendation` | hidden | whole rows | 474 | not yet | | `RecommendationController.getAllRecommendation` | `subdomains/generic/user/models/recommendation/recommendation.controller.ts` | +| POST | 1 | | `/recommendation` | hidden | whole rows | 364 | not yet | | `RecommendationController.createRecommendation` | `subdomains/generic/user/models/recommendation/recommendation.controller.ts` | +| PUT | 1 | | `/recommendation/:id/confirm` | hidden | whole rows | 643 | not yet | | `RecommendationController.confirmRecommendation` | `subdomains/generic/user/models/recommendation/recommendation.controller.ts` | +| PUT | 1 | | `/recommendation/:id/reject` | hidden | whole rows | 643 | not yet | | `RecommendationController.rejectRecommendation` | `subdomains/generic/user/models/recommendation/recommendation.controller.ts` | +| GET | 1 | | `/ref` | hidden | none | — | n/a | | `RefController.createRef` | `subdomains/core/referral/process/ref.controller.ts` | +| POST | 1 | | `/reward/ref` | hidden | whole rows | 156 | not yet | | `RefRewardController.createPendingRefRewards` | `subdomains/core/referral/reward/ref-reward.controller.ts` | +| PUT | 1 | | `/reward/ref/:id` | hidden | whole rows | 234 | not yet | | `RefRewardController.updateRefReward` | `subdomains/core/referral/reward/ref-reward.controller.ts` | +| POST | 1 | | `/reward/ref/manual` | hidden | whole rows | 308 | not yet | | `RefRewardController.createManualRefReward` | `subdomains/core/referral/reward/ref-reward.controller.ts` | +| PUT | 1 | | `/reward/ref/volumes` | hidden | whole rows | 308 | not yet | | `RefRewardController.updateVolumes` | `subdomains/core/referral/reward/ref-reward.controller.ts` | +| GET | 1 | | `/route` | hidden | whole rows | 308 | not yet | | `RouteController.getAllRoutes` | `subdomains/core/route/route.controller.ts` | +| PUT | 1 | | `/route/:id` | hidden | whole rows | 174 | not yet | | `RouteController.updateRoute` | `subdomains/core/route/route.controller.ts` | +| POST | 1 | | `/scorechain/screening` | hidden | whole rows | 14 | not yet | | `ScorechainController.screen` | `integration/scorechain/controllers/scorechain.controller.ts` | +| GET | 1 | | `/sell` | hidden | whole rows | 308 | not yet | | `SellController.getAllSell` | `subdomains/core/sell-crypto/route/sell.controller.ts` | +| POST | 1 | | `/sell` | hidden | whole rows | 308 | not yet | | `SellController.createSell` | `subdomains/core/sell-crypto/route/sell.controller.ts` | +| GET | 1 | | `/sell/:id` | public | whole rows | 377 | not yet | | `SellController.getSell` | `subdomains/core/sell-crypto/route/sell.controller.ts` | +| PUT | 1 | | `/sell/:id` | hidden | whole rows | 308 | not yet | | `SellController.updateSell` | `subdomains/core/sell-crypto/route/sell.controller.ts` | +| GET | 1 | | `/sell/:id/history` | hidden | whole rows | 470 | not yet | | `SellController.getSellRouteHistory` | `subdomains/core/sell-crypto/route/sell.controller.ts` | +| PUT | 1 | | `/sell/paymentInfos` | public | whole rows | 308 | not yet | | `SellController.createSellWithPaymentInfo` | `subdomains/core/sell-crypto/route/sell.controller.ts` | +| PUT | 1 | | `/sell/paymentInfos/:id/confirm` | public | whole rows | 545 | not yet | | `SellController.confirmSell` | `subdomains/core/sell-crypto/route/sell.controller.ts` | +| GET | 1 | | `/sell/paymentInfos/:id/tx` | public | whole rows | 504 | not yet | | `SellController.depositTx` | `subdomains/core/sell-crypto/route/sell.controller.ts` | +| PUT | 1 | | `/sell/quote` | public | whole rows | 143 | not yet | | `SellController.getSellQuote` | `subdomains/core/sell-crypto/route/sell.controller.ts` | +| GET | 1 | | `/setting` | hidden | whole rows | 5 | not yet | | `SettingController.getSettings` | `shared/models/setting/setting.controller.ts` | +| PUT | 1 | | `/setting/:key` | hidden | whole rows | 5 | not yet | | `SettingController.updateSetting` | `shared/models/setting/setting.controller.ts` | +| PUT | 1 | | `/setting/customSignUpFees` | hidden | none | — | n/a | | `SettingController.updateCustomSignUpFees` | `shared/models/setting/setting.controller.ts` | +| PUT | 1 | | `/setting/disabledProcesses` | hidden | none | — | n/a | | `SettingController.updateProcess` | `shared/models/setting/setting.controller.ts` | +| GET | 1 | | `/setting/infoBanner` | public | none | — | n/a | | `SettingController.getInfoBanner` | `shared/models/setting/setting.controller.ts` | +| POST | 1 | | `/specialExternalAccount` | hidden | whole rows | 7 | not yet | | `SpecialExternalAccountController.createSpecialExternalAccount` | `subdomains/supporting/payment/controllers/special-external-account.controller.ts` | +| GET | 1 | | `/statistic` | public | none | — | n/a | | `StatisticController.getAll` | `subdomains/core/statistic/statistic.controller.ts` | +| GET | 1 | | `/statistic/status` | public | whole rows | 5 | not yet | | `StatisticController.getStatus` | `subdomains/core/statistic/statistic.controller.ts` | +| GET | 1 | | `/statistic/transactions` | public | whole rows | 419 | not yet | | `StatisticController.getTransactions` | `subdomains/core/statistic/statistic.controller.ts` | +| GET | 1 | | `/support` | hidden | whole rows | 593 | not yet | | `SupportController.searchUserByKey` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/:id` | hidden | whole rows | 826 | not yet | | `SupportController.getUserData` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/:id/ip-log-pdf` | hidden | whole rows | 12 | not yet | | `SupportController.getIpLogPdf` | `subdomains/generic/support/support.controller.ts` | +| POST | 1 | | `/support/:id/onboarding-pdf` | hidden | whole rows | 264 | not yet | | `SupportController.generateOnboardingPdf` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/:id/scorechain` | hidden | whole rows | 14 | not yet | | `SupportController.getScorechainScreenings` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/:id/transaction-pdf` | hidden | whole rows | 826 | not yet | | `SupportController.getTransactionPdf` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/call-queues` | hidden | none | — | n/a | | `SupportController.getCallQueues` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/call-queues/:queue/items` | hidden | whole rows | 672 | not yet | | `SupportController.getCallQueueItems` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/call-queues/clerks` | hidden | none | — | n/a | | `SupportController.getCallQueueClerks` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/issue` | public | whole rows | 450 | not yet | | `SupportIssueController.getIssues` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| POST | 1 | | `/support/issue` | public | whole rows | 493 | not yet | | `SupportIssueController.createIssue` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/issue/:id` | public | whole rows | 450 | not yet | | `SupportIssueController.getIssue` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| PUT | 1 | | `/support/issue/:id` | hidden | whole rows | 421 | not yet | | `SupportIssueController.updateSupportIssue` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| PUT | 1 | | `/support/issue/:id/close` | public | whole rows | 450 | not yet | | `SupportIssueController.closeIssue` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/issue/:id/data` | hidden | whole rows | 951 | not yet | | `SupportIssueController.getIssueData` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| POST | 1 | | `/support/issue/:id/message` | public | whole rows | 441 | not yet | yes | `SupportIssueController.createSupportMessage` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/issue/:id/message/:messageId/file` | public | whole rows | — | not yet | | `SupportIssueController.getFile` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/issue/activity` | hidden | whole rows | 7 | not yet | | `SupportIssueController.getSupportIssueActivity` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/issue/clerk` | hidden | none | — | n/a | | `SupportIssueController.getSupportIssueClerk` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/issue/clerks` | hidden | none | — | n/a | | `SupportIssueController.getSupportIssueClerks` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/issue/counts` | hidden | whole rows | 16 | not yet | | `SupportIssueController.getSupportIssueCounts` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| POST | 1 | | `/support/issue/escalation/telegram-bind` | hidden | whole rows | 5 | not yet | | `SupportIssueController.bindEscalationChat` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/issue/escalation/telegram-chats` | hidden | none | — | n/a | | `SupportIssueController.getEscalationChats` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| POST | 1 | | `/support/issue/escalation/telegram-test` | hidden | whole rows | 5 | not yet | | `SupportIssueController.testEscalationChat` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/issue/list` | hidden | whole rows | 16 | not yet | | `SupportIssueController.getSupportIssueList` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/issue/statistics` | hidden | whole rows | 16 | not yet | | `SupportIssueController.getSupportIssueStatistics` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| POST | 1 | | `/support/issue/support` | hidden | whole rows | 493 | not yet | | `SupportIssueController.createIssueBySupport` | `subdomains/supporting/support-issue/support-issue.controller.ts` | +| GET | 1 | | `/support/kycFileList` | hidden | whole rows | 253 | not yet | | `SupportController.getKycFileList` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/kycFileStats` | hidden | whole rows | 99 | not yet | | `SupportController.getKycFileStats` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/note` | hidden | whole rows | 9 | not yet | | `SupportController.getNotes` | `subdomains/generic/support/support.controller.ts` | +| POST | 1 | | `/support/note` | hidden | whole rows | 253 | not yet | | `SupportController.createNote` | `subdomains/generic/support/support.controller.ts` | +| DELETE | 1 | | `/support/note/:id` | hidden | whole rows | 9 | not yet | | `SupportController.deleteNote` | `subdomains/generic/support/support.controller.ts` | +| PUT | 1 | | `/support/note/:id` | hidden | whole rows | 239 | not yet | | `SupportController.updateNote` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/note/users` | hidden | whole rows | 9 | not yet | | `SupportController.listNoteUsers` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/pending-reviews` | hidden | whole rows | 15 | not yet | | `SupportController.getPendingReviews` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/pending-reviews/items` | hidden | whole rows | 261 | not yet | | `SupportController.getPendingReviewItems` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/pending-transactions` | hidden | whole rows | 672 | not yet | | `SupportController.getPendingTransactions` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/recommendation-graph/:id/neighbors` | hidden | whole rows | 474 | not yet | yes | `SupportController.getRecommendationGraphNeighbors` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/template` | hidden | whole rows | 8 | not yet | | `SupportController.getTemplates` | `subdomains/generic/support/support.controller.ts` | +| POST | 1 | | `/support/template` | hidden | whole rows | 253 | not yet | | `SupportController.createTemplate` | `subdomains/generic/support/support.controller.ts` | +| DELETE | 1 | | `/support/template/:id` | hidden | whole rows | 8 | not yet | | `SupportController.deleteTemplate` | `subdomains/generic/support/support.controller.ts` | +| PUT | 1 | | `/support/template/:id` | hidden | whole rows | 8 | not yet | | `SupportController.updateTemplate` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/transaction/:id/refund` | hidden | whole rows | 143 | not yet | | `SupportController.getTransactionRefund` | `subdomains/generic/support/support.controller.ts` | +| PUT | 1 | | `/support/transaction/:id/refund` | hidden | whole rows | 415 | not yet | | `SupportController.setTransactionRefund` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/support/transactionList` | hidden | whole rows | 20 | not yet | | `SupportController.getTransactionList` | `subdomains/generic/support/support.controller.ts` | +| GET | 1 | | `/swap` | hidden | whole rows | 308 | not yet | | `SwapController.getAllSwap` | `subdomains/core/buy-crypto/routes/swap/swap.controller.ts` | +| POST | 1 | | `/swap` | hidden | whole rows | 308 | not yet | | `SwapController.createSwap` | `subdomains/core/buy-crypto/routes/swap/swap.controller.ts` | +| GET | 1 | | `/swap/:id` | public | whole rows | 308 | not yet | | `SwapController.getSwap` | `subdomains/core/buy-crypto/routes/swap/swap.controller.ts` | +| PUT | 1 | | `/swap/:id` | hidden | whole rows | 396 | not yet | | `SwapController.updateSwapRoute` | `subdomains/core/buy-crypto/routes/swap/swap.controller.ts` | +| GET | 1 | | `/swap/:id/history` | hidden | whole rows | 509 | not yet | | `SwapController.getSwapRouteHistory` | `subdomains/core/buy-crypto/routes/swap/swap.controller.ts` | +| PUT | 1 | | `/swap/paymentInfos` | public | whole rows | 308 | not yet | | `SwapController.createSwapWithPaymentInfo` | `subdomains/core/buy-crypto/routes/swap/swap.controller.ts` | +| PUT | 1 | | `/swap/paymentInfos/:id/confirm` | public | whole rows | 545 | not yet | | `SwapController.confirmSwap` | `subdomains/core/buy-crypto/routes/swap/swap.controller.ts` | +| GET | 1 | | `/swap/paymentInfos/:id/tx` | public | whole rows | 504 | not yet | | `SwapController.depositTx` | `subdomains/core/buy-crypto/routes/swap/swap.controller.ts` | +| PUT | 1 | | `/swap/quote` | public | whole rows | 143 | not yet | | `SwapController.getSwapQuote` | `subdomains/core/buy-crypto/routes/swap/swap.controller.ts` | +| POST | 1 | | `/tatum/addressWebhook` | hidden | none | — | n/a | | `TatumController.addressWebhook` | `integration/tatum/controllers/tatum.controller.ts` | +| PUT | 1 | | `/trading/rule/:id` | hidden | whole rows | 87 | not yet | | `TradingRuleController.update` | `subdomains/core/trading/controllers/trading-rule.controller.ts` | +| GET | 1 | | `/transaction` | public | whole rows | 1363 | not yet | yes | `TransactionController.getTransactions` | `subdomains/core/history/controllers/transaction.controller.ts` | +| PUT | 1 | | `/transaction/:id/invoice` | public | whole rows | 331 | not yet | yes | `TransactionController.generateInvoiceFromTransaction` | `subdomains/core/history/controllers/transaction.controller.ts` | +| PUT | 1 | | `/transaction/:id/receipt` | public | whole rows | 331 | not yet | yes | `TransactionController.generateReceiptFromTransaction` | `subdomains/core/history/controllers/transaction.controller.ts` | +| GET | 1 | | `/transaction/:id/refund` | public | whole rows | 331 | not yet | yes | `TransactionController.getTransactionRefund` | `subdomains/core/history/controllers/transaction.controller.ts` | +| PUT | 1 | | `/transaction/:id/refund` | public | whole rows | 487 | not yet | | `TransactionController.setTransactionRefundTarget` | `subdomains/core/history/controllers/transaction.controller.ts` | +| PUT | 1 | | `/transaction/:id/target` | hidden | whole rows | 1051 | not yet | | `TransactionController.setTransactionTarget` | `subdomains/core/history/controllers/transaction.controller.ts` | +| GET | 1 | | `/transaction/ChainReport` | hidden | whole rows | 1363 | not yet | yes | `TransactionController.getCsvChainReport` | `subdomains/core/history/controllers/transaction.controller.ts` | +| GET | 1 | | `/transaction/CoinTracking` | hidden | whole rows | 1363 | not yet | yes | `TransactionController.getCsvCT` | `subdomains/core/history/controllers/transaction.controller.ts` | +| PUT | 1 | | `/transaction/admin/:id` | hidden | whole rows | 276 | not yet | | `TransactionAdminController.updateTransaction` | `subdomains/supporting/payment/controllers/transaction-admin.controller.ts` | +| POST | 1 | | `/transaction/admin/:id/stop` | hidden | whole rows | 98 | not yet | | `TransactionAdminController.stopTransaction` | `subdomains/supporting/payment/controllers/transaction-admin.controller.ts` | +| POST | 1 | | `/transaction/admin/:txId/riskAssessment` | hidden | none | — | n/a | | `TransactionAdminController.createRiskAssessment` | `subdomains/supporting/payment/controllers/transaction-admin.controller.ts` | +| PUT | 1 | | `/transaction/admin/:txId/riskAssessment/:id` | hidden | whole rows | 13 | not yet | | `TransactionAdminController.updateRiskAssessment` | `subdomains/supporting/payment/controllers/transaction-admin.controller.ts` | +| GET | 1 | | `/transaction/csv` | public | none | — | n/a | | `TransactionController.getCsv` | `subdomains/core/history/controllers/transaction.controller.ts` | +| PUT | 1 | | `/transaction/csv` | public | whole rows | 1363 | not yet | yes | `TransactionController.createCsv` | `subdomains/core/history/controllers/transaction.controller.ts` | +| GET | 1 | | `/transaction/detail` | public | whole rows | 1363 | not yet | | `TransactionController.getTransactionDetails` | `subdomains/core/history/controllers/transaction.controller.ts` | +| PUT | 1 | | `/transaction/detail/csv` | public | whole rows | 1363 | not yet | | `TransactionController.createDetailCsv` | `subdomains/core/history/controllers/transaction.controller.ts` | +| GET | 1 | | `/transaction/detail/single` | public | whole rows | 487 | not yet | yes | `TransactionController.getSingleTransactionDetails` | `subdomains/core/history/controllers/transaction.controller.ts` | +| GET | 1 | | `/transaction/single` | public | whole rows | 487 | not yet | yes | `TransactionController.getSingleTransaction` | `subdomains/core/history/controllers/transaction.controller.ts` | +| GET | 1 | | `/transaction/target` | hidden | whole rows | 134 | not yet | | `TransactionController.getTransactionTargets` | `subdomains/core/history/controllers/transaction.controller.ts` | +| GET | 1 | | `/transaction/unassigned` | hidden | whole rows | 356 | not yet | | `TransactionController.getUnassignedTransactions` | `subdomains/core/history/controllers/transaction.controller.ts` | +| DELETE | 1 | yes | `/user` | public | whole rows | 344 | not yet | | `UserController.deleteUser` | `subdomains/generic/user/models/user/user.controller.ts` | +| DELETE | 2 | | `/user` | public | whole rows | 344 | not yet | | `UserV2Controller.deleteAccount` | `subdomains/generic/user/models/user/user.controller.ts` | +| GET | 1 | yes | `/user` | public | whole rows | 328 | not yet | | `UserController.getUserV1` | `subdomains/generic/user/models/user/user.controller.ts` | +| GET | 2 | | `/user` | public | whole rows | 351 | not yet | | `UserV2Controller.getUser` | `subdomains/generic/user/models/user/user.controller.ts` | +| PUT | 1 | yes | `/user` | public | whole rows | 406 | not yet | | `UserController.updateUserV1` | `subdomains/generic/user/models/user/user.controller.ts` | +| PUT | 2 | | `/user` | public | whole rows | 351 | not yet | | `UserV2Controller.updateUser` | `subdomains/generic/user/models/user/user.controller.ts` | +| PUT | 1 | | `/user/:id` | hidden | whole rows | 364 | not yet | | `UserController.updateUserAdmin` | `subdomains/generic/user/models/user/user.controller.ts` | +| DELETE | 1 | yes | `/user/account` | public | whole rows | 344 | not yet | | `UserController.deleteUserAccount` | `subdomains/generic/user/models/user/user.controller.ts` | +| DELETE | 2 | | `/user/addresses/:address` | public | whole rows | 344 | not yet | | `UserV2Controller.deleteAddress` | `subdomains/generic/user/models/user/user.controller.ts` | +| PUT | 2 | | `/user/addresses/:address` | public | whole rows | 351 | not yet | | `UserV2Controller.updateAddress` | `subdomains/generic/user/models/user/user.controller.ts` | +| PUT | 1 | | `/user/apiFilter/CT` | public | whole rows | 331 | not yet | | `UserController.updateApiFilter` | `subdomains/generic/user/models/user/user.controller.ts` | +| DELETE | 1 | | `/user/apiKey/CT` | public | none | — | n/a | | `UserController.deleteApiKey` | `subdomains/generic/user/models/user/user.controller.ts` | +| POST | 1 | | `/user/apiKey/CT` | public | whole rows | 253 | not yet | | `UserController.createApiKey` | `subdomains/generic/user/models/user/user.controller.ts` | +| POST | 1 | | `/user/change` | public | whole rows | 643 | not yet | | `UserController.changeUser` | `subdomains/generic/user/models/user/user.controller.ts` | +| POST | 1 | | `/user/data` | public | whole rows | 406 | not yet | | `UserController.updateKycData` | `subdomains/generic/user/models/user/user.controller.ts` | +| GET | 1 | yes | `/user/detail` | public | whole rows | 328 | not yet | | `UserController.getUserDetailV1` | `subdomains/generic/user/models/user/user.controller.ts` | +| PUT | 1 | yes | `/user/discountCodes` | public | whole rows | 308 | not yet | | `UserController.addDiscountCode` | `subdomains/generic/user/models/user/user.controller.ts` | +| PUT | 2 | | `/user/mail` | public | whole rows | 364 | not yet | | `UserV2Controller.updateUserMail` | `subdomains/generic/user/models/user/user.controller.ts` | +| POST | 2 | | `/user/mail/verify` | public | whole rows | 364 | not yet | | `UserV2Controller.verifyMail` | `subdomains/generic/user/models/user/user.controller.ts` | +| PUT | 1 | | `/user/name` | hidden | whole rows | 386 | not yet | | `UserController.updateUserName` | `subdomains/generic/user/models/user/user.controller.ts` | +| GET | 2 | | `/user/profile` | public | whole rows | 253 | not yet | | `UserV2Controller.getProfile` | `subdomains/generic/user/models/user/user.controller.ts` | +| GET | 1 | | `/user/ref` | hidden | whole rows | 45 | not yet | | `UserController.getRefInfo` | `subdomains/generic/user/models/user/user.controller.ts` | +| GET | 2 | | `/user/ref` | public | whole rows | 98 | not yet | | `UserV2Controller.getRef` | `subdomains/generic/user/models/user/user.controller.ts` | +| PUT | 2 | | `/user/ref` | public | whole rows | 98 | not yet | | `UserV2Controller.updateRefAsset` | `subdomains/generic/user/models/user/user.controller.ts` | +| PUT | 1 | | `/user/specialCodes` | public | whole rows | 308 | not yet | | `UserController.addSpecialCode` | `subdomains/generic/user/models/user/user.controller.ts` | +| GET | 1 | | `/user/volumes` | hidden | whole rows | 45 | not yet | | `UserController.getVolumes` | `subdomains/generic/user/models/user/user.controller.ts` | +| GET | 1 | | `/userData` | hidden | whole rows | 253 | not yet | | `UserDataController.getAllUserData` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| POST | 1 | | `/userData` | hidden | whole rows | 253 | not yet | | `UserDataController.createEmptyUserData` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| GET | 1 | | `/userData/:id` | hidden | whole rows | 253 | not yet | | `UserDataController.getUserData` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| PUT | 1 | | `/userData/:id` | hidden | whole rows | 384 | not yet | | `UserDataController.updateUserData` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| PUT | 1 | | `/userData/:id/bankDatas` | hidden | whole rows | 284 | not yet | | `UserDataController.addBankData` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| DELETE | 1 | | `/userData/:id/fee` | hidden | whole rows | 253 | not yet | | `UserDataController.removeFee` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| PUT | 1 | | `/userData/:id/fee` | hidden | whole rows | 253 | not yet | | `UserDataController.addFee` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| POST | 1 | | `/userData/:id/kycFile` | hidden | whole rows | 253 | not yet | | `UserDataController.uploadKycFile` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| PUT | 1 | | `/userData/:id/merge` | hidden | whole rows | 364 | not yet | | `UserDataController.mergeUserData` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| PUT | 1 | | `/userData/:id/volumes` | hidden | whole rows | — | not yet | | `UserDataController.updateVolumes` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| PUT | 1 | | `/userData/auditPeriodNumbers` | hidden | whole rows | 40 | not yet | | `UserDataController.calculateAuditPeriodNumbers` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| POST | 1 | | `/userData/download` | hidden | whole rows | 253 | not yet | | `UserDataController.downloadUserData` | `subdomains/generic/user/models/user-data/user-data.controller.ts` | +| POST | 1 | | `/userDataRelation` | public | whole rows | 253 | not yet | | `UserDataRelationController.create` | `subdomains/generic/user/models/user-data-relation/user-data-relation.controller.ts` | +| DELETE | 1 | | `/userDataRelation/:id` | public | none | — | n/a | | `UserDataRelationController.delete` | `subdomains/generic/user/models/user-data-relation/user-data-relation.controller.ts` | +| PUT | 1 | | `/userDataRelation/:id` | public | whole rows | 7 | not yet | | `UserDataRelationController.update` | `subdomains/generic/user/models/user-data-relation/user-data-relation.controller.ts` | +| GET | neutral | | `/version` | hidden | none | — | n/a | | `AppController.getVersion` | `app.controller.ts` | +| POST | 1 | | `/wallet` | hidden | none | — | n/a | | `WalletController.createWallet` | `subdomains/generic/user/models/wallet/wallet.controller.ts` | +| PUT | 1 | | `/wallet/:id` | hidden | whole rows | 20 | not yet | | `WalletController.updateWallet` | `subdomains/generic/user/models/wallet/wallet.controller.ts` | + +⚠️ = not registered at runtime, see *Known discrepancy* above. diff --git a/docs/load-sites.md b/docs/load-sites.md new file mode 100644 index 0000000000..00ec1108c6 --- /dev/null +++ b/docs/load-sites.md @@ -0,0 +1,1149 @@ +# Database load sites + +Every place in the code that reads from the database: **1105 load sites** across 241 files. + +This is the level at which the statement is unambiguous. An endpoint reaches several load sites — a permission check, a lookup, the actual query — so asking whether *an endpoint* loads efficiently has no single answer. Asking it of a load site does. [endpoints.md](endpoints.md) carries the per-endpoint summary derived from these sites. + +## What the mechanism means + +| Mechanism | Sites | Eager relations | Columns selected | +| --------- | ----: | --------------- | ---------------- | +| `find` family | 971 | **applied** — expanded recursively | all columns of the entity plus every eager relation | +| `createQueryBuilder` | 129 | not applied | all columns of the root entity, unless `.select([...])` narrows it | +| raw SQL | 5 | not applied | whatever the statement lists | + +Statements that load nothing are excluded from the count: 2 `createQueryBuilder` calls carrying `.update()`, 6 advisory locks (`SELECT pg_advisory_xact_lock(...)`, which return no rows) and 1 raw `INSERT`. Each of the 5 raw reads that remain names its columns — together with the one query builder below, raw SQL is the only place in this repository where a read states which columns it wants. + +Among the query builders, the field list is what decides whether anything is actually saved: + +| | Sites | +| --- | ---: | +| `.select([...])` — an explicit field list | **1** | +| `.select('alias')` — selects the root alias, **loads every column** | 105 | +| no `select` at all — loads every column | 23 | + +`.select('alias')` is the trap: it reads like a projection but the argument is the entity alias, not a field list. Such a query still loads every column of the root entity — it merely avoids the eager relations. + +## Measurements + +Columns were measured against the real entity metadata by building the query and counting its SELECT list — 782 of 1105 sites. + +- **348 are exact**: the `relations` tree is written at the call site. +- **434 are lower bounds**: the tree arrives as a parameter, so only the base query is visible here. `transaction.service.ts` is the clearest case — its callers pass trees reaching well over a thousand columns. +- 323 could not be measured: no resolvable target entity, or raw SQL. + +Median across measured sites: **123 columns**. 14 sites exceed 1000, 77 exceed 500, 409 exceed 100. + +Postgres refuses a statement with more than 1664 columns. That limit is what broke every invoice and receipt in production once a single new column was added elsewhere. + +## Load sites + +Sorted by measured columns, largest first. `—` means not measurable, not zero. + +| Columns | Joins | Mechanism | Entity | Location | Method | +| ------: | ----: | --------- | ------ | -------- | ------ | +| 1453 | 49 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:229` | `FiatOutputJobService.setReadyDate` | +| 1363 | 47 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:267` | `TransactionService.getTransactionsForAccount` | +| 1282 | 50 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-preparation.service.ts:426` | `BuyCryptoPreparationService.fillPaymentLinkPayments` | +| 1231 | 38 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:174` | `FiatOutputJobService.assignBankAccount` | +| 1162 | 44 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-batch.service.ts:65` | `BuyCryptoBatchService.batchAndOptimizeTransactions` | +| 1139 | 41 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-preparation.service.ts:317` | `BuyCryptoPreparationService.In` | +| 1092 | 41 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:299` | `TransactionService.getTransactionsForUsers` | +| 1090 | 40 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:274` | `BuyCryptoService.update` | +| 1063 | 42 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-preparation.service.ts:119` | `BuyCryptoPreparationService.doAmlCheck` | +| 1051 | 36 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:513` | `BuyCryptoService.refundBuyCrypto` | +| 1051 | 32 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:328` | `BankTxService.create` | +| 1051 | 32 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:341` | `BankTxService.update` | +| 1033 | 40 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:181` | `BuyFiatService.update` | +| 1003 | 36 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts:534` | `BuyFiatPreparationService.addFiatOutputs` | +| 951 | 33 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:685` | `SupportIssueService.getIssueData` | +| 907 | 31 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:1191` | `BuyCryptoService.getAllUserTransactions` | +| 891 | 37 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts:340` | `BuyFiatPreparationService.fillPaymentLinkPayments` | +| 885 | 33 | find | `BuyCryptoBatch` | `subdomains/core/buy-crypto/process/services/buy-crypto-out.service.ts:133` | `BuyCryptoOutService.fetchBatchesForPayout` | +| 880 | 26 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-preparation.service.ts:626` | `BuyCryptoPreparationService.chargebackFillUp` | +| 844 | 26 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-webhook.service.ts:17` | `BuyCryptoWebhookService.triggerWebhookManual` | +| 826 | 27 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:189` | `TransactionService.getTransactionsWithoutUid` | +| 826 | 27 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:198` | `TransactionService.getTransactionsByUserDataId` | +| 815 | 28 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:922` | `BuyCryptoService.getRefTransactions` | +| 815 | 28 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:1173` | `BuyCryptoService.getAllRefTransactions` | +| 813 | 29 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts:255` | `BuyFiatPreparationService.refreshFee` | +| 803 | 29 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:401` | `BuyFiatService.refundBuyFiat` | +| 794 | 27 | find | `Transaction` | `subdomains/supporting/payment/services/transaction-notification.service.ts:37` | `TransactionNotificationService.txAssigned` | +| 785 | 24 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-notification.service.ts:267` | `BuyCryptoNotificationService.chargebackInitiated` | +| 765 | 23 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-preparation.service.ts:588` | `BuyCryptoPreparationService.chargebackTx` | +| 737 | 30 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts:107` | `BuyFiatPreparationService.doAmlCheck` | +| 727 | 23 | find | `BankTxReturn` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.service.ts:176` | `BankTxReturnService.refundBankTxReturn` | +| 717 | 27 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:788` | `BuyCryptoService.retriggerScorechain` | +| 703 | 24 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts:491` | `BuyFiatPreparationService.complete` | +| 672 | 23 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:1229` | `BuyCryptoService.getByAmlReason` | +| 644 | 22 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:375` | `BuyFiatService.getBuyFiat` | +| 644 | 22 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:379` | `BuyFiatService.triggerWebhookManual` | +| 643 | 21 | find | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:196` | `RecommendationService.confirmRecommendation` | +| 643 | 21 | find | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:255` | `RecommendationService.getAndCheckRecommendationByCode` | +| 643 | 21 | find | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:294` | `RecommendationService.checkAndConfirmRecommendInvitation` | +| 639 | 24 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:108` | `FiatOutputJobService.generateReports` | +| 630 | 20 | find | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:284` | `RecommendationService.getUserDataRecommendation` | +| 623 | 20 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:620` | `BuyFiatService.getAllUserTransactions` | +| 613 | 19 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-notification.service.ts:82` | `BuyCryptoNotificationService.paymentCompleted` | +| 613 | 19 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-notification.service.ts:175` | `BuyCryptoNotificationService.pendingBuyCrypto` | +| 613 | 19 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-notification.service.ts:350` | `BuyCryptoNotificationService.chargebackUnconfirmed` | +| 597 | 21 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts:432` | `BuyFiatPreparationService.setOutput` | +| 593 | 18 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:738` | `BuyCryptoService.getBuyCryptosByChargebackIban` | +| 583 | 21 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-notification.service.ts:209` | `BuyFiatNotificationService.chargebackInitiated` | +| 583 | 21 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-registration.service.ts:35` | `BuyFiatRegistrationService.syncReturnTxId` | +| 567 | 17 | find | `BuyCrypto` | `subdomains/core/accounting/services/consumers/buy-crypto.consumer.ts:114` | `BuyCryptoConsumer.processForward` | +| 558 | 24 | find | `PaymentQuote` | `subdomains/core/payment-link/services/payment-quote.service.ts:150` | `PaymentQuoteService.getConfirmingQuotes` | +| 545 | 23 | find | `PaymentLink` | `subdomains/core/payment-link/repositories/payment-link.repository.ts:41` | `PaymentLinkRepository.getHistoryByStatus` | +| 545 | 23 | find | `PaymentLinkPayment` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:97` | `PaymentLinkPaymentService.updatePayment` | +| 545 | 23 | find | `PaymentLinkPayment` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:104` | `PaymentLinkPaymentService.getPendingPaymentByUniqueId` | +| 545 | 23 | find | `PaymentLinkPayment` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:372` | `PaymentLinkPaymentService.handleBlockchainConfirmed` | +| 545 | 23 | find | `PaymentLinkPayment` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:449` | `PaymentLinkPaymentService.sendWebhook` | +| 540 | 17 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:784` | `BuyFiatService.getByAmlReason` | +| 538 | 21 | find | `CryptoInput` | `subdomains/core/accounting/services/consumers/crypto-input.consumer.ts:89` | `CryptoInputConsumer.processForward` | +| 535 | 15 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:955` | `BuyCryptoService.getPendingTransactions` | +| 525 | 16 | find | `CustodyOrder` | `subdomains/core/custody/services/custody-order.service.ts:294` | `CustodyOrderService.confirmOrder` | +| 525 | 16 | find | `CustodyOrder` | `subdomains/core/custody/services/custody-order.service.ts:310` | `CustodyOrderService.getOrdersForSupport` | +| 517 | 16 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts:615` | `BuyFiatPreparationService.chargebackTx` | +| 517 | 16 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:487` | `BuyFiatService.retriggerScorechain` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/repositories/payment-link.repository.ts:14` | `PaymentLinkRepository.getAllPaymentLinks` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/repositories/payment-link.repository.ts:21` | `PaymentLinkRepository.getAllPaymentLinksByExternalLinkId` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/repositories/payment-link.repository.ts:28` | `PaymentLinkRepository.getAllPaymentLinksByExternalPaymentId` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/repositories/payment-link.repository.ts:65` | `PaymentLinkRepository.getPaymentLinkByLinkId` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/repositories/payment-link.repository.ts:72` | `PaymentLinkRepository.getPaymentLinkByExternalId` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/repositories/payment-link.repository.ts:82` | `PaymentLinkRepository.getPaymentLinkByExternalPaymentId` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/services/payment-link.service.ts:430` | `PaymentLinkService.updatePaymentLinkAdmin` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/services/payment-link.service.ts:485` | `PaymentLinkService.getActivePaymentLink` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/services/payment-link.service.ts:504` | `PaymentLinkService.assignPaymentLink` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/services/payment-link.service.ts:520` | `PaymentLinkService.getLocations` | +| 513 | 21 | find | `PaymentLink` | `subdomains/core/payment-link/services/payment-link.service.ts:702` | `PaymentLinkService.createPosLinkAdmin` | +| 509 | 17 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:947` | `BuyCryptoService.getCryptoHistory` | +| 507 | 18 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:358` | `KycService.reviewRecommendationStep` | +| 504 | 16 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:218` | `TransactionRequestService.getOrThrow` | +| 499 | 14 | find | `BankTxReturn` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.service.ts:169` | `BankTxReturnService.getPendingTx` | +| 497 | 16 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:937` | `BuyCryptoService.getBuyHistory` | +| 497 | 18 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-notification.service.ts:128` | `BuyFiatNotificationService.pendingBuyFiat` | +| 497 | 15 | find | `BankTxReturn` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.service.ts:86` | `BankTxReturnService.setFiatAmounts` | +| 493 | 19 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:366` | `SupportIssueService.createIssueInternal` | +| 490 | 20 | find | `PaymentLink` | `subdomains/core/payment-link/services/payment-link.service.ts:587` | `PaymentLinkService.getPublicPaymentLinkByUniqueId` | +| 490 | 15 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:474` | `BuyFiatService.resetAmlCheck` | +| 487 | 19 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:745` | `BuyCryptoService.getBuyCryptoByTransactionId` | +| 487 | 19 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:749` | `BuyCryptoService.getBuyCrypto` | +| 487 | 19 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:753` | `BuyCryptoService.updateVolumes` | +| 484 | 15 | find | `RefReward` | `subdomains/core/referral/reward/services/ref-reward-notification.service.ts:27` | `RefRewardNotificationService.refRewardPayouts` | +| 474 | 14 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:198` | `KycService.reviewIdentSteps` | +| 474 | 16 | find | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:274` | `RecommendationService.getAllRecommendationForUserData` | +| 474 | 16 | find | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:318` | `RecommendationService.getRecommendationsByKycStepIdsOrUserDataId` | +| 474 | 16 | find | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:326` | `RecommendationService.getRecommendationsByKycStepIdsOrUserDataId` | +| 474 | 16 | find | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:336` | `RecommendationService.getAllRecommendationsByRecommenderId` | +| 474 | 16 | find | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:344` | `RecommendationService.getRecommendationsByRecommendedId` | +| 473 | 18 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:652` | `SupportIssueService.getIssueEntities` | +| 472 | 14 | find | `BuyFiat` | `subdomains/core/accounting/services/consumers/buy-fiat.consumer.ts:122` | `BuyFiatConsumer.processForward` | +| 472 | 19 | find | `DepositRoute` | `subdomains/supporting/address-pool/route/deposit-route.service.ts:15` | `DepositRouteService.get` | +| 472 | 19 | find | `DepositRoute` | `subdomains/supporting/address-pool/route/deposit-route.service.ts:25` | `DepositRouteService.getById` | +| 472 | 19 | find | `DepositRoute` | `subdomains/supporting/address-pool/route/deposit-route.service.ts:29` | `DepositRouteService.getLatest` | +| 472 | 19 | find | `DepositRoute` | `subdomains/supporting/address-pool/route/deposit-route.service.ts:75` | `DepositRouteService.getPaymentRoutesForPublicName` | +| 470 | 16 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:637` | `BuyFiatService.getSellHistory` | +| 470 | 16 | find | `AccountMerge` | `subdomains/generic/user/models/account-merge/account-merge.service.ts:119` | `AccountMergeService.executeMerge` | +| 458 | 14 | find | `BankTxReturn` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return-notification.service.ts:27` | `BankTxReturnNotificationService.chargebackInitiated` | +| 454 | 16 | find | `LimitRequest` | `subdomains/supporting/support-issue/services/limit-request-notification.service.ts:31` | `LimitRequestNotificationService.limitRequestAcceptedManual` | +| 451 | 14 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-notification.service.ts:42` | `BuyFiatNotificationService.paymentCompleted` | +| 451 | 14 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat-notification.service.ts:290` | `BuyFiatNotificationService.chargebackUnconfirmed` | +| 450 | 16 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:457` | `SupportIssueService.closeIssue` | +| 450 | 16 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:661` | `SupportIssueService.getIssues` | +| 450 | 16 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:670` | `SupportIssueService.getIssue` | +| 450 | 16 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:737` | `SupportIssueService.getUserIssues` | +| 449 | 13 | find | `BuyCrypto` | `subdomains/core/accounting/services/ledger-cutover.service.ts:475` | `LedgerCutoverService.openBuyCryptoReceived` | +| 449 | 13 | find | `BuyCrypto` | `subdomains/core/accounting/services/ledger-cutover.service.ts:536` | `LedgerCutoverService.openBuyCryptoOwed` | +| 449 | 13 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-registration.service.ts:25` | `BuyCryptoRegistrationService.syncReturnTxId` | +| 444 | 16 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue-job.service.ts:37` | `SupportIssueJobService.autoOnHold` | +| 444 | 16 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue-job.service.ts:117` | `SupportIssueJobService.getAutoResponseIssues` | +| 441 | 15 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:504` | `SupportIssueService.createMessage` | +| 441 | 15 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:514` | `SupportIssueService.createMessageSupport` | +| 438 | 13 | find | `BankTxReturn` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:547` | `BankTxConsumer.openingBankTxId` | +| 438 | 13 | find | `BankTxReturn` | `subdomains/core/accounting/services/ledger-cutover.service.ts:610` | `LedgerCutoverService.openBankTxReturn` | +| 438 | 13 | find | `BankTxReturn` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.service.ts:54` | `BankTxReturnService.chargebackTx` | +| 438 | 13 | find | `BankTxReturn` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.service.ts:137` | `BankTxReturnService.update` | +| 434 | 15 | find | `LimitRequest` | `subdomains/supporting/support-issue/services/limit-request.service.ts:61` | `LimitRequestService.updateLimitRequest` | +| 434 | 15 | find | `LimitRequest` | `subdomains/supporting/support-issue/services/limit-request.service.ts:82` | `LimitRequestService.getUserLimitRequests` | +| 433 | 12 | find | `BankTx` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:106` | `BankTxConsumer.processForward` | +| 428 | 15 | find | `SupportMessage` | `subdomains/supporting/support-issue/services/support-issue.service.ts:478` | `SupportIssueService.closeIssue` | +| 428 | 15 | find | `SupportMessage` | `subdomains/supporting/support-issue/services/support-issue.service.ts:723` | `SupportIssueService.getIssueMessages` | +| 427 | 12 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:67` | `TransactionRequestService.txRequestWaitingExpiryCheck` | +| 427 | 12 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:78` | `TransactionRequestService.deleteOldTxRequests` | +| 422 | 12 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:778` | `BuyCryptoService.resetAmlCheck` | +| 421 | 14 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-escalation.service.ts:214` | `SupportEscalationService.checkEscalations` | +| 421 | 14 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:484` | `SupportIssueService.updateIssue` | +| 421 | 14 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:713` | `SupportIssueService.getIssueMessages` | +| 421 | 14 | find | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:750` | `SupportIssueService.getIssueUserDataId` | +| 419 | 14 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:1212` | `BuyCryptoService.getTransactions` | +| 418 | 18 | find | `CustodyOrderStep` | `subdomains/core/custody/services/custody-job.service.ts:80` | `CustodyJobService.executeStep` | +| 418 | 11 | find | `User` | `subdomains/generic/user/models/user/user-job.service.ts:19` | `UserJobService.approveUser` | +| 415 | 16 | find | `Buy` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:1050` | `BuyCryptoService.getBuy` | +| 406 | 12 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:399` | `UserService.updateUserV1` | +| 406 | 12 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:453` | `UserService.updateUserData` | +| 396 | 15 | find | `Swap` | `subdomains/core/buy-crypto/process/services/buy-crypto-registration.service.ts:69` | `BuyCryptoRegistrationService.filterBuyCryptoPayIns` | +| 396 | 15 | find | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:260` | `SwapService.updateSwap` | +| 396 | 15 | find | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:268` | `SwapService.confirmSwap` | +| 392 | 14 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:645` | `BuyFiatService.getPendingTransactions` | +| 386 | 11 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:445` | `UserService.updateUserName` | +| 385 | 15 | find | `Sell` | `subdomains/core/sell-crypto/process/services/buy-fiat-registration.service.ts:139` | `BuyFiatRegistrationService.createBuyFiatsAndAckPayIns` | +| 385 | 14 | find | `KycStep` | `subdomains/generic/kyc/services/kyc-admin.service.ts:45` | `KycAdminService.updateKycStep` | +| 384 | 14 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:223` | `BuyService.getByBankUsage` | +| 384 | 13 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:344` | `UserDataService.updateUserData` | +| 377 | 14 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:80` | `SellService.get` | +| 377 | 12 | find | `BankTxReturn` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.service.ts:118` | `BankTxReturnService.create` | +| 377 | 12 | find | `BankTxReturn` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.service.ts:148` | `BankTxReturnService.updateInternal` | +| 377 | 12 | find | `BankTxReturn` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.service.ts:158` | `BankTxReturnService.getBankTxReturn` | +| 377 | 12 | find | `BankTxReturn` | `subdomains/supporting/bank-tx/bank-tx-return/bank-tx-return.service.ts:162` | `BankTxReturnService.getBankTxReturnsByIban` | +| 374 | 14 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:287` | `SellService.confirmSell` | +| 370 | 10 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:268` | `BankTxService.fillBankTx` | +| 370 | 9 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:554` | `FiatOutputJobService.searchOutgoingBankTx` | +| 364 | 13 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:162` | `BuyService.createBuy` | +| 364 | 12 | find | `Webhook` | `subdomains/generic/user/services/webhook/webhook-notification.service.ts:32` | `WebhookNotificationService.sendOpenWebhooks` | +| 364 | 12 | find | `Webhook` | `subdomains/generic/user/services/webhook/webhook.service.ts:146` | `WebhookService.createAndSendWebhook` | +| 363 | 10 | find | `BuyCrypto` | `subdomains/core/accounting/services/consumers/payout-order.consumer.ts:297` | `PayoutOrderConsumer.owedCompletionChf` | +| 363 | 10 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto-preparation.service.ts:554` | `BuyCryptoPreparationService.checkAggregatingTransactions` | +| 363 | 10 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:134` | `BuyCryptoService.checkAmlResetTx` | +| 363 | 10 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:148` | `BuyCryptoService.createFromBankTx` | +| 363 | 10 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:203` | `BuyCryptoService.createFromCheckoutTx` | +| 363 | 10 | find | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:833` | `BuyCryptoService.manualPassAmlCheck` | +| 363 | 10 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data-job.service.ts:25` | `UserDataJobService.bankTxVerification` | +| 363 | 10 | find | `BuyCrypto` | `subdomains/supporting/fiat-output/fiat-output.service.ts:108` | `FiatOutputService.create` | +| 362 | 11 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:375` | `TransactionService.getByAssetId` | +| 358 | 16 | find | `CryptoStaking` | `subdomains/core/staking/services/staking.service.ts:48` | `StakingService.getUserInvests` | +| 356 | 10 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:624` | `BankTxService.getUnassignedBankTx` | +| 356 | 10 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:634` | `BankTxService.getBankTxsByVirtualIban` | +| 354 | 13 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:117` | `SellService.getSellsByIban` | +| 351 | 11 | find | `UserData` | `subdomains/generic/user/models/kyc/kyc.service.ts:127` | `KycService.getUserByKycCode` | +| 351 | 11 | find | `UserData` | `subdomains/generic/user/models/user/user.service.ts:266` | `UserService.getUserDtoV2` | +| 351 | 11 | find | `UserData` | `subdomains/generic/user/models/user/user.service.ts:412` | `UserService.updateUser` | +| 351 | 11 | find | `UserData` | `subdomains/generic/user/models/user/user.service.ts:424` | `UserService.updateUserMail` | +| 351 | 11 | find | `UserData` | `subdomains/generic/user/models/user/user.service.ts:434` | `UserService.verifyMail` | +| 351 | 11 | find | `UserData` | `subdomains/generic/user/models/user/user.service.ts:490` | `UserService.updateAddress` | +| 344 | 11 | find | `UserData` | `subdomains/generic/user/models/user/user.service.ts:505` | `UserService.deactivateUser` | +| 343 | 10 | find | `CheckoutTx` | `subdomains/supporting/fiat-payin/services/fiat-payin-sync.service.ts:87` | `FiatPayInSyncService.createCheckoutTx` | +| 331 | 10 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:1074` | `UserDataService.updateApiFilter` | +| 331 | 10 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:1084` | `UserDataService.checkApiKey` | +| 331 | 14 | find | `VirtualIban` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:169` | `VirtualIbanService.getByIdForUser` | +| 331 | 14 | find | `VirtualIban` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1262` | `VirtualIbanService.getActiveForBuyAndCurrency` | +| 331 | 14 | find | `VirtualIban` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1274` | `VirtualIbanService.getByIban` | +| 331 | 14 | find | `VirtualIban` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1316` | `VirtualIbanService.getVirtualIbansForAccount` | +| 329 | 9 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:278` | `TransactionRequestService.findAndComplete` | +| 328 | 10 | find | `User` | `subdomains/generic/user/models/auth/auth.controller.ts:157` | `AuthController.createAccessTokenAfterMerge` | +| 328 | 10 | find | `Wallet` | `subdomains/generic/user/models/kyc/kyc.service.ts:138` | `KycService.getAllKycData` | +| 328 | 10 | find | `User` | `subdomains/generic/user/models/kyc/kyc.service.ts:147` | `KycService.getKycFiles` | +| 328 | 10 | find | `User` | `subdomains/generic/user/models/kyc/kyc.service.ts:162` | `KycService.getKycFile` | +| 328 | 10 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:129` | `UserService.getUserDto` | +| 323 | 10 | find | `AktionariatRegistration` | `subdomains/supporting/realunit/realunit.service.ts:1246` | `RealUnitService.forwardRegistrationToAktionariat` | +| 321 | 8 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:363` | `BuyFiatService.getBuyFiatByTransactionId` | +| 321 | 8 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:368` | `BuyFiatService.getBuyFiatsByTransactionIds` | +| 319 | 10 | find | `BuyFiat` | `subdomains/core/accounting/services/ledger-cutover.service.ts:308` | `LedgerCutoverService.openBuyFiatReceived` | +| 319 | 10 | find | `BuyFiat` | `subdomains/core/accounting/services/ledger-cutover.service.ts:357` | `LedgerCutoverService.openBuyFiatOwed` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/kyc/kyc.service.ts:61` | `KycService.transferKycData` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/kyc/kyc.service.ts:77` | `KycService.transferKycData` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:80` | `UserService.getAllUser` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:84` | `UserService.getUser` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:88` | `UserService.getAllUserDataUsers` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:93` | `UserService.getUsersByUserDataIds` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:122` | `UserService.getUsersByIp` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:204` | `UserService.getRefUser` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:209` | `UserService.getRefUsersByRefs` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:215` | `UserService.getUsersByUsedRefs` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:467` | `UserService.updateUserAdmin` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:572` | `UserService.updateUserDataVolume` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:739` | `UserService.checkApiKey` | +| 308 | 9 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:748` | `UserService.updateApiFilter` | +| 301 | 6 | find | `BankTxRepeat` | `subdomains/supporting/bank-tx/bank-tx-repeat/bank-tx-repeat.service.ts:89` | `BankTxRepeatService.getAllUserRepeats` | +| 299 | 12 | find | `TradingOrder` | `subdomains/core/trading/services/trading-order.service.ts:65` | `TradingOrderService.startNewOrders` | +| 295 | 8 | find | `CustodyOrder` | `subdomains/core/custody/services/custody-job.service.ts:113` | `CustodyJobService.onStepComplete` | +| 295 | 8 | find | `CustodyOrder` | `subdomains/core/custody/services/custody-order.service.ts:284` | `CustodyOrderService.getCustodyOrderByTx` | +| 287 | 8 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:767` | `BuyFiatService.getTransactions` | +| 284 | 10 | find | `UserData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:173` | `BankDataService.addBankData` | +| 276 | 10 | find | `NameCheckLog` | `subdomains/generic/kyc/services/name-check.service.ts:205` | `NameCheckService.createNameCheckLog` | +| 274 | 10 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:59` | `BankDataService.checkUnverifiedBankDatas` | +| 266 | 9 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data-job.service.ts:39` | `UserDataJobService.setAccountOpener` | +| 264 | 9 | find | `KycFile` | `subdomains/generic/kyc/services/kyc-file.service.ts:27` | `KycFileService.getKycFile` | +| 264 | 9 | find | `KycFile` | `subdomains/generic/kyc/services/kyc-file.service.ts:34` | `KycFileService.getUserDataKycFiles` | +| 263 | 9 | find | `KycStep` | `subdomains/generic/kyc/services/kyc-notification.service.ts:35` | `KycNotificationService.autoKycStepReminder` | +| 263 | 9 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:137` | `KycService.checkIdentSteps` | +| 263 | 9 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:174` | `KycService.reviewNationalityStep` | +| 263 | 9 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:308` | `KycService.reviewFinancialData` | +| 263 | 9 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:1850` | `KycService.getUserByTransactionOrThrow` | +| 261 | 8 | find | `BuyCryptoBatch` | `subdomains/core/buy-crypto/process/services/buy-crypto-dex.service.ts:30` | `BuyCryptoDexService.secureLiquidity` | +| 261 | 8 | find | `BuyCryptoBatch` | `subdomains/core/buy-crypto/process/services/buy-crypto-dex.service.ts:35` | `BuyCryptoDexService.secureLiquidity` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:92` | `BankDataService.verifyBankData` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:279` | `BankDataService.getBankData` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:299` | `BankDataService.getBankDatasByIban` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:308` | `BankDataService.getBankDatasByUserData` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:317` | `BankDataService.getApprovedAlternatives` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:351` | `BankDataService.getValidBankDatasForUser` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:369` | `BankDataService.getIdentBankDataForUser` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:376` | `BankDataService.updateUserBankData` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:399` | `BankDataService.updateUserBankData` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:437` | `BankDataService.createIbanForUserInternal` | +| 261 | 9 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:507` | `BankDataService.getPendingReviewList` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:413` | `BankDataService.createIbanForUser` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/organization/organization.service.ts:26` | `OrganizationService.syncOrganization` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/jwt-revocation-sync.service.ts:30` | `JwtRevocationSyncService.syncDeniedJwtAccounts` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.controller.ts:54` | `UserDataController.getAllUserData` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.controller.ts:91` | `UserDataController.getUserData` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:158` | `UserDataService.getUserData` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:159` | `UserDataService.getUserData` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:171` | `UserDataService.getUserDataByIds` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:190` | `UserDataService.getByKycHashOrThrow` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:216` | `UserDataService.getDifferentUserWithSameIdentDoc` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:229` | `UserDataService.getUsersByMail` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:241` | `UserDataService.getUserDataByBirthday` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:281` | `UserDataService.getUsersByName` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:285` | `UserDataService.getUsersByPhone` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:289` | `UserDataService.getUserDatasWithKycFile` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:606` | `UserDataService.assignNextKycFileId` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:1055` | `UserDataService.createApiKey` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:1128` | `UserDataService.loadRelationsAndVerify` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:1139` | `UserDataService.loadRelationsAndVerify` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:1146` | `UserDataService.loadRelationsAndVerify` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:1783` | `UserDataService.getByPhoneCallStatuses` | +| 253 | 8 | find | `UserData` | `subdomains/generic/user/models/user/user.service.ts:319` | `UserService.getUserProfile` | +| 247 | 9 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:576` | `BuyFiatService.updateVolumes` | +| 247 | 6 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:384` | `BankTxService.reset` | +| 246 | 9 | find | `CustodyAccountAccess` | `subdomains/core/custody/services/custody-account.service.ts:61` | `CustodyAccountService.getCustodyAccountsForUser` | +| 245 | 8 | find | `NameCheckLog` | `subdomains/generic/kyc/services/name-check.service.ts:40` | `NameCheckService.updateLog` | +| 245 | 8 | find | `NameCheckLog` | `subdomains/generic/kyc/services/name-check.service.ts:169` | `NameCheckService.closeAndRefreshRiskStatus` | +| 243 | 8 | find | `KycStep` | `subdomains/generic/kyc/services/kyc-admin.service.ts:144` | `KycAdminService.triggerWebhook` | +| 243 | 8 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:1493` | `KycService.getKycStepById` | +| 243 | 8 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:1896` | `KycService.syncIdentFiles` | +| 243 | 8 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:1967` | `KycService.getDfxApprovalSteps` | +| 243 | 8 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:1995` | `KycService.getPendingReviewSteps` | +| 243 | 8 | find | `Mros` | `subdomains/supporting/mros/mros.service.ts:50` | `MrosService.getAll` | +| 243 | 8 | find | `Mros` | `subdomains/supporting/mros/mros.service.ts:54` | `MrosService.getById` | +| 240 | 5 | find | `BankTxRepeat` | `subdomains/supporting/bank-tx/bank-tx-repeat/bank-tx-repeat.service.ts:23` | `BankTxRepeatService.create` | +| 240 | 5 | find | `BankTxRepeat` | `subdomains/supporting/bank-tx/bank-tx-repeat/bank-tx-repeat.service.ts:36` | `BankTxRepeatService.update` | +| 240 | 5 | find | `BankTxRepeat` | `subdomains/supporting/bank-tx/bank-tx-repeat/bank-tx-repeat.service.ts:97` | `BankTxRepeatService.getPendingTx` | +| 239 | 8 | find | `SupportNote` | `subdomains/generic/support/services/support-note.service.ts:139` | `SupportNoteService.update` | +| 238 | 8 | find | `CustodyAccount` | `subdomains/core/custody/services/custody-account.service.ts:117` | `CustodyAccountService.getCustodyAccountById` | +| 238 | 8 | find | `CustodyAccountAccess` | `subdomains/core/custody/services/custody-account.service.ts:259` | `CustodyAccountService.getAccessList` | +| 238 | 8 | find | `CustodyAccount` | `subdomains/core/custody/services/custody-account.service.ts:384` | `CustodyAccountService.requireOwner` | +| 235 | 9 | find | `StakingReward` | `subdomains/core/staking/services/staking.service.ts:25` | `StakingService.getUserStakingRewards` | +| 234 | 6 | find | `RefReward` | `subdomains/core/referral/reward/services/ref-reward-out.service.ts:28` | `RefRewardOutService.checkPaidTransaction` | +| 234 | 6 | find | `RefReward` | `subdomains/core/referral/reward/services/ref-reward-out.service.ts:43` | `RefRewardOutService.payoutNewTransactions` | +| 234 | 6 | find | `RefReward` | `subdomains/core/referral/reward/services/ref-reward.service.ts:188` | `RefRewardService.updateRefReward` | +| 234 | 6 | find | `RefReward` | `subdomains/core/referral/reward/services/ref-reward.service.ts:199` | `RefRewardService.getAllUserRewards` | +| 234 | 6 | find | `RefReward` | `subdomains/core/referral/reward/services/ref-reward.service.ts:207` | `RefRewardService.getRefRewardsByUserDataId` | +| 229 | 11 | find | `CryptoInput` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:527` | `DashboardReconciliationService.getCryptoInputs` | +| 226 | 7 | find | `CustodyOrderStep` | `subdomains/core/custody/services/custody-job.service.ts:94` | `CustodyJobService.checkStep` | +| 217 | 6 | find | `CustodyOrder` | `subdomains/core/custody/services/custody-job.service.ts:52` | `CustodyJobService.resetExpiredConfirmedOrders` | +| 217 | 6 | find | `CustodyOrder` | `subdomains/core/custody/services/custody-order.service.ts:319` | `CustodyOrderService.approveOrder` | +| 217 | 6 | find | `CustodyOrder` | `subdomains/core/custody/services/custody.service.ts:257` | `CustodyService.getUserCustodyHistory` | +| 217 | 6 | find | `CustodyOrder` | `subdomains/core/custody/services/custody.service.ts:470` | `CustodyService.calculateAccruedInterest` | +| 201 | 5 | find | `BuyFiat` | `subdomains/core/accounting/services/consumers/payout-order.consumer.ts:293` | `PayoutOrderConsumer.owedCompletionChf` | +| 201 | 8 | find | `RefReward` | `subdomains/core/referral/reward/services/ref-reward-dex.service.ts:36` | `RefRewardDexService.secureLiquidity` | +| 201 | 5 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:109` | `BuyFiatService.checkAmlResetTx` | +| 201 | 5 | find | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:549` | `BuyFiatService.manualPassAmlCheck` | +| 201 | 5 | find | `BuyFiat` | `subdomains/supporting/fiat-output/fiat-output.service.ts:98` | `FiatOutputService.create` | +| 195 | 8 | find | `PaymentLink` | `subdomains/core/payment-link/services/payment-link.service.ts:612` | `PaymentLinkService.deletePaymentLink` | +| 182 | 5 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output.service.ts:222` | `FiatOutputService.delete` | +| 179 | 4 | find | `BankTxRepeat` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:553` | `BankTxConsumer.openingBankTxId` | +| 179 | 4 | find | `BankTxRepeat` | `subdomains/core/accounting/services/ledger-cutover.service.ts:641` | `LedgerCutoverService.openBankTxRepeat` | +| 176 | 5 | find | `TradingOrder` | `subdomains/core/accounting/services/consumers/trading-order.consumer.ts:84` | `TradingOrderConsumer.processForward` | +| 176 | 5 | find | `TradingOrder` | `subdomains/core/trading/services/trading-order.service.ts:164` | `TradingOrderService.checkRunningOrders` | +| 176 | 5 | find | `TradingOrder` | `subdomains/core/trading/services/trading-rule.service.ts:42` | `TradingRuleService.getCurrentTradingOrders` | +| 174 | 13 | find | `Route` | `subdomains/core/route/route.service.ts:19` | `RouteService.updateRoute` | +| 174 | 4 | find | `Recall` | `subdomains/supporting/recall/recall.service.ts:51` | `RecallService.update` | +| 174 | 4 | find | `Recall` | `subdomains/supporting/recall/recall.service.ts:63` | `RecallService.getAll` | +| 174 | 4 | find | `Recall` | `subdomains/supporting/recall/recall.service.ts:75` | `RecallService.getById` | +| 164 | 9 | find | `DepositRoute` | `subdomains/supporting/address-pool/route/deposit-route.service.ts:41` | `DepositRouteService.getByLabel` | +| 159 | 3 | find | `Transaction` | `subdomains/supporting/payment/services/transaction-notification.service.ts:114` | `TransactionNotificationService.txUnassigned` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/core/accounting/services/consumers/liquidity-order-dex.consumer.ts:104` | `LiquidityOrderDexConsumer.processForward` | +| 156 | 4 | find | `RefReward` | `subdomains/core/accounting/services/consumers/payout-order.consumer.ts:208` | `PayoutOrderConsumer.refRewardCounter` | +| 156 | 4 | find | `RefReward` | `subdomains/core/referral/reward/services/ref-reward.service.ts:140` | `RefRewardService.createPendingRefRewards` | +| 156 | 4 | find | `RefReward` | `subdomains/core/referral/reward/services/ref-reward.service.ts:261` | `RefRewardService.getTransactions` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/base/dex-evm.service.ts:157` | `DexEvmService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-arkade.service.ts:28` | `DexArkadeService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-bitcoin-testnet4.service.ts:55` | `DexBitcoinTestnet4Service.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-bitcoin.service.ts:52` | `DexBitcoinService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-cardano.service.ts:62` | `DexCardanoService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-firo.service.ts:48` | `DexFiroService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-icp.service.ts:73` | `DexIcpService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-lightning.service.ts:30` | `DexLightningService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-monero.service.ts:42` | `DexMoneroService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-solana.service.ts:62` | `DexSolanaService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-spark.service.ts:28` | `DexSparkService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-tron.service.ts:62` | `DexTronService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex-zano.service.ts:58` | `DexZanoService.getPendingAmount` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex.service.ts:162` | `DexService.fetchLiquidityTransactionResult` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex.service.ts:182` | `DexService.checkOrderReady` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex.service.ts:199` | `DexService.checkOrderCompletion` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex.service.ts:211` | `DexService.completeOrders` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex.service.ts:222` | `DexService.cancelOrders` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex.service.ts:234` | `DexService.hasOrder` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex.service.ts:239` | `DexService.getPendingOrders` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex.service.ts:329` | `DexService.finalizePurchaseOrders` | +| 156 | 4 | find | `LiquidityOrder` | `subdomains/supporting/dex/services/dex.service.ts:341` | `DexService.alertStrandedPurchaseOrders` | +| 150 | 10 | find | `LiquidityManagementPipeline` | `subdomains/core/liquidity-management/services/liquidity-management.service.ts:56` | `LiquidityManagementService.getPipelineWithOrders` | +| 146 | 6 | find | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:106` | `SwapService.updateVolume` | +| 146 | 6 | find | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:140` | `SwapService.getSwapWithoutRoute` | +| 146 | 6 | find | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:145` | `SwapService.get` | +| 146 | 6 | find | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:174` | `SwapService.getAllUserSwaps` | +| 146 | 6 | find | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:182` | `SwapService.getSwapsByUserDataId` | +| 146 | 6 | find | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:214` | `SwapService.createSwap` | +| 146 | 6 | find | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:253` | `SwapService.getUserSwaps` | +| 144 | 6 | find | `Sell` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:685` | `BuyFiatService.getSell` | +| 143 | 4 | find | `Fee` | `subdomains/supporting/payment/services/fee.service.ts:342` | `FeeService.getAllFees` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/accounting/services/consumers/liquidity-mgmt.consumer.ts:89` | `LiquidityMgmtConsumer.processForward` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/liquidity-management/adapters/actions/liquidity-pipeline.adapter.ts:62` | `LiquidityPipelineAdapter.buy` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/liquidity-management/adapters/actions/liquidity-pipeline.adapter.ts:98` | `LiquidityPipelineAdapter.checkBuyCompletion` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:122` | `LiquidityManagementPipelineService.getProcessingOrders` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:133` | `LiquidityManagementPipelineService.getPendingTx` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:181` | `LiquidityManagementPipelineService.checkRunningPipelines` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:243` | `LiquidityManagementPipelineService.startNewOrders` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:334` | `LiquidityManagementPipelineService.resolveUncertainOrders` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:506` | `LiquidityManagementPipelineService.blockConfirmedOrder` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:649` | `LiquidityManagementPipelineService.resolveUncertainOrderManually` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:702` | `LiquidityManagementPipelineService.checkRunningOrders` | +| 139 | 9 | find | `LiquidityManagementOrder` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:510` | `DashboardReconciliationService.getLmOrders` | +| 134 | 5 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:84` | `BuyService.updateVolume` | +| 134 | 5 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:120` | `BuyService.getAllBankUsages` | +| 134 | 5 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:131` | `BuyService.get` | +| 134 | 5 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:204` | `BuyService.getBuyWithoutRoute` | +| 134 | 5 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:208` | `BuyService.getUserBuys` | +| 134 | 5 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:212` | `BuyService.getUserDataBuys` | +| 134 | 5 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:250` | `BuyService.getAllUserBuys` | +| 131 | 3 | find | `StakingRefReward` | `subdomains/core/staking/services/staking.service.ts:37` | `StakingService.getUserStakingRefRewards` | +| 130 | 9 | find | `LiquidityManagementPipeline` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:173` | `LiquidityManagementPipelineService.checkRunningPipelines` | +| 126 | 2 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:223` | `BankTxService.assignTransactions` | +| 126 | 2 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:417` | `BankTxService.getBankTxByTransactionId` | +| 126 | 2 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:422` | `BankTxService.getBankTxsByTransactionIds` | +| 126 | 2 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:678` | `BankTxService.getBankTxsByName` | +| 124 | 5 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:123` | `SellService.getUserSells` | +| 124 | 5 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:136` | `SellService.getSellsByUserDataId` | +| 124 | 5 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:167` | `SellService.createSell` | +| 124 | 5 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:216` | `SellService.updateSell` | +| 124 | 5 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:244` | `SellService.updateVolume` | +| 124 | 5 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:278` | `SellService.getAllUserSells` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/core/accounting/services/consumers/payout-order.consumer.ts:109` | `PayoutOrderConsumer.processForward` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:521` | `DashboardReconciliationService.getPayoutOrders` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:37` | `PayoutService.getPayoutOrders` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:69` | `PayoutService.checkOrderCompletion` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:91` | `PayoutService.getRecentPayoutSentCorrelationIds` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:117` | `PayoutService.speedupTransaction` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:140` | `PayoutService.retryUncertainPayout` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:193` | `PayoutService.getLatestOrderDate` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:206` | `PayoutService.checkPreparationCompletion` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:226` | `PayoutService.checkPayoutCompletion` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:249` | `PayoutService.prepareNewOrders` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:266` | `PayoutService.payoutOrders` | +| 123 | 3 | find | `PayoutOrder` | `subdomains/supporting/payout/services/payout.service.ts:283` | `PayoutService.processFailedOrders` | +| 118 | 3 | find | `CustodyBalance` | `subdomains/core/custody/services/custody-pdf.service.ts:47` | `CustodyPdfService.getBalancesWithHistoricalPrices` | +| 118 | 3 | find | `CustodyBalance` | `subdomains/core/custody/services/custody.service.ts:111` | `CustodyService.getUserCustodyBalance` | +| 118 | 3 | find | `CustodyBalance` | `subdomains/core/custody/services/custody.service.ts:238` | `CustodyService.updateCustodyBalance` | +| 118 | 3 | find | `BankTxRepeat` | `subdomains/supporting/bank-tx/bank-tx-repeat/bank-tx-repeat.service.ts:49` | `BankTxRepeatService.update` | +| 118 | 3 | find | `BankTxRepeat` | `subdomains/supporting/bank-tx/bank-tx-repeat/bank-tx-repeat.service.ts:62` | `BankTxRepeatService.update` | +| 118 | 3 | find | `BankTxRepeat` | `subdomains/supporting/bank-tx/bank-tx-repeat/bank-tx-repeat.service.ts:104` | `BankTxRepeatService.getBankTxRepeat` | +| 112 | 7 | find | `LiquidityManagementPipeline` | `subdomains/core/liquidity-management/adapters/actions/liquidity-pipeline.adapter.ts:86` | `LiquidityPipelineAdapter.checkBuyCompletion` | +| 112 | 7 | find | `LiquidityManagementPipeline` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:110` | `LiquidityManagementPipelineService.getProcessingPipelines` | +| 112 | 7 | find | `LiquidityManagementPipeline` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:116` | `LiquidityManagementPipelineService.getStoppedPipelines` | +| 112 | 7 | find | `LiquidityManagementPipeline` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:145` | `LiquidityManagementPipelineService.getPipelineStatus` | +| 112 | 7 | find | `LiquidityManagementPipeline` | `subdomains/core/liquidity-management/services/liquidity-management-pipeline.service.ts:155` | `LiquidityManagementPipelineService.startNewPipelines` | +| 112 | 7 | find | `LiquidityManagementPipeline` | `subdomains/core/liquidity-management/services/liquidity-management.service.ts:196` | `LiquidityManagementService.findRunningPipeline` | +| 112 | 2 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:257` | `TransactionRequestService.getTransactionRequestByUid` | +| 112 | 2 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:261` | `TransactionRequestService.getOpenBuyQuotes` | +| 112 | 2 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:424` | `TransactionRequestService.getByAssetId` | +| 101 | 6 | find | `VirtualIban` | `subdomains/supporting/bank/bank/bank.service.ts:181` | `BankService.getReceiveIbanStatus` | +| 101 | 6 | find | `VirtualIban` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:130` | `VirtualIbanService.getActiveReceivingForUserAndCurrency` | +| 101 | 6 | find | `VirtualIban` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:155` | `VirtualIbanService.getActiveSendingCandidatesForUserAndCurrency` | +| 99 | 0 | query-builder (nur-alias) | `UserData` | `subdomains/generic/user/models/user-data/user-data-notification.service.ts:173` | `UserDataNotificationService.blackSquadInvitation` | +| 99 | 0 | query-builder (ohne-select) | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:141` | `UserDataService.getUserDataByUser` | +| 99 | 0 | query-builder (nur-alias) | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:179` | `UserDataService.getUserDataIdsByServiceProvider` | +| 99 | 0 | query-builder (nur-alias) | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:313` | `UserDataService.getUserDataByKey` | +| 99 | 0 | query-builder (ohne-select) | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:1766` | `UserDataService.countByDateRange` | +| 99 | 0 | query-builder (nur-alias) | `UserData` | `subdomains/generic/user/models/user-data/user-data.service.ts:1774` | `UserDataService.getMaxKycFileIdByDateRange` | +| 98 | 2 | find | `User` | `subdomains/generic/user/models/user-data/user-data.service.ts:1033` | `UserDataService.customIdentMethod` | +| 98 | 2 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:277` | `UserService.getRefDtoV2` | +| 98 | 2 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:285` | `UserService.updateRef` | +| 98 | 2 | find | `User` | `subdomains/generic/user/services/webhook/webhook.service.ts:107` | `WebhookService.sendWebhooks` | +| 98 | 2 | find | `User` | `subdomains/generic/user/services/webhook/webhook.service.ts:176` | `WebhookService.getUsers` | +| 98 | 2 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:146` | `TransactionService.getTransactionById` | +| 98 | 2 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:151` | `TransactionService.getTransactionsByIds` | +| 98 | 2 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:159` | `TransactionService.getTransactionByUid` | +| 98 | 2 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:166` | `TransactionService.getTransactionByRequestId` | +| 98 | 2 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:173` | `TransactionService.getTransactionByRequestUid` | +| 98 | 2 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:181` | `TransactionService.getTransactionByExternalId` | +| 98 | 2 | find | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:185` | `TransactionService.getTransactionByCkoId` | +| 93 | 2 | find | `AktionariatRegistration` | `subdomains/supporting/realunit/realunit.service.ts:1281` | `RealUnitService.findRegistration` | +| 93 | 2 | find | `AktionariatRegistration` | `subdomains/supporting/realunit/realunit.service.ts:1296` | `RealUnitService.findRegistration` | +| 91 | 4 | find | `PaymentActivation` | `subdomains/core/payment-link/services/payment-activation.service.ts:64` | `PaymentActivationService.getActivationByTxId` | +| 91 | 4 | find | `PaymentActivation` | `subdomains/core/payment-link/services/payment-activation.service.ts:131` | `PaymentActivationService.getExistingActivations` | +| 87 | 2 | find | `TradingRule` | `subdomains/core/trading/services/trading-rule.service.ts:46` | `TradingRuleService.updateTradingRule` | +| 87 | 2 | find | `TradingRule` | `subdomains/core/trading/services/trading-rule.service.ts:53` | `TradingRuleService.processRules` | +| 87 | 2 | find | `TradingRule` | `subdomains/core/trading/services/trading-rule.service.ts:63` | `TradingRuleService.reactivateRules` | +| 87 | 2 | find | `RealUnitTransferRequest` | `subdomains/supporting/realunit/realunit.service.ts:3103` | `RealUnitService.confirmTransfer` | +| 87 | 2 | find | `RealUnitTransferRequest` | `subdomains/supporting/realunit/realunit.service.ts:3209` | `RealUnitService.reconcilePendingTransfers` | +| 86 | 2 | find | `Asset` | `shared/models/asset/asset.service.ts:78` | `AssetService.getAssetsByPriceRules` | +| 83 | 4 | find | `LiquidityManagementRule` | `subdomains/core/liquidity-management/services/liquidity-management-rule.service.ts:56` | `LiquidityManagementRuleService.updateRule` | +| 83 | 4 | find | `LiquidityManagementRule` | `subdomains/core/liquidity-management/services/liquidity-management-rule.service.ts:64` | `LiquidityManagementRuleService.getRule` | +| 83 | 4 | find | `LiquidityManagementRule` | `subdomains/core/liquidity-management/services/liquidity-management-rule.service.ts:72` | `LiquidityManagementRuleService.deactivateRule` | +| 83 | 4 | find | `LiquidityManagementRule` | `subdomains/core/liquidity-management/services/liquidity-management-rule.service.ts:82` | `LiquidityManagementRuleService.reactivateRule` | +| 83 | 4 | find | `LiquidityManagementRule` | `subdomains/core/liquidity-management/services/liquidity-management-rule.service.ts:95` | `LiquidityManagementRuleService.updateRuleSettings` | +| 83 | 4 | find | `LiquidityManagementRule` | `subdomains/core/liquidity-management/services/liquidity-management-rule.service.ts:110` | `LiquidityManagementRuleService.reactivateRules` | +| 83 | 4 | find | `LiquidityManagementRule` | `subdomains/core/liquidity-management/services/liquidity-management-rule.service.ts:147` | `LiquidityManagementRuleService.findExistingRuleOnCreation` | +| 83 | 4 | find | `LiquidityManagementRule` | `subdomains/core/liquidity-management/services/liquidity-management.service.ts:109` | `LiquidityManagementService.findRuleByAssetOrThrow` | +| 78 | 1 | find | `User` | `subdomains/generic/user/models/user/user.service.ts:97` | `UserService.getUserByAddress` | +| 78 | 3 | find | `Mros` | `subdomains/supporting/mros/mros.service.ts:32` | `MrosService.update` | +| 77 | 0 | query-builder (nur-alias) | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:712` | `BuyCryptoService.getBuyCryptoByKeys` | +| 77 | 0 | query-builder (nur-alias) | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:767` | `BuyCryptoService.updateRefVolumes` | +| 77 | 0 | query-builder (nur-alias) | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:883` | `BuyCryptoService.getUserVolumeForType` | +| 77 | 0 | query-builder (nur-alias) | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:963` | `BuyCryptoService.getPendingLiquidityDemandChf` | +| 77 | 0 | query-builder (nur-alias) | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:1077` | `BuyCryptoService.updateBuyVolume` | +| 77 | 0 | query-builder (nur-alias) | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:1105` | `BuyCryptoService.updateCryptoRouteVolume` | +| 77 | 0 | query-builder (nur-alias) | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:1148` | `BuyCryptoService.getRefVolume` | +| 77 | 0 | query-builder (nur-alias) | `BuyCrypto` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:1160` | `BuyCryptoService.getPartnerFeeRefVolume` | +| 75 | 2 | find | `BuyCryptoBatch` | `subdomains/core/buy-crypto/process/services/buy-crypto-batch.service.ts:238` | `BuyCryptoBatchService.filterOutExistingBatches` | +| 71 | 0 | query-builder (nur-alias) | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:341` | `BuyFiatService.getBuyFiatByKey` | +| 71 | 0 | query-builder (nur-alias) | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:587` | `BuyFiatService.updateRefVolumes` | +| 71 | 0 | query-builder (nur-alias) | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:604` | `BuyFiatService.getUserVolume` | +| 71 | 0 | query-builder (nur-alias) | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:699` | `BuyFiatService.updateSellVolume` | +| 71 | 0 | query-builder (nur-alias) | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:742` | `BuyFiatService.getRefVolume` | +| 71 | 0 | query-builder (nur-alias) | `BuyFiat` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:754` | `BuyFiatService.getPartnerFeeRefVolume` | +| 71 | 1 | find | `Recall` | `subdomains/supporting/recall/recall.service.ts:68` | `RecallService.getByBankTxIds` | +| 68 | 4 | find | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:204` | `SwapService.getById` | +| 65 | 2 | find | `Fee` | `subdomains/supporting/payment/services/fee.service.ts:115` | `FeeService.createFee` | +| 61 | 0 | find | `BankTx` | `subdomains/core/accounting/services/consumers/exchange-tx.consumer.ts:386` | `ExchangeTxConsumer.hasBankRouteMatch` | +| 61 | 0 | find | `BankTx` | `subdomains/core/accounting/services/ledger-cutover.service.ts:710` | `LedgerCutoverService.openUnattributed` | +| 61 | 0 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx-repeat/bank-tx-repeat.service.ts:46` | `BankTxRepeatService.update` | +| 61 | 0 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx-repeat/bank-tx-repeat.service.ts:59` | `BankTxRepeatService.update` | +| 61 | 0 | query-builder (nur-alias) | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx-outgoing-match.service.ts:36` | `BankTxOutgoingMatchService.getUniqueOutgoingBankTx` | +| 61 | 0 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:153` | `BankTxService.enrichYapealTransactions` | +| 61 | 0 | query-builder (nur-alias) | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:395` | `BankTxService.getBankTxByKey` | +| 61 | 0 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:429` | `BankTxService.getBankTxById` | +| 61 | 0 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:433` | `BankTxService.getPendingTx` | +| 61 | 0 | query-builder (nur-alias) | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:449` | `BankTxService.getBankTxFee` | +| 61 | 0 | query-builder (nur-alias) | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:461` | `BankTxService.getBankTxFee` | +| 61 | 0 | query-builder (nur-alias) | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:505` | `BankTxService.getBankTxFee` | +| 61 | 0 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:525` | `BankTxService.getRecentBankToBankTx` | +| 61 | 0 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:532` | `BankTxService.getRecentExchangeTx` | +| 61 | 0 | find | `BankTx` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:552` | `BankTxService.storeSepaFile` | +| 61 | 0 | find | `BankTx` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:464` | `DashboardReconciliationService.getBankFlows` | +| 59 | 2 | find | `PaymentQuote` | `subdomains/core/payment-link/services/payment-quote.service.ts:94` | `PaymentQuoteService.getActualQuoteByUniqueId` | +| 59 | 1 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-frick.service.ts:37` | `FiatOutputFrickService.checkFrickOrderStatus` | +| 59 | 1 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-frick.service.ts:101` | `FiatOutputFrickService.transmitPayments` | +| 59 | 1 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:85` | `FiatOutputJobService.checkOlkypayOrderStatus` | +| 59 | 1 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:362` | `FiatOutputJobService.DisabledProcess` | +| 59 | 1 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:407` | `FiatOutputJobService.checkTransmission` | +| 59 | 1 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:432` | `FiatOutputJobService.transmitYapealPayments` | +| 59 | 1 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:495` | `FiatOutputJobService.transmitOlkypayPayments` | +| 59 | 1 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:603` | `FiatOutputJobService.getLastBatchId` | +| 59 | 1 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:638` | `FiatOutputJobService.notifyScryptDeposits` | +| 59 | 1 | find | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output.service.ts:203` | `FiatOutputService.update` | +| 56 | 3 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:140` | `BuyService.getById` | +| 56 | 3 | find | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:258` | `BuyService.updateBuy` | +| 54 | 2 | find | `LedgerAccount` | `subdomains/core/accounting/services/ledger-query.service.ts:89` | `LedgerQueryService.getAccounts` | +| 54 | 2 | find | `LedgerAccount` | `subdomains/core/accounting/services/ledger-query.service.ts:157` | `LedgerQueryService.getReconStatus` | +| 54 | 2 | find | `LedgerAccount` | `subdomains/core/accounting/services/ledger-query.service.ts:619` | `LedgerQueryService.unverifiedAccountIds` | +| 54 | 2 | find | `LedgerAccount` | `subdomains/core/accounting/services/ledger-reconciliation.service.ts:146` | `LedgerReconciliationService.reconcileAssets` | +| 53 | 1 | find | `PriceRule` | `subdomains/supporting/pricing/services/pricing.service.ts:163` | `PricingService.updatePrices` | +| 50 | 2 | find | `PaymentLinkPayment` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:58` | `PaymentLinkPaymentService.processExpiredPayments` | +| 50 | 2 | find | `PaymentLinkPayment` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:264` | `PaymentLinkPaymentService.expirePaymentIfPending` | +| 50 | 2 | find | `PaymentLink` | `subdomains/core/payment-link/services/payment-link.service.ts:172` | `PaymentLinkService.createInvoice` | +| 46 | 1 | find | `Bank` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:839` | `BankTxConsumer.bankContext` | +| 46 | 1 | find | `Bank` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:870` | `BankTxConsumer.currencyMarkAssetId` | +| 46 | 1 | find | `Bank` | `subdomains/core/accounting/services/ledger-cutover.service.ts:750` | `LedgerCutoverService.bankMaps` | +| 46 | 3 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:90` | `SellService.getById` | +| 46 | 3 | find | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:143` | `SellService.getSellWithoutRoute` | +| 46 | 1 | find | `Bank` | `subdomains/supporting/bank/bank/bank.service.ts:40` | `BankService.getAllBanks` | +| 46 | 1 | find | `Bank` | `subdomains/supporting/bank/bank/bank.service.ts:44` | `BankService.getBanksWithAsset` | +| 46 | 1 | find | `Bank` | `subdomains/supporting/bank/bank/bank.service.ts:48` | `BankService.getBanksByName` | +| 46 | 1 | find | `Bank` | `subdomains/supporting/bank/bank/bank.service.ts:222` | `BankService.loadIbanCache` | +| 46 | 1 | find | `Asset` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:74` | `DashboardReconciliationService.getReconciliation` | +| 46 | 1 | find | `Asset` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:146` | `DashboardReconciliationService.getOverview` | +| 46 | 3 | find | `Sell` | `subdomains/supporting/fiat-output/fiat-output.service.ts:149` | `FiatOutputService.createInternal` | +| 46 | 0 | query-builder (nur-alias) | `FiatOutput` | `subdomains/supporting/fiat-output/fiat-output.service.ts:231` | `FiatOutputService.getFiatOutputByKey` | +| 45 | 2 | find | `PaymentQuote` | `subdomains/core/payment-link/services/payment-quote.service.ts:124` | `PaymentQuoteService.getQuoteByAsset` | +| 45 | 2 | find | `PaymentQuote` | `subdomains/core/payment-link/services/payment-quote.service.ts:143` | `PaymentQuoteService.getQuoteByTxId` | +| 45 | 0 | query-builder (nur-alias) | `User` | `subdomains/generic/user/models/user/user.service.ts:102` | `UserService.getUserByKey` | +| 45 | 0 | query-builder (nur-alias) | `User` | `subdomains/generic/user/models/user/user.service.ts:140` | `UserService.getAllLinkedUsers` | +| 45 | 0 | query-builder (ohne-select) | `User` | `subdomains/generic/user/models/user/user.service.ts:177` | `UserService.getOpenRefCreditUser` | +| 45 | 0 | query-builder (nur-alias) | `User` | `subdomains/generic/user/models/user/user.service.ts:195` | `UserService.getOpenRefCreditEur` | +| 45 | 0 | query-builder (nur-alias) | `User` | `subdomains/generic/user/models/user/user.service.ts:226` | `UserService.countRefChildrenByUserDataIds` | +| 45 | 0 | query-builder (nur-alias) | `User` | `subdomains/generic/user/models/user/user.service.ts:248` | `UserService.countRefReferrersByUserDataIds` | +| 45 | 0 | query-builder (nur-alias) | `User` | `subdomains/generic/user/models/user/user.service.ts:582` | `UserService.getUserVolumes` | +| 45 | 0 | query-builder (nur-alias) | `User` | `subdomains/generic/user/models/user/user.service.ts:592` | `UserService.getUserVolumes` | +| 45 | 0 | query-builder (nur-alias) | `User` | `subdomains/generic/user/models/user/user.service.ts:654` | `UserService.getRefInfo` | +| 45 | 0 | query-builder (nur-alias) | `User` | `subdomains/generic/user/models/user/user.service.ts:667` | `UserService.getRefInfo` | +| 45 | 0 | query-builder (nur-alias) | `User` | `subdomains/generic/user/models/user/user.service.ts:726` | `UserService.getTotalRefRewards` | +| 42 | 1 | find | `FaucetRequest` | `subdomains/core/faucet-request/services/faucet-request.service.ts:41` | `FaucetRequestService.checkFaucetRequests` | +| 42 | 1 | find | `FaucetRequest` | `subdomains/core/faucet-request/services/faucet-request.service.ts:93` | `FaucetRequestService.resetFaucet` | +| 40 | 1 | find | `LiquidityBalance` | `subdomains/core/liquidity-management/services/liquidity-management-balance.service.ts:38` | `LiquidityManagementBalanceService.getAllLiqBalancesForAssets` | +| 40 | 1 | find | `LiquidityBalance` | `subdomains/core/liquidity-management/services/liquidity-management-balance.service.ts:68` | `LiquidityManagementBalanceService.refreshBankBalance` | +| 40 | 1 | find | `LiquidityBalance` | `subdomains/core/liquidity-management/services/liquidity-management-balance.service.ts:82` | `LiquidityManagementBalanceService.getBalances` | +| 40 | 1 | find | `LiquidityBalance` | `subdomains/core/liquidity-management/services/liquidity-management-balance.service.ts:95` | `LiquidityManagementBalanceService.saveBalanceResults` | +| 40 | 1 | find | `AssetPrice` | `subdomains/supporting/pricing/services/asset-prices.service.ts:12` | `AssetPricesService.getAssetPrices` | +| 40 | 1 | find | `AssetPrice` | `subdomains/supporting/pricing/services/asset-prices.service.ts:38` | `AssetPricesService.getAssetPriceEntitiesForDate` | +| 39 | 1 | find | `Organization` | `subdomains/generic/user/models/organization/organization.service.ts:86` | `OrganizationService.getOrganizationByName` | +| 38 | 1 | find | `BlockchainFee` | `subdomains/supporting/payment/services/fee.service.ts:93` | `FeeService.updateBlockchainFees` | +| 38 | 1 | find | `BlockchainFee` | `subdomains/supporting/payment/services/fee.service.ts:297` | `FeeService.getBlockchainFeeInChf` | +| 38 | 1 | find | `BlockchainFee` | `subdomains/supporting/payment/services/fee.service.ts:550` | `FeeService.getBlockchainMaxFee` | +| 34 | 0 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:96` | `TransactionRequestService.syncStatus` | +| 34 | 0 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:233` | `TransactionRequestService.getTransactionRequest` | +| 34 | 0 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:244` | `TransactionRequestService.getWaitingTransactionRequest` | +| 34 | 0 | find | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:341` | `TransactionRequestService.getConsumedSettlementEventIds` | +| 34 | 0 | query-builder (nur-alias) | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:352` | `TransactionRequestService.getLegacySettlementTxIds` | +| 34 | 0 | query-builder (nur-alias) | `TransactionRequest` | `subdomains/supporting/payment/services/transaction-request.service.ts:406` | `TransactionRequestService.getActiveDepositAddresses` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:21` | `AssetService.updateAsset` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:30` | `AssetService.getAssetsWith` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:42` | `AssetService.getAllBlockchainAssets` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:46` | `AssetService.getPricedAssets` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:53` | `AssetService.getPaymentAssets` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:57` | `AssetService.getAssetById` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:61` | `AssetService.getAssetsById` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:87` | `AssetService.getAssetsByIdWith` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:91` | `AssetService.getAssetByChainId` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:95` | `AssetService.getAssetByUniqueName` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:99` | `AssetService.getAssetByQuery` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:103` | `AssetService.getAssetsByName` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:107` | `AssetService.getNativeAsset` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:121` | `AssetService.getTokens` | +| 33 | 0 | find | `Asset` | `shared/models/asset/asset.service.ts:126` | `AssetService.getSellableBlockchains` | +| 33 | 0 | query-builder (nur-alias) | `Asset` | `shared/models/asset/asset.service.ts:140` | `AssetService.getAssetsUsedOn` | +| 33 | 0 | find | `Asset` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:106` | `DashboardReconciliationService.getReconciliation` | +| 33 | 0 | find | `Asset` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:377` | `DashboardReconciliationService.getExchangeFlows` | +| 32 | 1 | find | `PaymentLinkPayment` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:125` | `PaymentLinkPaymentService.getPaymentByExternalId` | +| 32 | 1 | find | `PaymentLinkPayment` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:131` | `PaymentLinkPaymentService.getMostRecentPayment` | +| 31 | 1 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:217` | `BankDataService.createBankDataInternal` | +| 31 | 1 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:237` | `BankDataService.updateBankData` | +| 31 | 1 | find | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:332` | `BankDataService.getVerifiedBankDataWithIban` | +| 30 | 0 | find | `ExchangeTx` | `integration/exchange/services/exchange-tx.service.ts:76` | `ExchangeTxService.upsertScryptTx` | +| 30 | 0 | find | `ExchangeTx` | `integration/exchange/services/exchange-tx.service.ts:114` | `ExchangeTxService.syncExchanges` | +| 30 | 0 | find | `ExchangeTx` | `integration/exchange/services/exchange-tx.service.ts:211` | `ExchangeTxService.getExchangeTx` | +| 30 | 0 | find | `ExchangeTx` | `integration/exchange/services/exchange-tx.service.ts:215` | `ExchangeTxService.getLastExchangeTx` | +| 30 | 0 | find | `ExchangeTx` | `integration/exchange/services/exchange-tx.service.ts:219` | `ExchangeTxService.getRecentExchangeTx` | +| 30 | 0 | find | `ExchangeTx` | `integration/exchange/services/exchange-tx.service.ts:269` | `ExchangeTxService.getSyncSinceDate` | +| 30 | 2 | find | `LedgerTx` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:335` | `BankTxConsumer.cutoverOwedOpeningChf` | +| 30 | 2 | find | `LedgerTx` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:563` | `BankTxConsumer.openingLiabilityLegChf` | +| 30 | 2 | find | `LedgerTx` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:582` | `BankTxConsumer.cutoverOpeningLiabilityChf` | +| 30 | 2 | find | `LedgerTx` | `subdomains/core/accounting/services/consumers/buy-crypto.consumer.ts:323` | `BuyCryptoConsumer.paymentLinkOpeningChf` | +| 30 | 2 | find | `LedgerTx` | `subdomains/core/accounting/services/consumers/buy-fiat.consumer.ts:585` | `BuyFiatConsumer.cutoverOwedOpeningChf` | +| 30 | 2 | find | `LedgerTx` | `subdomains/core/accounting/services/consumers/buy-fiat.consumer.ts:603` | `BuyFiatConsumer.paymentLinkOpeningChf` | +| 30 | 2 | find | `LedgerTx` | `subdomains/core/accounting/services/consumers/buy-fiat.consumer.ts:621` | `BuyFiatConsumer.cutoverPaymentLinkOpeningChf` | +| 30 | 0 | find | `ExchangeTx` | `subdomains/core/accounting/services/consumers/exchange-tx.consumer.ts:78` | `ExchangeTxConsumer.processForward` | +| 30 | 2 | find | `LedgerLeg` | `subdomains/core/accounting/services/consumers/exchange-tx.consumer.ts:363` | `ExchangeTxConsumer.matchRaiffeisenSweep` | +| 30 | 0 | find | `ExchangeTx` | `subdomains/core/accounting/services/consumers/exchange-tx.consumer.ts:417` | `ExchangeTxConsumer.buildFillIndexMap` | +| 30 | 2 | find | `LedgerTx` | `subdomains/core/accounting/services/consumers/payout-order.consumer.ts:321` | `PayoutOrderConsumer.cutoverOwedOpeningChf` | +| 30 | 2 | find | `LedgerLeg` | `subdomains/core/accounting/services/ledger-query.service.ts:349` | `LedgerQueryService.counterAccountByTxId` | +| 30 | 0 | find | `ExchangeTx` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:286` | `DashboardReconciliationService.getBlockchainFlows` | +| 30 | 0 | find | `ExchangeTx` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:387` | `DashboardReconciliationService.getExchangeFlows` | +| 30 | 0 | find | `ExchangeTx` | `subdomains/supporting/dashboard/dashboard-reconciliation.service.ts:544` | `DashboardReconciliationService.getExchangeWithdrawalsForBlockchain` | +| 27 | 2 | find | `LiquidityManagementAction` | `subdomains/core/liquidity-management/services/liquidity-management-rule.service.ts:257` | `LiquidityManagementRuleService.findExistingAction` | +| 26 | 0 | query-builder (nur-alias) | `BankAccount` | `subdomains/supporting/bank/bank-account/bank-account.service.ts:22` | `BankAccountService.getBankAccountByKey` | +| 26 | 0 | find | `BankAccount` | `subdomains/supporting/bank/bank-account/bank-account.service.ts:40` | `BankAccountService.checkFailedBankAccounts` | +| 26 | 0 | find | `BankAccount` | `subdomains/supporting/bank/bank-account/bank-account.service.ts:48` | `BankAccountService.reloadErrorBankAccounts` | +| 26 | 0 | find | `BankAccount` | `subdomains/supporting/bank/bank-account/bank-account.service.ts:56` | `BankAccountService.reloadUncheckedBankAccounts` | +| 26 | 0 | find | `BankAccount` | `subdomains/supporting/bank/bank-account/bank-account.service.ts:66` | `BankAccountService.getOrCreateIbanBankAccountInternal` | +| 26 | 0 | find | `BankAccount` | `subdomains/supporting/bank/bank-account/bank-account.service.ts:73` | `BankAccountService.getOrCreateBicBankAccountInternal` | +| 25 | 0 | query-builder (nur-alias) | `RefReward` | `subdomains/core/referral/reward/services/ref-reward.service.ts:216` | `RefRewardService.getRefRewardVolume` | +| 25 | 0 | query-builder (nur-alias) | `RefReward` | `subdomains/core/referral/reward/services/ref-reward.service.ts:249` | `RefRewardService.updatePaidRefCredit` | +| 25 | 0 | query-builder (nur-alias) | `RefReward` | `subdomains/core/referral/reward/services/ref-reward.service.ts:278` | `RefRewardService.getRewardRecipients` | +| 25 | 0 | find | `CheckoutTx` | `subdomains/supporting/fiat-payin/services/checkout-tx.service.ts:53` | `CheckoutTxService.getCheckoutTx` | +| 25 | 0 | find | `CheckoutTx` | `subdomains/supporting/fiat-payin/services/checkout-tx.service.ts:60` | `CheckoutTxService.getPendingRefundedList` | +| 25 | 0 | find | `CheckoutTx` | `subdomains/supporting/fiat-payin/services/checkout-tx.service.ts:71` | `CheckoutTxService.getSyncDate` | +| 23 | 0 | find | `Country` | `shared/models/country/country.service.ts:12` | `CountryService.getAllCountry` | +| 23 | 0 | find | `Country` | `shared/models/country/country.service.ts:16` | `CountryService.getCountry` | +| 23 | 0 | find | `Country` | `shared/models/country/country.service.ts:21` | `CountryService.getCountryWithSymbol` | +| 23 | 0 | find | `Country` | `shared/models/country/country.service.ts:22` | `CountryService.getCountryWithSymbol` | +| 23 | 0 | find | `Country` | `shared/models/country/country.service.ts:28` | `CountryService.getCountriesByKycType` | +| 23 | 0 | find | `Country` | `shared/models/country/country.service.ts:31` | `CountryService.getCountriesByKycType` | +| 23 | 0 | query-builder (nur-alias) | `TradingOrder` | `subdomains/core/trading/services/trading-order.service.ts:53` | `TradingOrderService.getTradingOrderYield` | +| 23 | 0 | query-builder (nur-alias) | `TradingOrder` | `subdomains/core/trading/services/trading-rule.service.ts:35` | `TradingRuleService.getCurrentTradingOrders` | +| 23 | 0 | find | `BankTxBatch` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx-batch.service.ts:10` | `BankTxBatchService.getBankTxBatchByIban` | +| 21 | 0 | query-builder (ohne-select) | `DepositRoute` | `subdomains/supporting/address-pool/route/deposit-route.service.ts:87` | `DepositRouteService.getPaymentRouteForKey` | +| 20 | 0 | query-builder (nur-alias) | `Sell` | `subdomains/core/sell-crypto/process/services/buy-fiat-registration.service.ts:97` | `BuyFiatRegistrationService.filterSellPayIns` | +| 20 | 0 | query-builder (nur-alias) | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:95` | `SellService.getSellByKey` | +| 20 | 0 | query-builder (nur-alias) | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:261` | `SellService.getUserVolume` | +| 20 | 0 | query-builder (nur-alias) | `Sell` | `subdomains/core/sell-crypto/route/sell.service.ts:271` | `SellService.getTotalVolume` | +| 20 | 0 | find | `Wallet` | `subdomains/generic/user/models/wallet/wallet.repository.ts:13` | `WalletRepository.getByAddress` | +| 20 | 0 | find | `Wallet` | `subdomains/generic/user/models/wallet/wallet.service.ts:19` | `WalletService.updateWallet` | +| 20 | 0 | find | `Wallet` | `subdomains/generic/user/models/wallet/wallet.service.ts:28` | `WalletService.getByAddress` | +| 20 | 0 | find | `Wallet` | `subdomains/generic/user/models/wallet/wallet.service.ts:36` | `WalletService.getByIdOrName` | +| 20 | 0 | find | `Wallet` | `subdomains/generic/user/models/wallet/wallet.service.ts:40` | `WalletService.getKycClients` | +| 20 | 0 | find | `Wallet` | `subdomains/generic/user/models/wallet/wallet.service.ts:44` | `WalletService.getDefault` | +| 20 | 0 | query-builder (nur-alias) | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:221` | `TransactionService.getTransactionList` | +| 20 | 0 | query-builder (nur-alias) | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:324` | `TransactionService.getManualRefVolume` | +| 20 | 0 | query-builder (nur-alias) | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:353` | `TransactionService.getAuditPeriodVolumes` | +| 20 | 0 | query-builder (nur-alias) | `Transaction` | `subdomains/supporting/payment/services/transaction.service.ts:389` | `TransactionService.getTransactionByKey` | +| 20 | 0 | query-builder (ohne-select) | `PriceRule` | `subdomains/supporting/pricing/services/pricing.service.ts:272` | `PricingService.getRuleFor` | +| 19 | 0 | query-builder (ohne-select) | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:79` | `SwapService.getSwapByAddress` | +| 19 | 0 | query-builder (nur-alias) | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:123` | `SwapService.getUserVolume` | +| 19 | 0 | query-builder (nur-alias) | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:133` | `SwapService.getTotalVolume` | +| 19 | 0 | query-builder (nur-alias) | `Swap` | `subdomains/core/buy-crypto/routes/swap/swap.service.ts:152` | `SwapService.getSwapByKey` | +| 19 | 0 | query-builder (ohne-select) | `CustodyOrder` | `subdomains/core/custody/services/custody-order.service.ts:231` | `CustodyOrderService.getOrdersByUserData` | +| 19 | 0 | query-builder (nur-alias) | `CustodyOrder` | `subdomains/core/custody/services/custody.service.ts:221` | `CustodyService.updateCustodyBalance` | +| 19 | 0 | query-builder (nur-alias) | `CustodyOrder` | `subdomains/core/custody/services/custody.service.ts:229` | `CustodyService.updateCustodyBalance` | +| 19 | 0 | query-builder (nur-alias) | `CustodyOrder` | `subdomains/core/custody/services/custody.service.ts:677` | `CustodyService.getHistoricalBalances` | +| 19 | 0 | query-builder (nur-alias) | `CustodyOrder` | `subdomains/core/custody/services/custody.service.ts:689` | `CustodyService.getHistoricalBalances` | +| 17 | 0 | find | `KycLog` | `subdomains/generic/kyc/services/kyc-log.service.ts:83` | `KycLogService.updateLog` | +| 17 | 0 | find | `KycLog` | `subdomains/generic/kyc/services/kyc-log.service.ts:90` | `KycLogService.updateLogPdfUrl` | +| 17 | 0 | find | `KycLog` | `subdomains/generic/kyc/services/kyc-log.service.ts:109` | `KycLogService.getLogsByUserDataId` | +| 16 | 0 | find | `Fiat` | `shared/models/fiat/fiat.service.ts:12` | `FiatService.getAllFiat` | +| 16 | 0 | find | `Fiat` | `shared/models/fiat/fiat.service.ts:16` | `FiatService.getActiveFiat` | +| 16 | 0 | find | `Fiat` | `shared/models/fiat/fiat.service.ts:27` | `FiatService.getFiat` | +| 16 | 0 | find | `Fiat` | `shared/models/fiat/fiat.service.ts:33` | `FiatService.getFiatByName` | +| 16 | 0 | find | `Fiat` | `shared/models/fiat/fiat.service.ts:43` | `FiatService.getFiatByCountry` | +| 16 | 0 | query-builder (nur-alias) | `PaymentLinkPayment` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:148` | `PaymentLinkPaymentService.getMostRecentPayments` | +| 16 | 0 | query-builder (nur-alias) | `VirtualIban` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1294` | `VirtualIbanService.getVirtualIbanByKey` | +| 16 | 0 | query-builder (nur-alias) | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:109` | `SupportIssueService.getSupportIssueCounts` | +| 16 | 0 | query-builder (nur-alias) | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:177` | `SupportIssueService.getSupportIssueStatistics` | +| 16 | 0 | query-builder (nur-alias) | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:198` | `SupportIssueService.getSupportIssueStatistics` | +| 16 | 0 | query-builder (nur-alias) | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:245` | `SupportIssueService.getSupportIssueStatistics` | +| 16 | 0 | query-builder (ohne-select) | `SupportIssue` | `subdomains/supporting/support-issue/services/support-issue.service.ts:549` | `SupportIssueService.getSupportIssueList` | +| 15 | 0 | find | `WalletApp` | `subdomains/core/payment-link/services/wallet-app.service.ts:20` | `WalletAppService.getAllBlockchainWalletApps` | +| 15 | 0 | find | `WalletApp` | `subdomains/core/payment-link/services/wallet-app.service.ts:24` | `WalletAppService.getRecommendedWalletApps` | +| 15 | 0 | find | `WalletApp` | `subdomains/core/payment-link/services/wallet-app.service.ts:28` | `WalletAppService.getWalletAppById` | +| 15 | 0 | query-builder (nur-alias) | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:284` | `BankDataService.getBankDataByKey` | +| 15 | 0 | query-builder (nur-alias) | `BankData` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:493` | `BankDataService.getPendingReviewSummary` | +| 15 | 0 | find | `AktionariatRegistration` | `subdomains/supporting/realunit/realunit.service.ts:2830` | `RealUnitService.getRegisteredWalletAddresses` | +| 14 | 0 | find | `ScorechainScreening` | `integration/scorechain/repositories/scorechain-screening.repository.ts:18` | `ScorechainScreeningRepository.getByObjectIds` | +| 14 | 0 | find | `ScorechainScreening` | `integration/scorechain/services/scorechain-screening.service.ts:233` | `ScorechainScreeningService.getCached` | +| 14 | 0 | query-builder (nur-alias) | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:354` | `RecommendationService.countByRecommenderIds` | +| 14 | 0 | query-builder (nur-alias) | `Recommendation` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:369` | `RecommendationService.countByRecommendedIds` | +| 13 | 0 | query-builder (nur-alias) | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:101` | `BuyService.getUserVolume` | +| 13 | 0 | query-builder (nur-alias) | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:111` | `BuyService.getTotalVolume` | +| 13 | 0 | query-builder (nur-alias) | `Buy` | `subdomains/core/buy-crypto/routes/buy/buy.service.ts:228` | `BuyService.getBuyByKey` | +| 13 | 0 | find | `PaymentQuote` | `subdomains/core/payment-link/services/payment-quote.service.ts:76` | `PaymentQuoteService.processExpiredQuotes` | +| 13 | 0 | find | `PaymentQuote` | `subdomains/core/payment-link/services/payment-quote.service.ts:109` | `PaymentQuoteService.getActualQuoteByPaymentId` | +| 13 | 0 | find | `PaymentQuote` | `subdomains/core/payment-link/services/payment-quote.service.ts:157` | `PaymentQuoteService.cancelAllForPayment` | +| 13 | 0 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:147` | `KycService.checkIdentSteps` | +| 13 | 0 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:184` | `KycService.reviewNationalityStep` | +| 13 | 0 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:209` | `KycService.reviewIdentSteps` | +| 13 | 0 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:319` | `KycService.reviewFinancialData` | +| 13 | 0 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:371` | `KycService.reviewRecommendationStep` | +| 13 | 0 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:441` | `KycService.checkDfxApproval` | +| 13 | 0 | find | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:1497` | `KycService.getStepsByUserData` | +| 13 | 0 | query-builder (nur-alias) | `KycStep` | `subdomains/generic/kyc/services/kyc.service.ts:1981` | `KycService.getPendingReviewSummary` | +| 13 | 0 | find | `TfaLog` | `subdomains/generic/kyc/services/tfa.service.ts:195` | `TfaService.checkVerification` | +| 13 | 0 | find | `Bank` | `subdomains/supporting/bank/bank/bank.service.ts:63` | `BankService.getBankInternal` | +| 13 | 0 | find | `Bank` | `subdomains/supporting/bank/bank/bank.service.ts:68` | `BankService.getBankById` | +| 13 | 0 | find | `Bank` | `subdomains/supporting/bank/bank/bank.service.ts:72` | `BankService.getBankByIdUncached` | +| 13 | 0 | find | `Bank` | `subdomains/supporting/bank/bank/bank.service.ts:76` | `BankService.getBankByIban` | +| 13 | 0 | find | `Bank` | `subdomains/supporting/bank/bank/bank.service.ts:80` | `BankService.getReceiveBanks` | +| 13 | 0 | find | `Bank` | `subdomains/supporting/bank/bank/bank.service.ts:84` | `BankService.getSenderBanks` | +| 13 | 0 | find | `Notification` | `subdomains/supporting/notification/services/notification-job.service.ts:38` | `NotificationJobService.resendUncompletedMails` | +| 13 | 0 | find | `Notification` | `subdomains/supporting/notification/services/notification.service.ts:49` | `NotificationService.getMails` | +| 13 | 0 | find | `Notification` | `subdomains/supporting/notification/services/notification.service.ts:107` | `NotificationService.isSuppressed` | +| 13 | 0 | find | `TransactionRiskAssessment` | `subdomains/supporting/payment/services/transaction-risk-assessment.service.ts:20` | `TransactionRiskAssessmentService.update` | +| 12 | 0 | find | `IpLog` | `shared/models/ip-log/ip-log.service.ts:66` | `IpLogService.getByUserDataId` | +| 12 | 0 | find | `IpLog` | `shared/models/ip-log/ip-log.service.ts:75` | `IpLogService.getLoginCountries` | +| 12 | 0 | query-builder (nur-alias) | `IpLog` | `shared/models/ip-log/ip-log.service.ts:79` | `IpLogService.getLoginCountries` | +| 12 | 0 | query-builder (nur-alias) | `IpLog` | `shared/models/ip-log/ip-log.service.ts:92` | `IpLogService.getUserDataIdsWith` | +| 12 | 0 | query-builder (nur-alias) | `IpLog` | `shared/models/ip-log/ip-log.service.ts:103` | `IpLogService.getUserDataIdsWith` | +| 12 | 0 | find | `IpLog` | `shared/models/ip-log/ip-log.service.ts:119` | `IpLogService.updateUserIpLogs` | +| 11 | 0 | find | `OlkyRecipient` | `integration/bank/services/olkypay.service.ts:104` | `OlkypayService.getOrCreateRecipient` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-mark-to-market.service.ts:106` | `LedgerMarkToMarketService.selectCandidates` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-mark-to-market.service.ts:173` | `LedgerMarkToMarketService.accountBalance` | +| 11 | 0 | query-builder (ohne-select) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-mark-to-market.service.ts:212` | `LedgerMarkToMarketService.alreadyBooked` | +| 11 | 0 | query-builder (ohne-select) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-query.service.ts:125` | `LedgerQueryService.getAccountDetail` | +| 11 | 0 | query-builder (ohne-select) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-query.service.ts:184` | `LedgerQueryService.getSuspense` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-query.service.ts:284` | `LedgerQueryService.balancesByAccount` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-query.service.ts:298` | `LedgerQueryService.nativeBalanceBefore` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-query.service.ts:310` | `LedgerQueryService.nativeBalanceInPeriod` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-query.service.ts:326` | `LedgerQueryService.nativeBalanceByAccount` | +| 11 | 0 | query-builder (ohne-select) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-query.service.ts:466` | `LedgerQueryService.marginBuckets` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-query.service.ts:540` | `LedgerQueryService.cumulativeEquityByDay` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-reconciliation.service.ts:271` | `LedgerReconciliationService.checkTransitAge` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-reconciliation.service.ts:347` | `LedgerReconciliationService.openResidualSince` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-reconciliation.service.ts:400` | `LedgerReconciliationService.checkSuspense` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-reconciliation.service.ts:487` | `LedgerReconciliationService.journalEquity` | +| 11 | 0 | query-builder (nur-alias) | `LedgerLeg` | `subdomains/core/accounting/services/ledger-reconciliation.service.ts:517` | `LedgerReconciliationService.nativeBalanceByAccount` | +| 11 | 0 | query-builder (nur-alias) | `Log` | `subdomains/supporting/log/log.repository.ts:97` | `LogRepository.cleanup` | +| 11 | 0 | query-builder (nur-alias) | `Log` | `subdomains/supporting/log/log.repository.ts:104` | `LogRepository.cleanup` | +| 11 | 0 | find | `Log` | `subdomains/supporting/log/log.repository.ts:119` | `LogRepository.getFinancialLogAt` | +| 11 | 0 | find | `Log` | `subdomains/supporting/log/log.repository.ts:132` | `LogRepository.getLatestFinancialLog` | +| 11 | 0 | find | `Log` | `subdomains/supporting/log/log.repository.ts:142` | `LogRepository.getLatestValidFinancialLogs` | +| 11 | 0 | find | `Log` | `subdomains/supporting/log/log.repository.ts:150` | `LogRepository.getLatestFinancialChangesLog` | +| 11 | 0 | query-builder (nur-alias) | `Log` | `subdomains/supporting/log/log.repository.ts:158` | `LogRepository.getFinancialChangesLogs` | +| 11 | 0 | query-builder (ohne-select) | `Log` | `subdomains/supporting/log/log.repository.ts:165` | `LogRepository.getFinancialChangesLogs` | +| 11 | 0 | find | `Log` | `subdomains/supporting/log/log.repository.ts:187` | `LogRepository.getFinancialChangesLogs` | +| 11 | 0 | query-builder (nur-alias) | `Log` | `subdomains/supporting/log/log.repository.ts:206` | `LogRepository.getFinancialLogs` | +| 11 | 0 | query-builder (ohne-select) | `Log` | `subdomains/supporting/log/log.repository.ts:214` | `LogRepository.getFinancialLogs` | +| 11 | 0 | query-builder (ohne-select) | `Log` | `subdomains/supporting/log/log.repository.ts:244` | `LogRepository.getFinancialLogs` | +| 11 | 0 | query-builder (ohne-select) | `Log` | `subdomains/supporting/log/log.repository.ts:688` | `LogRepository.assertEmptyResultIsEndOfData` | +| 11 | 0 | query-builder (feldliste) | `Log` | `subdomains/supporting/log/log.repository.ts:699` | `LogRepository.getFinancialLogValidityChangeSet` | +| 11 | 0 | find | `Log` | `subdomains/supporting/log/log.service.ts:51` | `LogService.update` | +| 11 | 0 | find | `Log` | `subdomains/supporting/log/log.service.ts:131` | `LogService.getLog` | +| 11 | 0 | find | `Log` | `subdomains/supporting/log/log.service.ts:135` | `LogService.maxEntity` | +| 11 | 0 | query-builder (ohne-select) | `Log` | `subdomains/supporting/log/log.service.ts:191` | `LogService.getBankLog` | +| 10 | 0 | find | `AccountMerge` | `subdomains/generic/user/models/account-merge/account-merge.service.ts:61` | `AccountMergeService.sendMergeRequest` | +| 10 | 0 | find | `AccountMerge` | `subdomains/generic/user/models/account-merge/account-merge.service.ts:162` | `AccountMergeService.pendingMergeRequest` | +| 9 | 0 | find | `SupportNote` | `subdomains/generic/support/services/support-note.service.ts:57` | `SupportNoteService.search` | +| 9 | 0 | find | `SupportNote` | `subdomains/generic/support/services/support-note.service.ts:76` | `SupportNoteService.search` | +| 9 | 0 | query-builder (nur-alias) | `SupportNote` | `subdomains/generic/support/services/support-note.service.ts:84` | `SupportNoteService.listUsers` | +| 9 | 0 | find | `SupportNote` | `subdomains/generic/support/services/support-note.service.ts:152` | `SupportNoteService.delete` | +| 9 | 0 | find | `TransactionSpecification` | `subdomains/supporting/payment/services/transaction-helper.ts:92` | `TransactionHelper.updateCache` | +| 8 | 0 | find | `LedgerAccount` | `subdomains/core/accounting/services/ledger-account.service.ts:12` | `LedgerAccountService.findByName` | +| 8 | 0 | find | `LedgerAccount` | `subdomains/core/accounting/services/ledger-account.service.ts:16` | `LedgerAccountService.findByAssetId` | +| 8 | 0 | find | `LedgerAccount` | `subdomains/core/accounting/services/ledger-mark-to-market.service.ts:122` | `LedgerMarkToMarketService.selectCandidates` | +| 8 | 0 | find | `LedgerAccount` | `subdomains/core/accounting/services/ledger-query.service.ts:114` | `LedgerQueryService.getAccountDetail` | +| 8 | 0 | find | `CustodyAccountAccess` | `subdomains/core/custody/services/custody-account.service.ts:149` | `CustodyAccountService.checkAccess` | +| 8 | 0 | find | `CustodyAccountAccess` | `subdomains/core/custody/services/custody-account.service.ts:418` | `CustodyAccountService.requireActingAllowed` | +| 8 | 0 | find | `SupportIssueTemplate` | `subdomains/generic/support/services/support-issue-template.service.ts:28` | `SupportIssueTemplateService.search` | +| 8 | 0 | find | `SupportIssueTemplate` | `subdomains/generic/support/services/support-issue-template.service.ts:31` | `SupportIssueTemplateService.search` | +| 8 | 0 | find | `SupportIssueTemplate` | `subdomains/generic/support/services/support-issue-template.service.ts:58` | `SupportIssueTemplateService.update` | +| 8 | 0 | find | `SupportIssueTemplate` | `subdomains/generic/support/services/support-issue-template.service.ts:76` | `SupportIssueTemplateService.delete` | +| 7 | 0 | find | `Language` | `shared/models/language/language.service.ts:11` | `LanguageService.getAllLanguage` | +| 7 | 0 | find | `Language` | `shared/models/language/language.service.ts:15` | `LanguageService.getLanguage` | +| 7 | 0 | find | `Language` | `shared/models/language/language.service.ts:19` | `LanguageService.getLanguageBySymbol` | +| 7 | 0 | find | `Language` | `shared/models/language/language.service.ts:24` | `LanguageService.getLanguageByCountry` | +| 7 | 0 | find | `UserDataRelation` | `subdomains/generic/user/models/user-data-relation/user-data-relation.service.ts:40` | `UserDataRelationService.updateUserDataRelation` | +| 7 | 0 | find | `SpecialExternalAccount` | `subdomains/supporting/payment/services/special-external-account.service.ts:12` | `SpecialExternalAccountService.createSpecialExternalAccount` | +| 7 | 0 | find | `SpecialExternalAccount` | `subdomains/supporting/payment/services/special-external-account.service.ts:24` | `SpecialExternalAccountService.getMultiAccounts` | +| 7 | 0 | find | `SpecialExternalAccount` | `subdomains/supporting/payment/services/special-external-account.service.ts:48` | `SpecialExternalAccountService.getPhoneCallList` | +| 7 | 0 | find | `SpecialExternalAccount` | `subdomains/supporting/payment/services/special-external-account.service.ts:58` | `SpecialExternalAccountService.getBlacklist` | +| 7 | 0 | find | `AssetPrice` | `subdomains/supporting/pricing/services/asset-prices-job.service.ts:81` | `AssetPricesJobService.saveAssetPrices` | +| 7 | 0 | find | `RealUnitLegalAcceptance` | `subdomains/supporting/realunit/realunit-legal.service.ts:57` | `RealUnitLegalService.getLatestAcceptance` | +| 7 | 0 | query-builder (nur-alias) | `SupportMessage` | `subdomains/supporting/support-issue/services/support-escalation.service.ts:310` | `SupportEscalationService.getLastMessages` | +| 7 | 0 | query-builder (nur-alias) | `SupportMessage` | `subdomains/supporting/support-issue/services/support-issue.service.ts:133` | `SupportIssueService.getSupportIssueActivity` | +| 7 | 0 | query-builder (nur-alias) | `SupportMessage` | `subdomains/supporting/support-issue/services/support-issue.service.ts:186` | `SupportIssueService.getSupportIssueStatistics` | +| 7 | 0 | query-builder (nur-alias) | `SupportMessage` | `subdomains/supporting/support-issue/services/support-issue.service.ts:614` | `SupportIssueService.getMessageStats` | +| 6 | 0 | find | `Ref` | `subdomains/core/referral/process/ref.repository.ts:13` | `RefRepository.getAndRemove` | +| 6 | 0 | find | `Ref` | `subdomains/core/referral/process/ref.service.ts:22` | `RefService.checkRefs` | +| 6 | 0 | find | `Ref` | `subdomains/core/referral/process/ref.service.ts:28` | `RefService.addOrUpdate` | +| 6 | 0 | find | `CustodyProvider` | `subdomains/generic/user/models/custody-provider/custody-provider.service.ts:17` | `CustodyProviderService.updateCustodyProvider` | +| 6 | 0 | find | `CustodyProvider` | `subdomains/generic/user/models/custody-provider/custody-provider.service.ts:26` | `CustodyProviderService.getWithMasterKey` | +| 6 | 0 | find | `Deposit` | `subdomains/supporting/address-pool/deposit/deposit.service.ts:63` | `DepositService.getDeposit` | +| 6 | 0 | find | `Deposit` | `subdomains/supporting/address-pool/deposit/deposit.service.ts:67` | `DepositService.getDepositByAddress` | +| 6 | 0 | find | `Deposit` | `subdomains/supporting/address-pool/deposit/deposit.service.ts:71` | `DepositService.getAllDeposits` | +| 6 | 0 | find | `Deposit` | `subdomains/supporting/address-pool/deposit/deposit.service.ts:75` | `DepositService.getDepositsByBlockchain` | +| 6 | 0 | find | `Deposit` | `subdomains/supporting/address-pool/deposit/deposit.service.ts:79` | `DepositService.getDepositByBlockchainAndIndex` | +| 6 | 0 | find | `Deposit` | `subdomains/supporting/address-pool/deposit/deposit.service.ts:83` | `DepositService.getUsedDepositsByBlockchain` | +| 6 | 0 | query-builder (ohne-select) | `Deposit` | `subdomains/supporting/address-pool/deposit/deposit.service.ts:89` | `DepositService.getNextDeposit` | +| 6 | 0 | query-builder (nur-alias) | `Deposit` | `subdomains/supporting/address-pool/deposit/deposit.service.ts:189` | `DepositService.getNextDepositIndex` | +| 5 | 0 | find | `Setting` | `shared/models/setting/setting.repository.ts:36` | `SettingRepository.getStatusSettings` | +| 5 | 0 | find | `Setting` | `shared/models/setting/setting.service.ts:16` | `SettingService.getAll` | +| 5 | 0 | find | `Setting` | `shared/models/setting/setting.service.ts:26` | `SettingService.get` | +| 5 | 0 | find | `Setting` | `shared/models/setting/setting.service.ts:32` | `SettingService.set` | +| 5 | 0 | find | `Setting` | `shared/models/setting/setting.service.ts:202` | `SettingService.getObj` | +| 5 | 0 | find | `Setting` | `shared/models/setting/setting.service.ts:206` | `SettingService.getObjCached` | +| 5 | 0 | find | `Setting` | `shared/models/setting/setting.service.ts:210` | `SettingService.setObj` | +| 5 | 0 | find | `Sanction` | `subdomains/core/aml/services/sanction.service.ts:54` | `SanctionService.syncList` | +| 4 | 0 | find | `SystemStateSnapshot` | `subdomains/core/monitoring/monitoring.service.ts:47` | `MonitoringService.loadState` | +| — | — | find | `—` | `config/config.ts:1344` | `Configuration.isDomesticIban` | +| — | — | find | `—` | `integration/binance-pay/services/binance-pay.service.ts:271` | `BinancePayService.verifySignature` | +| — | — | find | `—` | `integration/blockchain/api/services/blockchain-balance.service.ts:52` | `BlockchainBalanceService.getSolanaBalances` | +| — | — | find | `—` | `integration/blockchain/api/services/blockchain-balance.service.ts:79` | `BlockchainBalanceService.getTronBalances` | +| — | — | find | `—` | `integration/blockchain/api/services/blockchain-balance.service.ts:115` | `BlockchainBalanceService.getEvmBalances` | +| — | — | find | `—` | `integration/blockchain/api/services/blockchain-balance.service.ts:132` | `BlockchainBalanceService.getEvmBalances` | +| — | — | find | `—` | `integration/blockchain/cardano/cardano-client.ts:81` | `CardanoClient.getNativeCoinBalanceForAddress` | +| — | — | find | `—` | `integration/blockchain/cardano/cardano-client.ts:100` | `CardanoClient.getTokenBalances` | +| — | — | find | `—` | `integration/blockchain/icp/icp-client.ts:231` | `InternetComputerClient.getNativeTransfersForAddress` | +| — | — | find | `—` | `integration/blockchain/icp/icp-client.ts:232` | `InternetComputerClient.getNativeTransfersForAddress` | +| — | — | find | `—` | `integration/blockchain/shared/evm/citrea-base-client.ts:248` | `CitreaBaseClient.swapViaGateway` | +| — | — | find | `—` | `integration/blockchain/shared/evm/citrea-base-client.ts:353` | `CitreaBaseClient.getTokenPairByAddresses` | +| — | — | find | `—` | `integration/blockchain/shared/evm/evm-client.ts:681` | `EvmClient.poolQuote` | +| — | — | find | `—` | `integration/blockchain/shared/evm/evm-client.ts:704` | `EvmClient.getSwapResultBaseUnits` | +| — | — | find | `—` | `integration/blockchain/shared/evm/evm-decimals.service.ts:24` | `EvmDecimalsService.setDecimals` | +| — | — | find | `—` | `integration/blockchain/solana/solana-client.ts:530` | `SolanaClient.updateTokenInstruction` | +| — | — | find | `—` | `integration/blockchain/solana/solana-client.ts:531` | `SolanaClient.updateTokenInstruction` | +| — | — | find | `—` | `integration/blockchain/tron/tron-client.ts:51` | `TronClient.getNativeCoinBalanceForAddress` | +| — | — | find | `—` | `integration/blockchain/zano/services/zano.service.ts:97` | `ZanoService.addAssetsToWhitelist` | +| — | — | find | `—` | `integration/blockchain/zano/services/zano.service.ts:98` | `ZanoService.addAssetsToWhitelist` | +| — | — | find | `—` | `integration/blockchain/zano/zano-client.ts:185` | `ZanoClient.getTokenBalances` | +| — | — | find | `—` | `integration/exchange/controllers/exchange.controller.ts:93` | `ExchangeController.syncExchange` | +| — | — | find | `—` | `integration/exchange/services/exchange-tx.service.ts:304` | `ExchangeTxService.getTransactionsFor` | +| — | — | find | `—` | `integration/exchange/services/exchange.service.ts:228` | `ExchangeService.getWithdraw` | +| — | — | find | `—` | `integration/exchange/services/exchange.service.ts:284` | `ExchangeService.getMarket` | +| — | — | find | `—` | `integration/exchange/services/exchange.service.ts:297` | `ExchangeService.getTradePair` | +| — | — | find | `—` | `integration/exchange/services/exchange.service.ts:343` | `ExchangeService.getBestBidLiquidity` | +| — | — | find | `—` | `integration/exchange/services/exchange.service.ts:368` | `ExchangeService.trade` | +| — | — | find | `—` | `integration/exchange/services/mexc.service.ts:159` | `MexcService.getWithdraw` | +| — | — | find | `—` | `integration/exchange/services/scrypt.service.ts:402` | `ScryptService.withdrawFunds` | +| — | — | find | `—` | `integration/exchange/services/scrypt.service.ts:577` | `ScryptService.findWithdrawal` | +| — | — | find | `—` | `integration/exchange/services/scrypt.service.ts:600` | `ScryptService.getOrderStatus` | +| — | — | find | `—` | `integration/exchange/services/scrypt.service.ts:832` | `ScryptService.placeOrder` | +| — | — | find | `—` | `integration/exchange/services/scrypt.service.ts:862` | `ScryptService.cancelOrder` | +| — | — | find | `—` | `integration/exchange/services/scrypt.service.ts:895` | `ScryptService.editOrder` | +| — | — | find | `—` | `integration/exchange/services/scrypt.service.ts:914` | `ScryptService.getTradePair` | +| — | — | find | `—` | `integration/exchange/services/scrypt.service.ts:930` | `ScryptService.getSecurity` | +| — | — | find | `—` | `integration/lightning/lightning-helper.ts:134` | — | +| — | — | find | `—` | `integration/lightning/services/lightning.service.ts:196` | `LightningService.findPayment` | +| — | — | find | `—` | `shared/models/asset/asset.controller.ts:39` | `AssetController.getAllAsset` | +| — | — | find | `—` | `shared/models/asset/asset.service.ts:153` | `AssetService.getByQuerySync` | +| — | — | find | `—` | `shared/models/asset/asset.service.ts:157` | `AssetService.getByChainIdSync` | +| — | — | find | `—` | `shared/models/fiat/fiat.controller.ts:27` | `FiatController.getAllFiat` | +| — | — | find | `—` | `shared/models/fiat/fiat.service.ts:32` | `FiatService.getFiatByName` | +| — | — | find | `—` | `shared/models/ip-log/ip-log.service.ts:143` | `IpLogService.checkIpCountry` | +| — | — | find | `—` | `shared/models/setting/setting.repository.ts:20` | `SettingRepository.setDateMax` | +| — | — | find | `—` | `shared/models/setting/setting.service.ts:169` | `SettingService.updateCustomSignUpFees` | +| — | — | find | `—` | `shared/models/setting/setting.service.ts:198` | `SettingService.getCustomSignUpFees` | +| — | — | find | `—` | `shared/repositories/cached.repository.ts:16` | `CachedRepository.findOneCached` | +| — | — | find | `—` | `shared/repositories/cached.repository.ts:20` | `CachedRepository.findOneCachedBy` | +| — | — | find | `—` | `shared/repositories/cached.repository.ts:24` | `CachedRepository.findCached` | +| — | — | find | `—` | `shared/repositories/cached.repository.ts:28` | `CachedRepository.findCachedBy` | +| — | — | find | `—` | `shared/services/http.service.ts:84` | `HttpService.getMockResponse` | +| — | — | find | `—` | `shared/utils/util.ts:786` | — | +| — | — | find | `—` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:339` | `BankTxConsumer.cutoverOwedOpeningChf` | +| — | — | find | `—` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:567` | `BankTxConsumer.openingLiabilityLegChf` | +| — | — | find | `—` | `subdomains/core/accounting/services/consumers/bank-tx.consumer.ts:586` | `BankTxConsumer.cutoverOpeningLiabilityChf` | +| — | — | find | `—` | `subdomains/core/accounting/services/consumers/buy-crypto.consumer.ts:327` | `BuyCryptoConsumer.paymentLinkOpeningChf` | +| — | — | find | `—` | `subdomains/core/accounting/services/consumers/buy-fiat.consumer.ts:589` | `BuyFiatConsumer.cutoverOwedOpeningChf` | +| — | — | find | `—` | `subdomains/core/accounting/services/consumers/buy-fiat.consumer.ts:607` | `BuyFiatConsumer.paymentLinkOpeningChf` | +| — | — | find | `—` | `subdomains/core/accounting/services/consumers/buy-fiat.consumer.ts:625` | `BuyFiatConsumer.cutoverPaymentLinkOpeningChf` | +| — | — | find | `—` | `subdomains/core/accounting/services/consumers/ledger-watermark.helper.ts:225` | — | +| — | — | find | `—` | `subdomains/core/accounting/services/consumers/payout-order.consumer.ts:325` | `PayoutOrderConsumer.cutoverOwedOpeningChf` | +| — | — | find | `—` | `subdomains/core/accounting/services/ledger-booking.service.ts:257` | `LedgerBookingService.activeTx` | +| — | — | find | `—` | `subdomains/core/accounting/services/ledger-booking.service.ts:264` | `LedgerBookingService.activeTx` | +| — | — | find | `—` | `subdomains/core/accounting/services/ledger-booking.service.ts:268` | `LedgerBookingService.activeTx` | +| — | — | find | `—` | `subdomains/core/accounting/services/ledger-booking.service.ts:274` | `LedgerBookingService.activeTx` | +| — | — | query-builder (nur-alias) | `—` | `subdomains/core/accounting/services/ledger-booking.service.ts:335` | `LedgerBookingService.nextSeqFrom` | +| — | — | query-builder (nur-alias) | `—` | `subdomains/core/accounting/services/ledger-cutover.service.ts:958` | `LedgerCutoverService.maxSettledId` | +| — | — | query-builder (nur-alias) | `—` | `subdomains/core/accounting/services/ledger-cutover.service.ts:1002` | `LedgerCutoverService.idsUpToBoundary` | +| — | — | find | `—` | `subdomains/core/aml/services/aml-helper.service.ts:375` | — | +| — | — | find | `—` | `subdomains/core/aml/services/aml-helper.service.ts:684` | — | +| — | — | find | `—` | `subdomains/core/aml/services/aml-helper.service.ts:685` | — | +| — | — | find | `—` | `subdomains/core/aml/services/aml-helper.service.ts:686` | — | +| — | — | find | `—` | `subdomains/core/aml/services/aml-helper.service.ts:700` | — | +| — | — | find | `—` | `subdomains/core/aml/services/aml.service.ts:132` | `AmlService.getAmlCheckInput` | +| — | — | find | `—` | `subdomains/core/aml/services/aml.service.ts:278` | `AmlService.getBankData` | +| — | — | find | `—` | `subdomains/core/buy-crypto/process/entities/buy-crypto.entity.ts:370` | `BuyCrypto.calculateOutputReferenceAmount` | +| — | — | find | `—` | `subdomains/core/buy-crypto/process/entities/buy-crypto.entity.ts:662` | `BuyCrypto.setFeeAndFiatReference` | +| — | — | find | `—` | `subdomains/core/buy-crypto/process/services/buy-crypto-batch.service.ts:242` | `BuyCryptoBatchService.filterOutExistingBatches` | +| — | — | find | `—` | `subdomains/core/buy-crypto/process/services/buy-crypto-registration.service.ts:93` | `BuyCryptoRegistrationService.findMatchingRoute` | +| — | — | find | `—` | `subdomains/core/buy-crypto/process/services/buy-crypto-registration.service.ts:95` | `BuyCryptoRegistrationService.findMatchingRoute` | +| — | — | find | `—` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:297` | `BuyCryptoService.update` | +| — | — | find | `—` | `subdomains/core/buy-crypto/process/services/buy-crypto.service.ts:1063` | `BuyCryptoService.getCryptoRoute` | +| — | — | find | `—` | `subdomains/core/custody/controllers/custody-account.controller.ts:66` | `CustodyAccountController.getCustodyAccount` | +| — | — | find | `—` | `subdomains/core/custody/controllers/custody-account.controller.ts:67` | `CustodyAccountController.getCustodyAccount` | +| — | — | query-builder (ohne-select) | `—` | `subdomains/core/custody/services/custody-account.service.ts:482` | `CustodyAccountService.lockActiveAccessGrant` | +| — | — | find | `—` | `subdomains/core/custody/services/custody-account.service.ts:504` | `CustodyAccountService.createGrant` | +| — | — | find | `—` | `subdomains/core/custody/services/custody-account.service.ts:598` | `CustodyAccountService.grantAccessForLegacy` | +| — | — | find | `CustodyOrder` | `subdomains/core/custody/services/custody-job.service.ts:65` | `CustodyJobService.executeOrder` | +| — | — | find | `—` | `subdomains/core/custody/services/custody-order.service.ts:399` | `CustodyOrderService.checkBalance` | +| — | — | find | `—` | `subdomains/core/custody/services/custody.service.ts:307` | `CustodyService.getUserCustodyHistory` | +| — | — | find | `—` | `subdomains/core/history/mappers/transaction-dto.mapper.ts:211` | `TransactionDtoMapper.feeAmountType` | +| — | — | find | `—` | `subdomains/core/history/services/history-access.service.ts:122` | `HistoryAccessService.resolveFromApiKey` | +| — | — | find | `—` | `subdomains/core/history/services/history-access.service.ts:130` | `HistoryAccessService.findOwnedUser` | +| — | — | find | `—` | `subdomains/core/history/services/history.service.ts:169` | `HistoryService.getHistoryTransactions` | +| — | — | find | `—` | `subdomains/core/liquidity-management/adapters/actions/base/ccxt-exchange.adapter.ts:451` | `CcxtExchangeAdapter.checkTransferCompletion` | +| — | — | find | `—` | `subdomains/core/liquidity-management/adapters/actions/dfx-dex.adapter.ts:228` | `DfxDexAdapter.checkWithdrawCompletion` | +| — | — | find | `—` | `subdomains/core/liquidity-management/adapters/actions/layerzero-bridge.adapter.ts:124` | `LayerZeroBridgeAdapter.checkDepositCompletion` | +| — | — | find | `—` | `subdomains/core/liquidity-management/adapters/actions/layerzero-bridge.adapter.ts:190` | `LayerZeroBridgeAdapter.checkWithdrawCompletion` | +| — | — | find | `—` | `subdomains/core/liquidity-management/adapters/balances/bank.adapter.ts:38` | `BankAdapter.getBalances` | +| — | — | find | `—` | `subdomains/core/liquidity-management/adapters/balances/bank.adapter.ts:88` | `BankAdapter.getForBank` | +| — | — | find | `—` | `subdomains/core/liquidity-management/adapters/balances/bank.adapter.ts:92` | `BankAdapter.getForBank` | +| — | — | find | `—` | `subdomains/core/liquidity-management/adapters/balances/bank.adapter.ts:134` | `BankAdapter.getForBank` | +| — | — | find | `—` | `subdomains/core/liquidity-management/adapters/balances/exchange.adapter.ts:40` | `ExchangeAdapter.hasPendingOrders` | +| — | — | find | `—` | `subdomains/core/liquidity-management/services/liquidity-management-balance.service.ts:78` | `LiquidityManagementBalanceService.findRelevantBalance` | +| — | — | find | `—` | `subdomains/core/liquidity-management/services/liquidity-management-rule.service.ts:197` | `LiquidityManagementRuleService.confirmOrCreateActionTree` | +| — | — | find | `LiquidityManagementRule` | `subdomains/core/liquidity-management/services/liquidity-management.service.ts:42` | `LiquidityManagementService.checkLiquidityBalances` | +| — | — | find | `—` | `subdomains/core/liquidity-management/validators/liquidity-actions-all-steps-match.validator.ts:11` | `LiquidityActionsAllStepsMatchValidator.validate` | +| — | — | find | `—` | `subdomains/core/liquidity-management/validators/liquidity-actions-all-steps-match.validator.ts:12` | `LiquidityActionsAllStepsMatchValidator.validate` | +| — | — | query-builder (nur-alias) | `—` | `subdomains/core/monitoring/observers/bank.observer.ts:117` | `BankObserver.getDbBalance` | +| — | — | find | `—` | `subdomains/core/monitoring/observers/node-health.observer.ts:131` | `NodeHealthObserver.getPoolState` | +| — | — | find | `—` | `subdomains/core/monitoring/observers/node-health.observer.ts:139` | `NodeHealthObserver.getNodeStateInPool` | +| — | — | query-builder (nur-alias) | `—` | `subdomains/core/monitoring/observers/payment.observer.ts:72` | `PaymentObserver.getPayment` | +| — | — | find | `—` | `subdomains/core/monitoring/observers/payment.observer.ts:157` | `PaymentObserver.getLastOutputDates` | +| — | — | find | `—` | `subdomains/core/monitoring/observers/payment.observer.ts:160` | `PaymentObserver.getLastOutputDates` | +| — | — | find | `—` | `subdomains/core/payment-link/entities/payment-quote.entity.ts:116` | `PaymentQuote.getTransferAmount` | +| — | — | find | `—` | `subdomains/core/payment-link/entities/payment-quote.entity.ts:123` | `PaymentQuote.getTransferAmountFor` | +| — | — | find | `—` | `subdomains/core/payment-link/services/ocp-sticker.service.ts:206` | `OCPStickerService.generateBitcoinFocusStickersPdf` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-activation.service.ts:118` | `PaymentActivationService.doCreateRequest` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-balance.service.ts:93` | `PaymentBalanceService.getPaymentBalances` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-balance.service.ts:108` | `PaymentBalanceService.getPaymentBalances` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:179` | `PaymentLinkPaymentService.handleBinanceWaiting` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-link-payment.service.ts:284` | `PaymentLinkPaymentService.cancelByLink` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-link.service.ts:181` | `PaymentLinkService.createInvoice` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-link.service.ts:633` | `PaymentLinkService.getPaymentLinkByAccessKey` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-link.service.ts:643` | `PaymentLinkService.getPaymentLinkByAccessKey` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-link.service.ts:663` | `PaymentLinkService.waitForPayment` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-quote.service.ts:118` | `PaymentQuoteService.getActualQuoteByPaymentId` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-quote.service.ts:503` | `PaymentQuoteService.validateEvmTx` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-quote.service.ts:504` | `PaymentQuoteService.validateEvmTx` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-quote.service.ts:552` | `PaymentQuoteService.async` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-quote.service.ts:560` | `PaymentQuoteService.async` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-quote.service.ts:704` | `PaymentQuoteService.doIcpPayment` | +| — | — | find | `—` | `subdomains/core/payment-link/services/payment-standard.service.ts:13` | `PaymentStandardService.getById` | +| — | — | find | `—` | `subdomains/core/sell-crypto/process/buy-fiat.entity.ts:367` | `BuyFiat.setFeeAndFiatReference` | +| — | — | find | `—` | `subdomains/core/sell-crypto/process/services/buy-fiat-registration.service.ts:124` | `BuyFiatRegistrationService.findMatchingRoute` | +| — | — | find | `—` | `subdomains/core/sell-crypto/process/services/buy-fiat-registration.service.ts:126` | `BuyFiatRegistrationService.findMatchingRoute` | +| — | — | find | `—` | `subdomains/core/sell-crypto/process/services/buy-fiat-registration.service.ts:128` | `BuyFiatRegistrationService.findMatchingRoute` | +| — | — | find | `—` | `subdomains/core/sell-crypto/process/services/buy-fiat.service.ts:206` | `BuyFiatService.update` | +| — | — | raw-sql | `—` | `subdomains/generic/gs/gs.service.ts:337` | `GsService.executeDebugQuery` | +| — | — | find | `—` | `subdomains/generic/gs/gs.service.ts:739` | `GsService.getParsedJsonData` | +| — | — | find | `—` | `subdomains/generic/gs/gs.service.ts:742` | `GsService.getParsedJsonData` | +| — | — | query-builder (ohne-select) | `—` | `subdomains/generic/gs/gs.service.ts:805` | `GsService.getRawDbData` | +| — | — | query-builder (ohne-select) | `—` | `subdomains/generic/gs/gs.service.ts:868` | `GsService.getExtendedBankTxData` | +| — | — | query-builder (ohne-select) | `—` | `subdomains/generic/gs/gs.service.ts:887` | `GsService.getExtendedBankTxData` | +| — | — | query-builder (ohne-select) | `—` | `subdomains/generic/gs/gs.service.ts:906` | `GsService.getExtendedBankTxData` | +| — | — | find | `—` | `subdomains/generic/kyc/dto/mapper/kyc-info.mapper.ts:35` | — | +| — | — | find | `—` | `subdomains/generic/kyc/dto/mapper/kyc-info.mapper.ts:36` | — | +| — | — | find | `—` | `subdomains/generic/kyc/dto/mapper/kyc-info.mapper.ts:125` | — | +| — | — | find | `—` | `subdomains/generic/kyc/dto/mapper/kyc-info.mapper.ts:126` | — | +| — | — | find | `—` | `subdomains/generic/kyc/dto/mapper/kyc-info.mapper.ts:135` | — | +| — | — | find | `—` | `subdomains/generic/kyc/enums/kyc.enum.ts:19` | — | +| — | — | find | `—` | `subdomains/generic/kyc/services/integration/financial.service.ts:39` | `FinancialService.getQuestions` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc-admin.service.ts:41` | `KycAdminService.getKycSteps` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc-client.service.ts:55` | `KycClientService.getAllUserPayments` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc-client.service.ts:111` | `KycClientService.getFileFor` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:218` | `KycService.reviewIdentSteps` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:433` | `KycService.checkDfxApproval` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:436` | `KycService.checkDfxApproval` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:459` | `KycService.isKycStepUniqueViolation` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:515` | `KycService.initializeProcess` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:531` | `KycService.failContactStepForMail` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:1174` | `KycService.getOrCreateStepInternal` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:1200` | `KycService.getOrCreateStep` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:1201` | `KycService.getOrCreateStep` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:1295` | `KycService.getNext` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:1358` | `KycService.initiateStep` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:1465` | `KycService.completeReferencedSteps` | +| — | — | find | `—` | `subdomains/generic/kyc/services/kyc.service.ts:1777` | `KycService.getIdentCheckErrors` | +| — | — | find | `—` | `subdomains/generic/support/support-pdf.service.ts:332` | `SupportPdfService.createOnboardingPdf` | +| — | — | find | `—` | `subdomains/generic/support/support-pdf.service.ts:358` | `SupportPdfService.createOnboardingPdf` | +| — | — | find | `—` | `subdomains/generic/support/support-pdf.service.ts:370` | `SupportPdfService.createOnboardingPdf` | +| — | — | find | `—` | `subdomains/generic/support/support-pdf.service.ts:386` | `SupportPdfService.createOnboardingPdf` | +| — | — | find | `—` | `subdomains/generic/support/support.service.ts:1327` | `SupportService.getUniqueUserDataByKey` | +| — | — | find | `—` | `subdomains/generic/support/support.service.ts:1336` | `SupportService.getUniqueUserDataByKey` | +| — | — | find | `—` | `subdomains/generic/user/models/auth/auth.service.ts:497` | `AuthService.checkPendingRecommendation` | +| — | — | find | `—` | `subdomains/generic/user/models/auth/auth.service.ts:515` | `AuthService.confirmRecommendationCode` | +| — | — | find | `—` | `subdomains/generic/user/models/auth/auth.service.ts:530` | `AuthService.getLinkedUser` | +| — | — | find | `—` | `subdomains/generic/user/models/bank-data/bank-data.entity.ts:155` | `BankData.internalReview` | +| — | — | find | `—` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:246` | `BankDataService.updateBankDataInternal` | +| — | — | find | `—` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:338` | `BankDataService.getVerifiedBankDataWithIban` | +| — | — | find | `—` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:339` | `BankDataService.getVerifiedBankDataWithIban` | +| — | — | find | `—` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:340` | `BankDataService.getVerifiedBankDataWithIban` | +| — | — | find | `—` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:362` | `BankDataService.getAllBankDatasForUser` | +| — | — | find | `—` | `subdomains/generic/user/models/bank-data/bank-data.service.ts:444` | `BankDataService.createIbanForUserInternal` | +| — | — | find | `Wallet` | `subdomains/generic/user/models/kyc/kyc.service.ts:58` | `KycService.transferKycData` | +| — | — | find | `—` | `subdomains/generic/user/models/kyc/kyc.service.ts:193` | `KycService.getFileFor` | +| — | — | find | `—` | `subdomains/generic/user/models/kyc/kyc.service.ts:200` | `KycService.getFileFor` | +| — | — | find | `—` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:45` | `RecommendationService.createRecommendationByRecommender` | +| — | — | find | `—` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:135` | `RecommendationService.handleRecommendationRequest` | +| — | — | find | `—` | `subdomains/generic/user/models/recommendation/recommendation.service.ts:246` | `RecommendationService.setRecommenderRefCode` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data-job.service.ts:51` | `UserDataJobService.setAccountOpener` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.entity.ts:621` | `UserData.addPhoneCallExternalAccountCheckValue` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.entity.ts:722` | `UserData.getMailLoginUser` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.entity.ts:761` | `UserData.getStep` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.entity.ts:781` | `UserData.getPendingStepWith` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.entity.ts:785` | `UserData.getCompletedStepWith` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.entity.ts:789` | `UserData.getNonFailedStepWith` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.enum.ts:75` | — | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.service.ts:867` | `UserDataService.checkMail` | +| — | — | query-builder (nur-alias) | `—` | `subdomains/generic/user/models/user-data/user-data.service.ts:1214` | `UserDataService.updateVolumes` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.service.ts:1312` | `UserDataService.mergeUserData` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.service.ts:1324` | `UserDataService.mergeUserData` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.service.ts:1332` | `UserDataService.mergeUserData` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.service.ts:1344` | `UserDataService.mergeUserData` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.service.ts:1547` | `UserDataService.mergeUserData` | +| — | — | find | `—` | `subdomains/generic/user/models/user-data/user-data.service.ts:1725` | `UserDataService.updateBankTxTime` | +| — | — | find | `—` | `subdomains/generic/user/models/user/dto/user-dto.mapper.ts:27` | — | +| — | — | find | `—` | `subdomains/generic/user/models/user/user.repository.ts:31` | `UserRepository.getNextRef` | +| — | — | find | `—` | `subdomains/generic/user/models/user/user.service.ts:342` | `UserService.createUser` | +| — | — | find | `—` | `subdomains/generic/user/models/user/user.service.ts:496` | `UserService.updateAddress` | +| — | — | find | `—` | `subdomains/generic/user/models/user/user.service.ts:512` | `UserService.deactivateUser` | +| — | — | find | `—` | `subdomains/supporting/balance/services/balance-pdf.service.ts:105` | `BalancePdfService.getBalancesForAddress` | +| — | — | find | `—` | `subdomains/supporting/bank-tx/bank-tx/entities/bank-tx.entity.ts:323` | `BankTx.bankDataName` | +| — | — | find | `—` | `subdomains/supporting/bank-tx/bank-tx/entities/bank-tx.entity.ts:335` | `BankTx.getSenderAccount` | +| — | — | find | `—` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:172` | `BankTxService.enrichYapealTransactions` | +| — | — | find | `—` | `subdomains/supporting/bank-tx/bank-tx/services/bank-tx.service.ts:708` | `BankTxService.findMatchingBuy` | +| — | — | find | `—` | `subdomains/supporting/bank/bank/bank.service.ts:62` | `BankService.getBankInternal` | +| — | — | find | `—` | `subdomains/supporting/bank/bank/bank.service.ts:142` | `BankService.getMatchingBank` | +| — | — | find | `—` | `subdomains/supporting/bank/bank/bank.service.ts:143` | `BankService.getMatchingBank` | +| — | — | find | `—` | `subdomains/supporting/bank/bank/bank.service.ts:216` | `BankService.getReceiveIbanStatus` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban-frick-issuance-reconciliation.service.ts:150` | `VirtualIbanFrickIssuanceReconciliationService.runPhase1StuckIntents` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban-frick-issuance-reconciliation.service.ts:471` | `VirtualIbanFrickIssuanceReconciliationService.loadAbandonedReferences` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:118` | `VirtualIbanService.getAccountHolder` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:295` | `VirtualIbanService.String` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:385` | `VirtualIbanService.lockUserLevelIssuanceForMerge` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:709` | `VirtualIbanService.async` | +| — | — | raw-sql | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:769` | `VirtualIbanService.hasOrderedOwnershipPath` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1030` | `VirtualIbanService.resolveVirtualIbanId` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1124` | `VirtualIbanService.getFrickIntentForUpdate` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1139` | `VirtualIbanService.getFrickIntentByIdForUpdate` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1157` | `VirtualIbanService.persistUserLevelIfMissing` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1246` | `VirtualIbanService.findActiveForUserCurrencyAndBank` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1312` | `VirtualIbanService.getVirtualIbansForAccount` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1320` | `VirtualIbanService.getFrickVirtualIbansForAccount` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1339` | `VirtualIbanService.deactivateVirtualIbanLocked` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1379` | `VirtualIbanService.deactivateVirtualIbanLocked` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1446` | `VirtualIbanService.resolveIssuanceIntentsForMergeLocked` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1451` | `VirtualIbanService.resolveIssuanceIntentsForMergeLocked` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1501` | `VirtualIbanService.resolveMergedVirtualIbanPairLocked` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1554` | `VirtualIbanService.resolveMergedVirtualIbanPairLocked` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1557` | `VirtualIbanService.resolveMergedVirtualIbanPairLocked` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1565` | `VirtualIbanService.resolveMergedVirtualIbanPairLocked` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1591` | `VirtualIbanService.resolveMergedVirtualIbanPairLocked` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1638` | `VirtualIbanService.mergeUserLevelVirtualIbans` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1669` | `VirtualIbanService.mergeUserLevelVirtualIbans` | +| — | — | find | `—` | `subdomains/supporting/bank/virtual-iban/virtual-iban.service.ts:1715` | `VirtualIbanService.getProvider` | +| — | — | find | `—` | `subdomains/supporting/dex/strategies/supplementary/impl/bitcoin-testnet4.strategy.ts:35` | `BitcoinTestnet4Strategy.findTransaction` | +| — | — | find | `—` | `subdomains/supporting/dex/strategies/supplementary/impl/bitcoin.strategy.ts:35` | `BitcoinStrategy.findTransaction` | +| — | — | find | `—` | `subdomains/supporting/dex/strategies/supplementary/impl/cardano.strategy.ts:36` | `CardanoStrategy.findTransaction` | +| — | — | find | `—` | `subdomains/supporting/dex/strategies/supplementary/impl/firo.strategy.ts:35` | `FiroStrategy.findTransaction` | +| — | — | find | `—` | `subdomains/supporting/dex/strategies/supplementary/impl/icp.strategy.ts:41` | `IcpStrategy.findTransaction` | +| — | — | find | `—` | `subdomains/supporting/dex/strategies/supplementary/impl/monero.strategy.ts:35` | `MoneroStrategy.findTransaction` | +| — | — | find | `—` | `subdomains/supporting/dex/strategies/supplementary/impl/solana.strategy.ts:37` | `SolanaStrategy.findTransaction` | +| — | — | find | `—` | `subdomains/supporting/dex/strategies/supplementary/impl/solana.strategy.ts:37` | `SolanaStrategy.findTransaction` | +| — | — | find | `—` | `subdomains/supporting/dex/strategies/supplementary/impl/tron.strategy.ts:37` | `TronStrategy.findTransaction` | +| — | — | find | `—` | `subdomains/supporting/dex/strategies/supplementary/impl/zano.strategy.ts:37` | `ZanoStrategy.findTransaction` | +| — | — | find | `—` | `subdomains/supporting/fiat-output/fiat-output-job.service.ts:300` | `FiatOutputJobService.setReadyDate` | +| — | — | find | `—` | `subdomains/supporting/fiat-output/fiat-output.service.ts:55` | `FiatOutputService.selectPayoutBank` | +| — | — | find | `—` | `subdomains/supporting/fiat-output/fiat-output.service.ts:207` | `FiatOutputService.update` | +| — | — | find | `—` | `subdomains/supporting/log/log-job.service.ts:618` | `LogJobService.getAssetLog` | +| — | — | find | `—` | `subdomains/supporting/log/log-job.service.ts:625` | `LogJobService.getAssetLog` | +| — | — | find | `—` | `subdomains/supporting/log/log-job.service.ts:997` | `LogJobService.getAssetLog` | +| — | — | find | `—` | `subdomains/supporting/log/log-job.service.ts:1607` | `LogJobService.findSenderReceiverPair` | +| — | — | raw-sql | `Log` | `subdomains/supporting/log/log.repository.ts:341` | `LogRepository.getFinancialLogAssetPrices` | +| — | — | raw-sql | `Log` | `subdomains/supporting/log/log.repository.ts:511` | `LogRepository.getFinancialLogSummariesFull` | +| — | — | raw-sql | `Log` | `subdomains/supporting/log/log.repository.ts:664` | `LogRepository.getFinancialLogSummariesChartOnly` | +| — | — | find | `—` | `subdomains/supporting/notification/services/notification.service.ts:128` | `NotificationService.resolveMailWallet` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin-notification.service.ts:32` | `PayInNotificationService.returnedCryptoInput` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:148` | `PayInService.getCryptoInputsByTransactionIds` | +| — | — | query-builder (nur-alias) | `—` | `subdomains/supporting/payin/services/payin.service.ts:156` | `PayInService.getCryptoInputByKeys` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:179` | `PayInService.getNewPayIns` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:192` | `PayInService.getAllUserTransactions` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:201` | `PayInService.getPendingPayIns` | +| — | — | query-builder (nur-alias) | `—` | `subdomains/supporting/payin/services/payin.service.ts:217` | `PayInService.getPayInFee` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:226` | `PayInService.acknowledgePayIn` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:261` | `PayInService.ignorePayIn` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:269` | `PayInService.retryUncertainSend` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:323` | `PayInService.updateFailedPayments` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:351` | `PayInService.forwardPayIns` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:397` | `PayInService.getUnconfirmedNextBlockPayIns` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:434` | `PayInService.checkOutputConfirmations` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:457` | `PayInService.checkReturnConfirmations` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:480` | `PayInService.returnPayIns` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:509` | `PayInService.processStrandedSendingPayIns` | +| — | — | find | `—` | `subdomains/supporting/payin/services/payin.service.ts:553` | `PayInService.checkInputConfirmations` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/base/alchemy.strategy.ts:33` | `AlchemyStrategy.pollAddress` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/base/citrea.strategy.ts:81` | `CitreaBaseStrategy.getLastCheckedBlockHeight` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/base/citrea.strategy.ts:120` | `CitreaBaseStrategy.mapCoinTransactionsToEntries` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/base/evm.strategy.ts:38` | `EvmStrategy.getTransactionAsset` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/binance-pay.strategy.ts:60` | `BinancePayStrategy.mapBinanceTransaction` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/cardano.strategy.ts:97` | `CardanoStrategy.getLastCheckedBlockHeight` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/cardano.strategy.ts:146` | `CardanoStrategy.mapToPayInEntries` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/kucoin-pay.strategy.ts:60` | `KucoinPayStrategy.mapKucoinTransaction` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/monero.strategy.ts:55` | `MoneroStrategy.getLastCheckedBlockHeight` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/solana.strategy.ts:80` | `SolanaStrategy.getPayInAddresses` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/solana.strategy.ts:119` | `SolanaStrategy.getTransactionCoin` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/tron.strategy.ts:80` | `TronStrategy.getPayInAddresses` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/tron.strategy.ts:112` | `TronStrategy.getTransactionCoin` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/tron.strategy.ts:117` | `TronStrategy.getTransactionAsset` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/zano.strategy.ts:57` | `ZanoStrategy.getLastCheckedBlockHeight` | +| — | — | find | `—` | `subdomains/supporting/payin/strategies/register/impl/zano.strategy.ts:105` | `ZanoStrategy.doMapToPayInEntries` | +| — | — | find | `—` | `subdomains/supporting/payment/repositories/transaction-specification.repository.ts:49` | `TransactionSpecificationRepository.findSpec` | +| — | — | find | `—` | `subdomains/supporting/payment/services/fee.service.ts:233` | `FeeService.getFeeBySpecialCode` | +| — | — | find | `—` | `subdomains/supporting/payment/services/fee.service.ts:338` | `FeeService.getFee` | +| — | — | find | `—` | `subdomains/supporting/payment/services/swiss-qr.service.ts:391` | `SwissQRService.formatChDate` | +| — | — | find | `—` | `subdomains/supporting/payment/services/swiss-qr.service.ts:409` | `SwissQRService.formatChDate` | +| — | — | find | `—` | `subdomains/supporting/payment/services/transaction-request.service.ts:295` | `TransactionRequestService.findAndComplete` | +| — | — | find | `—` | `subdomains/supporting/payment/services/transaction-request.service.ts:297` | `TransactionRequestService.findAndComplete` | +| — | — | find | `—` | `subdomains/supporting/payment/services/transaction.service.ts:341` | `TransactionService.getAllTransactionsForUserData` | +| — | — | find | `—` | `subdomains/supporting/pricing/services/integration/coin-gecko.service.ts:155` | `CoinGeckoService.getCurrency` | +| — | — | find | `—` | `subdomains/supporting/pricing/services/integration/pricing-deuro.service.ts:60` | `PricingDeuroService.getPrice` | +| — | — | find | `—` | `subdomains/supporting/realunit/realunit-job.service.ts:132` | `RealUnitJobService.findUnconsumedSettlement` | +| — | — | find | `—` | `subdomains/supporting/realunit/realunit.service.ts:339` | `RealUnitService.getHistoryEventByTxHash` | +| — | — | find | `—` | `subdomains/supporting/realunit/realunit.service.ts:1442` | `RealUnitService.toUserDataDtoFromUserData` | +| — | — | find | `—` | `subdomains/supporting/realunit/realunit.service.ts:1606` | `RealUnitService.forwardRegistration` | +| — | — | find | `—` | `subdomains/supporting/realunit/realunit.service.ts:2927` | `RealUnitService.applyRegistrationConfirmation` | +| — | — | find | `—` | `subdomains/supporting/support-issue/services/support-escalation.service.ts:166` | `SupportEscalationService.bindGroupChat` | +| — | — | find | `—` | `subdomains/supporting/support-issue/services/support-issue.service.ts:92` | `SupportIssueService.getSupportIssueClerkForAccount` | +| — | — | find | `SupportMessage` | `subdomains/supporting/support-issue/services/support-issue.service.ts:676` | `SupportIssueService.getIssue` | +| — | — | find | `SupportMessage` | `subdomains/supporting/support-issue/services/support-issue.service.ts:728` | `SupportIssueService.getIssueFile` | +| — | — | find | `SupportMessage` | `subdomains/supporting/support-issue/services/support-issue.service.ts:743` | `SupportIssueService.getUserIssues` | diff --git a/docs/read-path-projections.md b/docs/read-path-projections.md new file mode 100644 index 0000000000..613035bfc6 --- /dev/null +++ b/docs/read-path-projections.md @@ -0,0 +1,267 @@ +# Read-path projections + +What the load-site inventory shows, what we intend to do about it, and how the result is to be +tested. + +## The goal + +**Every read path in this service selects the fields it returns, and nothing more.** That is the +target state, not an aspiration for the parts that happen to be convenient — the endpoint inventory +in [endpoints.md](endpoints.md) is the work list, and its `Tests` column is the record of how far +we have got. + +**Every converted endpoint must reach 100% coverage under the four levels defined below.** An +endpoint is not converted at `3/4`; it is unfinished. The reason is in *The risk this must guard +against*: a projection that drops a field does not fail loudly, it answers 200 with a wrong value. +Converting without the tests replaces a slow query with a silent defect, which is the worse of the +two. + +**That coverage is documented per endpoint in this repository**, in the `Tests` column of +[endpoints.md](endpoints.md), and updated in the same pull request that changes the code. A +conversion whose coverage is not recorded cannot be told apart from one that was never tested, and +is treated as the latter. + +## The problem + +This service loads far more data than it returns. Measured against the real entity metadata: + +- The whole database schema has **1,736 columns across 99 tables**. +- `PUT /v1/transaction/:id/invoice` selected **1,664 of them** — 96% of the entire schema — to + render a PDF containing a handful of values. That query sat exactly on Postgres' limit of 1,664 + columns per statement, which is why a single new column added elsewhere (`settlementEventId` on + `transaction_request`) broke every invoice and receipt in production until it was fixed. +- Of the 534 endpoints, **432 reach at least one load site that fetches whole rows**; 98 read + nothing at all, and **2 read only the fields they return**. The widest query a fetching endpoint + can trigger is 308 columns at the median, and 19 of them exceed 1,000. + +The column limit was the symptom, not the cause. Loading a thousand columns to return one is +equally wasteful under a limit of 4,096 — it simply would not have failed yet. + +### Where it comes from + +Two properties combine: + +**Eager relations.** 95 relations in this repo are declared `eager: true`. TypeORM expands them +recursively, so a plain `findOne()` on `UserData` already selects **253 columns across 8 joins**, +and one on `LimitRequest` **434 across 15** — before any `relations` option is passed. The +decision what to load therefore lives in the entity definition, not at the call site, and no call +site can see what it triggers. + +**No read model.** Of the 1,105 load sites in this repository, **six** name the columns they need: +one query builder and the five raw statements. The other 1,099 request whole rows — 971 through the +`find` family, and of the 129 query builders, 105 pass the root alias to `.select(...)`, which reads +like a projection but is not, while 23 pass no select at all. The same entities serve persistence, +business logic and pure output paths such as invoices, receipts, history and exports — which need +fields, not objects. + +## Vocabulary + +| Term | Meaning here | +| ---- | ------------ | +| **Overfetching** | Loading or transferring more data than the result needs. The umbrella term for this whole topic. | +| **Eager loading** | Automatically loading related entities, recursively. The opposite is lazy loading. | +| **Projection** | Selecting only the columns the result needs. The countermeasure. | +| **Read path** | An endpoint that only reads and renders data, and writes nothing back. | +| **Write path** | An endpoint that persists a loaded entity — it needs the complete object. | +| **Read model** | A separate model optimised for reading. Introducing projections for read paths is a small step towards one. | + +Note that eager relations apply to the `find*` family, **not** to `createQueryBuilder` and not to +raw SQL. [load-sites.md](load-sites.md) records that mechanism for each of the 1,105 load sites, +together with the measured column count. + +[endpoints.md](endpoints.md) summarises this per endpoint, as the union over every load site the +endpoint can reach. That column answers one question only — *does this endpoint load more than it +needs* — and any single offending site is enough to answer yes. It deliberately says nothing about +where the bulk of the work happens: an endpoint whose own query is raw SQL is still marked when a +permission check on the way loads a full row. For that question the load site is the level at +which the statement is unambiguous, which is why both documents exist. + +## What we intend to change + +Read paths select the fields they return, via a query builder with an explicit field list. Write +paths stay as they are — they need complete entities. + +Note that `select` inside `find` options is **not** sufficient: it narrows the root entity but +still pulls in the eager relations. Measured on `Transaction`: `find` selects 98 columns over 2 +joins, `find` with a three-field `select` still 81 over 2, a query builder with three fields +selects 3 over none. + +### When an endpoint qualifies + +All of the following must hold: + +1. **No write to the entity in question** anywhere in the call chain — no `save`, `update`, + `delete` or `remove` on its repository or on the entity manager. The endpoint may write *other* + entities; the criterion applies per load site. +2. **The entity is not handed to code whose use of it is unknown** — an event handler, a generic + service, a queue. +3. **All result-relevant fields are statically determinable.** Ruled out by dynamic field access + (`this[variable]`) unless the field list resolves to a constant. Two such getters exist, both in + `user-data.entity.ts`. +4. **The endpoint returns a DTO**, not an entity and not a binary stream. When an entity is + returned, the required field set is not defined by a contract and cannot be narrowed safely. +5. **The tests below pass.** + +The first four are pre-filters; the fifth decides. + +## The risk this must guard against + +A missing field does not crash. It is simply absent, getters compute with it anyway, and the +endpoint answers 200 with a wrong value. + +The concrete case, from the code that was already fixed once: + +```typescript +get requiredInvoiceFields(): string[] { + return ['accountType'].concat(this.isPersonalAccount ? ['firstname','surname'] : ['organizationName']); +} +get isInvoiceDataComplete(): boolean { + return this.requiredInvoiceFields.every((f) => this[f]); +} +``` + +Leave `surname` out of the projection and `isInvoiceDataComplete` returns `false` where the full +load returns `true`. The invoice is refused with "user data is not complete" although the data is +complete. No error, no log entry. + +This service carries **234 such getters across 50 of its 112 entities**. In an application moving +money, a silent wrong value is worse than a crash: a 500 is found within hours — the outage +described above proves it — a wrong value can run for weeks. + +## Test definition + +All four levels must pass for an endpoint to count as converted. `endpoints.md` records the state +per endpoint as `0/4` through `4/4`; only `4/4` is done. + +### Which endpoints these apply to + +To any load site that carries an explicit field list — that is where a forgotten field silently +yields an empty value. + +Today that is **six sites**, and this is what the suite covers of them: + +| Site | Form | Runs in a test | Column list asserted | Real database | +| ---- | ---- | -------------- | -------------------- | ------------- | +| `log.repository.ts:699` — `getFinancialLogValidityChangeSet` | `.select(['log.id', 'log.valid'])` | **no** | no | no | +| `log.repository.ts:341` — `getFinancialLogAssetPrices` | raw SQL, columns listed | **no** | no | no | +| `log.repository.ts:511` — `getFinancialLogSummariesFull` | raw SQL, columns listed | yes | yes | no | +| `log.repository.ts:664` — `getFinancialLogSummariesChartOnly` | raw SQL, columns listed | yes | yes | no | +| `virtual-iban.service.ts:769` — `hasOrderedOwnershipPath` | raw SQL, columns listed | **no** | no | no | +| `gs.service.ts:337` — `executeDebugQuery` | raw SQL, list supplied by the caller | yes | yes | no | + +Read that column by column, because the three answers mean different things. + +**Runs in a test.** Three of the six are never executed. `getFinancialLogValidityChangeSet` is +replaced by `jest.spyOn(logRepo, …).mockResolvedValue([…])` at all nine of its appearances, so the +projection line itself never runs. `getFinancialLogAssetPrices` is stood in for by a hand-written +fake that reimplements the filtering in TypeScript. `hasOrderedOwnershipPath` appears in no spec at +all. The two summary queries do run, through the `getFinancialLogSummaries` dispatcher, which the +repository spec calls 31 times. + +**Column list asserted.** Where a query runs, `query` is spied and the generated SQL inspected — +an `expect(sql).toContain(...)` per projected column, and for the chart-only path an assertion +that `message` never appears in the statement at all. Drop a column from those statements and the suite turns red. +That is level 3 of the definition below, reached for three sites. For the three that never run, +removing a column changes nothing: the mock supplies the value regardless. + +**Real database.** None of the six. Every spec stubs the boundary — `createQueryBuilder` as a +chainable mock in the repository spec, `createMock()` in the service spec. A mock cannot +observe which columns were requested, so **level 1, the completeness test, is satisfied nowhere +today**, not even for the three sites whose SQL is asserted. Asserting that a column appears in a +statement is not the same as proving the statement returns every field the response needs. + +`executeDebugQuery` is a different case regardless: its field list comes from the request, so an +incomplete result is the caller's doing rather than a defect here. Its 197 specs cover a different +axis — the table and column allowlist, PII masking, parameter binding — and that is the right axis +for it. + +So the gap is narrow and specific: **`log.repository.ts:699` is the one site that carries the +projection risk, serves a live endpoint (`PUT /log/financial/validity`), and is not exercised at +all.** What surrounds it is well covered — batching into blocks of 100, the audit trail, rejection +of fabricated audit records, the block on changing validity through the generic update path. + +Every other read in the repository either selects only the root alias or nothing at all and +therefore still loads every column; nothing can be missing from those. Each becomes subject to these +tests the moment it is given a field list. + +### How they run + +Four levels. All of them need a real Postgres instance; a mocked repository returns whatever the +mock defines and cannot see which columns were requested, so it cannot test any of this. + +**The repository already has this mechanism — it does not need to be built.** Fourteen migration +specs gate on it: + +```typescript +const PG_URL = process.env.MIGRATION_TEST_PG; +const describeDb = PG_URL ? describe : describe.skip; +``` + +`.github/workflows/api-pr.yaml` runs a throwaway Postgres 16 as a service and sets that variable, +in **all three test shards** — Jest distributes the suites across shards, so every shard needs its +own instance. Without the variable the blocks are skipped, which is why the suite still passes on a +machine with no database. + +The projection tests should use the same mechanism rather than introduce a second one. + +Two things are missing, and only two: + +- **The schema.** The migration specs each create their own Postgres schema (`const SCHEMA = '…'`) + so that parallel specs cannot collide. The projection tests need the same isolation, but their + schema comes from the entity metadata via `synchronize` rather than from replayed migrations — + the reference for a projection is the entity definition, not the migration history. +- **The fixtures**, generated from the same metadata. + +### 1. Completeness + +**With a fully populated fixture, no field of the response DTO may be empty.** + +If every field of every participating entity carries a distinguishable value, then any `undefined` +in the result proves the query failed to load something. + +This is the central test. It needs no reference implementation, is generated per endpoint, and does +not age: when a field is added to a DTO later, it is covered from the first run — which is the more +likely failure over time, since nobody will be thinking about projections by then. + +Fixtures are **generated from the metadata**, not hand-written. Every scalar column gets a value +and required relations are created recursively. A hand-written fixture that leaves a field empty +makes the test green and the defect invisible. + +### 2. Variants + +**One fixture per branch that changes the required field set.** + +The getter above needs `firstname` and `surname` for a personal account, but `organizationName` +otherwise. A fixture covering only personal accounts would let a projection missing +`organizationName` pass — and it would then compute wrongly for every corporate customer. + +Branches to cover are found where a getter reads a field list conditionally, or where its result +depends on a status field. + +### 3. Mutation + +**Remove each field of the projection individually; level 1 must fail every time.** + +This proves the test looks at anything at all. Where removing a field changes nothing, one of two +things is true: the field is unnecessary and can be dropped permanently, or the fixture has a gap +at exactly that point — and a real defect would have slipped through there. + +Without this level you never know whether a green test verified something or is merely green. + +### 4. Consistency against a second source + +**Where the same value exists twice, the two must agree.** + +Applies wherever a value was materialised into its own column while the original source is still +present. In the financial log, `totalBalanceChf` exists both as a column and inside +`message->balancesTotal->totalBalanceChf`; every row must carry the same value in both. Where such +an invariant exists it is the strongest available test, because it needs no second implementation +that could itself be written wrong. + +### Deliberately not part of this: a column budget + +An upper bound on the number of columns per query was considered and rejected. A projection is +already the protection — with an explicit field list, a new column three subsystems away cannot +inflate the query, which was the original failure. The budget number would be arbitrary, would turn +red on every legitimate new field, and after the third increase would be a ritual rather than a +check.