# トークンの管理

このガイドでは、OCAP Client を使用してファンジブルトークンを管理するための手順を詳しく説明します。トークンの設計図として機能するトークンファクトリーを設定し、それを使用してミント（新しいトークンの作成）およびバーン（既存のトークンの破棄）を行う方法を学びます。これらの操作は、アプリケーション内でカスタムエコノミーを作成および管理するための基本です。

トークンをミントしたら、アカウント間で転送できます。そのプロセスの詳細については、[トークンとNFTの転送](./how-to-guides-transfer-tokens-and-nfts.md)ガイドを参照してください。


## トークンファクトリーの作成

トークンファクトリーは、名前、シンボル、供給メカニズムなど、ファンジブルトークンのプロパティとルールを定義するスマートコントラクトです。また、ミントとバーンのプロセスも管理します。ファクトリーの作成は、新しいトークンが流通する前の最初のステップです。

`createTokenFactory` メソッドは、新しいトークンファクトリーをブロックチェーンにデプロイします。

### パラメータ

<x-field-group>
  <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="ファクトリーの所有者のウォレットオブジェクト。トランザクションの署名に使用されます。"></x-field>
  <x-field data-name="token" data-type="object" data-required="true" data-desc="作成するトークンのプロパティを定義するオブジェクト。">
    <x-field data-name="name" data-type="string" data-required="true" data-desc="トークンのフルネーム（例：「My Awesome Token」）。"></x-field>
    <x-field data-name="symbol" data-type="string" data-required="true" data-desc="トークンのティッカーシンボル（例：「MAT」）。"></x-field>
    <x-field data-name="decimal" data-type="number" data-required="true" data-desc="トークンがサポートする小数点以下の桁数。"></x-field>
    <x-field data-name="description" data-type="string" data-required="false" data-desc="トークンの簡単な説明。"></x-field>
    <x-field data-name="icon" data-type="string" data-required="false" data-desc="トークンのアイコンのURL。"></x-field>
    <x-field data-name="maxTotalSupply" data-type="number" data-required="false" data-desc="ミントできる最大総供給量。"></x-field>
  </x-field>
  <x-field data-name="curve" data-type="object" data-required="false" data-desc="トークンの価格をプログラムで制御するボンディングカーブの設定。省略した場合、ミント/バーンはリザーブトークンに結び付けられません。">
    <x-field data-name="basePrice" data-type="number" data-required="false" data-desc="リザーブ通貨でのトークンの基本価格。"></x-field>
    <x-field data-name="fixedPrice" data-type="number" data-required="false" data-desc="動的なカーブを使用しない場合のトークンの固定価格。"></x-field>
    <x-field data-name="slope" data-type="number" data-required="false" data-desc="ボンディングカーブの傾き。その急勾配を決定します。"></x-field>
  </x-field>
  <x-field data-name="feeRate" data-type="number" data-default="0" data-required="false" data-desc="ミントおよびバーン操作の手数料率（ベーシスポイント単位）。"></x-field>
  <x-field data-name="data" data-type="object" data-required="false" data-desc="トークンファクトリーに添付するオプションのカスタムデータ。"></x-field>
</x-field-group>

### 戻り値

トランザクションハッシュと新しく作成されたトークンファクトリーのアドレスを含む配列に解決される Promise を返します。

<x-field-group>
  <x-field data-name="[0]" data-type="string" data-desc="ファクトリー作成のトランザクションハッシュ。"></x-field>
  <x-field data-name="[1]" data-type="string" data-desc="新しいトークンファクトリーのアドレス。"></x-field>
</x-field-group>

### 例

```javascript トークンファクトリーの作成 icon=logos:javascript
import Client from '@ocap/client';
import Wallet from '@ocap/wallet';

const endpoint = 'https://beta.abtnetwork.io/api';
const client = new Client(endpoint);
const wallet = Wallet.fromRandom();

// まず、ウォレットに資金があることを確認してください。テストトークンはフォーセットから入手できます：
// https://faucet.abtnetwork.io/

async function createFactory() {
  try {
    const [hash, factoryAddress] = await client.createTokenFactory({
      wallet,
      token: {
        name: 'My Game Coin',
        symbol: 'MGC',
        decimal: 18,
        description: 'The official currency for My Awesome Game.',
        maxTotalSupply: 1000000,
      },
      feeRate: 100, // 1% fee
    });

    console.log('Token factory created successfully!');
    console.log('Transaction Hash:', hash);
    console.log('Factory Address:', factoryAddress);
    return factoryAddress;
  } catch (error) {
    console.error('Error creating token factory:', error);
  }
}

createFactory();
```


## トークンのミント

ミントは、新しいトークンを作成し、総供給量に追加するプロセスです。これはトークンファクトリーを介して行われます。ファクトリーがボンディングカーブで設定されている場合、ミントにはリザーブトークンでの支払いが必要になります。

