Access and Policy
A token's controls are part of the contract, not an off-chain layer. Who may hold it, who may act on it, how much may be minted, and whether it is paused are all enforced on chain. Every change runs through the token's admin Safe, so high-impact actions require its signer quorum.
Access registry: allow and deny lists
An access registry gates who may send or receive a token. A token runs in one of two modes:
- Allow list: only listed addresses may transact. Adding an address permits it. This is the closed model for a permissioned asset.
- Deny list: everyone may transact except listed addresses. Adding an address blocks it.
A token may be deployed with a registry, or deployed open and have a registry attached later. Membership is changed through the admin Safe (add or remove addresses), and the on-chain registry reflects the change once the operation confirms. A token without a registry is open: any address may hold it.
Roles
Named roles govern who may perform privileged contract actions. The admin Safe holds the top admin role and is the administrator of every named role, so it grants and revokes the rest. The named roles come from a fixed set, for example a minter role, a burner role, a pauser role, and a recovery role.
- The deploy grants the admin Safe its core roles (admin, minter, pauser).
- Some actions need a role the deploy does not grant. Burning needs a burner role; the compliance recovery action needs a recovery role. Grant it through the Safe before using that action.
- On chain is the source of truth. The off-chain role record is updated only after a grant or revoke confirms.
Recovery: clawing back a blocked balance
The compliance recovery action moves a blocked account's balance to the admin Safe. It is the strictest privileged action and the contract enforces three prerequisites, all of which must hold or the action reverts on chain:
- The admin Safe must hold the recovery role. The deploy does not grant it, so grant it through the Safe first, as noted above.
- The token must have an access registry attached. Recovery is defined only against a registry, so a token with no registry cannot recover.
- The target account must currently be denied by that registry. Recovery works on a blocked account, not an active one, so recovering an account that still has access reverts.
Policies: capped, unattended minting
A mint-cap policy lets a server-controlled key mint gaslessly within a per-call amount cap, without a Safe signature each time. This is the unattended capped-minting path for automation that issues supply on a schedule or on demand.
- The Safe sets the policy once: it scopes a verified server key to mint up to a fixed cap.
- After that, the server key submits capped mints gaslessly. The relayer submits them; a mint above the cap reverts on chain.
- The Safe can revoke the policy at any time, which removes the server key's scoped permission.
How a policy mint is signed
POST /v1/tokenization/tokens/{id}/policy-mint builds the operation and returns
module_typed_data and module_tx_hash. The scoped server key signs
module_typed_data with eth_signTypedData (EIP-712). Do not sign
module_tx_hash with personal_sign (EIP-191): personal_sign prefixes the
digest, recovery produces a different address, and the submission is rejected with a signer
mismatch.
This is a deliberately different shape from a Safe-path mint. A Safe mint signs a Safe
transaction (typed_data, keyed by safe_tx_hash) against the admin Safe's
signer quorum. A policy mint signs a module transaction against the token's on-chain policy
contract (a Zodiac Roles module, the Safe-ecosystem permissions component), whose EIP-712 domain is
the policy contract itself; the module enforces the amount cap during execution, so no Safe quorum
is needed per mint. module_tx_hash is the EIP-712 digest and the operation's replay
guard.
Submit the signature to
POST /v1/tokenization/tokens/{id}/operations/{operation_id}/module-signature; the relayer
then executes the mint gaslessly. The generic .../signatures endpoint is the Safe-path
(SafeTx) signature route and rejects a policy-mint operation, because a policy mint's ModuleTx
signature carries only the raw signature (no Safe-owner signer field) and is verified
against the scoped authority's key, not the Safe owner set. For the exact typed-data fields, see the
interactive reference.
Pause: the circuit breaker
Pausing flips a global circuit breaker on the token. While paused, every transfer, mint, and burn reverts on chain. Pause and unpause run through the admin Safe and require the pauser role (granted at deploy). Use it to freeze a token during an incident, then unpause to restore normal operation.
Everything routes through the Safe
Attaching a registry, changing membership, granting or revoking a role, setting or revoking a policy, and pausing all build a Safe transaction. The Safe's N of M owners sign the typed data, the platform relayer submits it, and a confirmation poller records success only after the transaction confirms on chain. A reverted-but-mined transaction is never treated as success.