メインコンテンツへスキップ

SolidityスマートコントラクトによるERC-20トークンの転送と承認

スマートコントラクト
トークン
Solidity
ERC-20
中級
jdourlens
2020年4月7日
10 分の読書

前回のチュートリアルでは、イーサリアムブロックチェーン上のSolidityで描かれたERC-20トークンの構造について学びました。 この記事では、Solidity言語で書かれたトークンとやり取りするためのスマートコントラクトの使い方について説明します。

このスマートコントラクトのために、ユーザーがイーサを新しくデプロイされたERC-20トークンに交換できる、ダミーの分散型取引所を実際に作成します。

このチュートリアルでは、前のチュートリアルで書いたコードをベースとして使います。 この分散型取引所(DEX)では、コントラクトのインスタンスをコンストラクタでインスタンス化し、以下の操作を実行します。

  • トークンをイーサ(ETH)に交換
  • イーサ(ETH)をトークンに交換

次のシンプルなERC20コードベースを追加することで、分散型取引所コードを開始します。

次の新しい分散型取引所(DEX)スマートコントラクトは、ERC-20をデプロイし、供給されたすべてを取得します。

これで分散型取引所(DEX)ができました。また、すべてのトークンリザーブが利用可能になりました。 コントラクトには、次の2つの関数があります。

  • buy: ユーザーはイーサ(ETH)を送ってトークンに交換できます
  • sell: ユーザーはトークンを送信してイーサ(ETH)を取り戻すことができます

buy関数

buy関数をコーディングしてみましょう。 まず、メッセージに含まれるイーサ(ETH)の量を確認し、コントラクトが十分なトークンを所有していること、そしてメッセージにイーサ(ETH)が含まれていることを検証する必要があります。 コントラクトが十分なトークンを所有している場合、ユーザーにその分のトークンを送信し、Boughtイベントを発行します。

require関数の呼び出しがエラーだった場合に、送信されたイーサ(ETH)は直接元に戻され、ユーザーに返されることに注意してください。

ここではシンプルに、1トークンと1Weiを交換します。

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "イーサを送信する必要があります");
    require(amountTobuy <= dexBalance, "リザーブに十分なトークンがありません");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

購入が成功した場合、トランザクションにはトークンのTransferBoughtの2つのイベントが表示されます。

トランザクション内の2つのイベント: TransferとBought

sell関数

売却を担当する関数では、まずユーザーが事前にapprove関数を呼び出して、金額を承認しておく必要があります。 転送を承認するには、ユーザーがDEXによってインスタンス化されたERC20Basicトークンコントラクトを呼び出す必要があります。 これは、まずDEXコントラクトのtoken()関数を呼び出して、DEXがtokenというERC20Basicコントラクトをデプロイしたアドレスを取得することで実現できます。 次に、セッション内にそのコントラクトのインスタンスを作成し、そのapprove関数を呼び出します。 次に、DEXのsell関数を呼び出すことで、トークンをイーサ(ETH)に交換できます。 例えば、インタラクティブ・ブラウニー(interactive brownie)セッションでは、次のようになります。

その後、sell関数が呼び出されたときに、呼び出し元のアドレスからコントラクトアドレスへの転送が成功したかどうかを確認し、その後イーサ(ETH)を呼び出し元のアドレスに送信します。

function sell(uint256 amount) public {
    require(amount > 0, "少なくともいくらかのトークンを売る必要があります");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "トークンの許可量を確認してください");
    token.transferFrom(msg.sender, address(this), amount);
    payable(msg.sender).transfer(amount);
    emit Sold(amount);
}

すべてがうまくいけば、トランザクションに2つのイベント (TransferSold) が表示され、トークンの残高とイーサの残高が更新されるはずです。

トランザクション内の2つのイベント: TransferとSold

このチュートリアルでは、ERC-20トークンの残高と許可量を確認する方法と、インターフェースを使用してERC20スマートコントラクトのTransferTransferFromを呼び出す方法を学びました。

トランザクションを実行した後には、コントラクトに対して行われたトランザクションを待機し、詳細を取得する (opens in a new tab)ためのJavaScriptチュートリアルがあります。また、ABIをお持ちであれば、トークンの転送やその他のイベントによって生成されたイベントをデコードするチュートリアル (opens in a new tab)も利用できます。

チュートリアルの完全なコードは、次のようになります。

ページの最終更新: 2026年3月3日

このチュートリアルは役に立ちましたか?