JPYC、Solidity、Polygon、Hardhat、スマートコントラクト、Web3、ブロックチェーン

¥100M発行を祝う!スマートコントラクトでのJPYCの活用方法 - 技術的視点(Solidity、Hardhat、Polygonを使用)

2025年11月10日

なぜ今JPYCに飛び込むべきか?

JPYCは日本円に連動したステーブルコインで、2025年10月27日に登場しました。日本のWeb3界で急成長を遂げ、発行額はわずか6日間で¥1億を超えました。

これまで日本でdAppsを構築している場合、ETHやMATICのような予測不可能な暗号通貨に頼るか、USDCのような海外のステーブルコインに依存せざるを得ませんでした。そのため、追加の面倒なしに円ベースのサービスを作成するのが難しかったのです。

しかしJPYCはゲームを変えます。これは日本の決済サービス法の下で正式に「電子決済手段」として認められています。これにより、円のユーザーにとって自然な操作感のある、よりスムーズで安全なWeb3アプリが実現します。このガイドでは、スマートコントラクトからJPYCとやり取りする方法を、本物のコードスニペットを用いて説明します。手数料が安く、取引が迅速なPolygonを利用し、基本的なJPYCを入金および出金するためのコントラクトを構築するためにHardhatとSolidityを使用します。

バージョンに関する簡単な注意点

これは2025年11月6日にテストしました。Web3のツールは素早く変化するため、ツールのアップデートによって後に問題が発生する可能性があります。最良の結果を得るためには、これらのバージョンを使用してください:

  • Hardhat: 2.22.4

  • @nomicfoundation/hardhat-toolbox: 5.0.0

  • @openzeppelin/contracts: 5.0.2

  • dotenv: 16.4.5

これをpackage.jsonに追加して、npm installを実行して一致させてください。

始めるために必要なもの

  • Node.js (v18以上が最適)

  • VS Codeのようなコードエディタ

  • アカウントを設定したMetaMaskウォレット拡張

  • ガス料金用にPolygonにあるMATIC(デプロイとトランザクション用)

  • テスト用の少しのJPYC—公式サイトの「JPYC EX」から数百円分を取得し、PolygonのMetaMaskに送信してください

ステップ1: Hardhatのセットアップ

ターミナルを開き、フォルダーを作成し、Hardhatプロジェクトを開始します:

mkdir jpyc-sc-tutorial
cd jpyc-sc-tutorial
npx hardhat

プロンプトに次のように答えてください:

  • 何をしますか? → JavaScriptプロジェクトを作成する

  • Hardhatプロジェクトのルート: → デフォルトのためEnterを押す

  • .gitignoreを追加しますか? → はい

  • npmで依存関係をインストールしますか? → はい

その後、これらをインストールしてください:

npm install @openzeppelin/contracts@5.0.2 dotenv@16.4.5

ルートに.envファイルを作成し、以下を追加してください:

POLYGON_RPC_URL="YOUR_ALCHEMY_OR_INFURA_POLYGON_RPC_URL"
PRIVATE_KEY="YOUR_METAMASK_PRIVATE_KEY"
  • AlchemyまたはInfuraからのPolygon RPCをここに置き換えます。

  • ここにあなたのMetaMaskの秘密鍵を使用してください—でも、内緒にしてください、本当に。

hardhat.config.jsを更新してください:

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

module.exports = {
  solidity: "0.8.20",
  networks: {
    polygon: {
      url: process.env.POLYGON_RPC_URL || "",
      accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],
    },
  },
};

ステップ2: スマートコントラクトの構築

