# Integration Guides

**Date**: 2025-12-24  
**Status**: Complete integration guides for all contracts

---

## Overview

This document provides integration guides for developers who want to integrate with the deployed contracts.

---

## Integration with Compliant Tokens

### Using CompliantUSDT or CompliantUSDC

#### 1. Import the Contract Interface

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../tokens/CompliantUSDT.sol";

contract MyContract {
    IERC20 public usdt;
    
    constructor(address usdtAddress) {
        usdt = IERC20(usdtAddress);
    }
    
    function transferUSDT(address to, uint256 amount) external {
        usdt.transfer(to, amount);
    }
}
```

#### 2. Handle Pausable State

```solidity
import "@openzeppelin/contracts/security/Pausable.sol";
import "../tokens/CompliantUSDT.sol";

contract MyContract {
    CompliantUSDT public usdt;
    
    function transferUSDT(address to, uint256 amount) external {
        require(!usdt.paused(), "USDT is paused");
        usdt.transfer(to, amount);
    }
}
```

#### 3. Listen to Compliance Events

```solidity
contract MyContract {
    event ValueTransferDetected(
        address indexed from,
        address indexed to,
        uint256 value,
        bytes32 legalReferenceHash
    );
    
    function onValueTransferDeclared(
        address from,
        address to,
        uint256 value,
        bytes32 legalReferenceHash
    ) external {
        emit ValueTransferDetected(from, to, value, legalReferenceHash);
    }
}
```

---

## Integration with TokenRegistry

### 1. Query Token Information

```solidity
import "../utils/TokenRegistry.sol";

contract MyContract {
    TokenRegistry public tokenRegistry;
    
    constructor(address registryAddress) {
        tokenRegistry = TokenRegistry(registryAddress);
    }
    
    function getTokenInfo(address token) external view returns (TokenRegistry.TokenInfo memory) {
        return tokenRegistry.getTokenInfo(token);
    }
    
    function isTokenActive(address token) external view returns (bool) {
        return tokenRegistry.isTokenActive(token);
    }
    
    function findTokenBySymbol(string calldata symbol) external view returns (address) {
        return tokenRegistry.getTokenBySymbol(symbol);
    }
}
```

### 2. Register Your Token

```solidity
contract MyToken {
    TokenRegistry public tokenRegistry;
    
    constructor(address registryAddress) {
        tokenRegistry = TokenRegistry(registryAddress);
    }
    
    function registerInRegistry() external {
        // This should be called by the token registry owner
        tokenRegistry.registerToken(
            address(this),
            "My Token",
            "MTK",
            18,
            false, // not native
            address(0) // not bridged
        );
    }
}
```

---

## Integration with FeeCollector

### 1. Collect Fees

```solidity
import "../utils/FeeCollector.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

contract MyContract {
    FeeCollector public feeCollector;
    IERC20 public feeToken;
    
    constructor(address collectorAddress, address tokenAddress) {
        feeCollector = FeeCollector(collectorAddress);
        feeToken = IERC20(tokenAddress);
    }
    
    function collectFees(uint256 amount) external {
        // Approve first
        feeToken.approve(address(feeCollector), amount);
        
        // Collect fees
        feeCollector.collectFees(address(feeToken), amount);
    }
    
    function collectETHFees() external payable {
        feeCollector.collectFees{value: msg.value}(address(0), msg.value);
    }
}
```

### 2. Query Fee Information

```solidity
contract MyContract {
    FeeCollector public feeCollector;
    
    function getFeeStats(address token) external view returns (
        uint256 totalCollected,
        uint256 totalDistributed,
        uint256 currentBalance
    ) {
        totalCollected = feeCollector.getTotalCollected(token);
        totalDistributed = feeCollector.getTotalDistributed(token);
        currentBalance = feeCollector.getBalance(token);
    }
}
```

---

## Integration with ComplianceRegistry

### 1. Check Contract Compliance

```solidity
import "../compliance/ComplianceRegistry.sol";

contract MyContract {
    ComplianceRegistry public complianceRegistry;
    
    constructor(address registryAddress) {
        complianceRegistry = ComplianceRegistry(registryAddress);
    }
    
    function isContractCompliant(address contractAddress) external view returns (bool) {
        return complianceRegistry.isContractRegistered(contractAddress);
    }
    
    function getComplianceInfo(address contractAddress) external view returns (
        bool isRegistered,
        string memory frameworkVersion,
        string memory jurisdiction
    ) {
        ComplianceRegistry.ContractComplianceStatus memory status = 
            complianceRegistry.getContractComplianceStatus(contractAddress);
        
        return (
            status.isRegistered,
            status.legalFrameworkVersion,
            status.legalJurisdiction
        );
    }
}
```

### 2. Register Your Contract

If your contract inherits from `LegallyCompliantBase`, it can be registered:

```solidity
import "../compliance/LegallyCompliantBase.sol";
import "../compliance/ComplianceRegistry.sol";

