# Synor Exchange Integration Guide

This document provides technical specifications for cryptocurrency exchanges to integrate Synor (SYNOR) deposits, withdrawals, and trading.

## Table of Contents

1. [Network Overview](#network-overview)
2. [Node Setup](#node-setup)
3. [Address Generation](#address-generation)
4. [Deposits](#deposits)
5. [Withdrawals](#withdrawals)
6. [Transaction Format](#transaction-format)
7. [API Reference](#api-reference)
8. [Security Considerations](#security-considerations)
9. [Test Environment](#test-environment)

---

## Network Overview

### Basic Information

| Property | Value |
|----------|-------|
| **Name** | Synor |
| **Symbol** | SYNOR |
| **Decimals** | 8 |
| **Smallest Unit** | soma (1 SYNOR = 10^8 somas) |
| **Block Time** | ~10 seconds (DAG-based) |
| **Consensus** | DAG-based PoW with SPECTRE ordering |
| **Signature Scheme** | Hybrid Ed25519 + Dilithium3 (post-quantum) |

### Network Types

| Network | Address Prefix | Use Case |
|---------|---------------|----------|
| Mainnet | `synor1` | Production |
| Testnet | `tsynor1` | Testing |

### Confirmation Requirements

| Amount | Recommended Confirmations |
|--------|---------------------------|
| < 100 SYNOR | 10 confirmations |
| 100-10,000 SYNOR | 50 confirmations |
| > 10,000 SYNOR | 100 confirmations |

---

## Node Setup

### Hardware Requirements

**Minimum:**
- CPU: 4 cores
- RAM: 8 GB
- Storage: 100 GB SSD
- Network: 100 Mbps

**Recommended (Exchange):**
- CPU: 8+ cores
- RAM: 32 GB
- Storage: 500 GB NVMe SSD
- Network: 1 Gbps

### Docker Deployment

```yaml
# docker-compose.yml
version: '3.8'

services:
  synor-node:
    image: synor/synord:latest
    container_name: synor-exchange-node
    restart: always
    command:
      - "run"
      - "--p2p-port=16511"
      - "--rpc-host=0.0.0.0"
      - "--rpc-port=16110"
      - "--ws-port=16111"
      - "--seeds=seed1.synor.cc:16511,seed2.synor.cc:16511"
    ports:
      - "16511:16511"   # P2P (public)
      - "127.0.0.1:16110:16110"  # RPC (internal only)
      - "127.0.0.1:16111:16111"  # WebSocket (internal only)
    volumes:
      - synor-data:/data/synor
    environment:
      - RUST_LOG=info
      - SYNOR_NETWORK=mainnet

volumes:
  synor-data:
```

### Node Health Check

```bash
# Check sync status
curl -X POST http://localhost:16110 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"synor_getSyncStatus","params":[],"id":1}'

# Response when synced:
# {"result":{"synced":true,"currentBlock":1234567,"highestBlock":1234567}}
```

---

## Address Generation

### Address Format

Synor addresses use Bech32m encoding:

```
synor1qz232pysw8kezv2f4qxnhdufrlx5cmq78522mpuf8x5qlxu6j8sgcp05get
└────┘└──────────────────────────────────────────────────────────┘
 HRP                    Base32-encoded payload
```

- **HRP (Human Readable Part):** `synor1` (mainnet) or `tsynor1` (testnet)
- **Payload:** 32-byte Blake3 hash of the hybrid public key
- **Checksum:** Bech32m checksum (6 characters)

### Generating Addresses

#### Using the CLI

```bash
# Generate new address
synor-cli wallet new

# Derive address from mnemonic
synor-cli wallet recover --mnemonic "your 24 word phrase..."
```

#### Using the SDK (Rust)

```rust
use synor_crypto::{generate_keypair, public_key_to_address, Network};

// Generate new keypair
let keypair = generate_keypair();

// Get address
let address = public_key_to_address(&keypair.public_key, Network::Mainnet);
// Returns: "synor1qz232pysw8kezv2f4qxnhdufrlx5cmq78522mpuf8x5qlxu6j8sgcp05get"
```

#### Using the SDK (JavaScript)

```javascript
import { createWallet, publicKeyToAddress } from '@synor/sdk';

// Generate wallet from mnemonic
const mnemonic = generateMnemonic(24);
const wallet = await createWallet(mnemonic, '', 'mainnet');

console.log(wallet.address);
// "synor1qz232pysw8kezv2f4qxnhdufrlx5cmq78522mpuf8x5qlxu6j8sgcp05get"
```

### Address Validation

```javascript
// Validate address format
function isValidSynorAddress(address) {
  const mainnetRegex = /^synor1[a-z0-9]{58}$/;
  const testnetRegex = /^tsynor1[a-z0-9]{59}$/;
  return mainnetRegex.test(address) || testnetRegex.test(address);
}
```

---

## Deposits

### Recommended Flow

1. **Generate unique deposit address per user**
2. **Monitor address via WebSocket or polling**
3. **Wait for required confirmations**
4. **Credit user account**

### Monitoring Deposits

#### WebSocket Subscription

```javascript
const ws = new WebSocket('ws://localhost:16111');

ws.onopen = () => {
  // Subscribe to address transactions
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    method: 'synor_subscribeAddress',
    params: ['synor1qz232...'],
    id: 1
  }));
};

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.method === 'synor_addressNotification') {
    const { txId, amount, confirmations } = msg.params;
    console.log(`Deposit: ${amount} SYNOR (${confirmations} confirms)`);
  }
};
```

#### Polling Method

```javascript
async function checkDeposits(address, lastCheckedBlock) {
  const response = await rpc('synor_getAddressTransactions', [
    address,
    { fromBlock: lastCheckedBlock, limit: 100 }
  ]);

  for (const tx of response.transactions) {
    if (tx.type === 'receive' && tx.confirmations >= REQUIRED_CONFIRMS) {
      await creditUser(address, tx.amount, tx.txId);
    }
  }

  return response.currentBlock;
}
```

### Deposit Transaction Example

```json
{
  "txId": "a1b2c3d4e5f6...",
  "type": "receive",
  "amount": "100.00000000",
  "from": "synor1sender...",
  "to": "synor1exchange...",
  "confirmations": 50,
  "blockHash": "block1234...",
  "timestamp": 1704067200
}
```

---

## Withdrawals

### Recommended Flow

1. **Validate withdrawal address**
2. **Check exchange hot wallet balance**
3. **Build and sign transaction**
4. **Broadcast transaction**
5. **Monitor confirmation status**
6. **Update user withdrawal status**

### Building a Withdrawal Transaction

```javascript
import { createSendTransactionHybrid, serializeTransaction } from '@synor/sdk';

async function processWithdrawal(toAddress, amount, wallet) {
  // Build signed transaction
  const tx = await createSendTransactionHybrid(
    wallet.address,  // From: exchange hot wallet
    toAddress,       // To: user's address
    amount,          // Amount in SYNOR (e.g., "100.5")
    wallet           // Contains seed, keypair, dilithiumPublicKey
  );

  // Broadcast
  const result = await rpc('synor_sendRawTransaction', [
    serializeTransaction(tx)
  ]);

  return result.txId;
}
```

### UTXO Consolidation

For high-volume exchanges, periodically consolidate small UTXOs:

```javascript
async function consolidateUtxos(wallet) {
  const utxos = await rpc('synor_getUtxos', [wallet.address]);

  // Only consolidate if many small UTXOs
  if (utxos.length < 100) return;

  // Filter small UTXOs (< 1 SYNOR)
  const smallUtxos = utxos.filter(u => parseFloat(u.amount) < 1);

  if (smallUtxos.length < 50) return;

  // Build consolidation transaction (send to self)
  // ... transaction building code
}
```

### Fee Estimation

```javascript
async function estimateFee(fromAddress, toAddress, amount) {
  const result = await rpc('synor_estimateFee', [{
    from: fromAddress,
    to: toAddress,
    amount: amount
  }]);

  return {
    fee: result.fee,          // e.g., "0.00001000"
    feePerByte: result.feePerByte,
    estimatedSize: result.size  // Larger for hybrid signatures
  };
}
```

---

## Transaction Format

### Hybrid Signatures

Synor uses **hybrid signatures** combining:

1. **Ed25519** (64 bytes) - Classical elliptic curve
2. **Dilithium3/ML-DSA-65** (~3.3 KB) - Post-quantum lattice-based

Both signatures must verify for a transaction to be valid.

### Transaction Structure

```json
{
  "version": 1,
  "inputs": [
    {
      "previousTxId": "abc123...",
      "outputIndex": 0,
      "signature": "ed25519_sig_hex",
      "hybridSignature": {
        "ed25519": "64_bytes_hex",
        "dilithium": "3293_bytes_hex"
      },
      "publicKey": "ed25519_pubkey_32_bytes",
      "dilithiumPublicKey": "dilithium_pubkey_1952_bytes"
    }
  ],
  "outputs": [
    {
      "address": "synor1recipient...",
      "amount": "10000000000"  // 100 SYNOR in somas
    }
  ],
  "lockTime": 0,
  "isHybrid": true
}
```

### Transaction Size

Due to Dilithium signatures, Synor transactions are larger than Bitcoin:

| Component | Size (bytes) |
|-----------|-------------|
| Base transaction | ~50 |
| Per input (hybrid) | ~5,500 |
| Per output | ~40 |

**Example:** 2 inputs, 2 outputs ≈ 11,180 bytes

---

## API Reference

### JSON-RPC Endpoint

- **HTTP:** `http://localhost:16110`
- **WebSocket:** `ws://localhost:16111`

### Common Methods

#### synor_getBlockCount
```json
{"jsonrpc":"2.0","method":"synor_getBlockCount","params":[],"id":1}
// Response: {"result": 1234567}
```

#### synor_getBalance
```json
{"jsonrpc":"2.0","method":"synor_getBalance","params":["synor1..."],"id":1}
// Response: {"result": {"confirmed": "1000.50000000", "pending": "10.00000000"}}
```

#### synor_getUtxos
```json
{"jsonrpc":"2.0","method":"synor_getUtxos","params":["synor1..."],"id":1}
// Response: {"result": [{"txId": "...", "outputIndex": 0, "amount": "100.00000000"}]}
```

#### synor_sendRawTransaction
```json
{"jsonrpc":"2.0","method":"synor_sendRawTransaction","params":["serialized_tx"],"id":1}
// Response: {"result": {"txId": "abc123..."}}
```

#### synor_getTransaction
```json
{"jsonrpc":"2.0","method":"synor_getTransaction","params":["txId"],"id":1}
// Response: {"result": {"txId": "...", "confirmations": 50, ...}}
```

#### synor_getAddressTransactions
```json
{"jsonrpc":"2.0","method":"synor_getAddressTransactions","params":["synor1...", 100],"id":1}
// Response: {"result": [{"txId": "...", "type": "receive", ...}]}
```

---

## Security Considerations

### Hot/Cold Wallet Architecture

```
                    ┌─────────────────┐
                    │   Cold Storage   │
                    │  (Offline HSM)   │
                    │   95% of funds   │
                    └────────┬────────┘
                             │ Manual
                             │ Transfer
                    ┌────────▼────────┐
                    │   Warm Wallet    │
                    │  (Limited online) │
                    │   4% of funds    │
                    └────────┬────────┘
                             │ Automated
                             │ Threshold
                    ┌────────▼────────┐
                    │    Hot Wallet    │
                    │  (Always online) │
                    │   1% of funds    │
                    └─────────────────┘
```

### Recommended Security Measures

1. **Multi-signature wallets** for hot wallet (2-of-3 minimum)
2. **Rate limiting** on withdrawals (per-user and global)
3. **Withdrawal address whitelisting** with cool-down period
4. **Monitoring** for unusual patterns
5. **Key rotation** schedule (quarterly for hot wallet keys)
6. **Audit logging** of all wallet operations

### Post-Quantum Security

Synor's hybrid signature scheme provides:

- **Current security:** Ed25519 against classical attacks
- **Future security:** Dilithium3 against quantum attacks
- **Defense in depth:** Both must be compromised to forge signatures

---

## Test Environment

### Testnet Information

| Property | Value |
|----------|-------|
| Network Name | Synor Testnet |
| Address Prefix | `tsynor1` |
| RPC Endpoint | `https://testnet-rpc.synor.cc` |
| WebSocket | `wss://testnet-ws.synor.cc` |
| Faucet | `https://faucet.synor.cc` |
| Explorer | `https://testnet.explorer.synor.cc` |

### Getting Test Tokens

```bash
# Request testnet tokens via faucet API
curl -X POST https://faucet.synor.cc/request \
  -H "Content-Type: application/json" \
  -d '{"address": "tsynor1your_testnet_address..."}'
```

### Running Local Testnet

```bash
# Clone repository
git clone https://github.com/synor/synor.git
cd synor

# Start local testnet with Docker
docker compose -f docker-compose.testnet.yml up -d

# Access local RPC
curl http://localhost:17110 ...
```

---

## Support

### Integration Support

- **Email:** integration@synor.cc
- **Telegram:** @SynorExchangeSupport
- **Documentation:** https://docs.synor.cc/exchange

### API Status

- **Status Page:** https://status.synor.cc
- **Maintenance Notifications:** Subscribe at status page

---

## Changelog

| Version | Date | Changes |
|---------|------|---------|
| 1.0 | 2026-01 | Initial release |

---

*Last updated: January 2026*
