# API Documentation

**Date**: 2025-12-24  
**Status**: Complete API documentation for all contracts

---

## Overview

This document provides comprehensive API documentation for all contracts in the system.

---

## Legal Compliance Contracts

### LegallyCompliantBase

**Location**: `contracts/compliance/LegallyCompliantBase.sol`

#### Functions

##### `recordLegalNotice(string calldata message)`
Record a legal notice.

**Parameters**:
- `message`: Legal notice message

**Access**: `DEFAULT_ADMIN_ROLE` only

**Events**: `LegalNotice(bytes32 indexed noticeHash, string message, uint256 timestamp)`

##### `_generateLegalReferenceHash(address from, address to, uint256 value, bytes memory additionalData)`
Generate a legal reference hash for a value transfer.

**Parameters**:
- `from`: Source address
- `to`: Destination address
- `value`: Transfer amount
- `additionalData`: Additional data

**Returns**: `bytes32` - Legal reference hash

**Access**: Internal

##### `_emitCompliantValueTransfer(address from, address to, uint256 value, string memory legalReference, bytes32 iso20022MessageId)`
Emit a compliant value transfer event.

**Parameters**:
- `from`: Source address
- `to`: Destination address
- `value`: Transfer amount
- `legalReference`: Legal reference string
- `iso20022MessageId`: ISO 20022 message ID

**Access**: Internal

#### Events

- `LegalNotice(bytes32 indexed noticeHash, string message, uint256 timestamp)`
- `ValueTransferDeclared(address indexed from, address indexed to, uint256 value, bytes32 legalReferenceHash)`
- `JurisdictionDeclared(string jurisdiction, uint256 timestamp)`
- `DisputeResolutionMechanismSet(string mechanism, uint256 timestamp)`

#### Constants

- `LEGAL_FRAMEWORK_VERSION`: "1.0.0"
- `LEGAL_JURISDICTION`: "International Private Law"
- `DISPUTE_RESOLUTION_MECHANISM`: "ICC Arbitration (Paris)"
- `ISO_20022_COMPLIANCE`: ISO 20022 compliance statement
- `TRAVEL_RULE_EXEMPTION_STATEMENT`: Travel Rules exemption statement
- `REGULATORY_EXEMPTION_STATEMENT`: Regulatory exemption statement

---

### ComplianceRegistry

**Location**: `contracts/compliance/ComplianceRegistry.sol`

#### Functions

##### `registerContract(address contractAddress)`
Register a contract that inherits from LegallyCompliantBase.

**Parameters**:
- `contractAddress`: Address of the compliant contract

**Access**: `REGISTRAR_ROLE` only

**Events**: `ContractRegistered(address indexed contractAddress, string legalFrameworkVersion, string legalJurisdiction, uint256 timestamp)`

##### `updateContractCompliance(address contractAddress, bytes32 newLegalNoticeHash)`
Update compliance status with a new legal notice.

**Parameters**:
- `contractAddress`: Address of the compliant contract
- `newLegalNoticeHash`: Hash of the new legal notice

**Access**: `REGISTRAR_ROLE` only

**Events**: `ContractComplianceUpdated(address indexed contractAddress, bytes32 lastLegalNoticeHash, uint256 timestamp)`

##### `getContractComplianceStatus(address contractAddress)`
Get compliance status for a contract.

**Parameters**:
- `contractAddress`: Address of the contract

**Returns**: `ContractComplianceStatus` struct

##### `isContractRegistered(address contractAddress)`
Check if a contract is registered.

**Parameters**:
- `contractAddress`: Address of the contract

**Returns**: `bool` - True if registered

---

## Token Contracts

### CompliantUSDT

**Location**: `contracts/tokens/CompliantUSDT.sol`

#### Functions

##### `pause()`
Pause token transfers.

**Access**: Owner only

##### `unpause()`
Unpause token transfers.

**Access**: Owner only

##### `mint(address to, uint256 amount)`
Mint new tokens.

**Parameters**:
- `to`: Address to mint tokens to
- `amount`: Amount of tokens to mint

**Access**: Owner only

##### `burn(uint256 amount)`
Burn tokens from caller's balance.

