Area: Payments / transfers + batches · Type: bug/enhancement (compliance)
Two related gaps on the money-movement path:
- Allowlist bypass.
wallet-policy.ts:141 enforces a wallet's destination allowlist by default (enforceDestinationAllowlist !== false). Single transfers use the default (enforce); the batch handler passes enforceDestinationAllowlist: false (transfer-batches.ts:564), so a destination the allowlist would block on a single transfer can still be paid via a batch.
- No sanctions screening in the transfer path.
policy-enforcement.service.ts is allowlist-only; there is no sanctions/AML screening before submit. Screening lives only on the separate caller-driven POST /v1/compliance/address-screenings.
Reproduce: code-confirmed (the default logic + the batch override). Live repro of (1) needs a wallet allowlist policy configured.
Impact: an operator relying on the destination allowlist as a control has it silently bypassed via batch; and an integrator who assumes the platform screens could pay a sanctioned address.
Suggested fix: make batch respect the allowlist by default (or require an explicit, logged opt-out); document that transfers are not sanctions-screened server-side and the caller must screen via /compliance/address-screenings.
Area: Payments / transfers + batches · Type: bug/enhancement (compliance)
Two related gaps on the money-movement path:
wallet-policy.ts:141enforces a wallet's destination allowlist by default (enforceDestinationAllowlist !== false). Single transfers use the default (enforce); the batch handler passesenforceDestinationAllowlist: false(transfer-batches.ts:564), so a destination the allowlist would block on a single transfer can still be paid via a batch.policy-enforcement.service.tsis allowlist-only; there is no sanctions/AML screening before submit. Screening lives only on the separate caller-drivenPOST /v1/compliance/address-screenings.Reproduce: code-confirmed (the default logic + the batch override). Live repro of (1) needs a wallet allowlist policy configured.
Impact: an operator relying on the destination allowlist as a control has it silently bypassed via batch; and an integrator who assumes the platform screens could pay a sanctioned address.
Suggested fix: make batch respect the allowlist by default (or require an explicit, logged opt-out); document that transfers are not sanctions-screened server-side and the caller must screen via
/compliance/address-screenings.