From 8f87c9bfbd22f9ab37d59219d5e4411e89ac4a36 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 07:21:20 +0000 Subject: [PATCH] Add Japanese translation for EVM Developers section Generated-By: mintlify-agent --- .gitbook/docs.json | 57 ++++ .../add-injective-to-your-dapp.mdx | 65 ++++ .../ja/developers-evm/bank-precompile.mdx | 49 +++ .../dapps/connect-with-metamask.mdx | 291 ++++++++++++++++++ .../dapps/connect-with-walletconnect.mdx | 118 +++++++ .gitbook/ja/developers-evm/dapps/index.mdx | 15 + .gitbook/ja/developers-evm/erc20-module.mdx | 21 ++ .../ja/developers-evm/evm-equivalence.mdx | 42 +++ .../evm-integrations-cheat-sheet.mdx | 132 ++++++++ .../developers-evm/evm-integrations-faq.mdx | 110 +++++++ .../ja/developers-evm/exchange-precompile.mdx | 168 ++++++++++ .gitbook/ja/developers-evm/index.mdx | 46 +++ .../infrastructure-and-tooling.mdx | 39 +++ .../developers-evm/multivm-token-standard.mdx | 99 ++++++ .../ja/developers-evm/network-information.mdx | 118 +++++++ .../permissioned-multivm-token.mdx | 161 ++++++++++ .gitbook/ja/developers-evm/precompiles.mdx | 79 +++++ .../smart-contracts/compile-foundry.mdx | 150 +++++++++ .../smart-contracts/compile-hardhat.mdx | 144 +++++++++ .../smart-contracts/deploy-foundry.mdx | 50 +++ .../smart-contracts/deploy-hardhat.mdx | 58 ++++ .../developers-evm/smart-contracts/index.mdx | 35 +++ .../smart-contracts/interact-foundry.mdx | 136 ++++++++ .../smart-contracts/interact-hardhat.mdx | 118 +++++++ .../smart-contracts/test-foundry.mdx | 84 +++++ .../smart-contracts/test-hardhat.mdx | 88 ++++++ .../smart-contracts/verify-foundry.mdx | 80 +++++ .../smart-contracts/verify-hardhat.mdx | 100 ++++++ .gitbook/ja/developers-evm/wrapped-inj.mdx | 121 ++++++++ 29 files changed, 2774 insertions(+) create mode 100644 .gitbook/ja/developers-evm/add-injective-to-your-dapp.mdx create mode 100644 .gitbook/ja/developers-evm/bank-precompile.mdx create mode 100644 .gitbook/ja/developers-evm/dapps/connect-with-metamask.mdx create mode 100644 .gitbook/ja/developers-evm/dapps/connect-with-walletconnect.mdx create mode 100644 .gitbook/ja/developers-evm/dapps/index.mdx create mode 100644 .gitbook/ja/developers-evm/erc20-module.mdx create mode 100644 .gitbook/ja/developers-evm/evm-equivalence.mdx create mode 100644 .gitbook/ja/developers-evm/evm-integrations-cheat-sheet.mdx create mode 100644 .gitbook/ja/developers-evm/evm-integrations-faq.mdx create mode 100644 .gitbook/ja/developers-evm/exchange-precompile.mdx create mode 100644 .gitbook/ja/developers-evm/index.mdx create mode 100644 .gitbook/ja/developers-evm/infrastructure-and-tooling.mdx create mode 100644 .gitbook/ja/developers-evm/multivm-token-standard.mdx create mode 100644 .gitbook/ja/developers-evm/network-information.mdx create mode 100644 .gitbook/ja/developers-evm/permissioned-multivm-token.mdx create mode 100644 .gitbook/ja/developers-evm/precompiles.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/compile-foundry.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/compile-hardhat.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/deploy-foundry.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/deploy-hardhat.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/index.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/interact-foundry.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/interact-hardhat.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/test-foundry.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/test-hardhat.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/verify-foundry.mdx create mode 100644 .gitbook/ja/developers-evm/smart-contracts/verify-hardhat.mdx create mode 100644 .gitbook/ja/developers-evm/wrapped-inj.mdx diff --git a/.gitbook/docs.json b/.gitbook/docs.json index 46996eed..87f5a6af 100644 --- a/.gitbook/docs.json +++ b/.gitbook/docs.json @@ -1690,6 +1690,63 @@ ] } ] + }, + { + "language": "ja", + "groups": [ + { + "group": "INJECTIVE", + "pages": [ + { + "group": "EVM開発者", + "icon": "rectangle-code", + "expanded": false, + "pages": [ + "ja/developers-evm/index", + "ja/developers-evm/network-information", + { + "group": "初めてのEVMスマートコントラクト", + "pages": [ + "ja/developers-evm/smart-contracts/index", + "ja/developers-evm/smart-contracts/compile-hardhat", + "ja/developers-evm/smart-contracts/test-hardhat", + "ja/developers-evm/smart-contracts/deploy-hardhat", + "ja/developers-evm/smart-contracts/verify-hardhat", + "ja/developers-evm/smart-contracts/interact-hardhat", + "ja/developers-evm/smart-contracts/compile-foundry", + "ja/developers-evm/smart-contracts/test-foundry", + "ja/developers-evm/smart-contracts/deploy-foundry", + "ja/developers-evm/smart-contracts/verify-foundry", + "ja/developers-evm/smart-contracts/interact-foundry" + ] + }, + { + "group": "初めてのEVM dApp", + "pages": [ + "ja/developers-evm/dapps/index", + "ja/developers-evm/dapps/connect-with-metamask", + "ja/developers-evm/dapps/connect-with-walletconnect" + ] + }, + "ja/developers-evm/evm-equivalence", + "ja/developers-evm/multivm-token-standard", + "ja/developers-evm/permissioned-multivm-token", + "ja/developers-evm/wrapped-inj", + "ja/developers-evm/precompiles", + "ja/developers-evm/bank-precompile", + "ja/developers-evm/exchange-precompile", + "ja/developers-evm/erc20-module", + "ja/developers-evm/infrastructure-and-tooling", + "ja/developers-evm/add-injective-to-your-dapp", + "ja/developers-evm/evm-integrations-cheat-sheet", + "ja/developers-evm/evm-integrations-faq", + "redirects/https_testnet_faucet_injective_network", + "redirects/https_testnet_blockscout_injective_network_blocks" + ] + } + ] + } + ] } ] }, diff --git a/.gitbook/ja/developers-evm/add-injective-to-your-dapp.mdx b/.gitbook/ja/developers-evm/add-injective-to-your-dapp.mdx new file mode 100644 index 00000000..f3f79a47 --- /dev/null +++ b/.gitbook/ja/developers-evm/add-injective-to-your-dapp.mdx @@ -0,0 +1,65 @@ +--- +title: dAppにInjectiveを追加する +--- + +# dAppにInjectiveを追加する + +ワンクリックでユーザーがInjectiveネットワークに接続できるようにします。 + +以下のコードスニペットを使用して、dAppに「Add Injective Network」ボタンを追加し、ユーザーがMetaMaskまたはEVM互換ウォレットにInjectiveを簡単に追加できるようにします。 + +1. スニペットをフロントエンドのコードベースにコピー&ペーストします。 +2. `addInjectiveNetwork`関数を好みのUIボタンに接続します。 +3. 以上です。ユーザーは数秒でウォレットにInjectiveを追加できるようになります。 + +```tsx +// Network configuration +const INJECTIVE_MAINNET_CONFIG = { + chainId: '0x6f0', // 1776 in decimal + chainName: 'Injective', + rpcUrls: ['https://evm-rpc.injective.network'], + nativeCurrency: { + name: 'Injective', + symbol: 'INJ', + decimals: 18 + }, + blockExplorerUrls: ['https://explorer.injective.network'] +}; + +async function addInjectiveNetwork() { + // Check if MetaMask or another Web3 wallet is installed + if (!window.ethereum) { + alert('Please install MetaMask or another Web3 wallet!'); + return; + } + + try { + // First, try to switch to the Injective network + await window.ethereum.request({ + method: 'wallet_switchEthereumChain', + params: [{ chainId: INJECTIVE_MAINNET_CONFIG.chainId }], + }); + + console.log('Switched to Injective network successfully!'); + } catch (switchError) { + // Error code 4902 means the network hasn't been added yet + if (switchError.code === 4902) { + try { + // Add the Injective network + await window.ethereum.request({ + method: 'wallet_addEthereumChain', + params: [INJECTIVE_MAINNET_CONFIG], + }); + + console.log('Injective network added successfully!'); + } catch (addError) { + console.error('Failed to add Injective network:', addError); + alert('Failed to add Injective network. Please try again.'); + } + } else { + console.error('Failed to switch network:', switchError); + alert('Failed to switch to Injective network.'); + } + } +} +``` diff --git a/.gitbook/ja/developers-evm/bank-precompile.mdx b/.gitbook/ja/developers-evm/bank-precompile.mdx new file mode 100644 index 00000000..b1a29063 --- /dev/null +++ b/.gitbook/ja/developers-evm/bank-precompile.mdx @@ -0,0 +1,49 @@ +--- +title: Bank Precompile +--- + +# Bank Precompile + +Bank Precompileは、固定アドレス`0x0000000000000000000000000000000000000064`に存在するシステムスマートコントラクトです。 + +EVM開発者に、Injectiveの**bankモジュール**(`x/bank`)と直接インタラクションするためのgas効率が良くネイティブな手段を提供します。これにより、ERC-20トークンを効果的にオンチェーンに導入できます。Bank precompileを使用するERC-20コントラクトは、オンチェーンで`erc20:0x...` denomとして表現されます。技術的には、トークンはオンチェーンにのみ存在し、EVMはチェーン状態へのビューを提供するだけで、別のコピーを維持しません。2つのトークンバージョンの切り替えにユーザーアクションが必要な従来のブリッジとは異なり、Bank precompileはオンチェーンのbank denomまたはERC-20 `transfer()`メソッドのいずれかを使用した転送に対してリアルタイムのデュアル環境反映を提供します。 + +Bank precompileに基づくERC-20実装の一連のコントラクト、precompileインターフェース、抽象コントラクトが[InjectiveのSolidity Contractsリポジトリ](https://github.com/InjectiveLabs/solidity-contracts)で利用可能です。主要なコントラクトは以下の通りです: + +* **Bank.sol** – precompileインターフェース +* **BankERC20.sol** – Bank precompileに基づく抽象ERC20実装 +* **FixedSupplyBankERC20.sol** – 固定サプライの分散型ERC20(オーナーなし、mintおよびburnなし) +* **MintBurnBankERC20.sol** – オーナーがmintとburnを許可されたERC20 + +これらの実装はOpenZeppelinのERC20コントラクトに基づいています。開発者はBank precompileを利用したカスタムERC20コントラクトを自由に作成できます。 + +## ERC20コントラクトのデプロイ + +**ℹ️ 注意:** + +denom spamを防止するため、ERC20モジュールを介したERC20コントラクトのデプロイは**有料操作**であり、デプロイ手数料として**1 INJ**が必要です。ERC20コントラクトのデプロイトランザクションにこの金額を含めてください。含めない場合、操作は拒否されます。 + +## Bank Precompileインターフェース + +```solidity +interface IBankModule { + function mint(address,uint256) external payable returns (bool); + function balanceOf(address,address) external view returns (uint256); + function burn(address,uint256) external payable returns (bool); + function transfer(address,address,uint256) external payable returns (bool); + function totalSupply(address) external view returns (uint256); + function metadata(address) external view returns (string memory,string memory,uint8); + function setMetadata(string memory,string memory,uint8) external payable returns (bool); +} +``` + +## 例 + +[Wrapped INJ (wINJ)](/developers-evm/wrapped-inj#is-winj-the-same-as-weth "wINJはwETHと同じですか?")は、 +[MultiVM Token Standard (MTS)](/developers-evm/multivm-token-standard)を実装するためにBank EVM precompileを利用しています。 + +## ビルドを開始する + +Bank、Exchange、Staking precompileを使用したコントラクトの構築方法を示すデモを用意しました。これらの例では、最も一般的なEthereum開発フレームワークである**Foundry**を使用してInjective EVMとインタラクションする方法も示しています。 + +Bank precompileのデモは[こちら](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos/erc20)から、対応するREADMEに従ってください。 diff --git a/.gitbook/ja/developers-evm/dapps/connect-with-metamask.mdx b/.gitbook/ja/developers-evm/dapps/connect-with-metamask.mdx new file mode 100644 index 00000000..00ed93ec --- /dev/null +++ b/.gitbook/ja/developers-evm/dapps/connect-with-metamask.mdx @@ -0,0 +1,291 @@ +--- +title: MetaMaskで接続する +--- + +## MetaMaskをInjective EVMテストネットに接続する + +MetaMaskは、Injective EVMを含むEVM互換ネットワークに接続できるブラウザウォレット拡張機能です。 + +### MetaMaskのインストール方法 + +[MetaMaskダウンロードページ](https://metamask.io/download)から公式MetaMask拡張機能をインストールします。 + +### Injective EVMテストネットをMetaMaskに追加する + +1. ブラウザの**MetaMaskアイコン**をクリックしてウォレットのロックを解除します。 +2. 上部の**ネットワークセレクター**をクリックします(デフォルトは「Ethereum Mainnet」)。 +3. **「ネットワークを追加」**または**「ネットワークを手動で追加」**を選択してカスタムネットワークフォームを開きます。 + +#### Injective EVMテストネットパラメータ + +以下の詳細を入力します: + +```json +Network Name: Injective EVM Testnet +Chain ID: 1439 +RPC URL: https://k8s.testnet.json-rpc.injective.network/ +Currency Symbol: INJ +Block Explorer URL: https://testnet.blockscout.injective.network/blocks +``` + +> _注: Block Explorer URLはオプションで、BlockScoutを使用しています。_ + +### Injective EVMテストネットに切り替える + +ネットワークが追加されたら、ネットワークセレクターを使用して**Injective EVMテストネット**に切り替えます。 + +### ウォレットに資金を追加する(オプション) + +テストネットINJが必要ですか?[Injectiveテストネットfaucet](https://testnet.faucet.injective.network)にアクセスしてください。 + +テストネットブロックに含まれると、資金が表示されます。 + +*** + +### 準備完了! + +MetaMaskが**Injective EVMテストネット**に接続されました。以下のことが可能です: + +* **Foundry**、**Hardhat**、**Remix**などのツールを使用してスマートコントラクトをデプロイする。 +* テストネットのdAppやコントラクトとインタラクションする。 +* Blockscoutエクスプローラーでトランザクションを確認する。 + +> **ヒント:** RPC URLとChain IDは常に正確に確認してください。設定ミスを避けるために重要です。 + +*** + +### ethers.jsでMetaMaskを接続する + +[`ethers`](https://docs.ethers.org/)を使用してプログラムからMetaMaskに接続することもできます。 + +#### サンプルコード + +```ts +import { ethers } from 'ethers'; + +export const INJECTIVE_EVM_PARAMS = { + chainId: '0x59f', // 1439 in hexadecimal + chainName: 'Injective EVM', + rpcUrls: ['https://k8s.testnet.json-rpc.injective.network/'], + nativeCurrency: { + name: 'Injective', + symbol: 'INJ', + decimals: 18, + }, + blockExplorerUrls: ['https://testnet.blockscout.injective.network/blocks'], +}; + +export async function connectMetaMask() { + if (typeof window.ethereum === 'undefined') { + alert('MetaMask not installed!'); + return; + } + + const provider = new ethers.providers.Web3Provider(window.ethereum); + + try { + await window.ethereum.request({ + method: 'wallet_addEthereumChain', + params: [INJECTIVE_EVM_PARAMS], + }); + + await provider.send('eth_requestAccounts', []); + const signer = provider.getSigner(); + const address = await signer.getAddress(); + + console.log('Connected address:', address); + return { provider, signer, address }; + } catch (err) { + console.error('MetaMask connection failed:', err); + } +} +``` + +### ethers.jsを使用してスマートコントラクトとインタラクションする + +counterコントラクトABIのサンプルコード: + +```tsx +// abi/counterAbi.ts +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "UserRevert", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], + "name": "ValueSet", + "type": "event" + }, + { + "inputs": [], + "name": "increment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "number", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newNumber", + "type": "uint256" + } + ], + "name": "setNumber", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "userRevert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] +``` + +```javascript +import { ethers } from 'ethers' +import { counterAbi } from './abi/counterAbi' +import { INJECTIVE_EVM_PARAMS } from './config' // From separate file + +// Replace with your deployed contract address +const contractAddress = '0xYourContractAddressHere' + +async function connectAndInteract() { + if (!window.ethereum) { + alert('MetaMask is not installed!') + return + } + + // Request Injective EVM Network be added to MetaMask + await window.ethereum.request({ + method: 'wallet_addEthereumChain', + params: [ + { + chainId: INJECTIVE_EVM_PARAMS.chainHex, + chainName: INJECTIVE_EVM_PARAMS.chainName, + rpcUrls: [INJECTIVE_EVM_PARAMS.rpcUrl], + nativeCurrency: INJECTIVE_EVM_PARAMS.nativeCurrency, + blockExplorerUrls: [INJECTIVE_EVM_PARAMS.blockExplorer], + }, + ], + }) + + const provider = new ethers.providers.Web3Provider(window.ethereum) + await provider.send('eth_requestAccounts', []) + const signer = provider.getSigner() + const userAddress = await signer.getAddress() + console.log('Connected as:', userAddress) + + // Contract instance + const contract = new ethers.Contract(contractAddress, counterAbi, signer) + + // Send transaction to increment + const tx = await contract.increment() + console.log('Transaction sent:', tx.hash) + + const receipt = await tx.wait() + console.log('Transaction mined in block:', receipt.blockNumber) +} + +connectAndInteract().catch(console.error) +``` + +### viemを使用してスマートコントラクトとインタラクションする + +サンプルコード + +```javascript +import { counterAbi } from './abi/counterAbi' +import { INJECTIVE_EVM_PARAMS } from './config' +import { createPublicClient, http } from 'viem' +import { createWalletClient, custom, defineChain, formatEther } from 'viem' + +// Replace with your deployed contract address +const contractAddress = '0xYourContractAddressHere' + +async function connectAndInteract() { + if (typeof window === 'undefined' || typeof window.ethereum === 'undefined') { + alert('MetaMask is not installed!') + return + } + + const client = createWalletClient({ + chain: INJECTIVE_EVM_PARAMS, + transport: custom(window.ethereum), + }) + + // Create a PublicClient for reading contract state + const publicClient = createPublicClient({ + chain: injectiveEvm, + transport: http(), + }) + + const [account] = await client.requestAddresses() + console.log('Connected account:', account) + + // Send transaction to increment using wallet client + const hash = await client.writeContract({ + address: contractAddress, + abi: counterAbi, + functionName: 'increment', + account, + }) + + console.log('Transaction sent with hash:', hash) +} + +connectAndInteract().catch(console.error) +``` diff --git a/.gitbook/ja/developers-evm/dapps/connect-with-walletconnect.mdx b/.gitbook/ja/developers-evm/dapps/connect-with-walletconnect.mdx new file mode 100644 index 00000000..dbecff18 --- /dev/null +++ b/.gitbook/ja/developers-evm/dapps/connect-with-walletconnect.mdx @@ -0,0 +1,118 @@ +--- +title: WalletConnectで接続する +--- + +WalletConnectは、ウォレットとWeb3アプリケーションを安全にリンクするオープンソースのチェーンに依存しないプロトコルです。ブリッジサーバーを使用して暗号化されたメッセージを中継し、QRコードのスキャンやディープリンクを介してユーザーが秘密鍵を公開せずに接続できるようにします。 + +### WalletConnectの統合手順 + +#### 前提条件 + +[WalletConnect Cloud](https://cloud.walletconnect.com)に登録し、**プロジェクトID**を取得します。 + +*** + +#### 依存関係のインストール + +```bash +npm install ethers wagmi viem @walletconnect/ethereum-provider +``` + +Injective EVMネットワーク設定のセットアップ + +```javascript +// lib/injectiveChain.ts +import { defineChain } from 'viem' + +export const injectiveEvm = defineChain({ + id: 1439, + name: 'Injective EVM', + nativeCurrency: { + name: 'INJ', + symbol: 'INJ', + decimals: 18, + }, + rpcUrls: { + default: { http: ['https://k8s.testnet.json-rpc.injective.network'] }, + }, + blockExplorers: { + default: { name: 'InjectiveScan', url: 'https://testnet.blockscout.injective.network/blocks' }, + }, +}) +``` + +Wagmi + WalletConnectのセットアップ + +```javascript + // lib/wagmi.ts +import { walletConnect } from '@wagmi/connectors' +import { createConfig, http } from '@wagmi/core' +import { injectiveEvm } from './injectiveChain' + +export const wagmiConfig = createConfig({ + chains: [injectiveEvm], + connectors: [ + walletConnect({ + projectId: 'your-walletconnect-project-id', // From WalletConnect Cloud + showQrModal: true, + }), + ], + transports: { + [injectiveEvm.id]: http(injectiveEvm.rpcUrls.default.http[0]), + }, +}) + +``` + +プロジェクトへの統合 + +```javascript +'use client' + +import Image from 'next/image' +import { wagmiConfig } from './providers' +import { useConnect, useAccount, WagmiProvider } from 'wagmi' +import { QueryClientProvider, QueryClient } from '@tanstack/react-query' + +export const queryClient = new QueryClient() + +function WalletConnector() { + const { connectors, connect, isPending } = useConnect() + const { address, isConnected } = useAccount() + const wcConnector = connectors.find(c => c.id === 'walletConnect') + + return ( +
+ {isConnected ? ( +

Connected to {address}

+ ) : ( + + )} +
+ ) +} + +export default function Home() { + return ( + + + + + + ) +} + +``` + +*** + +その他の情報 + +* WalletConnectドキュメント: [https://docs.walletconnect.com](https://docs.walletconnect.com) +* WalletConnect公式サンプル: [https://github.com/WalletConnect/web-examples](https://github.com/WalletConnect/web-examples) diff --git a/.gitbook/ja/developers-evm/dapps/index.mdx b/.gitbook/ja/developers-evm/dapps/index.mdx new file mode 100644 index 00000000..2bc2fba7 --- /dev/null +++ b/.gitbook/ja/developers-evm/dapps/index.mdx @@ -0,0 +1,15 @@ +--- +description: MetaMaskまたはWalletConnectでウォレットを接続 +title: 初めてのEVM dApp +--- + +dAppは、ブロックチェーン(通常はスマートコントラクト)とインタラクションするフロントエンドアプリケーションです。 + +まず[初めてのEVMスマートコントラクト](/developers-evm/smart-contracts/)をご確認ください! + +以下のガイドでは、異なるEVMウォレットとライブラリを使用した接続方法を紹介します。 + +## ガイド + +* [MetaMaskで接続する](/developers-evm/dapps/connect-with-metamask/) +* [WalletConnectで接続する](/developers-evm/dapps/connect-with-walletconnect/) diff --git a/.gitbook/ja/developers-evm/erc20-module.mdx b/.gitbook/ja/developers-evm/erc20-module.mdx new file mode 100644 index 00000000..c4e8167d --- /dev/null +++ b/.gitbook/ja/developers-evm/erc20-module.mdx @@ -0,0 +1,21 @@ +--- +title: ERC20 Module +--- + +### ERC20 Module + +ERC20モジュールは、**既存の**bank denom(例:IBCブリッジされたトークン、USDC、tokenfactory、Peggy)をInjective EVMに統合することを可能にします。このモジュールは、ストレージ内でトークンペア間のマッピングを維持し、ERC20トークンと対応するbank denom間の関連付けを作成します。既存のbank denom用に新しいトークンペアが生成されると、モジュールはBank precompileとインタラクションするERC20コントラクトをデプロイし、ストレージマッピングを参照してERC20アドレスを対応するbank denomに整合させます。このモジュールは以下の重要な目的を果たします: + +1. **ストレージ**: bank denom ↔ ERC20アドレス間のマッピング +2. **新しいメッセージタイプ**: ユーザーがチェーンメッセージを発行して新しいトークンペアマッピングを確立できるようにする + +#### 新しいトークンペアの作成 + +現在、3種類のbank denomにトークンペアを関連付けることができ、それぞれに特定のルールがあります: + +* **Tokenfactory (`factory/...`)**\ + denomの管理者またはgovernanceのみがトークンペアを作成できます。送信者は、カスタム実装として既存のERC20コントラクトアドレスを指定できます。省略した場合、`MintBurnBankERC20.sol`の新しいインスタンスがデプロイされ、`msg.sender`がオーナーとなり、コントラクトを通じたmintとburnが可能になります。 +* **IBC (`ibc/...`)**\ + IBC denomは、トークンペア作成を通じて任意のユーザーがEVMに統合できますが、カスタムERC20アドレスのオプションはありません。常にオーナーなしの`FixedSupplyBankERC20.sol`の新しいインスタンスがデプロイされます。 +* **Peggy (`peggy0x...`)**\ + Peggy denomは、トークンペア作成を通じて任意のユーザーがEVMに統合できますが、カスタムERC20アドレスのオプションはありません。常にオーナーなしの`FixedSupplyBankERC20.sol`の新しいインスタンスがデプロイされます。 diff --git a/.gitbook/ja/developers-evm/evm-equivalence.mdx b/.gitbook/ja/developers-evm/evm-equivalence.mdx new file mode 100644 index 00000000..c38ec315 --- /dev/null +++ b/.gitbook/ja/developers-evm/evm-equivalence.mdx @@ -0,0 +1,42 @@ +--- +description: InjectiveにおけるEVM Equivalenceの理解 +title: EVM Equivalence +--- + +## Injective EVM vs. Ethereum Mainnet + +InjectiveのネイティブEVMは、チェーンのコアアーキテクチャに統合された完全な組み込み実行環境です。開発体験においてEthereumと1:1の同等性を持つように設計されています。 + +InjectiveのネイティブEVMは最新バージョンの `geth` をサポートしており、開発者は最新の機能、ツール、セキュリティパッチ、改善点にアクセスできます。さらに、InjectiveのEVMはパフォーマンスを向上させ、機能を拡張し、Ethereumで利用可能なものを超えるInjectiveの高度な金融インフラストラクチャへのアクセスを提供します。 + +## トランザクションのgas fee見積もり + +| チェーン | Gas Price範囲 | トークン価格 | ERC-4337アカウント作成 | シンプル転送 | ERC-20転送 | +| --- | --- | --- | --- | --- | --- | +| Ethereum¹ | 30.5 ± 10.6 gwei | $3000 | $35.25 ± $12.25 | $1.9215 ± $0.6678 | $5.9475 ± $2.067 | +| Polygon² | 224 ± 108 gwei | $0.4 | $0.0345 ± $0.0166 | $0.0018 ± $0.0009 | $0.0058 ± $0.0028 | +| Optimism³ | 0.30 ± 0.15 gwei | $3000 | $0.3467 ± $0.1733 | $0.0189 ± $0.0094 | $0.0585 ± $0.0292 | +| Avalanche⁴ | 36.4 ± 4.5 nAVAX | $28 | $0.3926 ± $0.0485 | $0.0214 ± $0.0026 | $0.0662 ± $0.0081 | +| BnB Smart Chain⁵ | 7.05 ± 0.53 gwei | $600 | $1.6296 ± $0.1225 | $0.0888 ± $0.0066 | $0.2749 ± $0.0206 | +| Sei⁶ | 0.02 usei | $0.40 | $0.0030 | $0.00017 | $0.0005 | +| Injective⁷ | 0.16 nINJ | $23 | $0.0014 | $0.00008 | $0.0002 | + +### 注: アクションごとのgas + +* ERC-4337アカウント作成: `385266` +* シンプル転送: `21000` +* ERC-20トークン転送: `65000` + +### Gas Priceのソース + +1. [Ethereum Gas Price Source](https://etherscan.io/chart/gasprice) ↩︎ +2. [Polygon Gas Price Source](https://polygonscan.com/chart/gasprice) ↩︎ +3. [Optimism Gas Price Source](https://optimistic.etherscan.io/chart/gasprice) ↩︎ +4. [Avalanche Gas Price Source](https://snowtrace.io/insight/leaderboard/gas-tracker) ↩︎ +5. [BnB Smart Chain Gas Price Source](https://bscscan.com/chart/gasprice) ↩︎ +6. [Sei Gas Prices Config](https://github.com/sei-protocol/chain-registry/blob/main/gas.json) ↩︎ +7. [Injective Launches Gas Compression](https://injective.com/blog/injective-unveils-fee-reductions-with-gas-compression/) ↩︎ + +## EIP-1559設定 + +近日公開予定。 diff --git a/.gitbook/ja/developers-evm/evm-integrations-cheat-sheet.mdx b/.gitbook/ja/developers-evm/evm-integrations-cheat-sheet.mdx new file mode 100644 index 00000000..146fc98a --- /dev/null +++ b/.gitbook/ja/developers-evm/evm-integrations-cheat-sheet.mdx @@ -0,0 +1,132 @@ +--- +title: "EVM統合チートシート" +description: Injective EVM Mainnetで本番アプリケーションを構築しようとしていますか?統合を素早く進めるための便利なリファレンスです。新規デプロイメントとクロスチェーンデプロイメントの両方に適しています。 +--- + +# ネットワーク設定 + +- Chain ID: `1776` + +リファレンス: [EVMネットワーク情報 | Injective | Docs](/developers-evm/network-information#injective-evm-mainnet) + + +inEVMは**非推奨**となっているため、使用**しないで**ください。 + + +# エクスプローラー + +- [https://blockscout.injective.network/](https://blockscout.injective.network/) → EVMトランザクションのみ表示可能 +- [https://injscan.com/](https://injscan.com/) → EVMとCosmosの両方のトランザクションを表示可能 + +リファレンス: [EVMネットワーク情報 | Injective | Docs](/developers-evm/network-information#injective-evm-mainnet) + +# RPCエンドポイント + +- 統合パートナーに推奨 + - アプリケーションのニーズに合わせてカスタマイズ可能 + - カスタマイズ可能なレート制限、履歴データクエリのカットオフなし + - フリーミアム/有料オプション + - 接続方法: + - QuickNode: [Injective RPC Node Endpoints, APIs & Tools | QuickNode](https://www.quicknode.com/chains/inj) + - Thirdweb: [Injective EVM](https://thirdweb.com/injective) +- 統合パートナーには非推奨 + - アプリケーションのニーズに合わせたカスタマイズ不可 + - 厳しいレート制限、履歴データクエリのカットオフあり + - 無料オプション + - 接続方法: + - JSON-RPCエンドポイント: `https://sentry.evm-rpc.injective.network/` + - WSエンドポイント: `wss://sentry.evm-ws.injective.network` + +リファレンス: [EVMネットワーク情報 | Injective | Docs](/developers-evm/network-information#injective-evm-mainnet) + + +inEVMは**非推奨**となっているため、使用**しないで**ください。 + + +# コントラクトアドレス + +| | | | +|---|---|---| +|USDT|MTS USDT|`0x88f7F2b685F9692caf8c478f5BADF09eE9B1Cc13`| +|wETH|wrapped ETH|`0x83A15000b753AC0EeE06D2Cb41a69e76D0D5c7F7`| +|wINJ|wrapped INJ|`0x0000000088827d2d103ee2d9A6b781773AE03FfB`| +|USDC||`0x2a25fbD67b3aE485e461fe55d9DbeF302B7D3989`| +|MultiCall||`0xcA11bde05977b3631167028862bE2a173976CA11`| + +正規のソースとして以下のリファレンスページをご使用ください。 + +リファレンス: [EVMネットワーク情報 | Injective | Docs](/developers-evm/network-information#injective-evm-mainnet) + +# ブリッジ + +[Injective Bridge](https://bridge.injective.network) + +ガイド: +- [MetaMaskを使用してEthereumからInjectiveにブリッジする方法](https://injective.com/blog/how-to-bridge-from-ethereum-to-injective-using-metamask/) +- [Phantomを使用してSolanaからInjectiveにブリッジする方法](https://injective.com/blog/how-to-bridge-from-solana-to-injective-using-phantom/) +- [Wormholeを使用してInjectiveにブリッジする方法](https://injective.com/blog/how-to-bridge-to-injective-using-wormhole/) +- [Keplrを使用してCosmosからInjectiveにブリッジする方法](https://injective.com/blog/how-to-bridge-from-cosmos-to-injective-using-keplr/) + +# データ + +## エクスプローラー + +- エクスプローラー: [`blockscout.injective.network`](https://blockscout.injective.network/) +- エクスプローラーAPI: [`blockscout-api.injective.network/api`](https://blockscout-api.injective.network/api) + +## オラクル + +- API3: + - 価格フィード: [Api3 Market | Injective EVM](https://market.api3.org/injective) +- Pyth: + - ドキュメント: [Pyth EVM Real Time Data Pull Integration](https://docs.pyth.network/price-feeds/core/use-real-time-data/pull-integration/evm) + - リファレンスドキュメント: [Pyth EVM Smart Contract Addresses](https://docs.pyth.network/price-feeds/core/contract-addresses/evm) +- Chainlink: + - ドキュメント: [Chainlink Data Streams](https://docs.chain.link/data-streams) + +# ウォレット + +## `injectived` + +プログラマティックな制御に適しています(例:アプリケーション/dApp運用アカウント)。 + +インストールクイックスタート: + +```shell +wget https://github.com/InjectiveLabs/injective-chain-releases/releases/download/v1.17.2-1765930431/linux-amd64.zip # replace with latest version of injective +unzip linux-amd64.zip +sudo mv injectived peggo /usr/bin +sudo mv libwasmvm.x86_64.so /usr/lib +``` + + +上記コマンドの`wget`ダウンロードURLは、最新リリース版のものに置き換える必要があります。 +正確なコマンド(URLを含む)は[Mainnet Validator](/infra/validator-mainnet)セクションで確認できます。 + + + +Dockerを使用したインストールやソースからのコンパイルなど、 +その他のオプションは以下のリファレンスページで利用可能です。 + + +リファレンス: [injectived | Injective | Docs](/developers/injectived) + +## MetaMask + +EVM DAppとインタラクションする必要があるリテールユーザーに適しています。 + +インストール: + +- お使いのブラウザ用のブラウザ拡張機能を[https://metamask.io/en-GB](https://metamask.io/en-GB)から取得します。 +- [https://blockscout.injective.network/](https://blockscout.injective.network/)にアクセスし、ページ下部までスクロールします。 +- 「Add Injective」ボタンをクリックします。 +- MetaMaskのユーザーインターフェースのプロンプトに従います。 + +リファレンス: [Injectiveウォレットの作成方法(MetaMask)](https://injective.com/blog/how-to-create-an-injective-wallet-2/#to-connect-to-injective-with-metamask) + +## Keplr + +- Keplr: [https://www.keplr.app](https://www.keplr.app) +- 統合用Keplr APIドキュメント: [https://docs.keplr.app/api/intro](https://docs.keplr.app/api/intro) + +リファレンス: [Injectiveウォレットの作成方法(Keplr)](https://injective.com/blog/how-to-create-an-injective-wallet-2#to-connect-to-injective-with-keplr) diff --git a/.gitbook/ja/developers-evm/evm-integrations-faq.mdx b/.gitbook/ja/developers-evm/evm-integrations-faq.mdx new file mode 100644 index 00000000..a26298b7 --- /dev/null +++ b/.gitbook/ja/developers-evm/evm-integrations-faq.mdx @@ -0,0 +1,110 @@ +--- +title: "EVM統合FAQ" +description: Injective EVMとの統合に関するよくある質問。 +--- + +## Injective EVMは...をサポートしていますか? + +**Injective EVMは(EVM機能)をサポートしていますか?** + +A: 一般的に、答えは「はい」です。 +より具体的な質問については以下をご覧ください。 + +**Injective EVMはこれらの特定のopcodesをサポートしていますか?** + +A: はい。opcode実装において同等性を持っています。 +より正確には:カスタムopcodesの追加や、既存のopcodesの動作変更は行っていません。 + +**Injective EVMはERC20、ERC721、ERC1155をサポートしていますか?** + +A: はい。Solidityベースのスマートコントラクト標準はすべて動作するはずです。 +これらは標準的なEVM以上の特別な機能を*必要としない*ためです。 + +補足:ファンジブルトークンを実装する場合、 +ERC20およびその拡張であるその他のトークンについては、 +MultiVM Token Standard (MTS) トークンとして実装することを強く推奨します。 +これにより、同じトークンがInjective EVM上だけでなく、 +Injectiveネイティブ(特にCosmos Denomとして)でもファンジブルトークンとして機能できます。 +将来InjectiveがOther VMを追加した場合、MTSトークンはそれらでも動作します。 +MTSの詳細: +[一般記事](https://injective.com/blog/multivm-token-standard-wrapped-inj)、 +[テクニカルリファレンス](/developers-evm/multivm-token-standard)。 + +**Injective EVMはEIP-1559をサポートしていますか?** + +A: はい。 + +## Injective EVMで...を使用できますか? + +A: 一般的に、答えは「はい」です。 +より具体的な質問については以下をご覧ください。 + +**Injective EVMで(EVMツール/ライブラリ)を使用できますか?** + +A: + +- viem - はい +- ethers.js - はい +- hardhat - はい +- foundry - はい + +**InjectiveのEVM precompileを使用してInjective EVMでFoundryを使用できますか?** + +A: Injectiveの[EVM precompile](/developers-evm/precompiles)は、 +汎用的なEVMでは利用できないInjectiveネイティブ関数にアクセスします。 +これは、例えばFoundryを使用して以下に接続する場合: + +- Injective EVMテストネット - 動作します +- `localhost`シミュレーションEVMネットワーク - 動作しません + +後者の問題に対処するため、InjectiveのprecompileをサポートするFoundryツールのフォーク版を作成しました(MTSに必要な`BankERC20.sol`用のBank precompileから開始)。 +SolidityテストやデプロイメントスクリプトをFoundryプロジェクトとして使用する場合、 +`forge`/`cast`がローカルシミュレーションを実行できるようにこれが必要です。 + +x86_64 LinuxおよびmacOS ARM64用のプリビルドバイナリを含む最新リリースは、 +[github.com/InjectiveLabs/foundry/releases](https://github.com/InjectiveLabs/foundry/releases)で確認できます。 + + +このフォーク版FoundryでInjectiveのprecompileサポートを有効にするには、設定ファイル`foundry.toml`内で`injective = true`を設定するか、環境変数`FOUNDRY_INJECTIVE=true`を使用する必要があります。 + + +## InjectiveではどのようなEVM開発インフラストラクチャが利用可能ですか? + +回答については[EVM統合チートシート](/developers-evm/evm-integrations-cheat-sheet)を参照してください。 + +## JSON-RPCドロップレスポンスを解決するにはどうすればよいですか? + +A: RPCに公開エンドポイントを使用している場合、 +レート制限によりこの問題が発生する可能性があります。 +これらのエンドポイントは非常に軽い使用向けに設計されています。 +複雑なアプリケーションをデプロイした場合、 +代わりに商用グレードのRPCエンドポイントの使用を検討してください。 + +推奨RPCプロバイダーは[EVM統合チートシート](/developers-evm/evm-integrations-cheat-sheet)で確認できます。 + +## `inj...`アドレスと`0x...`アドレスは互換性がありますか? + +A: はい。実際には同じもので、異なるフォーマットで表示されているだけです。 + +これら2つのフォーマット間の変換のサンプルコードについては、 +[アドレスの変換](https://docs.injective.network/developers/convert-addresses)を参照してください。 + +## InjectiveはどのEVM hardforkをサポートしていますか? + +A: EVM用のライブ設定データは以下の通りです: +[sentry.lcd.injective.network/injective/evm/v1/params](https://sentry.lcd.injective.network/injective/evm/v1/params) + +`chain_config`の下に、EVM hardfork名(サフィックス付き)に対応するキーがあります。 +これらは、どのhardforkが有効化されているかを示します。 +これらのキーの値は、有効化されたブロック番号です。 +Mainnetローンチ時点では、すべて`0`に設定されています。 +つまり、「genesis」EVMブロックから有効化されています。 +将来のEVM hardforkでは、有効化される(またはされた) +ゼロ以外のブロック番号を持つ新しいキーが追加されます。 + + +EVM統合についてさらに質問がありますか? + +[Injective Discord](https://discord.com/invite/injective) +コミュニティに参加して質問してください! + diff --git a/.gitbook/ja/developers-evm/exchange-precompile.mdx b/.gitbook/ja/developers-evm/exchange-precompile.mdx new file mode 100644 index 00000000..0d5acca7 --- /dev/null +++ b/.gitbook/ja/developers-evm/exchange-precompile.mdx @@ -0,0 +1,168 @@ +--- +title: Exchange Precompile +--- + +Exchange Precompileは、固定アドレス`0x0000000000000000000000000000000000000065`に存在するシステムスマートコントラクトです。Solidity開発者に、Injectiveチェーンのexchangeモジュールと直接インタラクションするためのgas効率が良くネイティブな手段を提供します。このprecompileを活用することで、スマートコントラクトは以下のようなexchange関連のアクションをシームレスに実行できます: + +* サブアカウントへの資金の入金と引き出し。 +* スポットおよびデリバティブ注文の作成またはキャンセル。 +* サブアカウント残高とオープンポジションのクエリ。 +* 他のアカウントまたはコントラクトへの認可グラントの管理。 + +#### Precompileの呼び出し:直接アクセス vs. プロキシアクセス + +Exchange Precompileとのインタラクションには、2つの主要なアプローチがあります: + +**1. 直接アクセス(自己呼び出しコントラクト)** + +このモードでは、スマートコントラクトが自身の代わりにprecompileとインタラクションします。コントラクト自体が、自身の資金を使用してexchangeモジュールでの操作を実行し、自身のポジションを管理するアクターです。 + +_例:_ + +``` +exchange.deposit(address(this), subaccountID, denom, amount); +``` + +このメソッドは簡単で、コントラクトが本質的に自身のリソースを管理する権限を持っているため、**明示的な認可グラントは不要**です。 + +**2. プロキシアクセス(別のユーザーの代わりに呼び出す)** + +スマートコントラクトは、外部ユーザーアカウントの代わりにexchange操作を実行する仲介者として設計することもできます。このシナリオでは、コントラクトはprecompileを呼び出し、第三者のアドレスをsenderまたは操作対象のアカウントとして指定します。 + +_例:_ + +``` +exchange.deposit(userAddress, subaccountID, denom, amount); +``` + +これを成功させるには、スマートコントラクト(`grantee`)がユーザー(`userAddress`、`granter`)によって指定されたアクションを実行する**明示的な認可を受ける必要があります**。この認可は、precompileが提供する`approve`および`revoke`メソッドを使用して管理されます。**ユーザーの資金のセキュリティを確保するために、これらの認可を慎重に扱うことが重要です。** + +コントラクトに代わりに特定のアクションを実行する権限を付与するには: + +``` +exchange.approve(grantee, msgTypes, spendLimit, duration); +``` + +* `grantee`: 認可されるコントラクトのアドレス。 +* `msgTypes`: `grantee`が実行を許可されるメッセージタイプの配列(例:`MsgCreateDerivativeLimitOrder`、`MsgDeposit`)。完全なリストは`ExchangeTypes.sol`またはInjective Protocolのprotobuf定義を参照してください。 +* `spendLimit`: `grantee`がメッセージタイプごとまたはグラント全体で使用できる指定トークンの最大量を定義する`Cosmos.Coin`構造体の配列。 +* `duration`: 認可が有効な期間(秒単位)。 + +以前に付与した認可を取り消すには: + +``` +exchange.revoke(grantee, msgTypes); +``` + +認可が現在存在するかどうかを確認するには: + +``` +exchange.allowance(grantee, granter, msgType); +``` + +#### 例:直接メソッド + +以下の`ExchangeDemo`コントラクトは、スマートコントラクトが直接アクセスメソッドを使用する方法を示しています。資金の入金、資金の引き出し、デリバティブ指値注文の作成、サブアカウントポジションのクエリなどの基本的なexchangeアクションを、すべて自身のサブアカウントと資金を使用して実行します。 + +`Exchange.sol`および`ExchangeTypes.sol`ファイルには、precompileとインタラクションするために必要なインターフェース定義とデータ構造が含まれています。これらは通常、公式のInjective Solidityコントラクトリポジトリで利用可能であるか、プロジェクトの依存関係として含めることができます。 + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +import "../src/Exchange.sol"; // Contains IExchangeModule interface +import "../src/ExchangeTypes.sol"; // Contains necessary structs like DerivativeOrder + +contract ExchangeDemo { + address constant exchangeContract = 0x0000000000000000000000000000000000000065; + IExchangeModule exchange = IExchangeModule(exchangeContract); + + /*************************************************************************** + * Calling the precompile directly (contract acts on its own behalf) + ****************************************************************************/ + + /** + * @notice Deposits funds from the contract's balance into one of its exchange subaccounts. + * @param subaccountID The target subaccount ID (derived from the contract's address). + * @param denom The denomination of the asset to deposit (e.g., "inj"). + * @param amount The quantity of the asset to deposit. + * @return success Boolean indicating if the deposit was successful. + */ + function deposit( + string calldata subaccountID, + string calldata denom, + uint256 amount + ) external returns (bool) { + try exchange.deposit(address(this), subaccountID, denom, amount) returns (bool success) { + return success; + } catch Error(string memory reason) { + revert(string(abi.encodePacked("Deposit error: ", reason))); + } catch { + revert("Unknown error during deposit"); + } + } + + /** + * @notice Withdraws funds from one of the contract's exchange subaccounts to its main balance. + * @param subaccountID The source subaccount ID. + * @param denom The denomination of the asset to withdraw. + * @param amount The quantity of the asset to withdraw. + * @return success Boolean indicating if the withdrawal was successful. + */ + function withdraw( + string calldata subaccountID, + string calldata denom, + uint256 amount + ) external returns (bool) { + try exchange.withdraw(address(this), subaccountID, denom, amount) returns (bool success) { + return success; + } catch Error(string memory reason) { + revert(string(abi.encodePacked("Withdraw error: ", reason))); + } catch { + revert("Unknown error during withdraw"); + } + } + + /** + * @notice Queries the derivative positions for a given subaccount of this contract. + * @param subaccountID The subaccount ID to query. + * @return positions An array of DerivativePosition structs. + */ + function subaccountPositions( + string calldata subaccountID + ) external view returns (IExchangeModule.DerivativePosition[] memory positions) { + // Note: View functions calling precompiles might behave differently based on node configuration + // For on-chain state, this is fine. For off-chain queries, direct gRPC/API queries are often preferred. + return exchange.subaccountPositions(subaccountID); + } + + /** + * @notice Creates a new derivative limit order from the contract's subaccount. + * @param order The DerivativeOrder struct containing order details. + * @return response The response struct containing details like order hash. + */ + function createDerivativeLimitOrder( + IExchangeModule.DerivativeOrder calldata order + ) external returns (IExchangeModule.CreateDerivativeLimitOrderResponse memory response) { + try exchange.createDerivativeLimitOrder(address(this), order) returns (IExchangeModule.CreateDerivativeLimitOrderResponse memory resp) { + return resp; + } catch Error(string memory reason) { + revert(string(abi.encodePacked("CreateDerivativeLimitOrder error: ", reason))); + } catch { + revert("Unknown error during createDerivativeLimitOrder"); + } + } +} +``` + +#### ビルドを開始する + +この`ExchangeDemo`スマートコントラクトのビルド、デプロイ、インタラクション方法(サブアカウントのセットアップと資金供給を含む)の詳細な手順については、[solidity-contracts](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos/exchange)リポジトリの包括的なデモを参照してください。 + +#### まとめ + +Exchange Precompileは、洗練されたプロトコル統合型のトレーディングロジックをInjective上のスマートコントラクトに直接組み込むことを可能にする強力なツールです。コントラクトが自身のポートフォリオを管理する場合でも、(`approve`と`revoke`によるプロキシパターンを使用して)他のユーザーのための多機能なトレーディングインターフェースとして機能する場合でも、このprecompileはSolidityを使用してコアexchangeモジュールとインタラクションするための、クリーンで安全かつ効率的な方法を提供します。 + +自己完結型のコントラクトロジックには直接呼び出しを優先し、より広いInjectiveエコシステム向けの再利用可能なコントラクトインターフェースを構築する際には、堅牢な認可を備えたプロキシパターンを慎重に実装してください。 + +\ diff --git a/.gitbook/ja/developers-evm/index.mdx b/.gitbook/ja/developers-evm/index.mdx new file mode 100644 index 00000000..c8b8ca1e --- /dev/null +++ b/.gitbook/ja/developers-evm/index.mdx @@ -0,0 +1,46 @@ +--- +title: 概要 +--- + +EVM開発者の皆さん、ようこそ!InjectiveのネイティブEVMサポートにより、Solidityスマートコントラクトをデプロイすることができます。Exchangeモジュールとのインタラクション、dAppの構築など、さまざまな可能性が広がります。使い慣れたツール、ライブラリ、ワークフローを活用して、Injectiveで開発を始めましょう! + +## EVMでの開発を始める + + + + Injective EVMへの接続を設定する + + + **Solidity**でコードを記述し、**スマートコントラクト**のコンパイル、テスト、デプロイ、検証、インタラクションを行う + + + スマートコントラクトがInjectiveチェーンのネイティブ機能とインタラクションするためのEVMインターフェース + + + INJ Faucet + + diff --git a/.gitbook/ja/developers-evm/infrastructure-and-tooling.mdx b/.gitbook/ja/developers-evm/infrastructure-and-tooling.mdx new file mode 100644 index 00000000..afe7a651 --- /dev/null +++ b/.gitbook/ja/developers-evm/infrastructure-and-tooling.mdx @@ -0,0 +1,39 @@ +--- +description: ワールドクラスのインフラストラクチャでInjectiveを開発 +title: インフラストラクチャとツール +--- + +Injectiveは、業界をリードするインフラストラクチャプロバイダーの豊富なエコシステムによってサポートされています。信頼性の高いRPC、パワフルなデータインデクサー、そして金融に最適化された最速のL1でdAppをビルドおよびスケーリングするために必要なすべてのツールにアクセスできます。 + +### RPCとノードプロバイダー + +
TenderlyTenderlyは、EthereumおよびEVM互換のトランザクションをオンチェーンにブロードキャストせずにプレビューおよび分析できる高度なトランザクションシミュレーションを提供するプラットフォームです。また、ステップバイステップの実行トレースとエラーレポートを含むパワフルなデバッグツールを提供し、開発者がスマートコントラクトの問題を効率的に特定して修正できるようにします。
QuickNode最速のRPCノード、包括的なWeb3 APIライブラリ、最もパフォーマンスの高いブロックチェーンETLツールでInjectiveを開発できます。
+ +### **データインデキシングとクエリ** + + + + + + + + + + +
The Graph +