contractsフォルダーで、サンプルのLock.solを捨ててJPYCHandler.solを作成します:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract JPYCHandler is Ownable {
    IERC20 public immutable jpycToken;

    event Deposit(address indexed user, uint256 amount);
    event Withdraw(address indexed owner, uint256 amount);

    address constant JPYC_POLYGON_ADDRESS = 0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB;

    constructor() Ownable(msg.sender) {
        jpycToken = IERC20(JPYC_POLYGON_ADDRESS);
    }

    /**
     * @dev Lets a user deposit JPYC into the contract.
     * @param _amount Amount of JPYC (with 18 decimals in mind).
     * Note: User needs to approve this contract first to spend their JPYC.
     */
    function depositJPYC(uint256 _amount) external {
        require(_amount > 0, "Amount must be greater than zero");
        uint256 allowance = jpycToken.allowance(msg.sender, address(this));
        require(allowance >= _amount, "Check the token allowance");
        bool success = jpycToken.transferFrom(msg.sender, address(this), _amount);
        require(success, "Transfer failed");
        emit Deposit(msg.sender, _amount);
    }

    /**
     * @dev Owner can pull out all JPYC from the contract.
     */
    function withdrawAllJPYC() external onlyOwner {
        uint256 balance = getContractBalance();
        require(balance > 0, "No JPYC to withdraw");
        jpycToken.transfer(owner(), balance);
        emit Withdraw(owner(), balance);
    }

    /**
     * @dev Check the contract's JPYC balance.
     * @return Balance in wei-like units.
     */
    function getContractBalance() public view returns (uint256) {
        return jpycToken.balanceOf(address(this));
    }
}

ステップ3: デプロイとインタラクション

さあ、これをオンチェーンにしてテストしましょう。

  1. デプロイメントスクリプト

scripts/deploy.jsを調整します:

const hre = require("hardhat");

