# トークンとNFTの転送

このガイドでは、OCAP Clientを使用して、アカウント間でファンジブルトークン（ネイティブおよびカスタム）とノンファンジブルトークン（NFTまたはアセット）を転送するためのステップバイステップのウォークスルーを提供します。すべての転送の主要なメソッドは`client.transfer()`です。

覚えておくべき重要な機能の1つは、新しいアカウントが最初の着信トランザクションを受信したときに、オンチェーンで自動的に作成されることです。つまり、受信者の事前設定なしで、全く新しいアドレスにトークンやアセットを転送できます。


## `transfer` メソッド

`client.transfer()`メソッドは、アセットやトークンを送信するプロセスを簡素化する多機能なヘルパー関数です。単一の呼び出しで、適切なトランザクション（`transferV2Tx`）を構築、署名し、ブロックチェーンに送信します。

### パラメータ

<x-field-group>
  <x-field data-name="to" data-type="string" data-required="true">
    <x-field-desc markdown>受信者のアカウントアドレス。有効なDIDアドレスである必要があります。</x-field-desc>
  </x-field>
  <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="トランザクションの署名に使用される送信者のウォレットオブジェクト。"></x-field>
  <x-field data-name="token" data-type="number" data-default="0">
    <x-field-desc markdown>転送するチェーンのネイティブトークンの量。クライアントが自動的に正しい小数点以下の単位に変換します。</x-field-desc>
  </x-field>
  <x-field data-name="assets" data-type="string[]" data-default="[]" data-desc="転送するアセットアドレス（NFT）の配列。"></x-field>
  <x-field data-name="tokens" data-type="object[]" data-default="[]">
    <x-field-desc markdown>転送するカスタムファンジブルトークンオブジェクトの配列。</x-field-desc>
    <x-field data-name="address" data-type="string" data-required="true" data-desc="カスタムトークンコントラクトのアドレス。"></x-field>
    <x-field data-name="value" data-type="number" data-required="true" data-desc="転送するカスタムトークンの量。"></x-field>
  </x-field>
  <x-field data-name="memo" data-type="string" data-required="false" data-desc="トランザクションに含めるオプションのメッセージまたはメモ。"></x-field>
  <x-field data-name="delegator" data-type="string" data-required="false">
    <x-field-desc markdown>`wallet`が別のアカウントの代理として機能している場合、これは委任元アカウントのアドレスである必要があります。詳細については、[権限の委任](./how-to-guides-delegate-permissions.md)ガイドを参照してください。</x-field-desc>
  </x-field>
</x-field-group>

### 戻り値

<x-field data-name="Promise<string>" data-type="Promise">
  <x-field-desc markdown>ブロックチェーンへの送信が成功すると、トランザクションハッシュに解決されるPromise。</x-field-desc>
</x-field>


## ステップバイステップの例

### 前提条件

開始する前に、以下のものがあることを確認してください：

1. `https://beta.abtnetwork.io`のようなチェーンホストに接続された初期化済みの`GraphQLClient`。
2. 転送とトランザクション手数料をカバーするのに十分なトークンが入金された送信者のウォレットオブジェクト（`senderWallet`）。
3. アドレスを取得するための受信者のウォレットオブジェクト（`recipientWallet`）。受信者のアカウントはまだオンチェーンに存在している必要はありません。

```javascript 基本設定 icon=logos:javascript
import GraphQLClient from '@ocap/client';
import { fromRandom } from '@ocap/wallet';

// 1. クライアントを初期化
const client = new GraphQLClient({ endpoint: 'https://beta.abtnetwork.io/api' });

// 2. 送信者と受信者のウォレットを作成
// 実際のアプリケーションでは、送信者のウォレットはランダムに作成されるのではなく、ロードされます。
const senderWallet = fromRandom(); // このウォレットには資金が入っていると仮定します
const recipientWallet = fromRandom();

console.log(`Sender Address: ${senderWallet.address}`);
console.log(`Recipient Address: ${recipientWallet.address}`);

// この例のために送信者のウォレットに資金を供給するには、フォーセットを使用してください：
// https://faucet.abtnetwork.io/
```

### 例1：ネイティブトークンの転送

