SettleMint
ArchitectureSecurityCompliance Modules

Transfer Approval

TransferApproval module — pre-authorization workflow with expiry, one-time use, and identity-based exemptions for regulated transfer control.

Purpose: Reference for the TransferApproval compliance module.


TransferApproval

Requires pre-authorization before transfers. Approvals are identity-bound, one-time use, and expire after a configured duration.

Interface (capabilities)

CapabilityWho can callInputsOn-chain effectEmitsNotes
setModuleParametersToken admin (via compliance)approvalAuthorities[], oneTimeUse, approvalExpiry, allowExemptions, exemptionExpressionStores approval config; approvalExpiry is a config-time duration applied to all approvalsexemptionExpression uses the same RPN system as identity verification
approveTransferApproval authorityToken, sender identity, recipient identity, valueRecords approval keyed on (fromIdentity, toIdentity, value) with expiry timestampTransferApprovedOnly addresses in approvalAuthorities can issue approvals
revokeApprovalOriginal approverToken, sender identity, recipient identity, valueRemoves active approval for the specific tupleTransferApprovalRevokedOnly the address that issued the original approval can revoke it
canTransferCompliance engineSender, recipient, amountChecks for valid (non-expired, unused) approval keyed on (fromIdentity, toIdentity, value)Marks used if oneTimeUse is true; emits TransferApprovalConsumed

How pre-approval works

  1. Compliance manager issues an approval for a specific (sender identity, recipient identity, value) tuple
  2. Investor attempts a transfer matching the approved tuple
  3. Module checks: is there a valid (non-expired, unused) approval for this (sender, recipient, amount)?
  4. If yes: transfer proceeds and approval is consumed (if oneTimeUse is true), emitting TransferApprovalConsumed
  5. If no: transfer blocked. If allowExemptions is true, the recipient's identity is checked against the exemptionExpression — qualifying recipients bypass the approval requirement

Configuration

OptionDescription
approvalAuthoritiesAddresses authorized to issue approvals
oneTimeUseIf true, each approval can only be used once
approvalExpiryDuration in seconds (must be > 0 and ≤ 365 days); set at configuration time, applies to all approvals
allowExemptionsIf true, recipients matching the exemption expression bypass the approval requirement
exemptionExpressionRPN expression identifying exempt investors (e.g., QII exemption)

Regulatory use cases

RegulationExpiryExemption
Reg D 506(c) — Accredited Only24 hoursNone (all purchasers must be accredited)
Japan FSA7 days[CONTRACT] — QII investors (corporate entities) exempt

Key invariants

  • Approval is keyed on (sender identity, recipient identity, value) — not a blanket approval for any transfer
  • An investor with multiple wallets uses the same identity, so the approval applies across wallets
  • approvalExpiry is a config-time duration — all approvals use the same expiry window, not per-approval overrides
  • oneTimeUse = true is the default for most regulatory use cases
  • Expired approvals cannot be used; the compliance manager must reissue

Operational signals

  • TransferApproved — emitted when an approval authority grants a transfer approval
  • TransferApprovalConsumed — emitted when a one-time approval is used during transfer
  • TransferApprovalRevoked — emitted when the original approver revokes an approval
  • Monitor for ComplianceCheckFailed revert errors in failed transactions when transfers lack valid approvals

Failure modes & edge cases

  • Revoking an approval requires the original approver's address — a different authority cannot revoke another's approval
  • Approval issued just before expiry window change — the original expiry applies (config changes are not retroactive)
  • Exemption expression change does not affect already-issued approvals

See also

On this page