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: デプロイとインタラクション
さあ、これをオンチェーンにしてテストしましょう。
デプロイメントスクリプト
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
コンソールからデプロイされたアドレスを取得します。
インタラクションスクリプト
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: デプロイとインタラクション
さあ、これをオンチェーンにしてテストしましょう。
デプロイメントスクリプト
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
コンソールからデプロイされたアドレスを取得します。
インタラクションスクリプト
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開発は時には曲者で、特に異なるバージョンや環境においてそうです。
ステップに従っても問題が発生した場合やコードに関する質問がある場合は、ぜひ気軽にお問い合わせください。喜んでお手伝いします。楽しい構築を!


