> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Cách xem ai đã cấp vốn cho ví Solana

> Khám phá nguồn cấp vốn ban đầu của bất kỳ ví Solana nào bằng cách truy vết giao dịch chuyển SOL đến đầu tiên. Xác định nguồn cấp vốn từ sàn giao dịch, thông tin định danh và mối quan hệ giữa các ví.

<Note>
  Wallet API đang ở giai đoạn Beta. Các endpoint và định dạng phản hồi có thể thay đổi.
</Note>

## Tổng quan

Endpoint Wallet Funding Source xác định ai đã cấp vốn ban đầu cho một ví Solana bằng cách phân tích giao dịch chuyển SOL đến đầu tiên của ví đó. Endpoint này hữu ích cho việc định danh, tuân thủ, tìm hiểu mối quan hệ giữa các ví và xác định những ví được cấp vốn từ sàn giao dịch.

Tên và danh mục của bên cấp vốn lấy từ cùng hệ thống định danh mà endpoint [Identity](/docs/vi/wallet-api/identity) sử dụng. Vì vậy, khi bên cấp vốn là một thực thể đã biết, phản hồi sẽ trực tiếp cung cấp nhãn và danh mục dễ đọc.

Endpoint này yêu cầu gói trả phí. Các yêu cầu sử dụng khóa API của gói Free sẽ trả về `403 Forbidden`. Xem [Yêu cầu về gói](/docs/vi/wallet-api/overview#yêu-cầu-về-gói-dịch-vụ) để biết bảng phạm vi hỗ trợ đầy đủ.

## Khi nào nên sử dụng

Sử dụng Wallet Funding Source API để:

* **Định danh ví**: theo dõi nguồn cấp vốn cho các ví mới.
* **Phát hiện sàn giao dịch**: xác định các ví được cấp vốn trực tiếp từ sàn giao dịch tập trung.
* **Tuân thủ và AML**: đánh dấu các ví được thực thể đã biết cấp vốn để kiểm tra tuân thủ.
* **Phát hiện bot**: xác định các cụm bot được cấp vốn từ cùng một nguồn.
* **Phân tích airdrop**: theo dõi những ví đã nhận vốn ban đầu từ một dự án.
* **Phát hiện Sybil**: tìm các cụm ví được cùng một địa chỉ cấp vốn.

## Bắt đầu nhanh

### Tra cứu nguồn cấp vốn cơ bản

Tìm hiểu ai đã cấp vốn cho một ví:

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"system"}
    const getWalletFundingSource = async (address) => {
      const url = `https://api.helius.xyz/v1/wallet/${address}/funded-by?api-key=YOUR_API_KEY`;

      const response = await fetch(url);

      if (response.status === 404) {
        console.log('No funding transaction found for this wallet');
        return null;
      }

      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }

      const funding = await response.json();

      console.log(`Funding Source: ${funding.funderName || funding.funder}`);
      console.log(`Funder Type: ${funding.funderType || 'Unknown'}`);
      console.log(`Initial Amount: ${funding.amount} SOL`);
      console.log(`Date: ${new Date(funding.timestamp * 1000).toLocaleString()}`);
      console.log(`Transaction: ${funding.explorerUrl}`);

      return funding;
    };

    getWalletFundingSource("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY");
    ```
  </Tab>

  <Tab title="Python">
    ```python theme={"system"}
    import requests
    from datetime import datetime

    def get_wallet_funding_source(address: str):
        url = f"https://api.helius.xyz/v1/wallet/{address}/funded-by"
        headers = {"X-Api-Key": "YOUR_API_KEY"}

        response = requests.get(url, headers=headers)

        if response.status_code == 404:
            print('No funding transaction found for this wallet')
            return None

        response.raise_for_status()
        funding = response.json()

        print(f"Funding Source: {funding.get('funderName') or funding['funder']}")
        print(f"Funder Type: {funding.get('funderType', 'Unknown')}")
        print(f"Initial Amount: {funding['amount']} SOL")
        print(f"Date: {datetime.fromtimestamp(funding['timestamp']).strftime('%Y-%m-%d %H:%M:%S')}")
        print(f"Transaction: {funding['explorerUrl']}")

        return funding

    get_wallet_funding_source("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY")
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={"system"}
    curl "https://api.helius.xyz/v1/wallet/86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY/funded-by?api-key=YOUR_API_KEY"
    ```
  </Tab>
</Tabs>

## Định dạng phản hồi

Phản hồi thành công mô tả giao dịch chuyển SOL đến đầu tiên của ví:

```json theme={"system"}
{
  "funder": "26MAyPNpK4At8LgRECMMbgiKQuJyg3oACtw1Q9FRyuba",
  "funderName": null,
  "funderType": null,
  "mint": "So11111111111111111111111111111111111111111",
  "symbol": "SOL",
  "amount": 0.09811972,
  "amountRaw": "98119720",
  "decimals": 9,
  "date": "2022-01-19T20:46:34.000Z",
  "signature": "5WX9C5kCQNULGGrSHJBR1WDFyetVyekbUpe1KQ45p3zEBe6jVgSsJuMqLWijjTDcnaAK2518ZriktRMCNycnsNAG",
  "timestamp": 1642625194,
  "slot": 116984883,
  "explorerUrl": "https://orbmarkets.io/tx/5WX9C5kCQNULGGrSHJBR1WDFyetVyekbUpe1KQ45p3zEBe6jVgSsJuMqLWijjTDcnaAK2518ZriktRMCNycnsNAG?tab=summary"
}
```

Nếu ví chưa từng nhận SOL, API sẽ trả về mã 404:

```json theme={"system"}
{
  "error": "No funding transaction found",
  "code": 404
}
```

### Ghi chú về các trường

* **`funder`**: địa chỉ đã gửi giao dịch chuyển SOL đầu tiên đến ví này.
* **`funderName`**: tên dễ đọc nếu bên cấp vốn là một thực thể đã biết (ví dụ: sàn giao dịch, giao thức); nếu không thì là `null`.
* **`funderType`**: danh mục của bên cấp vốn (ví dụ: `exchange`, `defi-protocol`); là `null` nếu không có trong cơ sở dữ liệu định danh.
* **`mint`**: địa chỉ đúc token (`So11111111111111111111111111111111111111111` đối với SOL).
* **`symbol`**: ký hiệu token (luôn là `SOL` đối với giao dịch cấp vốn).
* **`amount`**: lượng SOL ban đầu đã nhận (dạng dễ đọc, ví dụ: `0.05` SOL).
* **`amountRaw`**: số lượng thô tính bằng lamport dưới dạng chuỗi (ví dụ: `"50000000"` tương ứng với 0,05 SOL).
* **`decimals`**: số chữ số thập phân của token (9 đối với SOL).
* **`date`**: chuỗi ngày được định dạng theo ISO 8601 (ví dụ: `"2024-01-01T00:00:00.000Z"`).
* **`signature`**: chữ ký giao dịch của lần chuyển tiền cấp vốn.
* **`timestamp`**: dấu thời gian Unix (tính bằng giây) khi ví được cấp vốn.
* **`slot`**: số slot Solana khi giao dịch cấp vốn được xác nhận.
* **`explorerUrl`**: liên kết trực tiếp để xem giao dịch trên Orb.

## Trường hợp sử dụng

### Phát hiện ví được cấp vốn từ sàn giao dịch

Xác định các ví được cấp vốn trực tiếp từ sàn giao dịch tập trung:

```javascript theme={"system"}
const isExchangeFunded = async (address) => {
  try {
    const funding = await getWalletFundingSource(address);

    if (!funding) {
      console.log('Wallet has no funding transaction');
      return false;
    }

    if (funding.funderType === 'exchange') {
      console.log(`Wallet was funded by ${funding.funderName}`);
      console.log(`This is likely a retail user withdrawing from an exchange`);
      return true;
    }

    console.log(`Wallet was not funded by an exchange`);
    return false;

  } catch (error) {
    console.error('Error checking funding source:', error);
    return false;
  }
};