**Parameters**:
- `amount`: Amount of tokens to burn

**Access**: Public

#### Standard ERC20 Functions

- `transfer(address to, uint256 amount)`
- `transferFrom(address from, address to, uint256 amount)`
- `approve(address spender, uint256 amount)`
- `balanceOf(address account)`
- `totalSupply()`
- `decimals()` - Returns 6

---

### CompliantUSDC

**Location**: `contracts/tokens/CompliantUSDC.sol`

Same API as CompliantUSDT.

---

## Utility Contracts

### TokenRegistry

**Location**: `contracts/utils/TokenRegistry.sol`

#### Functions

##### `registerToken(address tokenAddress, string calldata name, string calldata symbol, uint8 decimals, bool isNative, address bridgeAddress)`
Register a new token.

**Parameters**:
- `tokenAddress`: Address of the token contract
- `name`: Token name
- `symbol`: Token symbol
- `decimals`: Number of decimals
- `isNative`: Whether this is a native token
- `bridgeAddress`: Bridge address if bridged (address(0) if not)

**Access**: `REGISTRAR_ROLE` only

##### `updateTokenStatus(address tokenAddress, bool isActive)`
Update token status.

**Parameters**:
- `tokenAddress`: Address of the token
- `isActive`: New active status

**Access**: `REGISTRAR_ROLE` only

##### `removeToken(address tokenAddress)`
Remove a token from the registry.

**Parameters**:
- `tokenAddress`: Address of the token

**Access**: `REGISTRAR_ROLE` only

##### `getTokenInfo(address tokenAddress)`
Get token information.

**Parameters**:
- `tokenAddress`: Address of the token

**Returns**: `TokenInfo` struct

##### `getTokenBySymbol(string calldata symbol)`
Get token address by symbol.

**Parameters**:
- `symbol`: Token symbol

**Returns**: `address` - Token address (address(0) if not found)

##### `isTokenRegistered(address tokenAddress)`
Check if a token is registered.

**Parameters**:
- `tokenAddress`: Address of the token

**Returns**: `bool` - True if registered

##### `isTokenActive(address tokenAddress)`
Check if a token is active.

**Parameters**:
- `tokenAddress`: Address of the token

**Returns**: `bool` - True if active

##### `getAllTokens()`
Get all registered tokens.

**Returns**: `address[]` - Array of token addresses

##### `getTokenCount()`
Get count of registered tokens.

**Returns**: `uint256` - Number of registered tokens

---

### FeeCollector

**Location**: `contracts/utils/FeeCollector.sol`

#### Functions

##### `collectFees(address token, uint256 amount)`
Collect fees in a token.

**Parameters**:
- `token`: Token address (address(0) for native ETH)
- `amount`: Amount to collect

**Access**: Public (payable for ETH)

##### `distributeFees(address token)`
Distribute collected fees to recipients.

**Parameters**:
- `token`: Token address (address(0) for native ETH)

**Access**: `FEE_MANAGER_ROLE` only

##### `addFeeRecipient(address token, address recipient, uint256 shareBps)`
Add a fee recipient for a token.

**Parameters**:
- `token`: Token address (address(0) for native ETH)
- `recipient`: Recipient address
- `shareBps`: Share in basis points (10000 = 100%)

**Access**: `FEE_MANAGER_ROLE` only

##### `removeFeeRecipient(address token, address recipient)`
Remove a fee recipient.

**Parameters**:
- `token`: Token address
- `recipient`: Recipient address to remove

**Access**: `FEE_MANAGER_ROLE` only

##### `getFeeRecipients(address token)`
Get fee recipients for a token.

**Parameters**:
- `token`: Token address

**Returns**: `FeeRecipient[]` - Array of fee recipients

##### `getTotalCollected(address token)`
Get total collected fees for a token.

**Parameters**:
- `token`: Token address

**Returns**: `uint256` - Total collected amount

##### `getTotalDistributed(address token)`
Get total distributed fees for a token.

**Parameters**:
- `token`: Token address

**Returns**: `uint256` - Total distributed amount

##### `getBalance(address token)`
Get current balance for a token.

