2022.07.08

Ethereum – Polygon ブリッジ ERC20 編

こんにちは。次世代システム研究室のT.M です。

はじめに

前回、Ethereum – Polygon ブリッジを利用して、ETH を移転させました。今回は、ERC20 トークンを移転させる方法について説明をします。

Ethereumトークン発行

デプロイ

メインとなるERC20トークンをEthereum にデプロイします。openzeppelin を利用してコントラクトを実装します。TCOIN を発行し、100トークンをmint します。
pragma solidity >=0.4.22 <0.9.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract TCOIN is ERC20 {
    constructor() ERC20("TestCoin", "TCOIN") {
        _mint(msg.sender, 100000000000000000000);
    }
}

Verify

デプロイされたコントラクトをEtherscan でverify する必要があります。”Please select Compiler Type” は”Solidity(Single file)” を”Please select Compiler Version” はコンパイラのバージョンを、”Please select Open Source License Type” は”3) MIT License(MIT)” を選択します。


コントラクトのコードを一つにまとめます。
npx truffle-flattener TCOIN.sol > flatTCOIN.sol
一つにまとめたコードを登録します。このとき、”// SPDX-License-Identifier: MIT” が複数箇所ある場合エラーになりますので、一つだけ残してコードから削除してください。


“Verify and Publish” でverify が完了します。

Polygon トークン発行

デプロイ

PoS のChildERC20 トークンをPolygon にデプロイします。ChildERC20 はERC20 にdeposit とwithdraw が実装されたものになっています。deposit でmint され、withdraw でburn されます。
constructor(
    string memory name_,
    string memory symbol_,
    uint8 decimals_,
    address childChainManager
) public ERC20(name_, symbol_) {
    _setupContractId("ChildERC20");
    _setupDecimals(decimals_);
    _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
    _setupRole(DEPOSITOR_ROLE, childChainManager);
    _initializeEIP712(name_);
}
function deposit(address user, bytes calldata depositData)
    external
    override
    only(DEPOSITOR_ROLE)
{
    uint256 amount = abi.decode(depositData, (uint256));
    _mint(user, amount);
}
function withdraw(uint256 amount) external {
    _burn(_msgSender(), amount);
}
コンストラクタの第4引数はChildChainManager を設定します。ChildChainManager とは、Ethereum でERC20 をデポジットした時に、Polygon でChildERC20 トークンをmint するアカウントになります。mumbai ネットワークのChildChainManager は、ここに記述されています。
pragma solidity >=0.4.22 <0.9.0;

import "@maticnetwork/pos-portal/contracts/child/ChildToken/ChildERC20.sol";

contract ChildTCOIN is ChildERC20 {
    constructor() public ChildERC20("ChildTestCoin", "ChildTCOIN", 18, address(0x2e5e27d50EFa501D90Ad3638ff8441a0C0C0d75e)) {
    }
}
ChildERC20 は最新バージョンのコンパイラではコンパイルできないので、0.6.6 でコンパイルします。truffle-config.json でコンパイラのバージョンを固定します。
...
  compilers: {
    solc: {
      version: "0.6.6",      
    }
  },
...

Verify

Ethereum と同様にPolygon でもデプロイしたコントラクトをverify します。手順は同じです。コンパイラのバージョンを0.6.6 にします。


Mapping

Ethereum のERC20 トークンとPolygon のChildERC20 トークンをMapping します。Mapping はここで行います。”Ethereum token address” はERC20 トークンのアドレスを、”Polygon token address” はChildERC20 トークンを設定します。

諸々の確認があるので、チェックしてSubmit します。

トークン移転

トークンを移転する方法は前回のETH の移転と同様です。

まとめ

Ethereum とPolygon でERC20 トークンを発行して、それらをブリッジできるようにmapping しました。ChildERC20 のコントラクトが古いのが気になりましたが、用意されているコントラクトをデプロイして、mapping リクエストをするだけなので、とても簡単でした。

次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。インフラ設計、構築経験者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。

皆さんのご応募をお待ちしています。

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事