# Blockscout API Documentation

API endpoints for Blockscout explorer on ChainID 138.

## Base URL

```
https://explorer.d-bis.org
```

## API Endpoints

### Token Metadata

#### Get Token Information

```
GET /api/v2/tokens/{address}
```

**Parameters**:
- `address` (path): Token contract address

**Response**:
```json
{
  "address": "0x...",
  "name": "Wrapped Ether",
  "symbol": "WETH",
  "decimals": 18,
  "total_supply": "1000000000000000000000",
  "holders_count": 100,
  "transactions_count": 1000
}
```

#### Get Token Holders

```
GET /api/v2/tokens/{address}/holders
```

**Parameters**:
- `address` (path): Token contract address
- `page` (query): Page number (default: 1)
- `offset` (query): Items per page (default: 50)

**Response**:
```json
{
  "items": [
    {
      "address": "0x...",
      "value": "100000000000000000000",
      "token": {
        "address": "0x...",
        "symbol": "WETH",
        "decimals": 18
      }
    }
  ],
  "next_page_path": "/api/v2/tokens/{address}/holders?page=2"
}
```

#### Get Token Transfers

```
GET /api/v2/tokens/{address}/transfers
```

**Parameters**:
- `address` (path): Token contract address
- `page` (query): Page number (default: 1)
- `offset` (query): Items per page (default: 50)

**Response**:
```json
{
  "items": [
    {
      "from": {
        "hash": "0x...",
        "name": null
      },
      "to": {
        "hash": "0x...",
        "name": null
      },
      "total": {
        "value": "100000000000000000000",
        "token": {
          "address": "0x...",
          "symbol": "WETH",
          "decimals": 18
        }
      },
      "tx_hash": "0x...",
      "timestamp": "2024-12-19T00:00:00Z"
    }
  ],
  "next_page_path": "/api/v2/tokens/{address}/transfers?page=2"
}
```

### Account Information

#### Get Account Balance

```
GET /api/v2/addresses/{address}
```

**Parameters**:
- `address` (path): Account address

**Response**:
```json
{
  "hash": "0x...",
  "balance": "1000000000000000000000",
  "tx_count": 100,
  "token_count": 10
}
```

#### Get Account Tokens

```
GET /api/v2/addresses/{address}/token-balances
```

**Parameters**:
- `address` (path): Account address
- `page` (query): Page number (default: 1)
- `offset` (query): Items per page (default: 50)

**Response**:
```json
{
  "items": [
    {
      "address": "0x...",
      "value": "100000000000000000000",
      "token": {
        "address": "0x...",
        "name": "Wrapped Ether",
        "symbol": "WETH",
        "decimals": 18,
        "logo_url": "https://explorer.d-bis.org/images/tokens/weth.png"
      }
    }
  ],
  "next_page_path": "/api/v2/addresses/{address}/token-balances?page=2"
}
```

### Contract Verification

#### Get Contract Source Code

```
GET /api/v2/smart-contracts/{address}
```

**Parameters**:
- `address` (path): Contract address

**Response**:
```json
{
  "address": "0x...",
  "name": "WETH",
  "compiler_version": "0.8.19",
  "optimization": true,
  "source_code": "// SPDX-License-Identifier: MIT\n...",
  "abi": [...],
  "verified": true
}
```

## CORS Configuration

Blockscout must allow CORS requests from:

- `https://portfolio.metamask.io` (MetaMask Portfolio)
- `https://metamask.io` (MetaMask website)
- `https://chainlist.org` (Chainlist)

### CORS Headers

```
Access-Control-Allow-Origin: https://portfolio.metamask.io
Access-Control-Allow-Methods: GET, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Max-Age: 3600
```

## Rate Limiting

### Limits

- **Default**: 120 requests/minute per IP
- **API Keys**: Higher limits for API key holders
- **Public**: Lower limits for public access

### Headers

```
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 100
X-RateLimit-Reset: 1638360000
```

## Token Logo Serving

### Logo URL Format

```
https://explorer.d-bis.org/images/tokens/{address}.png
```

### Fallback

If token logo is not found, use default token logo or logo from token list.

### Supported Formats

- PNG (preferred)
- SVG
- JPEG

### Size Requirements

- **Recommended**: 512x512 pixels
- **Minimum**: 128x128 pixels
- **Maximum**: 1024x1024 pixels

## MetaMask Portfolio Integration

### Required Endpoints

For MetaMask Portfolio to display tokens:

1. **Token Metadata**: `/api/v2/tokens/{address}`
2. **Token Holders**: `/api/v2/tokens/{address}/holders`
3. **Account Tokens**: `/api/v2/addresses/{address}/token-balances`
4. **Token Transfers**: `/api/v2/tokens/{address}/transfers`

### CORS Requirements

Blockscout must allow CORS from Portfolio domain.

### Token List Integration

Portfolio uses token lists for auto-detection. Ensure token metadata matches token list entries.

## Error Handling

### Error Responses

```json
{
  "error": "Error message",
  "status": 400
}
```

### Common Errors

- **400 Bad Request**: Invalid parameters
- **404 Not Found**: Resource not found
- **429 Too Many Requests**: Rate limit exceeded
- **500 Internal Server Error**: Server error

## Examples

### Get WETH Token Information

```bash
curl https://explorer.d-bis.org/api/v2/tokens/0xYourWETHAddress
```

### Get Account Token Balances

```bash
curl https://explorer.d-bis.org/api/v2/addresses/0xYourAddress/token-balances
```

### Get Token Holders

```bash
curl https://explorer.d-bis.org/api/v2/tokens/0xYourTokenAddress/holders
```

## References

- [Blockscout API Documentation](https://docs.blockscout.com/for-developers/api)
- [Blockscout GitHub](https://github.com/blockscout/blockscout)