async function main() {
  const jpycHandler = await hre.ethers.deployContract("JPYCHandler");
  await jpycHandler.waitForDeployment();
  console.log(`JPYCHandler deployed to: ${jpycHandler.target}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

実行します:

npx hardhat run scripts/deploy.js --network polygon

コンソールからデプロイされたアドレスを取得します。

  1. インタラクションスクリプト

scripts/interact.jsを追加します:

const { ethers } = require("hardhat");

// CONFIG
const JPYC_HANDLER_ADDRESS = "YOUR_DEPLOYED_CONTRACT_ADDRESS";
const JPYC_TOKEN_ADDRESS = "0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB";
const DEPOSIT_AMOUNT = ethers.parseUnits("10", 18); // JPYC has 18 decimals

async function main() {
  const [signer] = await ethers.getSigners();
  console.log("Using wallet:", signer.address);

  const jpycHandler = await ethers.getContractAt("JPYCHandler", JPYC_HANDLER_ADDRESS, signer);
  const jpycToken = await ethers.getContractAt("IERC20", JPYC_TOKEN_ADDRESS, signer);

  console.log("\\nApproving spend...");
  const approveTx = await jpycToken.approve(JPYC_HANDLER_ADDRESS, DEPOSIT_AMOUNT);
  await approveTx.wait();
  console.log("Approved. Tx:", approveTx.hash);

  console.log("\\nDepositing...");
  const depositTx = await jpycHandler.depositJPYC(DEPOSIT_AMOUNT);
  await depositTx.wait();
  console.log("Deposited. Tx:", depositTx.hash);

  const contractBalance = await jpycHandler.getContractBalance();
  console.log("\\nCheck balance:", ethers.formatUnits(contractBalance, 18) + " JPYC");
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

契約アドレスを入れ替えたら、実行してください:

npx hardhat run scripts/interact.js --network polygon

承認、入金、および10JPYCの残高が表示されるはずです。

まとめとさらなるアイデア

これで、コントラクト内でJPYCを取り扱う基本が分かりました。approve-then-transferFromパターンは、すべてのERC20作業のための鍵です—それに慣れておきましょう。

このシンプルなセットアップは、次のようなクールなことに発展させることができます:

  • eコマースの決済システム

  • ブログでのクリエイターへのチップ

  • Web3ゲーム用の安定したゲーム内通貨

JPYCが登場したことで、円を中心にしたWeb3プロジェクトには多くの可能性があります。このコードを取得し、調整し、素晴らしいものを構築してください。

このガイドをまとめたのは、JPYCを使った構築のためのしっかりとした出発点を提供するためです。Web3開発は時には曲者で、特に異なるバージョンや環境においてそうです。

ステップに従っても問題が発生した場合やコードに関する質問がある場合は、ぜひ気軽にお問い合わせください。喜んでお手伝いします。楽しい構築を!

なぜ今JPYCに飛び込むべきか?

JPYCは日本円に連動したステーブルコインで、2025年10月27日に登場しました。日本のWeb3界で急成長を遂げ、発行額はわずか6日間で¥1億を超えました。

これまで日本でdAppsを構築している場合、ETHやMATICのような予測不可能な暗号通貨に頼るか、USDCのような海外のステーブルコインに依存せざるを得ませんでした。そのため、追加の面倒なしに円ベースのサービスを作成するのが難しかったのです。

しかしJPYCはゲームを変えます。これは日本の決済サービス法の下で正式に「電子決済手段」として認められています。これにより、円のユーザーにとって自然な操作感のある、よりスムーズで安全なWeb3アプリが実現します。このガイドでは、スマートコントラクトからJPYCとやり取りする方法を、本物のコードスニペットを用いて説明します。手数料が安く、取引が迅速なPolygonを利用し、基本的なJPYCを入金および出金するためのコントラクトを構築するためにHardhatとSolidityを使用します。

バージョンに関する簡単な注意点

これは2025年11月6日にテストしました。Web3のツールは素早く変化するため、ツールのアップデートによって後に問題が発生する可能性があります。最良の結果を得るためには、これらのバージョンを使用してください:

  • Hardhat: 2.22.4

  • @nomicfoundation/hardhat-toolbox: 5.0.0

  • @openzeppelin/contracts: 5.0.2

  • dotenv: 16.4.5

これをpackage.jsonに追加して、npm installを実行して一致させてください。

始めるために必要なもの

  • Node.js (v18以上が最適)

  • VS Codeのようなコードエディタ

  • アカウントを設定したMetaMaskウォレット拡張

  • ガス料金用にPolygonにあるMATIC(デプロイとトランザクション用)

  • テスト用の少しのJPYC—公式サイトの「JPYC EX」から数百円分を取得し、PolygonのMetaMaskに送信してください

ステップ1: Hardhatのセットアップ

ターミナルを開き、フォルダーを作成し、Hardhatプロジェクトを開始します:

mkdir jpyc-sc-tutorial
cd jpyc-sc-tutorial
npx hardhat

プロンプトに次のように答えてください:

  • 何をしますか? → JavaScriptプロジェクトを作成する

  • Hardhatプロジェクトのルート: → デフォルトのためEnterを押す

  • .gitignoreを追加しますか? → はい

  • npmで依存関係をインストールしますか? → はい

その後、これらをインストールしてください:

npm install @openzeppelin/contracts@5.0.2 dotenv@16.4.5

ルートに.envファイルを作成し、以下を追加してください:

POLYGON_RPC_URL="YOUR_ALCHEMY_OR_INFURA_POLYGON_RPC_URL"
PRIVATE_KEY="YOUR_METAMASK_PRIVATE_KEY"
  • AlchemyまたはInfuraからのPolygon RPCをここに置き換えます。

  • ここにあなたのMetaMaskの秘密鍵を使用してください—でも、内緒にしてください、本当に。

hardhat.config.jsを更新してください:

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

module.exports = {
  solidity: "0.8.20",
  networks: {
    polygon: {
      url: process.env.POLYGON_RPC_URL || "",
      accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],
    },
  },
};

ステップ2: スマートコントラクトの構築

contractsフォルダーで、サンプルのLock.solを捨ててJPYCHandler.solを作成します:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract JPYCHandler is Ownable {
    IERC20 public immutable jpycToken;

    event Deposit(address indexed user, uint256 amount);
    event Withdraw(address indexed owner, uint256 amount);

    address constant JPYC_POLYGON_ADDRESS = 0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB;

    constructor() Ownable(msg.sender) {
        jpycToken = IERC20(JPYC_POLYGON_ADDRESS);
    }

    /**
     * @dev Lets a user deposit JPYC into the contract.
     * @param _amount Amount of JPYC (with 18 decimals in mind).
     * Note: User needs to approve this contract first to spend their JPYC.
     */
    function depositJPYC(uint256 _amount) external {
        require(_amount > 0, "Amount must be greater than zero");
        uint256 allowance = jpycToken.allowance(msg.sender, address(this));
        require(allowance >= _amount, "Check the token allowance");
        bool success = jpycToken.transferFrom(msg.sender, address(this), _amount);
        require(success, "Transfer failed");
        emit Deposit(msg.sender, _amount);
    }

    /**
     * @dev Owner can pull out all JPYC from the contract.
     */
    function withdrawAllJPYC() external onlyOwner {
        uint256 balance = getContractBalance();
        require(balance > 0, "No JPYC to withdraw");
        jpycToken.transfer(owner(), balance);
        emit Withdraw(owner(), balance);
    }

    /**
     * @dev Check the contract's JPYC balance.
     * @return Balance in wei-like units.
     */
    function getContractBalance() public view returns (uint256) {
        return jpycToken.balanceOf(address(this));
    }
}

ステップ3: デプロイとインタラクション

さあ、これをオンチェーンにしてテストしましょう。

  1. デプロイメントスクリプト

scripts/deploy.jsを調整します:

const hre = require("hardhat");

async function main() {
  const jpycHandler = await hre.ethers.deployContract("JPYCHandler");
  await jpycHandler.waitForDeployment();
  console.log(`JPYCHandler deployed to: ${jpycHandler.target}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

実行します:

npx hardhat run scripts/deploy.js --network polygon

コンソールからデプロイされたアドレスを取得します。

  1. インタラクションスクリプト

scripts/interact.jsを追加します:

const { ethers } = require("hardhat");

// CONFIG
const JPYC_HANDLER_ADDRESS = "YOUR_DEPLOYED_CONTRACT_ADDRESS";
const JPYC_TOKEN_ADDRESS = "0x431D5dfF03120AFA4bDf332c61A6e1766eF37BDB";
const DEPOSIT_AMOUNT = ethers.parseUnits("10", 18); // JPYC has 18 decimals

async function main() {
  const [signer] = await ethers.getSigners();
  console.log("Using wallet:", signer.address);

  const jpycHandler = await ethers.getContractAt("JPYCHandler", JPYC_HANDLER_ADDRESS, signer);
  const jpycToken = await ethers.getContractAt("IERC20", JPYC_TOKEN_ADDRESS, signer);

  console.log("\\nApproving spend...");
  const approveTx = await jpycToken.approve(JPYC_HANDLER_ADDRESS, DEPOSIT_AMOUNT);
  await approveTx.wait();
  console.log("Approved. Tx:", approveTx.hash);

  console.log("\\nDepositing...");
  const depositTx = await jpycHandler.depositJPYC(DEPOSIT_AMOUNT);
  await depositTx.wait();
  console.log("Deposited. Tx:", depositTx.hash);

  const contractBalance = await jpycHandler.getContractBalance();
  console.log("\\nCheck balance:", ethers.formatUnits(contractBalance, 18) + " JPYC");
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

契約アドレスを入れ替えたら、実行してください:

npx hardhat run scripts/interact.js --network polygon

承認、入金、および10JPYCの残高が表示されるはずです。

まとめとさらなるアイデア

これで、コントラクト内でJPYCを取り扱う基本が分かりました。approve-then-transferFromパターンは、すべてのERC20作業のための鍵です—それに慣れておきましょう。

このシンプルなセットアップは、次のようなクールなことに発展させることができます:

  • eコマースの決済システム

  • ブログでのクリエイターへのチップ

  • Web3ゲーム用の安定したゲーム内通貨

JPYCが登場したことで、円を中心にしたWeb3プロジェクトには多くの可能性があります。このコードを取得し、調整し、素晴らしいものを構築してください。

このガイドをまとめたのは、JPYCを使った構築のためのしっかりとした出発点を提供するためです。Web3開発は時には曲者で、特に異なるバージョンや環境においてそうです。

ステップに従っても問題が発生した場合やコードに関する質問がある場合は、ぜひ気軽にお問い合わせください。喜んでお手伝いします。楽しい構築を!

Web3の技術を活用して、あなたのビジョンを実現へと導きます

ブロックチェーンの未来へ共に歩み出しましょう。高度な安全性とスケーラビリティを備えた革新的なWeb3ソリューションにより、あなたのビジネスに新たな可能性を切り拓きます。

Web3の技術を活用して、あなたのビジョンを実現へと導きます

ブロックチェーンの未来へ共に歩み出しましょう。高度な安全性とスケーラビリティを備えた革新的なWeb3ソリューションにより、あなたのビジネスに新たな可能性を切り拓きます。

Web3の技術を活用して、あなたのビジョンを実現へと導きます

ブロックチェーンの未来へ共に歩み出しましょう。高度な安全性とスケーラビリティを備えた革新的なWeb3ソリューションにより、あなたのビジネスに新たな可能性を切り拓きます。