🛰️

Soneium(ソニューム)のTestnet Minatoにスマートコントラクトをデプロイしてみる

2024/08/31に公開

Soneium(ソニューム)

SonyとAstarが共同開発したイーサリアムのL2チェーンです。Opスタックをベースにしてかなりインフラも整っているチェーンのよう。
https://soneium.org/en/

現在はTestnetのMinatoが稼働中

まだメインネットは動いておらず、テストネットのMinatoが稼働中のようなので、今回はMinatoにデプロイしてみる。

チェーン情報の追加はChainlistを使用

ちゃんとChainlistにも載っててインフラの力の入れようを感じる

https://chainlist.org/?testnets=true&search=minato

Faucetは無いみたいなので公式のBridgeを使用


https://bridge.soneium.org/en/testnet

ちなみにsepoliaのfaucetはこちら
https://cloud.google.com/application/web3/faucet/ethereum/sepolia

Hardhatのプロジェクトを作成

https://hardhat.org/hardhat-runner/docs/getting-started

とりあえずhardhatを入れてプロジェクトを作成していきます。

npm install hardhat
npx hardhat init

コントラクトを作成

今回はウォレットアドレスと名前を紐づけるコントラクトを作成しました。

contracts/NameWalletAddress.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;

contract NameWalletAddress {
    struct User {
        string name;
        address walletAddress;
    }
    
    mapping(address => User) public users;
    
    function setUser(string memory _name) public {
        users[msg.sender] = User(_name, msg.sender);
    }
    
    function getUser(address _address) public view returns (string memory, address) {
        User memory user = users[_address];
        return (user.name, user.walletAddress);
    }
}

環境変数を追加

npm i dotenv
.env.local
MINATO_PRIVATE_KEY="0x..." //秘密鍵の追加

hardhatのconfigを設定

hardhat.config.ts
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import dotenv from "dotenv";

dotenv.config();

const MINATO_PRIVATE_KEY = process.env.MINATO_PRIVATE_KEY || "";

const config: HardhatUserConfig = {
    solidity: "0.8.24",
    networks: {
        minato: {
            url: "https://rpc.minato.soneium.org",
            accounts: [MINATO_PRIVATE_KEY],
        },
    },
};

export default config;

いざMinatoにデプロイ!

npx hardhat ignition deploy ./ignition/modules/NameWalletAddress.ts --network minato

無事デプロイできてそう

✔ Confirm deploy to network minato (1946)? … yes
Hardhat Ignition 🚀

Deploying [ NameWalletAddress ]

Batch #1
  Executed NameWalletAddress#NameWalletAddress

[ NameWalletAddress ] successfully deployed 🚀

Deployed Addresses

NameWalletAddress#NameWalletAddress - 0x00..


https://explorer-testnet.soneium.org/address/0xA4009489491816B9DDa8B25496E656F43ab153ff

自分の名前を刻んでみる

scripts/saveName/index.ts
import { ethers } from "hardhat";

async function setUserName() {
    const c = await ethers.getContractAt("NameWalletAddress", contractAddress);
    const tx = await c.setUser(newName);

    // トランザクションの完了を待つ
    const res = await tx.wait();
    console.log("トランザクション完了");
    console.log("tx hash:", res?.hash);
}

const contractAddress = "0x..."; // コントラクトアドレス
const newName = "kazuma";
setUserName();

(余談)ついでにverifyしてみる

verifyのプラグインをインストール

import "@nomicfoundation/hardhat-verify";

configを修正

import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import dotenv from "dotenv";

dotenv.config();

const MINATO_PRIVATE_KEY = process.env.MINATO_PRIVATE_KEY || "";

const config: HardhatUserConfig = {
    solidity: "0.8.24",
    networks: {
        minato: {
            url: "https://rpc.minato.soneium.org",
            accounts: [MINATO_PRIVATE_KEY],
        },
    },
    etherscan: {
        apiKey: {
            minato: "",
        },
        customChains: [
            {
                network: "minato",
                chainId: 1946,
                urls: {
                    apiURL: "https://explorer-testnet.soneium.org/api",
                    browserURL: "https://explorer-testnet.soneium.org/",
                },
            },
        ],
    },
};

export default config;

verifyできた

Discussion