💭

ERC20: TwitFiのスマコンを見てみた

2022/12/24に公開約4,500字

概要

TwitFiNFTのスマートコントラクトがどのような実装をされているか見ていきます。

TwitFiとは ?

Tweet to Earn "TwitFi"

TwitFiは、ツイートをしてBirdNFTを育てて、TWTトークンを稼いでいく新感覚のGameFiです。

公式 https://twitfi.com/

TwitFi (ERC20)https://etherscan.io/token/0xd4df22556e07148e591b4c7b4f555a17188cf5cf#code

TwitFiNFT (ERC721) https://etherscan.io/token/0x94cce07f299945cfe80e309c85cb0a784b3ee6c2#code

TwitFi

Compiler Version 0.8.17

インポートされているライブラリ

  • @openzeppelin/contracts/access/Ownable.sol
  • @openzeppelin/contracts/security/Pausable.sol
  • @openzeppelin/contracts/utils/math/SafeMath.sol

関連アドレス一覧

  • TwitFi(TWT): 0xd4Df22556e07148e591B4c7b4f555a17188CF5cF
  • TwitFiオーナー: 0x2340accae6c964059e0ffcf9e2bb4fca9cfde653
  • Wrapped Ether(WETH): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

関数一覧

書き込みしている関数にフォーカスしてピックアップしました。

onlyOwner

コントラクトの所有者(※1)のみ実行ができる関数。

  • pause: 送金をストップする関数
  • unpause: 送金をスタートする関数
  • mint: TWTをミントする関数
  • addPairs: ペアを追加、削除する関数
  • setLiquidityFeePercent: 流動性手数料を設定する関数
  • setBurnFee: 破棄する手数料を設定する関数
  • manualswap: コントラクト上で保持しているTWTを全てETHにスワップする関数
  • manualBurn: TWTを破棄する関数
  • openTrading: トレードを開始する関数
  • withdraw: コントラクト上で保持しているETHを全てオーナーに送金する関数

※1. コントラクト作成時に使用されたアカウントがオーナーとなる。

※1. コントラクト作成時のトランザクション:Fromが当該コントラクトのオーナーです。

private

  • swapAndLiquify: コントラクト上で保持している残高からETHにスワップしてLPトークンを生成する関数
  • swapTokensForEth
  • addLiquidity: TWTとETHのLPトークンを生成する関数

internal

  • _transfer: TWTを送金処理する際の内部関数
  • _beforeTokenTransfer: TWTをmint,burnを処理する際の内部関数

関数のソースコード

pause

指定の関数を実行できなくする関数です。

function pause() public onlyOwner {
    // bool _paused = false となる。
    _pause();
}

unpause

指定の関数を実行再開する関数です。

function unpause() public onlyOwner {
    // bool _paused = true となる。
    _unpause();
}

mint

TWTトークンをミントする関数です。

/// @param _to ミントされたトークンの送り先
/// @param _amount ミントするトークン量
function mint(address _to, uint256 _amount) public onlyOwner {
    _mint(_to, _amount);
}

addPairs

ペアを追加、削除する関数です。

/// @param toPair ペアに追加するアドレス
/// @param _enable 有効フラグ
function addPairs(address toPair, bool _enable) public onlyOwner {
    // 既に登録済みのアドレスはエラー
    require(!pairs[toPair], "This pair is already excluded");

    // ペアを追加
    pairs[toPair] = _enable;
}

setLiquidityFeePercent

流動性手数料を設定する関数です。

/// @param liquidityFee 新しく設定する手数料
function setLiquidityFeePercent(
    uint256 liquidityFee
)
    external
    onlyOwner
{
    // 手数料を更新
    _liquidityFee = liquidityFee;
}

setBurnFee

破棄する手数料を設定する関数です。

/// @param burnFee 新しく設定する手数料
function setBurnFee(uint256 burnFee) external onlyOwner {
    // 手数料を更新
    _burnFee = burnFee;
}

manualswap

コントラクト上で保持しているTWTを全てETHにスワップする関数です。

function manualswap() external onlyOwner {
    // コントラクトで保持しているTWT残高を取得
    uint256 contractBalance = balanceOf(address(this));
    // 取得した残高をETHにスワップ
    swapTokensForEth(contractBalance);
}

manualBurn

TWTを破棄する関数です。

/// @param amount 破棄するトークン量
function manualBurn(uint256 amount) public virtual onlyOwner {
    // 指定されたトークン量を破棄する
    _burn(address(this), amount);
}

openTrading

トレードを開始する関数です。

onlyOwnerではなくonlyOwner()となってる。

function openTrading() external onlyOwner() {
    // 既に開始されている場合はエラー
    require(!tradingOpen, "Trading is already open");

    // TwitFiからUniswapを送金することをApprove
    _approve(address(this), address(uniswapV2Router), balanceOf(address(this)));

    // TwitFiとWETHのペアを作成
    uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());

    // LPトークンを生成
    uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this), balanceOf(address(this)), 0, 0, owner(), block.timestamp);

    // トレードをオープン
    tradingOpen = true;

    // ペアにuniswapV2Pair(LPトークン)を追加
    pairs[uniswapV2Pair] = true;
}

withdraw

コントラクト上で保持しているETHを全てオーナーに送金する関数です。

function withdraw() public onlyOwner {
    // コントラクトに保持されているETHを取得
    uint amount = address(this).balance;

    // 残高をオーナーに送金
    (bool success, ) = payable(owner()).call {
        value: amount
    }("");

    // 送金チェック
    require(success, "Failed to send Ether");
}

まとめ

非常にシンプルなコントラクトですが、送金 (transfer) に停止機能が実装されていたので、トレードされる方は注意が必要です。

GitHubで編集を提案

Discussion

ログインするとコメントできます