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

# getTokenAccountsByDelegate 사용 방법

> getTokenAccountsByDelegate 사용 사례, 코드 예제, 요청 매개변수, 응답 구조, 팁을 알아보세요.

[`getTokenAccountsByDelegate`](https://www.helius.dev/docs/api-reference/rpc/http/gettokenaccountsbydelegate) RPC 메서드는 특정 공개 키를 위임자로 승인한 모든 SPL 토큰 계정을 검색합니다. 위임자는 지정된 양에 따라 토큰 계정에서 토큰 전송 또는 소각과 같은 특정 작업을 수행할 수 있는 권한을 가지고 있습니다.

이 메서드는 위임된 권한을 관리하거나 특정 키가 대신 조치를 취할 수 있는 토큰 계정을 발견해야 하는 서비스에 유용합니다.

## 일반적인 사용 사례

* **위임된 자산 나열:** 특정 지갑이나 프로그램이 위임자 권한을 부여받은 모든 토큰 계정을 표시합니다.
* **자동화된 토큰 관리:** 사용자를 대신하여 작업을 수행하는 서비스(예: 자동 마켓 메이커, 토큰화된 보상을 관리하는 스테이킹 프로토콜)는 이를 사용하여 상호작용할 수 있는 계정을 찾을 수 있습니다.
* **위임 감사:** 특정 주소에 위임된 권한이 있는 계정을 검토합니다.
* **위임 취소:** 위임자 권한을 취소해야 하는 토큰 계정을 식별(단, 취소 자체는 별도의 거래임)합니다.

## 요청 매개변수

1. **`delegatePubkey`** (string, 필수): 관련된 토큰 계정을 찾으려는 위임자 계정의 base-58로 인코딩된 공개 키입니다.

2. **`filter`** (object, 필수): 계정을 필터링하기 위해 `mint` 또는 `programId` 중 하나를 **반드시** 지정해야 하는 JSON 객체:
   * **`mint`** (string): 특정 토큰 민트의 base-58로 인코딩된 공개 키입니다. 제공할 경우, 쿼리는 이 특정 토큰 유형의 토큰 계정만 반환하며, 이는 `delegatePubkey`에 위임됩니다.
   * **`programId`** (string): 계정을 소유한 토큰 프로그램의 base-58로 인코딩된 공개 키입니다. 일반적으로 표준 SPL 토큰 프로그램(`TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`) 또는 토큰-2022 프로그램(`TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`)일 것입니다.

3. **`options`** (object, 선택적): 다음과 같은 공통 필드를 포함하는 선택적 구성 객체:
   * **`commitment`** (string, 선택적): [커밋 수준](https://www.helius.dev/blog/solana-commitment-levels)을 지정합니다.
   * **`encoding`** (string, 선택적): 계정 데이터의 인코딩. `"jsonParsed"`을 강력히 추천하며 이는 사람이 읽을 수 있는 계정 정보를 반환합니다. 기타 옵션은 `"base64"`, `"base64+zstd"` 등이 있습니다. 지정되지 않으면 기본값은 `"base64"`입니다.
   * **`dataSlice`** (object, 선택적): 계정 데이터의 특정 슬라이스만 검색할 수 있습니다. `offset` (usize) 및 `length` (usize) 필드가 포함됩니다. 이는 `base58`, `base64` 또는 `base64+zstd` 인코딩에만 적용됩니다.
   * **`minContextSlot`** (u64, 선택적): 요청이 평가될 수 있는 최소 슬롯입니다.

## 응답 구조

JSON-RPC 응답의 `result.value` 필드는 객체의 배열입니다. 각 객체는 `filter` 기준과 일치하며 `delegatePubkey`를 위임자로 가진 토큰 계정을 나타냅니다. 배열의 각 객체는 다음 두 필드를 가집니다:

* **`pubkey`** (string): 토큰 계정 자체의 base-58로 인코딩된 공개 키입니다.
* **`account`** (object): 토큰 계정에 대한 자세한 정보를 포함하는 객체:
  * **`lamports`** (u64): 토큰 계정의 램포트 잔액(렌트 면제용).
  * **`owner`** (string): 이 계정을 소유한 프로그램의 공개 키(예: 토큰 프로그램).
  * **`data`**: 계정 데이터. `"jsonParsed"` 인코딩이 사용되는 경우, 이는 `program` 필드(예: `"spl-token"`) 및 구조화된 정보를 포함한 `parsed` 필드를 가진 객체가 됩니다:
    * **`parsed.info`**: 다음 세부 정보를 가진 객체:
      * **`mint`** (string): 토큰의 민트 주소.
      * **`owner`** (string): 토큰 계정의 소유자(위임자 아님).
      * **`tokenAmount`** (object): 이 계정의 총 토큰 잔액(`amount`, `decimals`, `uiAmount`, `uiAmountString`).
      * **`delegate`** (string): 위임자의 공개 키(요청의 `delegatePubkey`와 일치해야 함).
      * **`delegatedAmount`** (object): 위임자가 관리할 수 있도록 승인된 토큰 양(`amount`, `decimals`, `uiAmount`, `uiAmountString`).
      * **`isNative`** (boolean): 계정이 래핑된 SOL을 보유하고 있는지 여부.
      * **`state`** (string): 토큰 계정의 상태(예: `"initialized"`).
    * **`parsed.type`** (string): 계정 유형(예: `"account"`).
  * **`executable`** (boolean): 계정이 실행 가능한지 여부.
  * **`rentEpoch`** (u64): 이 계정이 다음에 렌트를 낼 시기.
  * **`space`** (u64, `jsonParsed`이 사용되지 않은 경우): 원시 계정 데이터 길이(바이트 단위).

**응답 예시 (`jsonParsed` 인코딩 사용):**

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "result": {
    "context": {
      "slot": 183458000
    },
    "value": [
      {
        "pubkey": "SomeTokenAccountPubkey1...",
        "account": {
          "data": {
            "program": "spl-token",
            "parsed": {
              "info": {
                "delegate": "DelegatePubkeyProvidedInRequest...",
                "delegatedAmount": {
                  "amount": "1000000000",
                  "decimals": 9,
                  "uiAmount": 1.0,
                  "uiAmountString": "1.0"
                },
                "isNative": false,
                "mint": "TokenMintPubkey...",
                "owner": "ActualOwnerOfTheTokenAccount...",
                "state": "initialized",
                "tokenAmount": {
                  "amount": "5000000000",
                  "decimals": 9,
                  "uiAmount": 5.0,
                  "uiAmountString": "5.0"
                }
              },
              "type": "account"
            },
            "space": 165
          },
          "executable": false,
          "lamports": 2039280,
          "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", // SPL Token Program
          "rentEpoch": 382
        }
      }
      // ... potentially other token accounts delegated to the same delegate
    ]
  },
  "id": 1
}
```

## 코드 예제

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <DELEGATE_PUBKEY> and <TOKEN_MINT_PUBKEY> or <TOKEN_PROGRAM_ID>
  # Example using programId (SPL Token Program)
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getTokenAccountsByDelegate",
      "params": [
        "<DELEGATE_PUBKEY>",
        { "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" },
        { "encoding": "jsonParsed" }
      ]
    }' \
    <YOUR_RPC_URL>

  # Example using a specific mint
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getTokenAccountsByDelegate",
      "params": [
        "<DELEGATE_PUBKEY>",
        { "mint": "<TOKEN_MINT_PUBKEY>" },
        { "encoding": "jsonParsed", "commitment": "confirmed" }
      ]
    }' \
    <YOUR_RPC_URL>
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  const { Connection, PublicKey } = require('@solana/web3.js');

  async function findDelegatedAccounts(delegateAddress, filter, encoding = 'jsonParsed') {
    // Replace with your RPC endpoint
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    const delegatePubKey = new PublicKey(delegateAddress);

    try {
      let actualFilter;
      if (filter.mint) {
        actualFilter = { mint: new PublicKey(filter.mint) };
      } else if (filter.programId) {
        actualFilter = { programId: new PublicKey(filter.programId) };
      } else {
        console.error("Filter must contain either 'mint' or 'programId'");
        return;
      }

      const accounts = await connection.getTokenAccountsByDelegate(
        delegatePubKey,
        actualFilter,
        { encoding }
      );

      console.log(`Found ${accounts.value.length} token accounts delegated to ${delegateAddress}:`);
      accounts.value.forEach(accInfo => {
        console.log(`  Token Account: ${accInfo.pubkey.toBase58()}`);
        if (encoding === 'jsonParsed' && accInfo.account.data.parsed) {
          console.log(`    Mint: ${accInfo.account.data.parsed.info.mint}`);
          console.log(`    Owner: ${accInfo.account.data.parsed.info.owner}`);
          console.log(`    Delegated Amount: ${accInfo.account.data.parsed.info.delegatedAmount.uiAmountString}`);
        }
        // console.log(JSON.stringify(accInfo.account.data, null, 2)); // For full data
      });

    } catch (error) {
      console.error(`Error fetching token accounts by delegate for ${delegateAddress}:`, error);
    }
  }

  // Replace with an actual delegate public key
  const exampleDelegate = '4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T'; 

  // Example 1: Find all SPL Token program accounts delegated to `exampleDelegate`
  findDelegatedAccounts(exampleDelegate, { programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' });

  // Example 2: Find accounts for a specific mint (e.g., USDC) delegated to `exampleDelegate`
  // const usdcMint = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
  // findDelegatedAccounts(exampleDelegate, { mint: usdcMint });
  ```
</CodeGroup>

## 개발자 팁

* **필터 요구사항:** 필터 매개변수에 `mint` 또는 `programId` 중 하나를 *반드시* 제공해야 합니다. 이러한 필터 없이 모든 토큰 유형의 위임된 계정을 쿼리할 수 없습니다.
* **인코딩:** `"jsonParsed"`를 `encoding` 옵션으로 사용하는 것은 데이터를 더 쉽게 처리할 수 있도록 강력히 추천됩니다. 이는 이진 계정 데이터를 구조화된 JSON 형식으로 디코딩합니다.
* **성능:** `programId`를 사용하여 쿼리하는 것은 `mint`를 사용하여 쿼리하는 것보다 리소스를 더 많이 소모할 수 있으며, 특히 위임자가 여러 다른 토큰 유형에 대해 권한을 갖고 있는 경우 그렇습니다. 일부 RPC 제공자는 이 메서드에 대해 더 엄격한 속도 제한을 가질 수 있습니다.
* **위임된 양:** 응답의 `delegatedAmount`는 현재 위임자가 사용할 수 있도록 승인된 최대 토큰 수를 나타냅니다. 이는 계정의 총 `tokenAmount`보다 적을 수 있습니다.
* **위임 취소:** 이 메서드는 정보만 검색합니다. 위임을 취소하려면 토큰 계정의 소유자가 SPL 토큰 프로그램에 `Revoke` 명령을 보내야 합니다.

이 가이드는 승인된 위임자를 기반으로 SPL 토큰 계정을 찾는 `getTokenAccountsByDelegate` 사용에 대한 포괄적인 개요를 제공합니다.
