Lifecycle controls
A register of securities has to be serviced. Units are issued and redeemed. A position is immobilized during an investigation, moved on the order of an authority, or restored to a holder who has lost access to a wallet. Trading is halted during an incident. In T-REX these are operations of the token, executed directly against the on-chain record, each gated by its own role.
The controls
Issue
mint
AGENT_MINTER
No
Redeem
burn
AGENT_BURNER
Yes
Freeze an amount
freezePartialTokens, unfreezePartialTokens
AGENT_PARTIAL_FREEZER
Yes
Freeze an address
setAddressFrozen
AGENT_ADDRESS_FREEZER
Yes
Forced transfer
forcedTransfer
AGENT_FORCED_TRANSFER
Yes
Recover a lost wallet
recoveryAddress
AGENT_RECOVERY_ADDRESS
Yes
Halt and resume
pause, unpause
AGENT_PAUSER
Yes
Each role is granted separately. An Issuer can give minting to its issuance desk, freezing to its compliance function and recovery to its transfer agent, and none of them holds the others' powers. See Actors and roles.
These operations act on tokens held on the reference chain. A position that is active on a satellite is brought back first. See "Positions on satellite chains" below.
Issuance and redemption
mint(to, amount)
burn(from, amount)
Effect
Creates tokens at to. Total supply goes up.
Destroys tokens held at from. Total supply goes down.
Eligibility
The recipient must be verified.
Not applicable.
Compliance rules
Apply to the recipient: a mint cannot take an identity past a cap.
Not applicable.
Frozen tokens
Not affected.
Released as needed: the burn unfreezes exactly what it lacks.
While paused
Allowed
Allowed
An agent cannot mint to an identity that is not eligible, nor past a rule. Issuance passes the same two gates as a transfer, with no sender.
A burn needs no consent from the holder and passes no gate. It works on a frozen address and on a wallet that its owner has revoked, so a redemption can always be carried out.
Freezing
Function
setAddressFrozen(address, true)
freezePartialTokens(address, amount)
Effect
The address cannot send and cannot receive transfers.
That amount cannot be sent. The rest of the balance moves normally, and the address still receives.
Undone with
setAddressFrozen(address, false)
unfreezePartialTokens(address, amount)
Read with
isFrozen(address)
getFrozenTokens(address)
Limit
The frozen amount never exceeds the balance of the address.
What a freeze does not do:
It does not change ownership. Frozen tokens are still counted in
balanceOfand in the position of the identity. Rules about distribution still count them.It does not stop the agents. A burn, a forced transfer and a recovery go through a freeze, and release the frozen amount they need. An agent never has to unfreeze before acting.
It is per address, not per identity. Freezing one address of an investor leaves its other addresses free. To immobilize an investor entirely, freeze each address that holds tokens.
A freeze is the way to keep an address out of an asset. Deleting its registration does not do that. See The eligibility registry.
Forced transfer
forcedTransfer(from, to, amount) moves tokens without the holder. It exists for decisions that override the holder: a court order, a succession, the correction of an error, the enforcement of a pledge.
The token is not paused
Yes
The recipient is verified
Yes
The sender's address is not frozen
No. A forced transfer goes through a freeze.
The amount is within the sender's free balance
No. Frozen tokens are released as needed.
The compliance rules allow the movement
No. The compliance is told afterward, so positions stay correct and tracker modules record it.
Two limits remain, by design. A forced transfer cannot deliver tokens to an ineligible recipient: the register never records a holding that should not exist, even on an agent's instruction. And it cannot run while the token is halted.
The event ForcedTransfer(agent) follows the Transfer event and names the agent that executed it.
Recovering a lost wallet
recoveryAddress(lostWallet, newWallet, identity) restores a position to a holder who has lost access to the wallet that holds it. It moves everything from the lost wallet to a new address of the same identity.
The token requires:
The two addresses are different.
The lost wallet holds tokens.
At least one of the two addresses is known to the registry.
If the new address is known, it belongs to the identity named in the call.
The token is not paused.
What it does:
Registers the new address for the identity, when the address resolves nowhere.
Moves the whole balance. Partial recovery does not exist.
Carries the freezes. A frozen amount stays frozen on the new address, and a frozen address stays frozen. A recovery is not a way around a freeze.
Tells the compliance. The movement is between two addresses of one identity, so no position changes and no distribution rule is involved. When the identity named in the call is not the one of the lost wallet, the position moves to the named identity: a change of ownership, which the Issuer decides and answers for.
Removes the local registration of the lost wallet, when it had one.
The new address can be any address of the investor, including its ONCHAINID itself.
The contract does not verify that the person asking is the holder. That verification is the Issuer's procedure, carried out off-chain by the agent before it calls the function. The event RecoverySuccess(lostWallet, newWallet, identity) records each recovery for transparency.
Which recovery
The investor still controls its identity and wants the tokens out of a wallet
The investor
identityTransfer from the wallet, through its identity. It moves the free balance. See Identity-based control and spender compliance.
The investor no longer trusts a wallet
The investor
Revokes the wallet in the global identity registry.
The investor cannot act, or part of the wallet's balance is frozen
An agent
recoveryAddress. It moves the whole balance, frozen tokens included, and keeps them frozen.
The investor has lost the keys of its identity
The guardians
Social recovery. See Account abstraction and recovery.
The identity itself is lost for good
An agent
forcedTransfer to an address of the investor's new identity
The pause
pause halts the asset. unpause resumes it.
transfer, transferFrom, identityTransfer
Blocked
forcedTransfer, recoveryAddress
Blocked
Settlement of transfers executed on satellites
Blocked. The settlement stays deliverable and is recorded when the pause is lifted.
mint, burn
Allowed
Freezing and unfreezing
Allowed
Configuration
Allowed
The pause stops every movement between holders, including the privileged ones. During an incident, nothing is settled and nothing is moved by an agent until the pause is lifted. Issuance and redemption stay available because they are often part of the response.
Three facts about the pause:
A token is deployed paused. The Issuer lifts the pause when the asset opens.
The token can pause itself. If the cross-chain layer delivers a settlement that the register cannot account for, one that was already applied or that matches no validation, the token halts until an agent has investigated.
The pause is for the whole asset. Stopping one satellite chain is a separate control: the issuance of validations can be paused per chain, by the
COMPLIANCE_MANAGER.
Positions on satellite chains
The controls above act on the reference chain. An agent cannot reach across and move, freeze or burn a position that is active on a satellite. It brings the position back, then acts.
The agent sends a forced-recall instruction to the satellite.
T-REX Lite burns the position there and sends the proof.
The reference chain converts the position from bridged to free, for the same identity.
The agent applies the control it needs: freeze, forced transfer, burn.
This is the same path a holder's own recall follows. The register never treats a position as present on the reference chain before the satellite has confirmed that it is gone there.
What an agent cannot do
Deliver tokens to an ineligible recipient.
mintandforcedTransferboth require a verified recipient.Issue past a rule. A mint is subject to the compliance rules.
Move tokens while the asset is halted.
Act without a trace. Every control emits an event that names what was done, and the role that allows it is visible in the AccessManager.
Exceed its role. A pauser cannot mint. A minter cannot force a transfer.
Trust statement. The holders of these roles can freeze, move and destroy positions without the holder's consent. That is what servicing a register of securities requires, and it is the Issuer's responsibility to decide who holds each role and under what procedure.
Audit trail
Mint, burn
Transfer from or to the zero address
Freeze an amount
TokensFrozen, TokensUnfrozen
Freeze an address
AddressFrozen, with the actor
Forced transfer
Transfer, ForcedTransfer, and TokensUnfrozen when frozen tokens were released
Recovery
Transfer, RecoverySuccess, and the freeze events for what was carried over
Pause
Paused, Unpaused
Last updated