+StreamingFastがInjective向けに開発した、The Graphの最先端SubstreamsおよびSubstreams対応のsubgraphソリューションは、開発者にオンチェーンデータへのシームレスなアクセスを提供します。 +

+ +
+ +### ブロックエクスプローラー + +
BlockScoutEVM標準ブロックエクスプローラー
BlockScout CloudEVM標準ブロックエクスプローラー(BlockScoutホスティング)
diff --git a/.gitbook/ja/developers-evm/multivm-token-standard.mdx b/.gitbook/ja/developers-evm/multivm-token-standard.mdx new file mode 100644 index 00000000..bc345ccb --- /dev/null +++ b/.gitbook/ja/developers-evm/multivm-token-standard.mdx @@ -0,0 +1,99 @@ +--- +title: MultiVM Token Standard +description: InjectiveのマルチVM アーキテクチャにおけるトークン表現の理解 +--- + +## MultiVM Token Standard (MTS) とは? + +MTS (MultiVM Token Standard) は、Injective上のすべてのトークンが、 +Cosmosモジュールを使用してデプロイされたものでも、Ethereum Virtual Machine (EVM) を介してデプロイされたものでも、 +1つの正規の残高とアイデンティティを持つことを保証します。 +この統一されたアプローチはフラグメンテーションを防ぎ、トークンのブリッジやラッピングの必要性を排除し、 +分散型金融 (DeFi) およびdAppインタラクションにおけるシームレスな相互運用性と統一された流動性を実現します。 + +## なぜMTSが重要なのか? + +- **シームレスな相互運用性:** トークンはCosmosとEVM環境間で一貫性を保ちます。 +- **統一された流動性:** 単一の信頼できるソースにより、流動性のフラグメンテーションを回避します。 +- **開発者体験の向上:** Hardhat、Foundry、MetaMaskなどの標準ツールがそのまま動作します。 +- **セキュリティと効率性:** すべてのトークン状態はbankモジュールで一元管理され、堅牢なセキュリティを確保します。 + +## アーキテクチャ + +システムは2つの主要コンポーネントで構成されています: + +- [**Bank Precompile**](/developers-evm/bank-precompile/): + - Goで開発されたこのprecompileは、Injective EVMに直接組み込まれています。 + - mint、burn、transferなどのERC20操作をbankモジュールにプロキシするSolidityインターフェースを提供します。 +- [**ERC20 Module**](/developers-evm/erc20-module/): + - このモジュールは、既存のオンチェーンdenomをEVMに表現するために使用されます。MTSベースのERC20トークンの作成は`Bank` precompileを通じて行う必要があります。 + - このモジュールは、ネイティブのbank denom(例:INJ、IBCトークン、Peggyアセット)をEVM内のERC20コントラクトにマッピングします。 + - bankモジュールが管理する正規のトークン残高を常に反映するMTS準拠のERC20コントラクトをデプロイします。 + +
+ +
+

