> ## 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.

# Solanaウォレットの資金提供者を確認する方法

> Solanaウォレットの最初のSOL受取転送を追跡して、その元の資金提供ソースを発見します。取引所の資金提供、帰属、およびウォレットの関係を特定します。

<Note>
  ウォレットAPIはベータ版です。エンドポイントとレスポンス形式は変更される可能性があります。
</Note>

## 概要

ウォレット資金提供ソースエンドポイントは、最初のSOL受取転送を分析することで、Solanaウォレットを最初に資金提供した人を特定します。これは、帰属、コンプライアンス、ウォレットの関係の理解、取引所資金提供ウォレットの識別に役立ちます。

資金提供者の名前とカテゴリは、[Identity](/ja/wallet-api/identity)エンドポイントで使用される同じアイデンティティシステムから取得されるため、資金提供者が既知のエンティティの場合、レスポンスに直接人間が読み取れるラベルとカテゴリが表示されます。

このエンドポイントは有料プランが必要です。無料プランのAPIキーで行われた要求には`403 Forbidden`が返されます。完全なカバレッジテーブルについては、[プランの要件](/ja/wallet-api/overview#plan-requirements)を参照してください。

## 使用タイミング

ウォレット資金提供ソースAPIの使用用途：

* **ウォレットの帰属**：新しいウォレットがどこから資金提供されているかを追跡。
* **取引所の検出**：中央集権型取引所から直接資金提供されたウォレットを識別。
* **コンプライアンスとAML**：既知のエンティティから資金提供されたウォレットをコンプライアンスチェックのためにフラグ。
* **ボットの検出**：同じソースから資金提供されたボットファームを識別。
* **エアドロップ分析**：プロジェクトから初期資金を受け取ったウォレットを追跡。
* **Sybil検出**：同じアドレスから資金提供されたウォレットのクラスターを見つける。

## クイックスタート

### 基本的な資金調達の検索

ウォレットに資金を提供したのは誰かを確認する：

<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>

## レスポンス形式

成功したレスポンスはウォレットの最初のSOL受取転送を説明します：

```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"
}
```

ウォレットが一度もSOLを受け取っていない場合、APIは404を返します：

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

### フィールドノート

* **`funder`**: このウォレットに最初のSOL転送を送信したアドレス。
* **`funderName`**: 資金提供者が既知のエンティティ（例：取引所、プロトコル）である場合の人が読み取れる名前。それ以外の場合は`null`。
* **`funderType`**: 資金提供者のカテゴリ（例：`exchange`, `defi-protocol`）；アイデンティティデータベースにない場合は`null`。
* **`mint`**: トークンミントアドレス（SOLの場合は`So11111111111111111111111111111111111111111`）。
* **`symbol`**: トークンシンボル（資金調達トランザクションの場合は常に`SOL`）。
* **`amount`**: 受け取った最初のSOLの量（人が読み取れる形式、例：`0.05` SOL）。
* **`amountRaw`**: lamportsでの生の金額（例えば0.05 SOLに対しては`"50000000"`）。
* **`decimals`**: トークンの小数点以下の桁数（SOLの場合は9）。
* **`date`**: ISO 8601形式の日付文字列（例：`"2024-01-01T00:00:00.000Z"`）。
* **`signature`**: 資金移転のトランザクションシグネチャ。
* **`timestamp`**: ウォレットが資金提供を受けたときのUnixタイムスタンプ（秒単位）。
* **`slot`**: 資金調達トランザクションが確認されたときのSolanaスロット番号。
* **`explorerUrl`**: Orbでトランザクションを表示するための直接リンク。

## ユースケース

### 取引所で資金提供されたウォレットを検出

中央集権型取引所から直接資金提供されたウォレットを識別：

```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");
```

### ウォレットクラスターを見つける（Sybil検出）

同じソースから資金提供されたウォレットのグループを特定する：

```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);
```

### エアドロップ受取人を追跡

エアドロップ受取人がどこから来たのかを分析する：

```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;
};
```

### ウォレットタイムラインの構築

ウォレットの作成から始めるタイムラインを作成する：

```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
  };
};
```

### コンプライアンスリスクスコアリング

資金提供ソースに基づいてリスクスコアを割り当てる：

```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 };
};
```

### 帰属追跡

最も多くの新しいウォレットを作成しているソースを追跡する：

```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;
};
```

## 資金提供者の種類

`funderType`フィールドは、アドレスに資金を提供したウォレットのカテゴリを示します。[Identity Categories](/ja/wallet-api/identity#identity-categories)からすべての値がサポートされています。

<Accordion title="サポートされている資金提供者の種類">
  一般的な資金提供者の種類：

  | タイプ         | 説明                 | 例                              |
  | ----------- | ------------------ | ------------------------------ |
  | 中央集権型取引所    | CEXホットウォレット        | Binance, Coinbase, Kraken, OKX |
  | DeFi        | DeFiプロトコルアドレス      | Jupiter, Raydium, Marinade     |
  | マーケットメーカー   | マーケットメイキング会社       | Jump Trading, Wintermute       |
  | トレーディング会社   | プロプライエタリートレーディング会社 | インスティテューショナルトレーダー              |
  | クロスチェーンブリッジ | ブリッジプロトコルアドレス      | Wormhole, AllBridge, Portal    |
  | バリデーター      | バリデーターアドレス         | Coinbase Validator, Jito       |
  | オピニオンリーダー   | 著名人                | インフルエンサー、創設者                   |
  | トレジャリー      | プロジェクトの財務          | プロトコルの財務                       |
  | ステークプール     | リキッドステーキングプール      | Marinade, Jito                 |
  | null        | 不明な資金提供者           | アイデンティティデータベースにない通常のウォレット      |

  完全なリストには次のものが含まれます：エアドロップ、権限、クロスチェーンブリッジ、カジノ＆ギャンブル、DAO、DeFi、DePIN、中央集権型取引所、エクスプロイト/ハッカー/詐欺、料金、資金調達、ゲーム、ジェネシスブロック配布、ガバナンス、ハッカー、Jito、オピニオンリーダー、マーケットメーカー、ミームコイン、マルチシグ、NFT、非流通供給、オラクル、その他、支払い、プロプライエタリーAMM、再ステーキング、ラガー、スキャマー、スパム、ステークプール、システム、ツール、取引アプリ/ボット、取引会社、トランザクション送信、トレジャリー、バリデーター、ボールト、X402。

  完全なリストと説明については、[Identity Categories](/ja/wallet-api/identity#identity-categories)セクションを参照してください。
</Accordion>

## ベストプラクティス

* **404レスポンスを処理する。** SOLを一度も受け取っていないウォレットは404を返します。これは未資金の新しく作成されたウォレットでは予期されるものです。
* **Identity APIと組み合わせる。** レスポンスには`funderName`と`funderType`が含まれていますが、さらに詳細を得るために[Identity](/ja/wallet-api/identity)エンドポイントに`funder`アドレスを呼び出すことができます。
* **資金データをキャッシュする。** ウォレットの資金提供ソースは変更されません。このデータを永続的にキャッシュして、繰り返しのAPI呼び出しを避けます。
* **コンテキストに年齢を確認する。** `timestamp`はウォレットが最初に資金提供されたときを教えてくれます。コンテキスト向上のために年齢と資金提供ソースを組み合わせます。

## よくあるエラー

| エラーコード | 説明                  | 解決策                                                                                      |
| ------ | ------------------- | ---------------------------------------------------------------------------------------- |
| 400    | 無効なウォレットアドレス形式      | アドレスが有効なbase58 Solanaアドレスであることを確認してください                                                  |
| 401    | APIキーがないか、無効です      | リクエストにAPIキーが含まれていることを確認してください                                                            |
| 403    | エンドポイントには有料プランが必要です | 資金ソースのルックアップは無料プランでは利用できません。[プランをアップグレードする](https://dashboard.helius.dev)ことで有料のティアに移行します |
| 404    | 資金取引が見つかりません        | このウォレットは一度もSOLを受け取ったことがありません                                                             |
| 429    | レート制限を超えました         | リクエスト頻度を減らすか、プランをアップグレードしてください                                                           |

## 制限

* このエンドポイントはウォレットへの **最初のSOL転送** のみを追跡します。
* ウォレットがエアドロップやプログラムの初期化でSOL転送なしに作成された場合、資金データはありません。
* 資金提供ソースは **直接の** 資金提供者を示し、必ずしも最終的な資金の出所を示すものではありません。
* 歴史的データは、この機能が展開された後に作成されたウォレットに対してのみ利用可能です。

## 次のステップ

<CardGroup cols={3}>
  <Card title="ウォレットアイデンティティ" icon="address-card" href="/ja/wallet-api/identity">
    資金提供者のアドレスを完全なラベル、カテゴリ、タグに解決します。
  </Card>

  <Card title="ウォレットAPI概要" icon="wallet" href="/ja/wallet-api/overview">
    すべてのウォレットAPIエンドポイントと共有規約。
  </Card>

  <Card title="APIリファレンス" icon="code" href="/ja/api-reference/wallet-api/funded-by">
    資金ソースルックアップのリクエストとレスポンスのスキーマ。
  </Card>
</CardGroup>
