A transfer that gets refused
What happens when an unscreened buyer tries to acquire tokens
The strongest compliance moment in the platform. The interface does not simply hide the button — the contract itself rejects the transfer, and the refusal is recorded as evidence.
Real elapsed time: under a second · 1 external system call(s) · simulated round trip 568 msUnscreened investor attempts a purchase
An account that failed sanctions screening tries to buy from the order book. The platform does not hide the attempt — it processes it, so the refusal is recorded.
{
"accountRef" : "INV-103",
"orderId" : "ORD-418772",
"tokens" : 25
}
{
"accepted" : false,
"stage" : "registry check",
"detail" : "proceeding to compliance verification"
}
What changed
- Attempt logged
- No funds reserved
Registry returns not verified
The address is not on the whitelist. The screening decision that produced this is on file against the account, so the refusal is explainable rather than opaque.
{
"method" : "IdentityRegistry.isVerified",
"params" : { "address" : "0x9c31...77e5", "accountRef" : "INV-103" }
}
{
"verified" : false,
"reason" : "identity not registered",
"onFile" : "screening refused — sanctions match requiring escalation",
"transferAllowed" : false
}
What changed
- Transfer blocked before settlement
- No money moved
Contract-level rejection demonstrated
Even if the interface were bypassed and the transfer submitted directly to the chain, the transfer hook reverts it. This is the control that actually matters.
{
"method" : "transfer",
"params" : { "to" : "0x9c31...77e5", "amount" : 25 },
"contract" : "0x41945f556471d0ff07411f2c39587b68a42a6c83",
"note" : "submitted bypassing the platform interface"
}
{
"success" : false,
"revert" : "IdentityRegistry: receiver not verified",
"gasUsed" : 24118,
"stateChange": "none",
"note" : "the interface is not the control — the contract is"
}
What changed
- Transaction reverted
- No state change on chain
This is the slide to linger on. A platform that only hides the button has a compliance problem the moment someone uses the API directly.
Refusal written to the audit trail
The refusal is recorded with the rule that produced it, the account, the asset and a timestamp — then exported to the regulator in the same file as the successful actions.
{
"sequence" : 1184,
"actor" : "Gate",
"refused" : true,
"message" : "Transfer to Lionel Fabre rejected by the token contract — the address is not on the compliance registry.",
"rule" : "Permissioned transfer check — shared compliance registry",
"accountRef" : "INV-103",
"assetRef" : "PRP-1001",
"stamp" : "refused — nothing written"
}
{
"appended" : true,
"immutable" : true,
"visibleTo" : ["operator console", "audit trail export"],
"exportFormat" : "CSV, RFC 4180"
}
What changed
- Refusal permanently on the audit trail
- Included in the regulator export
Refusals are recorded with the same weight as approvals. An inspection asks to see that the gate fired, not that nothing bad happened.