| 1 | Every webhook’s signature is verified before the body is used, and an invalid one answers 4xx and is logged | Code review against Webhooks; send a request with a wrong signature |
| 2 | The handler answers 2xx within 10 seconds and does its work after acknowledging, or quickly | Measure the handler under load |
| 3 | Events are deduplicated on sourceEventId: a second delivery changes nothing | Run POST /events/recover after a scenario |
| 4 | A corporate action is applied only when version is higher than what you hold; a restriction likewise | Run CASH_DIVIDEND_LIFECYCLE and confirm the final state matches GET /corporate-actions/{sourceCaId} |
| 5 | Events of one token are ordered by sequence, never by arrival | Sort what a scenario delivered and compare with the scenario table |
| 6 | data replaces what you hold; nothing is merged or accumulated | Code review |
| 7 | An unknown caType, reasonCode, eventType or enum value is stored as informational and does not fail the handler | Run UNKNOWN_CA_TYPE |
| 8 | A restriction is lifted only on ca.restriction.removed, never on expectedEnd | Run RESTRICTION_LIFECYCLE and check the token’s status between steps |
| 9 | marketStatus UNAVAILABLE stops trading of the token in your venue; CLOSED is read with its reason | Product review against Track token status |
| 10 | After an outage, your recovery resends failed deliveries or pages the event list from the start of the outage, then checks state | Rehearse it: stop your endpoint, run a scenario, start it, recover |
| 11 | venueActions is read for every corporate action, and a tradingStop or poolMode change reaches the people who act on it | Product review against Corporate actions |
| 12 | A COMPLETED corporate action’s settlement is read as aggregate figures; individual payments are read on chain | Code review |
| 13 | The bearer token is cached and refreshed, not requested per call | Log review |
| 14 | The client secret and the signing secret live only in your backend’s secret store, never in logs or frontend code | Secret scan |
| 15 | Every non-2xx response is logged with its error, message and statusCode, and every webhook with its sourceEventId | Log review |