**Parameters**:
- `token`: Token address (address(0) for native ETH)

**Returns**: `uint256` - Current balance

##### `emergencyWithdraw(address token, address to, uint256 amount)`
Emergency withdraw (admin only).

**Parameters**:
- `token`: Token address (address(0) for native ETH)
- `to`: Recipient address
- `amount`: Amount to withdraw

**Access**: `DEFAULT_ADMIN_ROLE` only

---

## AddressMapper

**Location**: `contracts/utils/AddressMapper.sol`

#### Functions

##### `getDeployedAddress(address genesisAddress)`
Get the deployed address for a genesis address.

**Parameters**:
- `genesisAddress`: The address from genesis.json

**Returns**: `address` - The actual deployed address

##### `getGenesisAddress(address deployedAddress)`
Get the genesis address for a deployed address.

**Parameters**:
- `deployedAddress`: The deployed address

**Returns**: `address` - The genesis address

##### `isMapped(address addr)`
Check if an address is a genesis address that has been mapped.

**Parameters**:
- `addr`: Address to check

**Returns**: `bool` - True if the address has a mapping

##### `setMapping(address genesisAddress, address deployedAddress)`
Add or update a mapping (owner only).

**Parameters**:
- `genesisAddress`: The genesis address
- `deployedAddress`: The deployed address

**Access**: Owner only

##### `removeMapping(address genesisAddress)`
Remove a mapping (owner only).

**Parameters**:
- `genesisAddress`: The genesis address to remove

**Access**: Owner only

##### `transferOwnership(address newOwner)`
Transfer ownership (owner only).

**Parameters**:
- `newOwner`: The new owner address

**Access**: Owner only

---

## Error Codes

### ComplianceRegistry

- `"ComplianceRegistry: zero address"` - Zero address provided
- `"ComplianceRegistry: contract already registered"` - Contract already registered
- `"ComplianceRegistry: contract not registered"` - Contract not registered

### TokenRegistry

- `"TokenRegistry: zero address"` - Zero address provided
- `"TokenRegistry: token already registered"` - Token already registered
- `"TokenRegistry: symbol already used"` - Symbol already in use
- `"TokenRegistry: invalid token contract"` - Invalid token contract
- `"TokenRegistry: token not registered"` - Token not registered

### FeeCollector

- `"FeeCollector: ETH amount mismatch"` - ETH amount mismatch
- `"FeeCollector: no ETH expected"` - No ETH expected
- `"FeeCollector: no recipients configured"` - No recipients configured
- `"FeeCollector: no fees to distribute"` - No fees to distribute
- `"FeeCollector: ETH transfer failed"` - ETH transfer failed
- `"FeeCollector: distribution overflow"` - Distribution overflow
- `"FeeCollector: zero recipient"` - Zero recipient address
- `"FeeCollector: invalid share"` - Invalid share percentage
- `"FeeCollector: recipient already exists"` - Recipient already exists
- `"FeeCollector: recipient not found"` - Recipient not found

---

## Events Reference

### ComplianceRegistry

- `ContractRegistered(address indexed contractAddress, string legalFrameworkVersion, string legalJurisdiction, uint256 timestamp)`
- `ContractComplianceUpdated(address indexed contractAddress, bytes32 lastLegalNoticeHash, uint256 timestamp)`

### TokenRegistry

- `TokenRegistered(address indexed tokenAddress, string name, string symbol, uint8 decimals, uint256 timestamp)`
- `TokenUpdated(address indexed tokenAddress, bool isActive, uint256 timestamp)`
- `TokenRemoved(address indexed tokenAddress, uint256 timestamp)`

### FeeCollector

- `FeesCollected(address indexed token, address indexed from, uint256 amount, uint256 timestamp)`
- `FeesDistributed(address indexed token, address indexed recipient, uint256 amount, uint256 timestamp)`
- `FeeRecipientAdded(address indexed token, address indexed recipient, uint256 shareBps, uint256 timestamp)`
- `FeeRecipientRemoved(address indexed token, address indexed recipient, uint256 timestamp)`

---

**Last Updated**: 2025-12-24