contract MyCompliantContract is LegallyCompliantBase {
    ComplianceRegistry public complianceRegistry;
    
    constructor(address admin, address registryAddress) LegallyCompliantBase(admin) {
        complianceRegistry = ComplianceRegistry(registryAddress);
    }
    
    function registerSelf() external {
        // This should be called by the registry owner
        complianceRegistry.registerContract(address(this));
    }
}
```

---

## Integration with AddressMapper

### 1. Map Addresses

```solidity
import "../utils/AddressMapper.sol";

contract MyContract {
    AddressMapper public addressMapper;
    
    constructor(address mapperAddress) {
        addressMapper = AddressMapper(mapperAddress);
    }
    
    function getActualAddress(address genesisAddress) external view returns (address) {
        return addressMapper.getDeployedAddress(genesisAddress);
    }
    
    function checkIfMapped(address addr) external view returns (bool) {
        return addressMapper.isMapped(addr);
    }
}
```

---

## Frontend Integration

### 1. Web3.js Integration

```javascript
const { ethers } = require('ethers');

// Connect to provider
const provider = new ethers.providers.JsonRpcProvider('http://192.168.11.250:8545');

// Get contract instance
const usdtAbi = [...]; // ABI from contract
const usdtAddress = '0x...'; // Deployed address
const usdt = new ethers.Contract(usdtAddress, usdtAbi, provider);

// Read operations
const balance = await usdt.balanceOf(userAddress);
const totalSupply = await usdt.totalSupply();
const isPaused = await usdt.paused();

// Write operations (need signer)
const signer = provider.getSigner();
const usdtWithSigner = usdt.connect(signer);
const tx = await usdtWithSigner.transfer(recipientAddress, amount);
await tx.wait();
```

### 2. Ethers.js Integration

```javascript
import { ethers } from 'ethers';

// Connect to provider
const provider = new ethers.JsonRpcProvider('http://192.168.11.250:8545');

// Get contract instance
const tokenRegistryAbi = [...]; // ABI
const tokenRegistryAddress = '0x...';
const registry = new ethers.Contract(tokenRegistryAddress, tokenRegistryAbi, provider);

// Query token info
const tokenInfo = await registry.getTokenInfo(tokenAddress);
const allTokens = await registry.getAllTokens();
const tokenCount = await registry.getTokenCount();
```

### 3. Event Listening

```javascript
// Listen to ValueTransferDeclared events
usdt.on('ValueTransferDeclared', (from, to, value, legalRefHash, event) => {
    console.log('Value transfer:', {
        from,
        to,
        value: value.toString(),
        legalRefHash,
        blockNumber: event.blockNumber
    });
});

// Listen to TokenRegistered events
registry.on('TokenRegistered', (tokenAddress, name, symbol, decimals, event) => {
    console.log('Token registered:', {
        tokenAddress,
        name,
        symbol,
        decimals,
        blockNumber: event.blockNumber
    });
});
```

---

## Testing Integration

### 1. Foundry Tests

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "forge-std/Test.sol";
import "../tokens/CompliantUSDT.sol";
import "../utils/TokenRegistry.sol";

contract IntegrationTest is Test {
    CompliantUSDT public usdt;
    TokenRegistry public registry;
    
    function setUp() public {
        usdt = new CompliantUSDT(address(this), address(this));
        registry = new TokenRegistry(address(this));
    }
    
    function testTokenRegistration() public {
        registry.registerToken(
            address(usdt),
            "Tether USD (Compliant)",
            "cUSDT",
            6,
            false,
            address(0)
        );
        
        assertTrue(registry.isTokenRegistered(address(usdt)));
        assertTrue(registry.isTokenActive(address(usdt)));
    }
    
    function testTokenTransfer() public {
        address recipient = address(0x123);
        uint256 amount = 1000 * 10**6;
        
        usdt.transfer(recipient, amount);
        
        assertEq(usdt.balanceOf(recipient), amount);
    }
}
```

---

## Best Practices

### 1. Error Handling

Always check return values and handle errors:

```solidity
function safeTransfer(address token, address to, uint256 amount) external {
    IERC20(token).transfer(to, amount);
    // Check if transfer was successful
    require(IERC20(token).balanceOf(to) >= amount, "Transfer failed");
}
```

### 2. Access Control

Always verify access control:

```solidity
function adminFunction() external {
    require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Not admin");
    // ...
}
```

### 3. Reentrancy Protection

Use reentrancy guards for state-changing functions:

```solidity
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract MyContract is ReentrancyGuard {
    function withdraw() external nonReentrant {
        // Safe withdrawal logic
    }
}
```

### 4. Event Emission

Always emit events for important state changes:

```solidity
event TokenTransferred(address indexed from, address indexed to, uint256 amount);

function transfer(address to, uint256 amount) external {
    // Transfer logic
    emit TokenTransferred(msg.sender, to, amount);
}
```

---

## Security Considerations

1. **Always verify contract addresses** before interacting
2. **Check contract state** (paused, active, etc.) before operations
3. **Validate inputs** to prevent unexpected behavior
4. **Use safe math operations** (OpenZeppelin SafeMath or Solidity 0.8+)
5. **Implement access controls** for sensitive operations
6. **Monitor events** for important state changes
7. **Test thoroughly** before deploying to mainnet

---

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