`mintToken` メソッドは、ファクトリーから指定された量のトークンをミントするトランザクションを開始します。

### パラメータ

<x-field-group>
  <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="ミント操作に資金を提供し、トランザクションに署名するウォレット。"></x-field>
  <x-field data-name="tokenFactory" data-type="string" data-required="true" data-desc="ミント元のトークンファクトリーのアドレス。"></x-field>
  <x-field data-name="amount" data-type="number" data-required="true" data-desc="ミントするトークンの量。"></x-field>
  <x-field data-name="receiver" data-type="string" data-required="true" data-desc="新しくミントされたトークンを受け取るアドレス。"></x-field>
  <x-field data-name="maxReserve" data-type="number" data-required="true" data-desc="ウォレットが支払う意思のあるリザーブトークンの最大量。これはスリッページ保護メカニズムとして機能します。"></x-field>
  <x-field data-name="data" data-type="object" data-required="false" data-desc="ミントトランザクションに添付するオプションのカスタムデータ。"></x-field>
</x-field-group>

### 戻り値

トランザクションハッシュに解決される Promise を返します。

<x-field data-name="hash" data-type="string" data-desc="ミント操作のトランザクションハッシュ。"></x-field>

### 例

```javascript ファクトリーからトークンをミントする icon=logos:javascript
async function mintNewTokens(factoryAddress) {
  try {
    const hash = await client.mintToken({
      wallet,
      tokenFactory: factoryAddress,
      amount: 5000,
      receiver: wallet.address, // 自分のウォレットにトークンをミントします
      maxReserve: 10, // 支払うリザーブトークンの最大額。ボンディングカーブの価格に基づいて調整してください。
    });

    console.log('Tokens minted successfully!');
    console.log('Transaction Hash:', hash);
  } catch (error) {
    console.error('Error minting tokens:', error);
  }
}

// createFactory の例で `factoryAddress` が利用可能であると仮定します
// const factoryAddress = '...'; 
// mintNewTokens(factoryAddress);
```


## トークンのバーン

バーンはミントの反対で、トークンを流通から永久に削除します。トークンファクトリーがボンディングカーブを使用している場合、トークンをバーンすると、比例した量のリザーブ通貨がユーザーに返されます。

`burnToken` メソッドがこのプロセスを開始します。

### パラメータ

<x-field-group>
  <x-field data-name="wallet" data-type="WalletObject" data-required="true" data-desc="バーンするトークンを保持し、トランザクションに署名するウォレット。"></x-field>
  <x-field data-name="tokenFactory" data-type="string" data-required="true" data-desc="トークンファクトリーのアドレス。"></x-field>
  <x-field data-name="amount" data-type="number" data-required="true" data-desc="バーンするトークンの量。"></x-field>
  <x-field data-name="receiver" data-type="string" data-required="true" data-desc="見返りとしてリザーブトークンを受け取るアドレス。"></x-field>
  <x-field data-name="minReserve" data-type="number" data-required="true" data-desc="ウォレットが受け取ることを期待するリザーブトークンの最小量。これは価格のスリッページから保護します。"></x-field>
  <x-field data-name="data" data-type="object" data-required="false" data-desc="バーントランザクションに添付するオプションのカスタムデータ。"></x-field>
</x-field-group>

### 戻り値

トランザクションハッシュに解決される Promise を返します。

<x-field data-name="hash" data-type="string" data-desc="バーン操作のトランザクションハッシュ。"></x-field>

### 例

```javascript トークンをバーンする icon=logos:javascript
async function burnExistingTokens(factoryAddress) {
  try {
    const hash = await client.burnToken({
      wallet,
      tokenFactory: factoryAddress,
      amount: 1000,
      receiver: wallet.address, // 自分のウォレットでリザーブトークンを受け取ります
      minReserve: 1, // 受け取るリザーブトークンの最小額。ボンディングカーブの価格に基づいて調整してください。
    });

    console.log('Tokens burned successfully!');
    console.log('Transaction Hash:', hash);
  } catch (error) {
    console.error('Error burning tokens:', error);
  }
}

// createFactory の例で `factoryAddress` が利用可能であると仮定します
// const factoryAddress = '...'; 
// burnExistingTokens(factoryAddress);
```


## まとめ

このガイドでは、ファンジブルトークンを管理するための完全なライフサイクル、つまりファクトリーの作成、新しいトークンのミント、そして供給量を減らすためのバーンについて学びました。これらの強力なプリミティブにより、OCAP プラットフォーム上で洗練された経済システムを構築できます。

トークンの作成方法を学んだので、次の論理的なステップはそれらを移動させる方法を学ぶことです。[トークンとNFTの転送](./how-to-guides-transfer-tokens-and-nfts.md)ガイドに進み、その方法を確認してください。
