methodData.vendorId — the external id of the product_vendor the routing
engine picked for this quote (dart, route_fusion, metcap, cfx),
snapshotted so execution dispatches on the decision the quote recorded
rather than re-deriving it.
It exists alongsidebankId, not instead of it. bankId is resolved by
LEFT JOIN through product_vendor.bank_id, which is NULL for every vendor
that fronts banks rather than being one — so bankId cannot distinguish
route_fusion from cfx from self_custody, and a bankId-only branch
silently lumps all of them into its default case.
Optional because it is a jsonb field added after the fact: quotes written
before it shipped carry no vendorId, and readers must treat undefined as
"pre-dates the field" and fall back to the bankId behaviour rather than
assuming a vendor. Typed as string rather than the Vendor union because
@cfxlabsinc/db schema files do not import their own domain unions, and the
value is a free-form product_vendor.external_id anyway.
methodData.vendorId— the external id of theproduct_vendorthe routing engine picked for this quote (dart,route_fusion,metcap,cfx), snapshotted so execution dispatches on the decision the quote recorded rather than re-deriving it.It exists alongside
bankId, not instead of it.bankIdis resolved by LEFT JOIN throughproduct_vendor.bank_id, which is NULL for every vendor that fronts banks rather than being one — sobankIdcannot distinguishroute_fusionfromcfxfromself_custody, and abankId-only branch silently lumps all of them into its default case.Optional because it is a jsonb field added after the fact: quotes written before it shipped carry no
vendorId, and readers must treatundefinedas "pre-dates the field" and fall back to thebankIdbehaviour rather than assuming a vendor. Typed asstringrather than theVendorunion because@cfxlabsinc/dbschema files do not import their own domain unions, and the value is a free-formproduct_vendor.external_idanyway.