Token Architecture
Galileo extends ERC-3643 (T-REX) to create compliant security tokens for luxury product ownership. Each physical product is represented by exactly one token.
Single-Supply Pattern
Unlike fungible tokens, Galileo uses a single-supply pattern:
- Each product = one token contract deployment
- Total supply = 1 (always)
- Token ID = product DID
This ensures perfect 1:1 correspondence between physical items and digital tokens.
Token Interface
interface IGalileoToken is IToken {
// Product Metadata
function productDID() external view returns (string memory);
function productCategory() external view returns (string memory);
function brandDID() external view returns (string memory);
function productURI() external view returns (string memory);
function gtin() external view returns (string memory);
function serialNumber() external view returns (string memory);
// CPO (Certified Pre-Owned) Status
function isCPOCertified() external view returns (bool);
function cpoCertificationDate() external view returns (uint256);
function cpoCertifier() external view returns (address);
function cpoCertificationURI() external view returns (string memory);
// CPO Management (restricted)
function certifyCPO(string calldata certificationURI) external;
function revokeCPO(string calldata reason) external;
// Extended Transfer
function transferWithReason(
address to,
uint256 amount,
bytes32 reasonCode,
string calldata reasonDescription
) external returns (bool);
// Lifecycle
function isDecommissioned() external view returns (bool);
function decommissionReason() external view returns (string memory);
}Compliance Modules
Galileo includes 5 pluggable compliance modules:
| Module | Purpose | Checks |
|---|---|---|
| BrandAuthorization | Authorized retailer verification | Seller has brand authorization claim |
| CPOCertification | CPO status requirements | Resale requires valid CPO certification |
| ServiceCenter | MRO authorization | Transfer to/from authorized service centers |
| Sanctions | Sanctions screening | Neither party on sanctions lists |
| Jurisdiction | Geographic restrictions | Transfer allowed in both jurisdictions |
Transfer Flow
- Initiate — Seller calls
transfer()ortransferWithReason() - Identity Check — Verify sender/receiver ONCHAINID
- Compliance Check — All modules must approve (in order)
- Execute — Ownership transfers on-chain
- Event — TransferWithReason emitted, off-chain sync triggered
Transfer Reason Codes
// Standard reason codes (keccak256 hashes)
keccak256("SALE") // Primary or secondary sale
keccak256("GIFT") // Gift between individuals
keccak256("INHERITANCE") // Estate/inheritance transfer
keccak256("WARRANTY_CLAIM") // Return for warranty service
keccak256("SERVICE_TRANSFER") // Temporary transfer for service
keccak256("AUCTION") // Auction house transfer
keccak256("LOAN") // Temporary transfer for display/loan