この例では、送信者から受信者に10ネイティブトークンを送信する方法を示します。

```javascript ネイティブトークンの転送 icon=logos:javascript
async function transferNativeTokens() {
  try {
    const hash = await client.transfer({
      to: recipientWallet.address,
      token: 10, // 送信するネイティブトークンの量
      wallet: senderWallet,
      memo: 'Sending you 10 native tokens!'
    });
    console.log('Native token transfer successful. Tx Hash:', hash);
  } catch (err) {
    console.error('Error transferring tokens:', err);
  }
}

transferNativeTokens();
```

### 例2：NFT（アセット）の転送

NFTを転送するには、その一意のアセットアドレスが必要です。まず、アセットを作成または取得します（[アセット（NFT）の管理](./how-to-guides-manage-assets.md)を参照）。この例では、`senderWallet`がすでにアドレス`zNKj...`を持つNFTを所有していると仮定します。

```javascript NFTの転送 icon=logos:javascript
async function transferNFT() {
  // これがsenderWalletが所有するNFTのアドレスであると仮定します
  const nftAddress = 'zNKjL4wTmxQPk5nN2ADDPCd58286b2de3f3e';

  try {
    const hash = await client.transfer({
      to: recipientWallet.address,
      assets: [nftAddress], // アセットアドレスの配列
      wallet: senderWallet,
      memo: 'Here is the NFT you wanted.'
    });
    console.log('NFT transfer successful. Tx Hash:', hash);
  } catch (err) {
    console.error('Error transferring NFT:', err);
  }
}

transferNFT();
```

### 例3：カスタムトークンの転送

この例では、カスタムファンジブルトークンを転送する方法を示します。トークンのコントラクトアドレスが必要です。カスタムトークンの作成については、[トークンの管理](./how-to-guides-manage-tokens.md)ガイドを参照してください。

```javascript カスタムトークンの転送 icon=logos:javascript
async function transferCustomToken() {
  // これがsenderWalletが所有するカスタムトークンのアドレスであると仮定します
  const customTokenAddress = 'z37bA4x...'; 

  try {
    const hash = await client.transfer({
      to: recipientWallet.address,
      wallet: senderWallet,
      tokens: [
        { address: customTokenAddress, value: 50 } // カスタムトークン50単位
      ],
      memo: 'Sending 50 custom tokens.'
    });
    console.log('Custom token transfer successful. Tx Hash:', hash);
  } catch (err) {
    console.error('Error transferring custom token:', err);
  }
}

transferCustomToken();
```

### 例4：複合転送

ネイティブトークン、カスタムトークン、および複数のNFTをすべて単一のアトミックなトランザクションで送信できます。これは非常に効率的です。

```javascript 複合転送 icon=logos:javascript
async function combinedTransfer() {
  // これらがsenderWalletが所有するアセットとトークンのアドレスであると仮定します
  const nftAddress1 = 'zNKjL4wTmxQPk5nN2ADDPCd58286b2de3f3e';
  const nftAddress2 = 'zNKiabcdeQPk5nN2ADDPCd58286b2defghj';
  const customTokenAddress = 'z37bA4x...'; // カスタムファンジブルトークンのアドレス

  try {
    const hash = await client.transfer({
      to: recipientWallet.address,
      wallet: senderWallet,
      token: 5, // 5ネイティブトークン
      assets: [nftAddress1, nftAddress2], // 2つのNFTの配列
      tokens: [
        { address: customTokenAddress, value: 50 } // カスタムトークン50単位
      ],
      memo: 'Sending a mix of tokens and NFTs.'
    });
    console.log('Combined transfer successful. Tx Hash:', hash);
  } catch (err) {
    console.error('Error with combined transfer:', err);
  }
}

combinedTransfer();
```

これらの例に従うことで、アプリケーションでトークンとNFTの転送を簡単に実装できます。転送したいアイテムの作成に関する詳細については、関連ガイドを参照してください。

### 参考文献

* [アセット（NFT）の管理方法](./how-to-guides-manage-assets.md)
* [トークンの管理方法](./how-to-guides-manage-tokens.md)
* [高レベルAPI](./api-reference-transaction-helpers.md)