isExchangeFunded("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY");
```

### Tìm cụm ví (phát hiện Sybil)

Xác định các nhóm ví được cấp vốn từ cùng một nguồn:

```javascript theme={"system"}
const findWalletClusters = async (walletAddresses) => {
  const fundingData = await Promise.all(
    walletAddresses.map(async address => {
      try {
        const funding = await getWalletFundingSource(address);
        return { address, funder: funding?.funder };
      } catch {
        return { address, funder: null };
      }
    })
  );

  // Group by funder
  const clusters = {};

  fundingData.forEach(({ address, funder }) => {
    if (funder) {
      if (!clusters[funder]) {
        clusters[funder] = [];
      }
      clusters[funder].push(address);
    }
  });

  // Report clusters
  Object.entries(clusters).forEach(([funder, wallets]) => {
    if (wallets.length > 1) {
      console.log(`\nFound cluster: ${wallets.length} wallets funded by ${funder.slice(0, 8)}...`);
      wallets.forEach(wallet => console.log(`  - ${wallet}`));
    }
  });

  return clusters;
};

// Example: Check list of wallets for clusters
const suspiciousWallets = [
  "Wallet1...",
  "Wallet2...",
  "Wallet3..."
];

findWalletClusters(suspiciousWallets);
```

### Theo dõi người nhận airdrop

Phân tích nguồn gốc của những người nhận airdrop:

```javascript theme={"system"}
const analyzeAirdropRecipients = async (airdropWallets) => {
  const fundingSources = await Promise.all(
    airdropWallets.map(async address => {
      try {
        return await getWalletFundingSource(address);
      } catch {
        return null;
      }
    })
  );

  const stats = {
    total: airdropWallets.length,
    exchangeFunded: 0,
    unknown: 0,
    byExchange: {}
  };

  fundingSources.forEach(funding => {
    if (!funding) {
      stats.unknown++;
      return;
    }

    if (funding.funderType === 'exchange') {
      stats.exchangeFunded++;
      const exchange = funding.funderName || 'Unknown Exchange';
      stats.byExchange[exchange] = (stats.byExchange[exchange] || 0) + 1;
    }
  });

  console.log('Airdrop Recipient Analysis:');
  console.log(`Total Recipients: ${stats.total}`);
  console.log(`Exchange-Funded: ${stats.exchangeFunded} (${(stats.exchangeFunded / stats.total * 100).toFixed(1)}%)`);
  console.log(`Unknown Source: ${stats.unknown}`);
  console.log('\nBy Exchange:');
  Object.entries(stats.byExchange).forEach(([exchange, count]) => {
    console.log(`  ${exchange}: ${count}`);
  });

  return stats;
};
```

### Xây dựng dòng thời gian của ví

Tạo dòng thời gian bắt đầu từ lúc ví được tạo:

```javascript theme={"system"}
const buildWalletTimeline = async (address) => {
  const funding = await getWalletFundingSource(address);

  if (!funding) {
    console.log('No funding data available');
    return null;
  }

  const creationDate = new Date(funding.timestamp * 1000);
  const ageInDays = Math.floor((Date.now() - creationDate.getTime()) / (1000 * 60 * 60 * 24));

  console.log('Wallet Timeline:');
  console.log(`Created: ${creationDate.toLocaleString()} (${ageInDays} days ago)`);
  console.log(`Initial Funding: ${funding.amount} SOL`);
  console.log(`Funded By: ${funding.funderName || funding.funder.slice(0, 8) + '...'}`);

  if (funding.funderType === 'exchange') {
    console.log(`This wallet was likely created by withdrawing from ${funding.funderName}`);
  }

  return {
    creationDate,
    ageInDays,
    initialFunding: funding.amount,
    fundedBy: funding.funderName || funding.funder
  };
};
```

### Chấm điểm rủi ro tuân thủ

Gán điểm rủi ro dựa trên nguồn cấp vốn:

```javascript theme={"system"}
const assessWalletRisk = async (address) => {
  const funding = await getWalletFundingSource(address);

  if (!funding) {
    return { riskLevel: 'UNKNOWN', score: 50, reasons: ['No funding data available'] };
  }

  let score = 0;
  let reasons = [];

  // Low risk: Funded by known exchange
  if (funding.funderType === 'exchange') {
    score = 20;
    reasons.push(`Funded by known exchange (${funding.funderName})`);
  }
  // Medium risk: Unknown funder
  else if (!funding.funderName) {
    score = 50;
    reasons.push('Funded by unknown wallet');
  }
  // High risk: Funded by flagged address
  else if (funding.funderType === 'flagged') {
    score = 90;
    reasons.push('Funded by flagged address');
  }

  // Age factor: New wallets are higher risk
  const ageInDays = (Date.now() / 1000 - funding.timestamp) / (60 * 60 * 24);
  if (ageInDays < 7) {
    score += 20;
    reasons.push('Wallet is less than 7 days old');
  }

  // Amount factor: Very small initial funding is suspicious
  if (funding.amount < 0.01) {
    score += 10;
    reasons.push('Very small initial funding amount');
  }

  const riskLevel = score < 30 ? 'LOW' : score < 60 ? 'MEDIUM' : 'HIGH';

  console.log(`Risk Assessment for ${address}:`);
  console.log(`Risk Level: ${riskLevel} (Score: ${score}/100)`);
  reasons.forEach(reason => console.log(`  - ${reason}`));

  return { riskLevel, score, reasons };
};
```

### Theo dõi định danh

Theo dõi những nguồn đang tạo ra nhiều ví mới nhất:

```javascript theme={"system"}
const trackNewWalletSources = async (recentWallets) => {
  const fundingSources = await Promise.all(
    recentWallets.map(async address => {
      try {
        const funding = await getWalletFundingSource(address);
        return {
          address,
          funder: funding?.funder,
          funderName: funding?.funderName,
          funderType: funding?.funderType
        };
      } catch {
        return { address, funder: null };
      }
    })
  );

  // Count by source
  const sourceStats = {};

  fundingSources.forEach(({ funderName, funderType }) => {
    const sourceName = funderName || funderType || 'Unknown';
    sourceStats[sourceName] = (sourceStats[sourceName] || 0) + 1;
  });

  // Sort by count
  const sorted = Object.entries(sourceStats)
    .sort(([, a], [, b]) => b - a)
    .slice(0, 10);

  console.log('Top Wallet Funding Sources:');
  sorted.forEach(([source, count]) => {
    console.log(`${source}: ${count} wallets`);
  });

  return sourceStats;
};
```

## Loại bên cấp vốn

Trường `funderType` cho biết danh mục của ví đã cấp vốn cho địa chỉ. Hệ thống hỗ trợ tất cả giá trị trong [Danh mục định danh](/docs/vi/wallet-api/identity#danh-mục-danh-tính).

<Accordion title="Supported funder types">
  Các loại bên cấp vốn phổ biến:

  | Loại                     | Mô tả                      | Ví dụ                                                   |
  | ------------------------ | -------------------------- | ------------------------------------------------------- |
  | Sàn giao dịch tập trung  | Ví nóng của CEX            | Binance, Coinbase, Kraken, OKX                          |
  | DeFi                     | Địa chỉ giao thức DeFi     | Jupiter, Raydium, Marinade                              |
  | Nhà tạo lập thị trường   | Công ty tạo lập thị trường | Jump Trading, Wintermute                                |
  | Công ty giao dịch        | Công ty giao dịch tự doanh | Nhà giao dịch tổ chức                                   |
  | Cầu nối chuỗi chéo       | Địa chỉ giao thức cầu nối  | Wormhole, AllBridge, Portal                             |
  | Trình xác thực           | Địa chỉ trình xác thực     | Coinbase Validator, Jito                                |
  | Người có ảnh hưởng chính | Cá nhân nổi bật            | Người có ảnh hưởng, nhà sáng lập                        |
  | Ngân quỹ                 | Ngân quỹ dự án             | Ngân quỹ giao thức                                      |
  | Nhóm staking             | Nhóm staking thanh khoản   | Marinade, Jito                                          |
  | null                     | Bên cấp vốn không xác định | Ví thông thường, không có trong cơ sở dữ liệu định danh |

  Danh sách đầy đủ bao gồm: Airdrop, Cơ quan có thẩm quyền, Cầu nối chuỗi chéo, Sòng bạc & cờ bạc, DAO, DeFi, DePIN, Sàn giao dịch tập trung, Kẻ khai thác/Lừa đảo/Tấn công, Phí, Gây quỹ, Trò chơi, Phân phối khối Genesis, Quản trị, Tin tặc, Jito, Người có ảnh hưởng chính, Nhà tạo lập thị trường, Memecoin, Đa chữ ký, NFT, Nguồn cung không lưu hành, Oracle, Khác, Thanh toán, AMM độc quyền, Restaking, Kẻ rút thanh khoản, Kẻ lừa đảo, Thư rác, Nhóm staking, Hệ thống, Công cụ, Ứng dụng/Bot giao dịch, Công ty giao dịch, Gửi giao dịch, Ngân quỹ, Trình xác thực, Kho lưu trữ và X402.

  Xem phần [Danh mục định danh](/docs/vi/wallet-api/identity#danh-mục-danh-tính) để biết danh sách đầy đủ kèm mô tả.
</Accordion>

## Phương pháp hay nhất

* **Xử lý phản hồi 404.** Những ví chưa từng nhận SOL sẽ trả về mã 404. Đây là hành vi bình thường đối với ví mới tạo nhưng chưa được cấp vốn.
* **Kết hợp với Identity API.** Phản hồi bao gồm `funderName` và `funderType`, nhưng bạn có thể gọi endpoint [Identity](/docs/vi/wallet-api/identity) cho địa chỉ `funder` để biết thêm chi tiết.
* **Lưu dữ liệu cấp vốn vào bộ nhớ đệm.** Nguồn cấp vốn của ví không bao giờ thay đổi. Hãy lưu vĩnh viễn dữ liệu này vào bộ nhớ đệm để tránh gọi API nhiều lần.
* **Kiểm tra tuổi ví để có thêm ngữ cảnh.** `timestamp` cho biết thời điểm ví được cấp vốn lần đầu. Kết hợp tuổi ví với nguồn cấp vốn để có ngữ cảnh rõ hơn.

## Lỗi thường gặp

| Mã lỗi | Mô tả                                 | Giải pháp                                                                                                                       |
| ------ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| 400    | Định dạng địa chỉ ví không hợp lệ     | Xác minh địa chỉ là một địa chỉ Solana base58 hợp lệ                                                                            |
| 401    | Thiếu khóa API hoặc khóa không hợp lệ | Kiểm tra khóa API đã được đưa vào yêu cầu                                                                                       |
| 403    | Endpoint yêu cầu gói trả phí          | Tính năng tra cứu nguồn cấp vốn không khả dụng trong gói Free. [Nâng cấp gói](https://dashboard.helius.dev) lên một bậc trả phí |
| 404    | Không tìm thấy giao dịch cấp vốn      | Ví này chưa từng nhận SOL                                                                                                       |
| 429    | Đã vượt quá giới hạn tốc độ           | Giảm tần suất yêu cầu hoặc nâng cấp gói                                                                                         |

## Giới hạn

* Endpoint này chỉ theo dõi **giao dịch chuyển SOL đầu tiên** đến một ví.
* Nếu ví được tạo thông qua airdrop hoặc quá trình khởi tạo chương trình mà không có giao dịch chuyển SOL, ví đó sẽ không có dữ liệu cấp vốn.
* Nguồn cấp vốn đại diện cho bên cấp vốn **trực tiếp**, không nhất thiết là nguồn tiền cuối cùng.
* Dữ liệu lịch sử chỉ khả dụng đối với các ví được tạo sau khi tính năng này được triển khai.

## Bước tiếp theo

<CardGroup cols={3}>
  <Card title="Wallet Identity" icon="address-card" href="/docs/vi/wallet-api/identity">
    Phân giải địa chỉ bên cấp vốn thành nhãn, danh mục và các thẻ đầy đủ.
  </Card>

  <Card title="Wallet API Overview" icon="wallet" href="/docs/vi/wallet-api/overview">
    Tất cả endpoint của Wallet API và các quy ước dùng chung.
  </Card>

  <Card title="API Reference" icon="code" href="/docs/vi/api-reference/wallet-api/funded-by">
    Lược đồ yêu cầu và phản hồi cho thao tác tra cứu nguồn cấp vốn.
  </Card>
</CardGroup>