単一トークン表現アーキテクチャ

+
+
+ +### MTS準拠トークンの作成 + +#### 新しいERC20トークン("erc20:..." denom) + +1. [**事前構築テンプレートの使用**](https://github.com/InjectiveLabs/solidity-contracts/tree/master/src): + - `BankERC20.sol`、`MintBurnBankERC20.sol`、`FixedSupplyBankERC20.sol`などの提供されたSolidityテンプレートから始めます。 +2. [**コントラクトのデプロイ**](/developers-evm/smart-contracts/): + - Injective EVMネットワークにMTSトークンコントラクトをデプロイします。 + - コントラクトはBank Precompileと自動的にインタラクションし、正規の状態を更新します。 + +#### 既存のdenom(TokenFactory、IBC、Peggy) + +2つのオプションがあります: + +1. `MsgCreateTokenPair`メッセージを送信して、erc20モジュール内にトークンペアを作成します。 + +2. ペア作成時にスマートコントラクト用のカスタムERC20実装を使用します(tokenfactory denomのみ): + +- まずカスタムERC20スマートコントラクトをチェーンにアップロードします。 +- `MsgCreateTokenPair`メッセージの送信時にコントラクトのアドレスを指定します。 + +### 相互運用性とクロスチェーン統合 + +#### ネイティブ相互運用性 + +InjectiveのEVMはCosmosベースのチェーンに直接統合されています。 + +- EVMスマートコントラクトは、MTSを使用する場合、ネイティブモジュール(exchange、staking、governanceモジュールなど)に即座に反映される操作を実行します。 +- Injectiveバイナリ内で提供される[JSON-RPCエンドポイント](/developers-evm/network-information/)はEthereumと互換性があり、スムーズな開発者統合を保証します。 + +#### クロスチェーン操作 + +- **IBC互換性:** 既存のネイティブトークン(例:[Token Factory](/developers-native/injective/tokenfactory/)を介して作成されたものやPeggyを介してペグされたもの)は、MTSペアリングが確立されるとEVMからアクセス可能になります。 +- **ブリッジの代替手段:** 多くのブロックチェーンが個別のブリッジ操作(ロック、ミント、アンロック)を必要とするのに対し、MTSはネイティブに状態を同期することでこれらの手順を回避します。 + +#### Allowanceと拡張ERC20関数 + +- MTSコントラクトは、allowance(approve/transferFrom)などの標準的なERC20機能を維持します。 +- allowanceメカニズムはEVMコントラクト内で便宜上維持されますが、最終的な残高はbankモジュールによって管理され、整合性が保たれます。 + +### パフォーマンス、Gas、セキュリティの考慮事項 + +#### Gasコストと効率性 + +- Gas feeはINJで支払われます。EVM経由のMTS操作は抽象化レイヤーを導入するため、ネイティブトランザクションと比較してgas使用量がわずかに増加する可能性がありますが、全体的なコストはEthereumでの同等の操作よりも低くなります。 +- gasモデルは、EVM方式のopcodeコストとネイティブモジュールインタラクションのバランスを反映するように設計されています。 + +#### セキュリティ + +- [bankモジュール](/developers-native/core/)は単一の信頼できるソースとして、トークン残高が一貫性があり検証可能であることを保証し、MTSのセキュリティを支えています。 +- [precompile](/developers-evm/precompiles/)の使用により、状態の非同期化などの一般的な問題を防ぎ、どこから開始された操作であっても同じ正規の台帳が更新されることを保証します。 +- スマートコントラクト開発のための高度なセキュリティガイドラインとベストプラクティスは、セキュリティセクションおよび外部リソースで提供されています。 + +**ℹ️ 注意:** + +denom spamを防止するため、ERC20モジュールを介したERC20コントラクトのデプロイは**有料操作**であり、デプロイ手数料として**1 INJ**が必要です。 +ERC20コントラクトのデプロイトランザクションにこの金額を含めてください。含めない場合、操作は拒否されます。 diff --git a/.gitbook/ja/developers-evm/network-information.mdx b/.gitbook/ja/developers-evm/network-information.mdx new file mode 100644 index 00000000..30b6203a --- /dev/null +++ b/.gitbook/ja/developers-evm/network-information.mdx @@ -0,0 +1,118 @@ +--- +description: Injective EVMネットワークに関する基本情報 +title: EVMネットワーク情報 +--- + + + + + +## ネットワーク情報 + +* Chain ID: `1776` +* JSON-RPCエンドポイント: `https://sentry.evm-rpc.injective.network/` +* WSエンドポイント: `wss://sentry.evm-ws.injective.network` +* Faucet: N/A、メインネットINJの取得については [`injective.com/getinj`](https://injective.com/getinj/) を参照 +* Explorer: [`blockscout.injective.network`](https://blockscout.injective.network/) +* Explorer API: `https://blockscout-api.injective.network/api` + + +Injective Chain IDはネイティブでは `injective-1` です。 +しかし、EVMでは数値Chain ID `1776` を使用します。 +これらは異なりますが、**同じ**ネットワークにマッピングされます。 + +詳細については [Injectiveメインネットのネットワーク情報](/developers/network-information/#injective-mainnet) を参照してください。 + + +## コントラクト + +* **USDT** USDT (MTS) - [`0x88f7F2b685F9692caf8c478f5BADF09eE9B1Cc13`](https://blockscout.injective.network/address/0x88f7F2b685F9692caf8c478f5BADF09eE9B1Cc13) +* **wETH** wrapped ETH (MTS) - [`0x83A15000b753AC0EeE06D2Cb41a69e76D0D5c7F7`](https://blockscout.injective.network/address/0x83A15000b753AC0EeE06D2Cb41a69e76D0D5c7F7) +* **wINJ** wrapped INJ (MTS) - [`0x0000000088827d2d103ee2d9A6b781773AE03FfB`](https://blockscout.injective.network/address/0x0000000088827d2d103ee2d9A6b781773AE03FfB) +* **USDC** USDC (MTS) - [`0x2a25fbD67b3aE485e461fe55d9DbeF302B7D3989`](https://blockscout.injective.network/address/0x2a25fbD67b3aE485e461fe55d9DbeF302B7D3989) +* **MultiCall** - [`0xcA11bde05977b3631167028862bE2a173976CA11`](https://blockscout.injective.network/address/0xcA11bde05977b3631167028862bE2a173976CA11) + + +**MTS** と表記されているトークンは [MultiVM Token Standard](https://docs.injective.network/developers-evm/multivm-token-standard) に準拠しています。 + +これにより、ブリッジを使用せずに、同じトークンをすべてのInjectiveモジュール(EVM、Cosmos)で使用できます。 + + +## その他のプロバイダー + +* Explorer + * Blockscoutミラー: [`injective.cloud.blockscout.com`](https://injective.cloud.blockscout.com) +* JSON-RPCプロバイダー + * Quicknode [`quicknode.com/chains/inj`](https://www.quicknode.com/chains/inj) + * エンドポイントURLを取得するにはQuicknodeのアカウント作成が必要です + * [Quicknode JSON-RPCドキュメント](https://www.quicknode.com/docs/injective/evm/eth_blockNumber) + * ThirdWeb [`thirdweb.com/injective`](https://thirdweb.com/injective) + * エンドポイントURLを取得するにはThirdWebのアカウント作成が必要です + * [ThirdWeb Playground](https://playground.thirdweb.com/) + + + + + +## ネットワーク情報 + +* Chain ID: `1439` +* JSON-RPCエンドポイント: `https://k8s.testnet.json-rpc.injective.network/` +* WSエンドポイント: `wss://k8s.testnet.ws.injective.network/` +* Faucet (Injective): [`testnet.faucet.injective.network/`](https://testnet.faucet.injective.network/) +* Faucet (Google): [`cloud.google.com/application/web3/faucet/injective/testnet`](https://cloud.google.com/application/web3/faucet/injective/testnet) +* Faucet (Circle): [`faucet.circle.com/`](https://faucet.circle.com/) +* Explorer: [`testnet.blockscout.injective.network/`](https://testnet.blockscout.injective.network/) +* Explorer API: `https://testnet.blockscout-api.injective.network/api` + + + +Injective Chain IDはネイティブでは `injective-888` です。しかし、EVMでは数値Chain ID `1439` を使用します。これらは異なりますが、**同じ**ネットワークにマッピングされます。 + +詳細については [Injectiveテストネットのネットワーク情報](/developers/network-information/#injective-testnet) を参照してください。 + + +## コントラクト + +* **wINJ** wrapped INJ (MTS) - [`0x0000000088827d2d103ee2d9A6b781773AE03FfB`](https://testnet.blockscout.injective.network/address/0x0000000088827d2d103ee2d9A6b781773AE03FfB) +* **USDT** USDT (MTS) - [`0xaDC7bcB5d8fe053Ef19b4E0C861c262Af6e0db60`](https://testnet.blockscout.injective.network/address/0xaDC7bcB5d8fe053Ef19b4E0C861c262Af6e0db60) +* **USDC** - [`0x0C382e685bbeeFE5d3d9C29e29E341fEE8E84C5d`](https://testnet.blockscout.injective.network/token/0x0C382e685bbeeFE5d3d9C29e29E341fEE8E84C5d) +* **USDC CCTP TokenMessengerV2** - [`0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA`](https://testnet.blockscout.injective.network/address/0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA) +* **USDC CCTP MessageTransmitterV2** - [`0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275`](https://testnet.blockscout.injective.network/address/0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275) +* **USDC CCTP TokenMinterV2** - [`0xb43db544E2c27092c107639Ad201b3dEfAbcF192`](https://testnet.blockscout.injective.network/address/0xb43db544E2c27092c107639Ad201b3dEfAbcF192) +* **USDC CCTP MessageV2** - [`0xbaC0179bB358A8936169a63408C8481D582390C4`](https://testnet.blockscout.injective.network/address/0xbaC0179bB358A8936169a63408C8481D582390C4) + + +**MTS** と表記されているトークンは [MultiVM Token Standard](https://docs.injective.network/developers-evm/multivm-token-standard) に準拠しています。 + +これにより、ブリッジを使用せずに、同じトークンをすべてのInjectiveモジュール(EVM、Cosmos)で使用できます。 + + +## その他のプロバイダー + +* Explorer + * Blockscoutミラー: [`testnet-injective.cloud.blockscout.com/`](https://testnet-injective.cloud.blockscout.com/) +* JSON-RPCプロバイダー + * Quicknode [`quicknode.com/chains/inj`](https://www.quicknode.com/chains/inj) + * エンドポイントURLを取得するにはQuicknodeのアカウント作成が必要です + * [Quicknode JSON-RPCドキュメント](https://www.quicknode.com/docs/injective/evm/eth_blockNumber) + * ThirdWeb [`thirdweb.com/injective-evm-testnet`](https://thirdweb.com/injective-evm-testnet) + * エンドポイントURLを取得するにはThirdWebのアカウント作成が必要です + * [ThirdWeb Playground](https://playground.thirdweb.com/) + +## その他の情報 + +Injective EVMテストネットの詳細については以下のページを参照してください: + +* 基礎: + * [EVMでの開発を始める](/developers-evm) + * [初めてのEVMスマートコントラクト](/developers-evm/smart-contracts) + * [初めてのEVM dApp](/developers-evm/dapps) +* 応用: + * [EVM Equivalence](/developers-evm/evm-equivalence) + * [MultiVM Token Standard](/developers-evm/multivm-token-standard) + * [Precompiles](/developers-evm/precompiles) + + + + diff --git a/.gitbook/ja/developers-evm/permissioned-multivm-token.mdx b/.gitbook/ja/developers-evm/permissioned-multivm-token.mdx new file mode 100644 index 00000000..51a6ad2d --- /dev/null +++ b/.gitbook/ja/developers-evm/permissioned-multivm-token.mdx @@ -0,0 +1,161 @@ +--- +title: Permissioned MTS Tokens +description: MultiVM Token Standard (MTS) トークンにおけるInjectiveのpermissionsモジュールの活用 +--- + +## Injectiveのpermissionsモジュール + +[`permissions`モジュール](https://docs.injective.network/developers-native/injective/permissions)はInjectiveにネイティブで、Denomのカスタム管理(例:ロール)を可能にします。 +この機能はMultiVM Token Standard (MTS) トークンに拡張されており、 +EVMスマートコントラクトコード内でカスタム管理ルールを実装できます。 + +## なぜMTSトークンにpermissionsを使用するのか? + +InjectiveでMTSを使用して現実世界の資産 (RWA) をトークン化しており、 +その基盤となる資産が本質的にpermissionsを必要とする場合、 +それはInjectiveの`permissions`モジュールを活用する優れたユースケースです。 + +MTSトークンのEVMスマートコントラクトは、`permissions`モジュールの機能を活用するために +追加のSolidityインターフェースを実装するだけで済みます。 + +## スマートコントラクトの実装 + +スマートコントラクトで、`PermissionsHook.sol`から`IPermissionsHook`をインポートして拡張します。 + +```solidity +interface IPermissionsHook +``` + +これには、以下のシグネチャを持つ`isTransferRestricted`関数の実装が含まれます: + +```solidity +function isTransferRestricted( + address from, + address to, + Cosmos.Coin calldata amount +) +``` + +完全なファイルはGithubで確認できます: +[`PermissionsHook.sol`](https://github.com/InjectiveLabs/solidity-contracts/blob/master/src/PermissionsHook.sol) + +### スマートコントラクトの例 + +`PermissionsHook`を拡張するスマートコントラクトを作成します: + +```solidity +import { Cosmos } from "../src/CosmosTypes.sol"; +import { PermissionsHook } from "../src/PermissionsHook.sol"; +contract RestrictedAddressTransferHook is PermissionsHook { + /* + ... + */ +} +``` + +`isTransferRestricted`関数のカスタム実装を追加します。 +例えば、この関数は特定のアドレスに関連する転送を除き、すべての転送を許可します: + +```solidity + function isTransferRestricted( + address from, + address to, + Cosmos.Coin calldata amount + ) external pure override returns (bool) { + address restrictedAddress = "0x..."; + if (from == restrictedAddress || to == restrictedAddress) { + // this particular address is not allowed to transfer + return true; + } + + // All other transfers are allowed + return false; + } +``` + +より詳細な例はGithubで確認できます: +[`PermissionsHookExamples.sol`](https://github.com/InjectiveLabs/solidity-contracts/blob/master/examples/PermissionsHookExamples.sol) + +## Hookの登録 + +permissions用のhookを登録するには、以下が必要です: + +- MTSトークンをデプロイしたのと同じアカウントの制御権。 +- MTSトークンのデプロイ済みアドレス +- Permissions Hookのデプロイ済みアドレス + +上記を使用して、 +[このようなJSONファイル](https://github.com/InjectiveLabs/stablecoin-evm/blob/fiattoken-inj/scripts/demo/namespace.json)を作成できます。 + +次に、MTSトークンをデプロイしたのと同じアカウントを使用して`injectived`を実行し登録します。 + +```shell +injectived tx permissions create-namespace ... +``` + + +MTSトークンとPermissions Hookは同じアドレスを持つことができます。 +これはあなた次第のアーキテクチャ上の決定です。 + + +### Hookの登録例 + +以下の内容で`register-hooks.json`という名前のファイルを作成します: + +```jsonc +{ + "denom": "erc20:0x...", // <-- MTSトークンのEVMアドレス + "evm_hook": "0x...", // <-- permissions hookのEVMアドレス + "role_permissions": [ + { + "name": "EVERYONE", + "role_id": 0, + "permissions": 10 + } + ], + "actor_roles": [ + ] +} +``` + +`denom`と`evm_hook`フィールドの値を適切な値に置き換えてください。 + + +ファイルが有効なJSONになるよう、すべてのコメントも削除してください。 + + +次に、以下のコマンドを実行します: + +```shell +injectived tx permissions create-namespace register-hooks.json [flags] +``` + +これは、MTSトークンにpermissions hookを定義する1つの特定の方法に過ぎません。 +複数のバリエーションがあります。 +このステップの追加詳細(他のバリエーションを含む)については、 +[Permissioned Assetsのローンチ方法](https://docs.injective.network/developers-native/injective/permissions/04_launch_permissioned_asset)を参照してください。 + +## リファレンス実装 + +permissioned MTSトークンの使用を示す、より完全なステーブルコインの例も利用可能です。 + +この例には、トークンが一時停止されている場合に転送を防止し、 +アドレスのブラックリストも管理するpermissions hookが含まれています。 + +```solidity +function isTransferRestricted( + address _from, + address _to, + Cosmos.Coin calldata /* _amount */ +) external view returns (bool) { + if (fiatToken.paused()) { + return true; + } else if (fiatToken.isBlacklisted(_from) || fiatToken.isBlacklisted(_to)) { + return true; + } + + return false; +} +``` + +[`PermissionsHook_Inj.sol`](https://github.com/InjectiveLabs/stablecoin-evm/blob/fiattoken-inj/contracts/v2/PermissionsHook_Inj.sol)を参照してください。 diff --git a/.gitbook/ja/developers-evm/precompiles.mdx b/.gitbook/ja/developers-evm/precompiles.mdx new file mode 100644 index 00000000..918104f3 --- /dev/null +++ b/.gitbook/ja/developers-evm/precompiles.mdx @@ -0,0 +1,79 @@ +--- +title: Precompiles +--- + +### InjectiveにおけるPrecompileとは? + +Injectiveでは、precompileはプロトコルレベルでEVM(Ethereum Virtual Machine)レイヤーに直接組み込まれた、特別な高度に最適化されたスマートコントラクトです。ユーザーがデプロイする標準的なSolidityスマートコントラクトとは異なり、precompileはチェーンのコアロジックの一部です。Solidityではなく Goで記述され、固定アドレスでEVMに公開されるため、Solidityスマートコントラクトから他のスマートコントラクトと同様に呼び出すことができます。 + +precompileは、Ethereumスタイルのインターフェースが付与されたInjectiveチェーンのネイティブ関数と考えてください。 + +### なぜ必要なのか?(EVMとネイティブモジュールのブリッジ) + +Injective EVMはサイロ内で動作しているわけではありません。Bankモジュール(トークン管理用)、Exchangeモジュール(オンチェーンオーダーブック用)、Stakingモジュールなど、InjectiveのパワフルなネイティブCosmos SDKモジュールと深く統合されています。 + +Precompileは、EVMの世界(Solidityコントラクトが存在する場所)とこれらのInjectiveネイティブ機能の間の重要な**ブリッジ**として機能します。precompileがなければ、EVMスマートコントラクトは孤立し、より広いInjectiveエコシステムの豊富な機能と流動性を活用できなくなります。 + +例えば、ネイティブ環境とEVM環境間で統一されたトークン残高を保証する[MultiVM Token Standard (MTS)](/developers-evm/multivm-token-standard)モデルは、**Bank Precompile**に大きく依存しています。 + +### 開発者にとってのメリット + +* **ネイティブ機能へのアクセス:** オンチェーンオーダーブック、ネイティブstaking、governance、MTSのためのbankモジュールなど、Injectiveのユニークなモジュールと直接インタラクションできます。 +* **パフォーマンスの向上:** precompileを介して実行される操作は、複雑なネイティブロジックを純粋にSolidityで再現しようとするよりも大幅に高速でgas効率が良く、最適化されたネイティブコードとして実行されます。 +* **シームレスな相互運用性:** EVMとInjectiveのCosmos ネイティブ機能の両方の強みを活かした、真に統合されたアプリケーションを構築できます。 +* **開発の簡素化:** 馴染みのあるSolidityインターフェースを通じて複雑なネイティブ機能とインタラクションし、基盤となるCosmosの複雑さの多くを抽象化します。 + +Bank precompileに基づくERC-20実装の一連のコントラクト、precompileインターフェース、抽象コントラクトが[InjectiveのSolidity Contractsリポジトリ](https://github.com/InjectiveLabs/solidity-contracts)で利用可能です。主要なコントラクトは以下の通りです: + +* [**Bank.sol**](https://github.com/InjectiveLabs/solidity-contracts/blob/master/src/Bank.sol) – precompileインターフェース +* [**BankERC20.sol**](https://github.com/InjectiveLabs/solidity-contracts/blob/master/src/BankERC20.sol) – Bank precompileに基づく抽象ERC20実装 +* [**FixedSupplyBankERC20.sol**](https://github.com/InjectiveLabs/solidity-contracts/blob/master/src/FixedSupplyBankERC20.sol) – 固定サプライの分散型ERC20(オーナーなし、mintおよびburnなし) +* [**MintBurnBankERC20.sol**](https://github.com/InjectiveLabs/solidity-contracts/blob/master/src/MintBurnBankERC20.sol) – オーナーがmintとburnを許可されたERC20 + +これらの実装はOpenZeppelinのERC20コントラクトに基づいています。開発者はBank precompileを利用したカスタムERC20コントラクトを自由に作成できます。 + +### 始めるためのデモ + +Bank、Exchange、Staking precompileを使用したコントラクトの構築方法を示すデモを用意しました。これらの例では、最も一般的なEthereum開発フレームワークである**Foundry**を使用してInjective EVMとインタラクションする方法も示しています。 + +Foundryの`cast`ツールを活用することで、ターミナルから直接コントラクトをデプロイし、Injectiveチェーンとインタラクションできます。これにより、ビルダーはInjectiveのネイティブモジュールを活用したパワフルなアプリケーションを素早く実験、テスト、デプロイできます。 + +以下のデモで確認できること: + +- トークン管理、トレーディング、stakingのためにprecompileを呼び出すSolidityコントラクトの書き方。 +- Foundryスクリプトと`cast`コマンドを使用して、Injective EVMでこれらのコントラクトをデプロイし、インタラクションする方法。 +- EVMロジックとInjectiveのネイティブ機能をブリッジするためのベストプラクティス。 + +[Injective Solidity Contractsリポジトリ](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos)をクローンし、各デモディレクトリのステップバイステップガイドに従って開発を開始してください。 + +* [Bank Precompileデモ](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos/erc20) +* [Exchange Precompileデモ](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos/exchange) +* [Staking Precompileデモ](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos/staking) + +### Precompileアドレス + +| 名前 | 用途 | EVMアドレス | +| ---------------------------------- | ----------------------------- | ----------- | +| [Bank](/developers-evm/bank-precompile) | トークン管理 | `0x64` | +| [Exchange](/developers-evm/exchange-precompile) | オンチェーンオーダーブック | `0x65` | +| Staking | ネイティブstakingトークンのオンチェーン管理 | `0x66` | + +## non-contract addressエラー + +Foundryを使用して、Injective MainnetまたはInjective Testnetをローカルに「fork」し、 +その環境でスマートコントラクトを実行すると、 +以下のようなエラーが表示される場合があります: + +```text +[Revert] call to non-contract address 0x0000000000000000000000000000000000000064 +``` + +これは、FoundryがInjectiveを実際に実行するのではなく、ローカルで*シミュレーション*しているために発生します。 +そのため、Injective固有のEVMシミュレーションではなく、*汎用的なEVM*シミュレーションを実行しています。 +違いは、Injectiveのネイティブ機能が存在しないため、precompileを認識できないことにあります。 + +修正は簡単です: +Injectiveのprecompileを含むようにパッチされたFoundryバージョンを使用してください: +[github.com/InjectiveLabs/foundry/releases](https://github.com/InjectiveLabs/foundry/releases)。 + +これらにはx86_64 LinuxおよびmacOS ARM64用のプリビルドバイナリが含まれています。 diff --git a/.gitbook/ja/developers-evm/smart-contracts/compile-foundry.mdx b/.gitbook/ja/developers-evm/smart-contracts/compile-foundry.mdx new file mode 100644 index 00000000..c3d916f5 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/compile-foundry.mdx @@ -0,0 +1,150 @@ +--- +title: Foundryのセットアップとスマートコントラクトのコンパイル +--- + +## 前提条件 + +Foundryがインストールされていることを確認します。以下のコマンドを実行してください: + +```shell +forge --version +``` + +このチュートリアルで使用したバージョンは `1.2.3-stable` です。このバージョン以降を使用してください。 + +Foundryがまだインストールされていない場合は、以下のコマンドを実行してインストールします: + +```shell +curl -L https://foundry.paradigm.xyz | bash +``` + + +Foundryのインストールには他のオプションもあります。 +[Foundryインストールドキュメント](https://getfoundry.sh/introduction/installation) を参照してください。 + + +ウォレットと、テストネットINJで資金提供されたアカウントが必要です。 + + +EVMテストネット資金は [Injectiveテストネットfaucet](https://testnet.faucet.injective.network/) からリクエストできます。 + + +アカウント作成後、秘密鍵をアクセス可能な場所にコピーしておいてください。このチュートリアルを完了するために必要です。 + + +秘密鍵の取り扱いには注意が必要です。 +ここに記載されている手順は、ローカル開発とテストネットには十分です。 +しかし、メインネットで使用する秘密鍵には**十分なセキュリティではありません**。 +メインネットでは鍵のセキュリティに関するベストプラクティスに従い、メインネットと他のネットワーク間で同じ鍵/アカウントを再利用しないでください。 + + +## 新しいFoundryプロジェクトのセットアップ + +gitを使用してデモリポジトリをクローンします。プロジェクトはすでに完全にセットアップされています。 + +```shell +git clone https://github.com/injective-dev/foundry-inj +cd foundry-inj +``` + +このプロジェクトで使用するユーティリティ関数を提供する `forge-std` ライブラリをインストールします。 + +```shell +forge install foundry-rs/forge-std +``` + +## プロジェクト構造の確認 + +コードエディタ/IDEでリポジトリを開き、ディレクトリ構造を確認しましょう。 + +```text +foundry-inj/ + src/ + Counter.sol → スマートコントラクトのSolidityコード + test/ + Counter.t.sol → テストケース + foundry.toml → 設定ファイル +``` + +`foundry.toml` ファイルは、Injective EVMテストネットに接続するよう事前に設定されています。 +続行する前に、Injectiveテストネットアカウントの秘密鍵を提供するだけです。 + +以下のコマンドを入力して秘密鍵をインポートし、`injTest` という名前のアカウントに保存します: + +```shell +cast wallet import injTest --interactive +``` + +秘密鍵と、このアカウントを使用するたびに入力するパスワードが求められます。 +先ほど作成して資金提供したアカウントの秘密鍵を使用してください(例: Injectiveテストネットfaucet経由)。 +秘密鍵とパスワードのテキストを入力または貼り付けても、ターミナルには何も表示されません。 +出力は以下のようになります: + +```text +Enter private key: +Enter password: +`injTest` keystore was saved successfully. Address: 0x58f936cb685bd6a7dc9a21fa83e8aaaf8edd5724 +``` + + +これにより、秘密鍵の暗号化バージョンが `~/.foundry/keystores` に保存され、 +後続のコマンドで `--account` CLIフラグを使用してアクセスできます。 + + +## スマートコントラクトの編集 + +このデモに含まれるスマートコントラクトは非常にシンプルです。以下の機能を持っています: + +- 数値である `value` を1つ保存します。 +- `value()` クエリメソッドを公開します。 +- `increment(num)` トランザクションメソッドを公開します。 + +ファイルを開きます: `src/Counter.sol` + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +contract Counter { + uint256 public value = 0; + + function increment(uint256 num) external { + value += num; + } +} + +``` + +## スマートコントラクトのコンパイル + +以下のコマンドを実行します: + +```shell +forge build +``` + +Foundryは、`foundry.toml` ファイルで設定されたSolidityコンパイラ (`solc`) のバージョンを自動的にダウンロードして実行します。 + +## コンパイル出力の確認 + +コンパイラが完了すると、プロジェクトディレクトリに追加のディレクトリが表示されます: + +```text +foundry-inj/ + cache/ + ... + out/ + build-info/ + ... + Counter.sol/ + Counter.json → このファイルを開く +``` + +`Counter.json` ファイル (`out/Counter.sol/Counter.json`) を開きます。 +その中に、`abi` と `bytecode` フィールドを含むコンパイラ出力が表示されます。 +これらのアーティファクトは、後のすべてのステップ(テスト、デプロイ、検証、インタラクション)で使用されます。 + +## 次のステップ + +Foundryプロジェクトのセットアップとスマートコントラクトのコンパイルが完了したので、次はスマートコントラクトのテストです! +[Foundryを使用したスマートコントラクトのテスト](./test-foundry/) チュートリアルに進みましょう。 diff --git a/.gitbook/ja/developers-evm/smart-contracts/compile-hardhat.mdx b/.gitbook/ja/developers-evm/smart-contracts/compile-hardhat.mdx new file mode 100644 index 00000000..f4841862 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/compile-hardhat.mdx @@ -0,0 +1,144 @@ +--- +title: Hardhatのセットアップとスマートコントラクトのコンパイル +--- + +## 前提条件 + +最新バージョンのNodeJsがインストールされていることを確認してください。 +以下のコマンドで確認できます: + +```shell +node -v +``` + +このガイドでは以下のバージョンを使用しています: + +```text +v22.16.0 +``` + +NodeJsがまだインストールされていない場合は、以下を使用してインストールしてください: + +- LinuxまたはMac: [NVM](https://github.com/nvm-sh/nvm) +- Windows: [NVM for Windows](https://github.com/coreybutler/nvm-windows) + +ウォレットと、テストネットINJで資金提供されたアカウントが必要です。 + + +EVMテストネット資金は [Injectiveテストネットfaucet](https://testnet.faucet.injective.network/) からリクエストできます。 + + +アカウント作成後、秘密鍵をアクセス可能な場所にコピーしておいてください。このチュートリアルを完了するために必要です。 + + +秘密鍵の取り扱いには注意が必要です。 +ここに記載されている手順は、ローカル開発とテストネットには十分です。 +しかし、メインネットで使用する秘密鍵には**十分なセキュリティではありません**。 +メインネットでは鍵のセキュリティに関するベストプラクティスに従い、メインネットと他のネットワーク間で同じ鍵/アカウントを再利用しないでください。 + + +## 新しいHardhatプロジェクトのセットアップ + +gitを使用してデモリポジトリをクローンします。プロジェクトはすでに完全にセットアップされています。 + +```shell +git clone https://github.com/injective-dev/hardhat-inj +``` + +npmから依存関係をインストールします: + +```shell +npm install +``` + +## プロジェクト構造の確認 + +npmのダウンロードとインストールを待つ間に、コードエディタ/IDEでリポジトリを開き、ディレクトリ構造を確認しましょう。 + +```text +hardhat-inj/ + contracts/ + Counter.sol → スマートコントラクトのSolidityコード + script/ + deploy.js → デプロイスクリプト + test/ + Counter.test.js → テストケース + hardhat.config.js → 設定ファイル + .example.env +``` + +`hardhat.config.js` ファイルは、Injective EVMテストネットに接続するよう事前に設定されています。 +続行する前に、Injectiveテストネットアカウントの秘密鍵を提供するだけです。 + +```shell +cp .example.env .env +``` + +`.env` ファイルを編集して秘密鍵を追加します。 +必要に応じて、代替のJSON-RPCエンドポイントに更新することもできます。 + +```shell +PRIVATE_KEY=0xプレフィックスなしの秘密鍵 +INJ_TESTNET_RPC_URL=https://k8s.testnet.json-rpc.injective.network/ + +``` + +## スマートコントラクトの編集 + +このデモに含まれるスマートコントラクトは非常にシンプルです。以下の機能を持っています: + +- 数値である `value` を1つ保存します。 +- `value()` クエリメソッドを公開します。 +- `increment(num)` トランザクションメソッドを公開します。 + +ファイルを開きます: `contracts/Counter.sol` + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +contract Counter { + uint256 public value = 0; + + function increment(uint256 num) external { + value += num; + } +} + +``` + +## スマートコントラクトのコンパイル + +以下のコマンドを実行します: + +```shell +npx hardhat compile +``` + +Hardhatは、`hardhat.config.js` ファイルで設定されたSolidityコンパイラ (`solc`) のバージョンを自動的にダウンロードして実行します。 + +## コンパイル出力の確認 + +コンパイラが完了すると、プロジェクトディレクトリに追加のディレクトリが表示されます: + +```text +hardhat-inj/ + artifacts/ + build-info/ + ... + contracts/ + Counter.sol/ + Counter.json → このファイルを開く + ... + cache/ + ... +``` + +`Counter.json` ファイル (`artifacts/contracts/Counter.sol/Counter.json`) を開きます。 +その中に、`abi` と `bytecode` フィールドを含むコンパイラ出力が表示されます。 +これらのアーティファクトは、後のすべてのステップ(テスト、デプロイ、検証、インタラクション)で使用されます。 + +## 次のステップ + +Hardhatプロジェクトのセットアップとスマートコントラクトのコンパイルが完了したので、次はスマートコントラクトのテストです! +[Hardhatを使用したスマートコントラクトのテスト](./test-hardhat/) チュートリアルに進みましょう。 diff --git a/.gitbook/ja/developers-evm/smart-contracts/deploy-foundry.mdx b/.gitbook/ja/developers-evm/smart-contracts/deploy-foundry.mdx new file mode 100644 index 00000000..e2e54d4e --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/deploy-foundry.mdx @@ -0,0 +1,50 @@ +--- +title: Foundryを使用したスマートコントラクトのデプロイ +--- + +## 前提条件 + +Foundryプロジェクトがセットアップ済みで、スマートコントラクトのコンパイルが成功している必要があります。 +その方法については [Foundryのセットアップとスマートコントラクトのコンパイル](./compile-foundry/) チュートリアルを参照してください。 + +任意ですが強く推奨: スマートコントラクトのテストも成功している必要があります。 +その方法については [Foundryを使用したスマートコントラクトのテスト](./test-foundry/) チュートリアルを参照してください。 + +## デプロイの実行 + +以下のコマンドでスマートコントラクトをデプロイします: + +```shell +forge create \ + src/Counter.sol:Counter \ + --rpc-url injectiveEvm \ + --legacy \ + --account injTest \ + --gas-price 160000000 \ + --gas-limit 2000000 \ + --broadcast +``` + + +keystoreに保存された `injTest` アカウントを使用しています。 +これは [Foundryのセットアップとスマートコントラクトのコンパイル](./compile-foundry/) で事前にセットアップしたものです。 + + +出力は以下のようになります: + +```text +Enter keystore password: +Deployer: 0x58f936cb685Bd6a7dC9a21Fa83E8aaaF8EDD5724 +Deployed to: 0x213bA803265386C10CE04a2cAa0f31FF3440b9cF +Transaction hash: 0x6aa9022f593083c7779da014a3032efd40f3faa2cf3473f4252a8fbd2a80db6c +``` + +デプロイされたアドレスをコピーし、[`https://testnet.blockscout.injective.network`](https://testnet.blockscout.injective.network/) にアクセスして、検索フィールドにアドレスを貼り付けます。 +デプロイしたスマートコントラクトのブロックエクスプローラーページが表示されます。 + +"Contract" タブをクリックすると、そのコントラクトのEVM bytecodeが表示され、コンパイル後のアーティファクトディレクトリのEVM bytecodeと一致するはずです。 + +## 次のステップ + +スマートコントラクトのデプロイが完了したので、次はスマートコントラクトの検証です! +[Foundryを使用したスマートコントラクトの検証](./verify-foundry/) チュートリアルに進みましょう。 diff --git a/.gitbook/ja/developers-evm/smart-contracts/deploy-hardhat.mdx b/.gitbook/ja/developers-evm/smart-contracts/deploy-hardhat.mdx new file mode 100644 index 00000000..89cb6b53 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/deploy-hardhat.mdx @@ -0,0 +1,58 @@ +--- +title: Hardhatを使用したスマートコントラクトのデプロイ +--- + +## 前提条件 + +Hardhatプロジェクトがセットアップ済みで、スマートコントラクトのコンパイルが成功している必要があります。 +その方法については [Hardhatのセットアップとスマートコントラクトのコンパイル](./compile-hardhat/) チュートリアルを参照してください。 + +任意ですが強く推奨: スマートコントラクトのテストも成功している必要があります。 +その方法については [Hardhatを使用したスマートコントラクトのテスト](./test-hardhat/) チュートリアルを参照してください。 + +## デプロイスクリプトの編集 + +コンピュータ上でコンパイルしたスマートコントラクトをInjectiveテストネット上に存在させるためには、ネットワークにデプロイする必要があります。 + +そのために、`hardhat.config.js` で指定された値を使用してHardhatが事前設定した `ethers` インスタンスを使用するスクリプトを利用します。 + +ファイルを開きます: `script/deploy.js` + +```js +async function main() { + const Counter = await ethers.getContractFactory('Counter'); + const counter = await Counter.deploy({ + gasPrice: 160e6, + gasLimit: 2e6, + }); + await counter.waitForDeployment(); + const address = await counter.getAddress(); + + console.log('Counter smart contract deployed to:', address); +} +``` + +スマートコントラクトのコンパイル後に `artifacts/contracts/Counter.sol/Counter.json` を確認したことを覚えていますか?このスクリプトでは、`ethers.getContractFactory('Counter')` がそのファイルを取得し、ABIとEVM bytecodeを抽出します。 +続く行でその情報を使用してデプロイトランザクションを構築し、ネットワークに送信します。 +成功した場合、スマートコントラクトがデプロイされたアドレスが出力されます。例: +[`0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b`](https://testnet.blockscout.injective.network/address/0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b) + +他のEVMネットワークでは、トランザクション(デプロイトランザクションを含む)でgas priceとgas limitを指定する必要はありません。しかし、現在Injectiveではこれが必要です。 + +## デプロイスクリプトの実行 + +以下のコマンドでスマートコントラクトをデプロイします: + +```shell +npx hardhat run script/deploy.js --network inj_testnet +``` + +デプロイされたアドレスをコピーし、[`https://testnet.blockscout.injective.network`](https://testnet.blockscout.injective.network/) にアクセスして、検索フィールドにアドレスを貼り付けます。 +デプロイしたスマートコントラクトのブロックエクスプローラーページが表示されます。 + +"Contract" タブをクリックすると、そのコントラクトのEVM bytecodeが表示され、コンパイル後のアーティファクトディレクトリのEVM bytecodeと一致するはずです。 + +## 次のステップ + +スマートコントラクトのデプロイが完了したので、次はスマートコントラクトの検証です! +[Hardhatを使用したスマートコントラクトの検証](./verify-hardhat/) チュートリアルに進みましょう。 diff --git a/.gitbook/ja/developers-evm/smart-contracts/index.mdx b/.gitbook/ja/developers-evm/smart-contracts/index.mdx new file mode 100644 index 00000000..09c65280 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/index.mdx @@ -0,0 +1,35 @@ +--- +title: 初めてのEVMスマートコントラクト +--- + +スマートコントラクトは、ブロックチェーン上で実行されるコードです。 +Solidityスマートコントラクトをコンパイルし、 +InjectiveのEthereum Virtual Machine (EVM) 上でテスト、デプロイ、検証、インタラクションを行うことができます。 +標準的なEVM開発ツールやフレームワークも使用可能です。 +このガイドでは、HardhatとFoundryを使用した方法を説明します。 + +## Hardhat + +このガイドでは、[Hardhat](https://hardhat.org/) を使用してInjective テストネット上にEVMスマートコントラクトを構築する手順を説明します。 + +* [Hardhatのセットアップとスマートコントラクトのコンパイル](/developers-evm/smart-contracts/compile-hardhat/) +* [Hardhatを使用したスマートコントラクトのテスト](/developers-evm/smart-contracts/test-hardhat/) +* [Hardhatを使用したスマートコントラクトのデプロイ](/developers-evm/smart-contracts/deploy-hardhat/) +* [Hardhatを使用したスマートコントラクトの検証](/developers-evm/smart-contracts/verify-hardhat/) +* [Hardhatを使用したスマートコントラクトとのインタラクション](/developers-evm/smart-contracts/interact-hardhat/) + +## Foundry + +このガイドでは、[Foundry](https://getfoundry.sh/) を使用してInjective テストネット上にEVMスマートコントラクトを構築する手順を説明します。 + +* [Foundryのセットアップとスマートコントラクトのコンパイル](/developers-evm/smart-contracts/compile-foundry/) +* [Foundryを使用したスマートコントラクトのテスト](/developers-evm/smart-contracts/test-foundry/) +* [Foundryを使用したスマートコントラクトのデプロイ](/developers-evm/smart-contracts/deploy-foundry/) +* [Foundryを使用したスマートコントラクトの検証](/developers-evm/smart-contracts/verify-foundry/) +* [Foundryを使用したスマートコントラクトとのインタラクション](/developers-evm/smart-contracts/interact-foundry/) + +## 次のステップ + +スマートコントラクトは、技術者でないユーザーにユーザーエクスペリエンスを提供しません。 +彼らに対応するためには、分散型アプリケーションを構築する必要があります。 +その方法については、[初めてのdApp](/developers-evm/dapps/) ガイドをご覧ください! diff --git a/.gitbook/ja/developers-evm/smart-contracts/interact-foundry.mdx b/.gitbook/ja/developers-evm/smart-contracts/interact-foundry.mdx new file mode 100644 index 00000000..ee59cd3f --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/interact-foundry.mdx @@ -0,0 +1,136 @@ +--- +title: Foundryを使用したスマートコントラクトとのインタラクション +--- + +## 前提条件 + +Foundryプロジェクトがセットアップ済みで、スマートコントラクトのデプロイが成功している必要があります。 +その方法については [Foundryを使用したスマートコントラクトのデプロイ](./deploy-foundry/) チュートリアルを参照してください。 + +任意ですが強く推奨: スマートコントラクトの検証も成功している必要があります。 +その方法については [Foundryを使用したスマートコントラクトの検証](./verify-foundry/) チュートリアルを参照してください。 + +## 関数の呼び出し - クエリ + +クエリは読み取り専用の操作です。 +そのため、スマートコントラクトの状態は**更新されません**。 +*状態変更なし*のため、ウォレット、署名、トランザクション手数料(gas)は不要です。 + +以下のコマンドで `value()` 関数をクエリします: + +```shell +cast call \ + --rpc-url injectiveEvm \ + ${SC_ADDRESS} \ + "value()" +``` + +`${SC_ADDRESS}` をスマートコントラクトをデプロイしたアドレスに置き換えてください。 + +例えば、スマートコントラクトアドレスが `0x213ba803265386c10ce04a2caa0f31ff3440b9cf` の場合、コマンドは以下のようになります: + +```shell +cast call \ + --rpc-url injectiveEvm \ + 0x213ba803265386c10ce04a2caa0f31ff3440b9cf \ + "value()" +``` + +以下が出力されます。 + +```text +0x0000000000000000000000000000000000000000000000000000000000000000 +``` + + +`0x0000000000000000000000000000000000000000000000000000000000000000` は `0` を意味します。 +これはSolidityの `uint256`(スマートコントラクトの `value()` 関数の戻り値の型)の16進数生表現です。 + + +## 関数の呼び出し - トランザクション + +トランザクションは書き込み操作です。 +そのため、スマートコントラクトの**状態が更新されます**。 +*状態変更*が発生する可能性があるため、トランザクションはウォレットで署名され、トランザクション手数料(gas)を支払う必要があります。 + +以下のコマンドで `increment(num)` 関数のトランザクションを実行します。 + +```shell +cast send \ + --legacy \ + --rpc-url injectiveEvm \ + --gas-price 160000000 \ + --gas-limit 2000000 \ + --account injTest \ + ${SC_ADDRESS} \ + "increment(uint256)" \ + 1 +``` + + +gas priceは *wei* 単位で指定します。 +1 wei = 10^-18 INJ。 + + +`${SC_ADDRESS}` をスマートコントラクトをデプロイしたアドレスに置き換えてください。 + +例えば、スマートコントラクトアドレスが `0x213ba803265386c10ce04a2caa0f31ff3440b9cf` の場合、コマンドは以下のようになります: + +```shell +cast send \ + --legacy \ + --rpc-url injectiveEvm \ + --gas-price 160000000 \ + --gas-limit 2000000 \ + --account injTest \ + 0x213ba803265386c10ce04a2caa0f31ff3440b9cf \ + "increment(uint256)" \ + 1 +``` + +成功した場合、以下のような結果が表示されます: + +```text +Enter keystore password: +blockHash 0xe4c1f5faafc5365c43678135d6adc87104f0e288cddfcdffeb2f5aa08282ca22 +blockNumber 83078201 +contractAddress +cumulativeGasUsed 43623 +effectiveGasPrice 160000000 +from 0x58f936cb685Bd6a7dC9a21Fa83E8aaaF8EDD5724 +gasUsed 43623 +logs [] +logsBloom 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +root +status 1 (success) +transactionHash 0x3c95e15ba24074301323e09d09d5967cc2858e255d1fdfd912758fd8bbd353b4 +transactionIndex 0 +type 0 +blobGasPrice +blobGasUsed +to 0x213bA803265386C10CE04a2cAa0f31FF3440b9cF +``` + +状態を更新した後、新しい状態をクエリできます。 +結果は状態変更を反映します。 + +```shell +cast call \ + --rpc-url injectiveEvm \ + ${SC_ADDRESS} \ + "value()" +``` + +今回の結果は `0x0000000000000000000000000000000000000000000000000000000000000001` です。`0 + 1 = 1` だからです。 + +```js +0x0000000000000000000000000000000000000000000000000000000000000001 +``` + +## 次のステップ + +おめでとうございます!Foundryを使用したInjectiveでのEVMスマートコントラクト開発の全ガイドが完了しました! + +スマートコントラクトは、技術者でないユーザーにユーザーエクスペリエンスを提供しません。 +彼らに対応するためには、分散型アプリケーションを構築する必要があります。 +その方法については、[初めてのdApp](../dapps/) ガイドをご覧ください! diff --git a/.gitbook/ja/developers-evm/smart-contracts/interact-hardhat.mdx b/.gitbook/ja/developers-evm/smart-contracts/interact-hardhat.mdx new file mode 100644 index 00000000..ac4e1579 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/interact-hardhat.mdx @@ -0,0 +1,118 @@ +--- +title: Hardhatを使用したスマートコントラクトとのインタラクション +--- + +## 前提条件 + +Hardhatプロジェクトがセットアップ済みで、スマートコントラクトのデプロイが成功している必要があります。 +その方法については [Hardhatを使用したスマートコントラクトのデプロイ](./deploy-hardhat/) チュートリアルを参照してください。 + +任意ですが強く推奨: スマートコントラクトの検証も成功している必要があります。 +その方法については [Hardhatを使用したスマートコントラクトの検証](./verify-hardhat/) チュートリアルを参照してください。 + +## Hardhatコンソールの起動 + +以下のコマンドで対話型Javascript REPLを起動します。 + +```shell +npx hardhat console --network inj_testnet +``` + +シェルが通常のシェル(bash、zshなど)ではなくNodeJs REPLになります。 +このREPLで、`Counter` スマートコントラクトのインスタンスを作成します。 +`ethers.getContractFactory(...)` と `contract.attach('0x...');` を使用します。 +例えば、スマートコントラクトが `0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b` にデプロイされた場合、コマンドは以下のようになります: + +```js +const Counter = await ethers.getContractFactory('Counter'); +const counter = await Counter.attach('0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b'); +``` + +REPLでは `> ` がシェルプロンプトとして表示されます。 +各プロンプトの結果はこのプレフィックスなしで出力されます。 +ターミナルの内容は以下のようになります: + +```js +> const Counter = await ethers.getContractFactory('Counter'); +undefined +> const counter = await Counter.attach('0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b'); +undefined +``` + +これで `counter` を使用してスマートコントラクトとインタラクションできます。 + +## 関数の呼び出し - クエリ + +クエリは読み取り専用の操作です。 +そのため、スマートコントラクトの状態は**更新されません**。 +*状態変更なし*のため、ウォレット、署名、トランザクション手数料(gas)は不要です。 + +以下のコマンドで `value()` 関数をクエリします。 + +```js +await counter.value(); +``` + +以下が出力されます。 + +```js +0n +``` + + +`0n` は `0` を意味し、`n` サフィックスは +[`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) +であり、[`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number) ではないことを示します。 + +これは、Solidityの `uint256`(スマートコントラクトの `value()` 関数の戻り値の型)を +`Number` で表現することができないためです。 +`Number` の最大整数値は `2^53 - 1` です。 +そのため `BigInt` を使用する必要があります。 + + +## 関数の呼び出し - トランザクション + +トランザクションは書き込み操作です。 +そのため、スマートコントラクトの**状態が更新されます**。 +*状態変更*が発生する可能性があるため、トランザクションはウォレットで署名され、トランザクション手数料(gas)を支払う必要があります。 + +以下のコマンドで `increment(num)` 関数のトランザクションを実行します。 + +```js +await counter.increment(1, { gasPrice: 160e6, gasLimit: 2e6 }); +``` + +gas priceは *wei* 単位で指定します。 +1 wei = 10^-18 INJ。 + + +成功した場合、以下のような結果が表示されます: + +```js +ContractTransactionResponse { ... +``` + +状態を更新した後、新しい状態をクエリできます。 +結果は状態変更を反映します。 + +```js +await counter.value(); +``` + +今回の結果は `1n` です。`0 + 1 = 1` だからです。 + +```js +1n +``` + +## Hardhatコンソールの停止 + +`Ctrl+C` を2回連続で押すか、`.exit` コマンドを入力します。 + +## 次のステップ + +おめでとうございます!Hardhatを使用したInjectiveでのEVMスマートコントラクト開発の全ガイドが完了しました! + +スマートコントラクトは、技術者でないユーザーにユーザーエクスペリエンスを提供しません。 +彼らに対応するためには、分散型アプリケーションを構築する必要があります。 +その方法については、[初めてのdApp](../dapps/) ガイドをご覧ください! diff --git a/.gitbook/ja/developers-evm/smart-contracts/test-foundry.mdx b/.gitbook/ja/developers-evm/smart-contracts/test-foundry.mdx new file mode 100644 index 00000000..3c12e16b --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/test-foundry.mdx @@ -0,0 +1,84 @@ +--- +title: Foundryを使用したスマートコントラクトのテスト +--- + +## 前提条件 + +Foundryプロジェクトがセットアップ済みで、スマートコントラクトのコンパイルが成功している必要があります。 +その方法については [Foundryのセットアップとスマートコントラクトのコンパイル](./compile-foundry/) チュートリアルを参照してください。 + +## テスト仕様の編集 + +テスト対象のスマートコントラクトは最小限のものなので、必要なテストケースも最小限です。 + +テスト前に、スマートコントラクトをデプロイする必要があります。 +これは `setUp` ブロックで行われます。 +スマートコントラクトは単独では実行できず、EVM内で実行する必要があるためです。 +Foundryでは、デフォルトでテストはエミュレートされたインメモリEVMインスタンスで実行され、一時的なものなので、デプロイは形式的なものです。 + +ファイルを開きます: `test/Counter.t.sol` + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity 0.8.28; + +import { Test } from "forge-std/Test.sol"; +import { Counter } from "../src/Counter.sol"; + +contract CounterTest is Test { + Counter public counter; + + function setUp() public { + counter = new Counter(); + } + + function testInitialValue() public view { + assertEq(counter.value(), 0); + } + + function testIncrementValueFromZero() public { + counter.increment(100); + assertEq(counter.value(), 100); + } + + function testIncrementValueFromNonZero() public { + counter.increment(100); + counter.increment(23); + assertEq(counter.value(), 123); + } +} + +``` + +3つのテストケースがあります: + +- 初期 `value()` の確認。 +- `increment(num)` を呼び出し、`value()` が更新されたことを確認。 +- `increment(num)` を再度呼び出し、`value()` が再度更新されたことを確認。 + +## スマートコントラクトに対するテストの実行 + +以下のコマンドでテストを実行します。 + +```shell +forge test +``` + +## テスト出力の確認 + +すべてのテストが計画通りに動作すれば、以下のような出力が表示されます: + +```text +Ran 3 tests for test/Counter.t.sol:CounterTest +[PASS] testIncrementValueFromNonZero() (gas: 32298) +[PASS] testIncrementValueFromZero() (gas: 31329) +[PASS] testInitialValue() (gas: 10392) +Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.35ms (3.16ms CPU time) + +Ran 1 test suite in 171.04ms (5.35ms CPU time): 3 tests passed, 0 failed, 0 skipped (3 total tests) +``` + +## 次のステップ + +スマートコントラクトのテストが完了したので、次はスマートコントラクトのデプロイです! +[Foundryを使用したスマートコントラクトのデプロイ](./deploy-foundry/) チュートリアルに進みましょう。 diff --git a/.gitbook/ja/developers-evm/smart-contracts/test-hardhat.mdx b/.gitbook/ja/developers-evm/smart-contracts/test-hardhat.mdx new file mode 100644 index 00000000..ae773053 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/test-hardhat.mdx @@ -0,0 +1,88 @@ +--- +title: Hardhatを使用したスマートコントラクトのテスト +--- + +## 前提条件 + +Hardhatプロジェクトがセットアップ済みで、スマートコントラクトのコンパイルが成功している必要があります。 +その方法については [Hardhatのセットアップとスマートコントラクトのコンパイル](./compile-hardhat/) チュートリアルを参照してください。 + +## テスト仕様の編集 + +テスト対象のスマートコントラクトは最小限のものなので、必要なテストケースも最小限です。 + +テスト前に、スマートコントラクトをデプロイする必要があります。 +これは `before` ブロックで行われます。 +スマートコントラクトは単独では実行できず、EVM内で実行する必要があるためです。 +Hardhatでは、デフォルトでテストはエミュレートされたインメモリEVMインスタンスで実行され、一時的なものなので、デプロイは形式的なものです。 + +ファイルを開きます: `test/Counter.test.js` + +```js +const { expect } = require('chai'); + +describe('Counter', function () { + let counter; + + before(async function () { + Counter = await ethers.getContractFactory('Counter'); + counter = await Counter.deploy(); + await counter.waitForDeployment(); + }); + + it('should start with a count of 0', async function () { + expect(await counter.value()).to.equal(0); + }); + + it('should increment the count starting from zero', async function () { + await counter.increment(100); + expect(await counter.value()).to.equal(100); + }); + + it('should increment the count starting from non-zero', async function () { + await counter.increment(23); + expect(await counter.value()).to.equal(123); + }); +}); + +``` + +3つのテストケースがあります: + +- 初期 `value()` の確認。 +- `increment(num)` を呼び出し、`value()` が更新されたことを確認。 +- `increment(num)` を再度呼び出し、`value()` が再度更新されたことを確認。 + +## スマートコントラクトに対するテストの実行 + +以下のコマンドでテストを実行します。 + +```shell +npx hardhat test +``` + +以下のコマンドは、エミュレートされたEVMインスタンスでは**なく**、Injectiveテストネット(パブリックネットワーク)にスマートコントラクトをデプロイしてテストを実行します。 +ほとんどの場合、この方法は**推奨されません**。特定/高度なユースケースでのみ必要です。 + +```shell +npx hardhat test --network inj_testnet +``` + +## テスト出力の確認 + +すべてのテストが計画通りに動作すれば、以下のような出力が表示されます: + +```text + Counter + ✔ should start with a count of 0 + ✔ should increment the count starting from zero + ✔ should increment the count starting from non-zero + 3 passing (41ms) +``` + +その後、gas(複雑さとトランザクションコストの指標)に関する追加レポートを含むテーブルが表示されます。 + +## 次のステップ + +スマートコントラクトのテストが完了したので、次はスマートコントラクトのデプロイです! +[Hardhatを使用したスマートコントラクトのデプロイ](./deploy-hardhat/) チュートリアルに進みましょう。 diff --git a/.gitbook/ja/developers-evm/smart-contracts/verify-foundry.mdx b/.gitbook/ja/developers-evm/smart-contracts/verify-foundry.mdx new file mode 100644 index 00000000..6d08a5cc --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/verify-foundry.mdx @@ -0,0 +1,80 @@ +--- +title: Foundryを使用したスマートコントラクトの検証 +--- + +## 前提条件 + +Foundryプロジェクトがセットアップ済みで、スマートコントラクトのデプロイが成功している必要があります。 +その方法については [Foundryを使用したスマートコントラクトのデプロイ](./deploy-foundry/) チュートリアルを参照してください。 + +## スマートコントラクトの検証とは? + +検証プロセスは、スマートコントラクト自体やネットワークの他の状態に影響を与えません。 + +代わりに、特定のアドレスにデプロイされたスマートコントラクトの元のソースコードをネットワークエクスプローラーに提供する標準化されたプロセスです。ネットワークエクスプローラーはそのソースコードを**独立してコンパイル**し、結果のbytecodeがスマートコントラクトのデプロイトランザクションのbytecodeと実際に**一致**することを検証します。 + +検証が合格(一致)した場合、ブロックエクスプローラーはその特定のスマートコントラクトのページで拡張モードを「アンロック」します。 +以下を含むより詳細なスマートコントラクト情報が表示されます: +* 完全なソースコード (Solidity) +* ABI (JSON) +* トランザクションとイベントがより詳細に表示されます (ABIを使用してパース) + +また、ユーザーがウォレットを接続すると、ネットワークエクスプローラー内でスマートコントラクトの関数を呼び出してクエリを実行したり、トランザクションを送信して状態を更新したりすることができます。 + +{/* TODO consider moving this section to FAQs */} + +## 検証コマンドの実行 + +以下のコマンドを入力します: + +```shell +forge verify-contract \ + --rpc-url injectiveEvm \ + --verifier blockscout \ + --verifier-url 'https://testnet.blockscout-api.injective.network/api/' \ + ${SC_ADDRESS} \ + src/Counter.sol:Counter +``` + +`${SC_ADDRESS}` をスマートコントラクトをデプロイしたアドレスに置き換えてください。 + +例えば、スマートコントラクトアドレスが `0x213bA803265386C10CE04a2cAa0f31FF3440b9cF` の場合、コマンドは以下のようになります: + +```shell +forge verify-contract \ + --rpc-url injectiveEvm \ + --verifier blockscout \ + --verifier-url 'https://testnet.blockscout-api.injective.network/api/' \ + 0x213bA803265386C10CE04a2cAa0f31FF3440b9cF \ + src/Counter.sol:Counter +``` + +## 検証結果の確認 + +ターミナルに以下のような出力が表示されます: + +```text +Start verifying contract `0x213bA803265386C10CE04a2cAa0f31FF3440b9cF` deployed on 1439 +Submitting verification for [src/Counter.sol:Counter] 0x213bA803265386C10CE04a2cAa0f31FF3440b9cF. +Submitted contract for verification: + Response: `OK` + GUID: `213ba803265386c10ce04a2caa0f31ff3440b9cf686b778c` + URL: https://testnet.blockscout-api.injective.network/address/0x213ba803265386c10ce04a2caa0f31ff3440b9cf +``` + +より興味深いのは、ネットワークエクスプローラーを訪問することです。 +検証出力のネットワークエクスプローラーURLにアクセスします。 +そして "Contract" タブを選択します。 +次に "Code" サブタブを選択します。 +以前は "ByteCode" のみが利用可能でしたが、 +現在は "Code"、"Compiler"、"ABI" も利用可能です。 + +"Contract" タブ内で、 +"Read/Write contract" サブタブを選択します。 +以前はこれは存在しませんでしたが、 +現在はブロックエクスプローラーから直接すべてのスマートコントラクト関数とインタラクションできます。 + +## 次のステップ + +スマートコントラクトのデプロイと検証が完了したので、次はスマートコントラクトとのインタラクションです! +[Foundryを使用したスマートコントラクトとのインタラクション](./interact-foundry/) チュートリアルに進みましょう。 diff --git a/.gitbook/ja/developers-evm/smart-contracts/verify-hardhat.mdx b/.gitbook/ja/developers-evm/smart-contracts/verify-hardhat.mdx new file mode 100644 index 00000000..9cd8bff0 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/verify-hardhat.mdx @@ -0,0 +1,100 @@ +--- +title: Hardhatを使用したスマートコントラクトの検証 +--- + +## 前提条件 + +Hardhatプロジェクトがセットアップ済みで、スマートコントラクトのデプロイが成功している必要があります。 +その方法については [Hardhatを使用したスマートコントラクトのデプロイ](./deploy-hardhat/) チュートリアルを参照してください。 + +## スマートコントラクトの検証とは? + +検証プロセスは、スマートコントラクト自体やネットワークの他の状態に影響を与えません。 + +代わりに、特定のアドレスにデプロイされたスマートコントラクトの元のソースコードをネットワークエクスプローラーに提供する標準化されたプロセスです。ネットワークエクスプローラーはそのソースコードを**独立してコンパイル**し、結果のbytecodeがスマートコントラクトのデプロイトランザクションのbytecodeと実際に**一致**することを検証します。 + +検証が合格(一致)した場合、ブロックエクスプローラーはその特定のスマートコントラクトのページで拡張モードを「アンロック」します。 +以下を含むより詳細なスマートコントラクト情報が表示されます: +* 完全なソースコード (Solidity) +* ABI (JSON) +* トランザクションとイベントがより詳細に表示されます (ABIを使用してパース) + +また、ユーザーがウォレットを接続すると、ネットワークエクスプローラー内でスマートコントラクトの関数を呼び出してクエリを実行したり、トランザクションを送信して状態を更新したりすることができます。 + +{/* TODO consider moving this section to FAQs */} + +## スマートコントラクト検証設定の編集 + +`hardhat.config.js` を開き、`etherscan` と `sourcify` 要素を確認します。 + +```js + etherscan: { + apiKey: { + inj_testnet: 'nil', + }, + customChains: [ + { + network: 'inj_testnet', + chainId: 1439, + urls: { + apiURL: 'https://testnet.blockscout-api.injective.network/api', + browserURL: 'https://testnet.blockscout.injective.network/', + }, + }, + ], + }, + sourcify: { + enabled: false, + }, +``` + +SourcifyとEtherscanは2つの人気のあるブロックエクスプローラーで、それぞれ異なる検証APIを持っています。 +InjectiveはBlockscoutを使用しており、Etherscan APIと互換性があります。 +そのため、設定ではSourcifyが無効化されています。 +Etherscan設定内の `apiKey` 値は不要なので、空でない任意の値でOKです。 +`customChains` 内の `inj_testnet` ネットワークは、Injectiveテストネットの適切な値で既に設定されています。 + +## 検証コマンドの実行 + +以下のコマンドを入力します: + +```shell +npx hardhat verify --network inj_testnet ${SC_ADDRESS} +``` + +`${SC_ADDRESS}` をスマートコントラクトをデプロイしたアドレスに置き換えてください。 + +例えば、スマートコントラクトアドレスが `0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b` の場合、コマンドは以下のようになります: + +```shell +npx hardhat verify --network inj_testnet 0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b +``` + +## 検証結果の確認 + +ターミナルに以下のような出力が表示されます: + +```text +Successfully submitted source code for contract +contracts/Counter.sol:Counter at 0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b +for verification on the block explorer. Waiting for verification result... + +Successfully verified contract Counter on the block explorer. +https://testnet.blockscout.injective.network/address/0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b#code +``` + +より興味深いのは、ネットワークエクスプローラーを訪問することです。 +検証出力のネットワークエクスプローラーURLにアクセスします。 +そして "Contract" タブを選択します。 +次に "Code" サブタブを選択します。 +以前は "ByteCode" のみが利用可能でしたが、現在は "Code"、"Compiler"、"ABI" も利用可能です。 + +"Contract" タブ内で、 +"Read/Write contract" サブタブを選択します。 +以前はこれは存在しませんでしたが、 +現在はブロックエクスプローラーから直接すべてのスマートコントラクト関数とインタラクションできます。 + +## 次のステップ + +スマートコントラクトのデプロイと検証が完了したので、次はスマートコントラクトとのインタラクションです! +[Hardhatを使用したスマートコントラクトとのインタラクション](./interact-hardhat/) チュートリアルに進みましょう。 diff --git a/.gitbook/ja/developers-evm/wrapped-inj.mdx b/.gitbook/ja/developers-evm/wrapped-inj.mdx new file mode 100644 index 00000000..a588dbca --- /dev/null +++ b/.gitbook/ja/developers-evm/wrapped-inj.mdx @@ -0,0 +1,121 @@ +--- +title: Wrapped INJ (wINJ) +--- + +# Wrapped INJ (wINJ) + +## ラップされた暗号通貨とは? + +Injectiveでは、INJはネットワーク上のトランザクション手数料の支払いに使用される暗号通貨です。 + +しかし、一部のdApp(DEXを含む)はインターフェースでERC20トークンのみを受け付けるため、INJはそれらでは**動作しません**。 + +解決策は、INJをラップするERC20トークンを作成することです。これを「wrapped INJ」と呼びます。 +そのトークンシンボルは**wINJ**です。 +したがって、ERC20トークンを受け付けるdAppはwINJも受け付けます。 + +wINJトークンの動作メカニズムは簡単です: + +- Mint: INJを入金する際にトータルサプライを増加させます。 +- Burn: INJを引き出す際にトータルサプライを減少させます。 + +wINJは、INJと1対1で担保されたERC20トークンと考えることができ、異なる技術的インターフェースを持ちながら同等の価値として扱うことができます。 + +## wINJはwETHと同じですか? + +Ethereumに詳しい方は、これがwrapped Ether (wETH) と同じように聞こえると思われるかもしれません。 +その通りで、ここまではwINJはwETHと同じように動作します。 + +しかし、InjectiveネットワークはMultiVMテクニカルアーキテクチャで設計されていることに注意してください。 +これは、wINJがwETHのように*標準的な*ERC20実装を使用して実装された場合、 +wINJはInjectiveネットワークのEVM以外の部分(例:Cosmosトランザクション)とインタラクションする際に**アクセスできない**ことを意味します。 + +これはまさに、Injectiveの +[MultiVM Token Standard (MTS)](/developers-evm/multivm-token-standard) +が設計された制限のタイプです。 + +具体的には、 +[この行](https://github.com/InjectiveLabs/solidity-contracts/blob/b152129a/src/WINJ9.sol#L9C10-L9C15)に注目してください: + +```solidity +contract WINJ9 is BankERC20, IWINJ9 { +``` + +ERC20実装で一般的なように、スマートコントラクト内に`uint256`値として残高を保存する代わりに、 +wINJスマートコントラクトは`Bank` precompileを使用します。 +マジックは +[`BankERC20`の`_update`関数](https://github.com/InjectiveLabs/solidity-contracts/blob/b152129a/src/BankERC20.sol#L50-L81)で起こり、 +`Bank`モジュールの`mint`、`burn`、または`transfer`関数が +[EVM precompile](/developers-evm/bank-precompile "InjectiveのネイティブBankモジュール用EVM precompile")を介して呼び出されます。 + +これらの残高は`Bank` precompileから保存/取得されるため、 +InjectiveのMultiVMアーキテクチャの他の場所からアクセスできます。 +例えば、Cosmos SDKを使用してwINJ残高をクエリできます。 +EVMトランザクションを通じて更新した後でも、またその逆も同様です。 +これを「ネイティブチェーン残高」と呼びます。 + +[wINJの完全なデモ](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos/winj9)をご覧ください。 + +## wINJをプログラムで使用する方法 + +- Injective Mainnetのアドレス: `0x0000000088827d2d103ee2d9A6b781773AE03FfB` +- Injective Testnetのアドレス: `0x0000000088827d2d103ee2d9A6b781773AE03FfB` + +INJをwINJに変換するには、このスマートコントラクトの`deposit`関数を呼び出します: + +- 関数シグネチャ: `deposit() public payable` +- パラメータとして金額を指定する必要はありません。トランザクションに`value`を設定すると、`payable`が`msg.value`として取得します。 + +wINJをINJに変換するには、このスマートコントラクトの`withdraw`関数を呼び出します: + +- 関数シグネチャ: `withdraw(uint256 wad) public` +- 受け取りたいINJの金額を`wad`パラメータとして設定します。 + +その他の関数(例:転送)は標準のERC20と同じです。 + +## ネットワークエクスプローラーでwINJを使用する方法 + +- Injective MainnetのエクスプローラーURL: [`0x0000000088827d2d103ee2d9A6b781773AE03FfB`](https://blockscout.injective.network/address/0x0000000088827d2d103ee2d9A6b781773AE03FfB?tab=contract) +- Injective TestnetのエクスプローラーURL: [`0x0000000088827d2d103ee2d9A6b781773AE03FfB`](https://testnet.blockscout.injective.network/address/0x0000000088827d2d103ee2d9A6b781773AE03FfB?tab=contract) + +INJをwINJに変換するには、このスマートコントラクトの`deposit`関数を呼び出します: + +- エクスプローラーページのwINJトークンの「Contract」タブ、次に「Read/Write contract」サブタブに移動します。 +- `deposit()`関数を見つけ、`>`シンボルをクリックして展開します。 +- 「Send native INJ (uint256)」フィールドに変換したいINJの金額を入力します。 + - この数値は自動的に`10^18`が乗算されるため、手動で変換する必要はありません。 +- 「Write」ボタンを押します。 +- ウォレットでトランザクションを確認し、署名して送信します。 +- ウォレットに、選択した金額のINJ減少とwINJ増加が反映されるはずです。 + - INJの減少はわずかに多くなります。トランザクション手数料の支払いに使用されるためです。 + +wINJをINJに変換するには、このスマートコントラクトの`withdraw`関数を呼び出します: + +- エクスプローラーページのwINJトークンの「Contract」タブ、次に「Read/Write contract」サブタブに移動します。 +- `withdraw()`関数を見つけ、`>`シンボルをクリックして展開します。 +- 「wad (uint256)」フィールドに変換したいwINJの金額を入力します。 + - この数値は自動的に`10^18`が乗算されるため、手動で変換する必要はありません。 +- 「Write」ボタンを押します。 +- ウォレットでトランザクションを確認し、署名して送信します。 +- ウォレットに、選択した金額のINJ増加とwINJ減少が反映されるはずです。 + - INJの増加はわずかに少なくなります。トランザクション手数料の支払いに使用されるためです。 + +# Injective DoでwINJを使用する方法 + +- [Injective Do](https://do.injective.network/)にアクセスします。 +- 右上の「Connect」ボタンを押します。 +- ウォレットを選択します。 +- ウォレットで「Allow」を選択し、Injective Do dAppへの接続を許可します。 +- 右上(以前「Connect」ボタンがあった場所)にウォレットアドレスが表示されるはずです。 +- 上部のナビゲーションバーで「EVM」を選択します。 +- ドロップダウンメニューで「Wrap/Unwrap」を選択します。 +- INJをwINJに変換する場合 + - 上部の「Wrap」タブを押します。 + - 「Amount」フィールドに変換したい金額を入力します。 + - 下部の「Wrap」ボタンを押します。 + - トランザクションが完了したら、ウォレットのINJおよびwINJ残高を確認します。 +- wINJをINJに変換する場合 + - 上部の「Unwrap」タブを押します。 + - 「Amount」フィールドに変換したい金額を入力します。 + - 下部の「Unwrap」ボタンを押します。 + - トランザクションが完了したら、ウォレットのINJおよびwINJ残高を確認します。