diff --git a/.gitbook/docs.json b/.gitbook/docs.json index 46996eed..8324f226 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 Smart Contract", + "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..edd916ff --- /dev/null +++ b/.gitbook/ja/developers-evm/add-injective-to-your-dapp.mdx @@ -0,0 +1,65 @@ +--- +title: InjectiveをdAppに追加する +--- + +# InjectiveをdAppに追加する + +ユーザーがワンクリックで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..ee4658c0 --- /dev/null +++ b/.gitbook/ja/developers-evm/bank-precompile.mdx @@ -0,0 +1,50 @@ +--- +title: Bank Precompile +--- + +# Bank Precompile + +Bank Precompileは、固定アドレス`0x0000000000000000000000000000000000000064`に存在するシステムsmart contractです。 + +EVM開発者に対して、Injectiveの**bank module**(`x/bank`)と直接やり取りするためのgas効率の良いネイティブな手段を提供します。これにより、ERC-20トークンを効果的にオンチェーンに取り込むことができます。Bank precompileを使用するすべてのERC-20 contractは、オンチェーンでは`erc20:0x...`というdenomとして表現されます。技術的には、トークンはオンチェーンにのみ存在し、EVMは別のコピーを保持するのではなく、チェーンの状態へのビューを提供するということを意味します。従来のブリッジングでは2つのトークンバージョンが存在しユーザーの操作で切り替える必要がありますが、Bank precompileはオンチェーンのbank denomまたはERC-20の`transfer()`メソッドのいずれを使用した転送でもリアルタイムにデュアル環境の反映を提供します。 + +Bank precompileを基盤としたERC-20実装、precompileインターフェース、および抽象contractが[InjectiveのSolidity Contractsリポジトリ](https://github.com/InjectiveLabs/solidity-contracts)で利用可能です。主要なcontractは以下の通りです: + +* **Bank.sol** – precompileインターフェース +* **BankERC20.sol** – Bank precompileを基盤とした抽象ERC20実装 +* **FixedSupplyBankERC20.sol** – 固定供給量の分散型ERC20(オーナーなし、mintおよびburnなし) +* **MintBurnBankERC20.sol** – トークンのmintとburnが許可されたオーナー付きERC20 + +これらの実装はOpenZeppelinのERC20 contractに基づいています。開発者はBank precompileを利用して自由にカスタムERC20 contractを作成できます。 + +## ERC20 Contractのデプロイ + +**ℹ️ 注意:** + +denomスパムを防止するため、ERC20 moduleを介したERC20 contractのデプロイは**有料操作**であり、デプロイ手数料として**1 INJ**が必要です。ERC20 contractのデプロイトランザクションにこの金額が含まれていることを確認してください。含まれていない場合、操作は拒否されます。 + +## 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 "Is wINJ the same as wETH?") +は、[MultiVM Token Standard (MTS)](/developers-evm/multivm-token-standard)を実装するために +Bank EVM precompileを活用しています。 + +## 開発を始める + +Bank、Exchange、Staking precompilesを使用したcontractの構築方法を示すデモをいくつか用意しました。これらの例では、最も一般的な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..24142d5d --- /dev/null +++ b/.gitbook/ja/developers-evm/dapps/connect-with-metamask.mdx @@ -0,0 +1,291 @@ +--- +title: MetaMask で接続する +--- + +## MetaMask を Injective EVM Testnet に接続する + +MetaMask は、**Injective EVM** を含む EVM 互換ネットワークに接続できるブラウザウォレット拡張機能です。 + +### MetaMask のインストール方法 + +[MetaMask ダウンロードページ](https://metamask.io/download)から公式の MetaMask 拡張機能をインストールしてください。 + +### Injective EVM Testnet を MetaMask に追加する + +1. ブラウザで **MetaMask アイコン**をクリックし、ウォレットのロックを解除します。 +2. 上部の**ネットワークセレクター**をクリックします(デフォルトは _"Ethereum Mainnet"_ です)。 +3. **"Add Network"** または **"Add a network manually"** を選択して、カスタムネットワークフォームを開きます。 + +#### Injective EVM Testnet のパラメータ + +以下の情報を入力してください: + +```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 Testnet に切り替える + +ネットワークが追加されたら、ネットワークセレクターを使用して **Injective EVM Testnet** に切り替えます。 + +### ウォレットに資金を入れる(任意) + +Testnet INJ が必要ですか?[Injective Testnet faucet](https://testnet.faucet.injective.network) にアクセスしてください。 + +資金は Testnet ブロックに含まれると表示されます。 + +*** + +### 準備完了! + +MetaMask が **Injective EVM Testnet** に接続されました。以下のことができます: + +* **Foundry**、**Hardhat**、または **Remix** などのツールを使用して smart contract をデプロイする。 +* Testnet の 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` を使用して smart contract と対話する + +カウンターコントラクト 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` を使用して smart contract と対話する + +サンプルコード + +```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..9586b466 --- /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) に登録し、**project 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..354be6a8 --- /dev/null +++ b/.gitbook/ja/developers-evm/dapps/index.mdx @@ -0,0 +1,16 @@ +--- +description: MetaMask または WalletConnect でウォレットを接続する +title: 初めての EVM dApp +--- + +dApp は、ブロックチェーンと対話するフロントエンドアプリケーションであり、 +通常は smart contract を使用します。 + +まず[初めての EVM smart contract](/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..9465b299 --- /dev/null +++ b/.gitbook/ja/developers-evm/erc20-module.mdx @@ -0,0 +1,21 @@ +--- +title: ERC20 Module +--- + +### ERC20 Module + +ERC20 moduleは、**既存の**bank denom(例:IBCブリッジされたトークン、USDC、tokenfactory、およびPeggy)をInjective EVMと統合することを可能にします。このモジュールはストレージ内にトークンペア間のマッピングを維持し、ERC20トークンと対応するbank denomの間の関連付けを作成します。既存のbank denomに対して新しいトークンペアが生成されると、モジュールはBank precompileとやり取りするERC20 contractをデプロイし、ストレージマッピングを参照してERC20アドレスを対応するbank denomに紐付けます。このモジュールにはいくつかの重要な目的があります: + +1. **ストレージ**:bank denom ↔ ERC20アドレス間のマッピング +2. **新しいメッセージタイプ**:チェーンメッセージを発行して新しいトークンペアマッピングを確立することをユーザーに可能にします + +#### 新しいトークンペアの作成 + +現在、3種類のbank denomがトークンペアを関連付けることができ、それぞれに固有のルールがあります: + +* **Tokenfactory (`factory/...`)**\ + denomの管理者またはガバナンスのみがトークンペアを作成できます。送信者はカスタム実装として既存のERC20 contractアドレスを指定できます。省略された場合、`MintBurnBankERC20.sol`の新しいインスタンスがデプロイされ、`msg.sender`がオーナーとなり、contractを通じて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..2c5ec387 --- /dev/null +++ b/.gitbook/ja/developers-evm/evm-equivalence.mdx @@ -0,0 +1,42 @@ +--- +description: Injective における EVM equivalence の理解 +title: EVM Equivalence +--- + +## Injective EVM と Ethereum Mainnet の比較 + +Injective のネイティブ EVM は、チェーンのコアアーキテクチャに統合された完全な組み込み実行環境です。開発体験において Ethereum と 1:1 で同等になるよう設計されています。 + +Injective のネイティブ EVM は最新バージョンの `geth` をサポートしており、開発者は最新の機能、ツール、セキュリティパッチ、改善にアクセスできます。さらに、Injective の EVM はパフォーマンスを向上させ、機能を拡張し、Ethereum では利用できない Injective の高度な金融インフラストラクチャへのアクセスを提供します。 + +## トランザクションの gas 費用見積もり + +| チェーン | gas 価格範囲 | トークン価格 | 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 価格のソース + +1. [Ethereum gas 価格ソース](https://etherscan.io/chart/gasprice) ↩︎ +2. [Polygon gas 価格ソース](https://polygonscan.com/chart/gasprice) ↩︎ +3. [Optimism gas 価格ソース](https://optimistic.etherscan.io/chart/gasprice) ↩︎ +4. [Avalanche gas 価格ソース](https://snowtrace.io/insight/leaderboard/gas-tracker) ↩︎ +5. [BnB Smart Chain gas 価格ソース](https://bscscan.com/chart/gasprice) ↩︎ +6. [Sei gas 価格設定](https://github.com/sei-protocol/chain-registry/blob/main/gas.json) ↩︎ +7. [Injective が 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..4de904f7 --- /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 Network Information | 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 Network Information | 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 Network Information | Injective | Docs](/developers-evm/network-information#injective-evm-mainnet) + + +inEVMは**非推奨**となっているため、使用**しないでください**。 + + +# Contractアドレス + +| | | | +|---|---|---| +|USDT|MTS USDT|`0x88f7F2b685F9692caf8c478f5BADF09eE9B1Cc13`| +|wETH|wrapped ETH|`0x83A15000b753AC0EeE06D2Cb41a69e76D0D5c7F7`| +|wINJ|wrapped INJ|`0x0000000088827d2d103ee2d9A6b781773AE03FfB`| +|USDC||`0x2a25fbD67b3aE485e461fe55d9DbeF302B7D3989`| +|MultiCall||`0xcA11bde05977b3631167028862bE2a173976CA11`| + +正式なソースとして以下のリファレンスページをご利用ください。 + +リファレンス:[EVM Network Information | Injective | Docs](/developers-evm/network-information#injective-evm-mainnet) + +# ブリッジ + +[Injective Bridge](https://bridge.injective.network) + +ガイド: +- [How To Bridge From Ethereum To Injective Using Metamask](https://injective.com/blog/how-to-bridge-from-ethereum-to-injective-using-metamask/) +- [How To Bridge From Solana To Injective Using Phantom](https://injective.com/blog/how-to-bridge-from-solana-to-injective-using-phantom/) +- [How to Bridge To Injective Using Wormhole](https://injective.com/blog/how-to-bridge-to-injective-using-wormhole/) +- [How To Bridge From Cosmos To Injective Using Keplr](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 DAppsとやり取りする必要があるリテールユーザーに適しています。 + +インストール: + +- お使いのブラウザに対応したブラウザ拡張機能を[https://metamask.io/en-GB](https://metamask.io/en-GB)から取得します。 +- [https://blockscout.injective.network/](https://blockscout.injective.network/)にアクセスし、ページの下部までスクロールします。 +- 「Add Injective」ボタンをクリックします。 +- MetaMaskのユーザーインターフェースの指示に従います。 + +リファレンス:[How to Create an Injective Wallet (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) + +リファレンス:[How to Create an Injective Wallet (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..b7edaedc --- /dev/null +++ b/.gitbook/ja/developers-evm/evm-integrations-faq.mdx @@ -0,0 +1,112 @@ +--- +title: "EVM インテグレーション FAQ" +description: Injective の EVM との統合に関するよくある質問。 +--- + +## Injective EVM は...をサポートしていますか? + +**Injective EVM は(EVM の機能)をサポートしていますか?** + +A: 一般的に、答えは「はい」です。 +より具体的な質問については以下をご覧ください。 + +**Injective EVM は特定の opcode をサポートしていますか?** + +A: はい。opcode の実装において完全な互換性があります。 +より正確に言うと、カスタム opcode は追加しておらず、 +既存の opcode の動作も変更していません。 + +**Injective EVM は ERC20、ERC721、ERC1155 をサポートしていますか?** + +A: はい、Solidity ベースの smart contract 標準はすべて動作します。 +これらは標準的な EVM 以上の特別な機能を必要と*しない*ためです。 + +補足: fungible token を実装する場合、 +ERC20 およびその拡張規格については、 +MultiVM Token Standard (MTS) トークンとして実装することを強く推奨します。 +これにより、同じトークンが Injective の EVM 上だけでなく、 +Injective ネイティブ(具体的には Cosmos Denoms として)でも fungible token として機能します。 +将来 Injective が他の 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 で Foundry と Injective の EVM precompile を使用できますか?** + +A: Injective の [EVM precompile](/developers-evm/precompiles) は、 +汎用的な EVM では利用できない Injective ネイティブの機能にアクセスします。 +つまり、例えば Foundry を使用して以下に接続する場合: + +- Injective EVM Testnet - 動作します +- `localhost` のシミュレートされた EVM ネットワーク - 動作しません + +後者の問題に対処するため、Injective precompile(`BankERC20.sol` と MTS に必要な Bank precompile から対応)をサポートする Foundry ツールのフォーク版を作成しました。 +Foundry プロジェクトとして Solidity テストやデプロイスクリプトを使用している場合、 +`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 hard fork 名(サフィックス付き)に対応するキーがあります。 +これらは有効化されている 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..155eb832 --- /dev/null +++ b/.gitbook/ja/developers-evm/exchange-precompile.mdx @@ -0,0 +1,168 @@ +--- +title: Exchange Precompile +--- + +Exchange Precompileは、固定アドレス`0x0000000000000000000000000000000000000065`に存在するシステムsmart contractです。Solidity開発者に対して、Injectiveチェーンのexchange moduleと直接やり取りするためのgas効率の良いネイティブな手段を提供します。このprecompileを活用することで、smart contractは以下のようなさまざまなexchange関連のアクションをシームレスに実行できます: + +* サブアカウントへの資金の入金および出金。 +* スポットおよびデリバティブ注文の発注またはキャンセル。 +* サブアカウント残高およびオープンポジションのクエリ。 +* 他のアカウントまたはcontractに対する認可グラントの管理。 + +#### Precompileの呼び出し:直接アクセス vs プロキシアクセス + +Exchange Precompileとのやり取りには、主に2つの方法があります: + +**1. 直接アクセス(自己呼び出しContract)** + +このモードでは、smart contractが自身の代わりにprecompileとやり取りします。contract自体が、自身の資金を使用し、自身のポジションを管理して、exchange moduleで操作を実行するアクターとなります。 + +_例:_ + +``` +exchange.deposit(address(this), subaccountID, denom, amount); +``` + +この方法はシンプルで、contractが自身のリソースを管理する権限を本質的に持っているため、**明示的な認可グラントは不要**です。 + +**2. プロキシアクセス(別のユーザーに代わって呼び出す)** + +Smart contractは、外部ユーザーアカウントに代わってexchange操作を実行する仲介者として設計することもできます。このシナリオでは、contractがprecompileを呼び出し、第三者のアドレスを送信者または操作対象のアカウントとして指定します。 + +_例:_ + +``` +exchange.deposit(userAddress, subaccountID, denom, amount); +``` + +これを成功させるには、smart contract(`grantee`)がユーザー(`userAddress`、`granter`)から指定されたアクションを実行するための**明示的な認可が必要**です。この認可は、precompileが提供する`approve`および`revoke`メソッドを使用して管理されます。**ユーザーの資金のセキュリティを確保するため、これらの認可は慎重に扱うことが重要です。** + +特定のアクションを代わりに実行するようcontractを認可するには: + +``` +exchange.approve(grantee, msgTypes, spendLimit, duration); +``` + +* `grantee`:認可されるcontractのアドレス。 +* `msgTypes`:`grantee`が実行を許可されるメッセージタイプの配列(例:`MsgCreateDerivativeLimitOrder`、`MsgDeposit`)。完全なリストは`ExchangeTypes.sol`またはInjective Protocolのprotobuf定義を参照してください。 +* `spendLimit`:メッセージタイプごとまたはグラント全体で、`grantee`が利用できるトークンの最大量を定義する`Cosmos.Coin`構造体の配列。 +* `duration`:認可が有効な期間(秒単位)。 + +以前に付与された認可を取り消すには: + +``` +exchange.revoke(grantee, msgTypes); +``` + +認可が現在存在するかどうかを確認するには: + +``` +exchange.allowance(grantee, granter, msgType); +``` + +#### 例:直接メソッド + +以下の`ExchangeDemo` contractは、smart contractが直接アクセスメソッドを使用する方法を示しています。自身のサブアカウントと資金を使用して、資金の入金、資金の出金、デリバティブ指値注文の作成、サブアカウントポジションのクエリなどの基本的なexchangeアクションを実行します。 + +`Exchange.sol`および`ExchangeTypes.sol`ファイルには、precompileとやり取りするために必要なインターフェース定義とデータ構造が含まれています。これらは通常、公式のInjective Solidity contractsリポジトリで入手可能であるか、プロジェクトの依存関係として含めることができます。 + +```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` smart contractのビルド、デプロイ、およびやり取りの詳細な手順(サブアカウントの設定や資金調達を含む)については、[solidity-contracts](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos/exchange)リポジトリの包括的なデモを参照してください。 + +#### まとめ + +Exchange Precompileは、洗練されたプロトコル統合型の取引ロジックをInjective上のsmart contractに直接組み込むことを可能にする強力なツールです。contractが独自のポートフォリオを管理する場合でも、他のユーザー向けの多機能な取引インターフェースとして機能する場合(`approve`および`revoke`を使用したプロキシパターン経由)でも、このprecompileはSolidityを使用してコアexchange moduleとやり取りするためのクリーンで安全かつ効率的な方法を提供します。 + +自己完結型のcontractロジックには直接呼び出しを優先し、より広範なInjectiveエコシステム向けの再利用可能なcontractインターフェースを構築する際には、堅牢な認可を備えたプロキシパターンを慎重に実装することを忘れないでください。 + +\ diff --git a/.gitbook/ja/developers-evm/index.mdx b/.gitbook/ja/developers-evm/index.mdx new file mode 100644 index 00000000..9142105c --- /dev/null +++ b/.gitbook/ja/developers-evm/index.mdx @@ -0,0 +1,46 @@ +--- +title: 概要 +--- + +EVM開発者の皆さん、ようこそ!InjectiveのネイティブEVMサポートにより、Solidity smart contractをデプロイできます。また、Exchange moduleとの連携、dAppsの構築など、さまざまな可能性が広がります。使い慣れたツール、ライブラリ、ワークフローでInjectiveの開発を始めましょう! + +## EVMで開発を始める + + + + InjectiveのEVMへの接続を設定します + + + **Solidity**でコードを記述し、**smart contract**のコンパイル、テスト、デプロイ、検証、操作を行います。 + + + smart contractが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..9be49199 --- /dev/null +++ b/.gitbook/ja/developers-evm/infrastructure-and-tooling.mdx @@ -0,0 +1,39 @@ +--- +description: ワールドクラスのインフラストラクチャでInjective上に構築する +title: インフラストラクチャ & ツール +--- + +BlockScout Injectiveは、業界をリードするインフラストラクチャプロバイダーの豊富なエコシステムによってサポートされています。信頼性の高いRPC、強力なデータインデクサー、そしてdAppの構築とスケーリングに必要なすべてのツールにアクセスできます。最速のL1 for financeで開発を始めましょう。 + +### RPCおよびノードプロバイダー + +
TenderlyTenderlyは、高度なトランザクションシミュレーションを提供するプラットフォームで、ユーザーがオンチェーンにブロードキャストすることなくEthereumおよびEVM互換トランザクションをプレビュー・分析できます。また、ステップバイステップの実行トレースやエラーレポートなど、強力なデバッグツールも提供しており、開発者がsmart contractの問題を効率的に特定・修正するのに役立ちます。
QuickNode最速のRPCノード、包括的なweb3 APIライブラリ、および最もパフォーマンスの高いブロックチェーンETLツールでInjective上に構築しましょう。
+ +### **データインデクシング & クエリ** + + + + + + + + + + +
The Graph +

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

+ +
+ +### ブロックエクスプローラー + +
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..ba761210 --- /dev/null +++ b/.gitbook/ja/developers-evm/multivm-token-standard.mdx @@ -0,0 +1,114 @@ +--- +title: MultiVM Token Standard +description: Injective のマルチ VM アーキテクチャにおけるトークン表現の理解 +--- + +## MultiVM Token Standard (MTS) とは? + +MTS (MultiVM Token Standard) は、Injective 上のすべてのトークンが、 +Cosmos モジュールを使用してデプロイされたものでも、Ethereum Virtual Machine (EVM) を通じてデプロイされたものでも、 +単一の正規残高とアイデンティティを持つことを保証します。 +この統一されたアプローチにより、フラグメンテーションを防ぎ、トークンのブリッジやラッピングの必要性を排除し、 +分散型金融(DeFi)や dApp のインタラクションにおけるシームレスな相互運用性と統一された流動性を実現します。 + +## MTS が重要な理由 + +- **シームレスな相互運用性:** トークンは Cosmos と EVM 環境間で一貫性を保ちます。 +- **統一された流動性:** 単一の信頼できるソースにより、流動性のフラグメンテーションを回避します。 +- **優れた開発者体験:** Hardhat、Foundry、MetaMask などの標準ツールがそのまま利用できます。 +- **セキュリティと効率性:** すべてのトークン状態は bank モジュールで一元管理され、堅牢なセキュリティを確保します。 + +## アーキテクチャ + +システムは 2 つの主要コンポーネントで構成されています: + +- [**Bank Precompile**](/developers-evm/bank-precompile/): + - Go で開発され、Injective EVM に直接組み込まれた precompile です。 + - 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 module 内にトークンペアを作成する。 + +2. ペア作成時にカスタム ERC20 実装を smart contract に使用する(tokenfactory denom のみ): + +- まず、カスタム ERC20 smart contract をチェーン上にアップロードします。 +- `MsgCreateTokenPair` メッセージの送信時にコントラクトのアドレスを提供します。 + +### 相互運用性とクロスチェーン統合 + +#### ネイティブ相互運用性\* + +Injective の EVM は Cosmos ベースのチェーンに直接統合されています。 + +- EVM smart contract は、MTS を使用する場合、ネイティブモジュール + (exchange、staking、governance モジュールなど)に即座に反映される操作を実行します。 +- Injective バイナリ内で提供される [JSON-RPC エンドポイント](/developers-evm/network-information/) + は Ethereum と互換性があり、 + スムーズな開発者統合を保証します。 + +#### クロスチェーン操作 + +- **IBC 互換性:** 既存のネイティブトークン + (例:[Token Factory](/developers-native/injective/tokenfactory/) で作成されたもの、 + または Peggy でペグされたもの)は、MTS ペアリングが確立されると EVM からアクセス可能になります。 +- **ブリッジの代替:** 多くのブロックチェーンでは別途ブリッジ操作(lock、mint、unlock)が必要ですが、 + MTS はネイティブに状態を同期することでこれらの手順を回避します。 + +#### Allowance と拡張 ERC20 機能 + +- MTS コントラクトは、allowance(approve/transferFrom)などの標準 ERC20 機能を維持します。 +- allowance メカニズムは便宜上 EVM コントラクト内で管理されますが、 + 最終的な残高は bank モジュールによって管理され、整合性が保たれることに注意してください。 + +### パフォーマンス、gas、セキュリティに関する考慮事項 + +#### gas コストと効率性 + +- gas 手数料は INJ で支払われます。 + EVM を通じた MTS 操作は、ネイティブトランザクションと比較して gas 使用量がわずかに増加する抽象化レイヤーを導入しますが、 + 全体的なコストは Ethereum での同等の操作よりも低く抑えられます。 +- gas モデルは、EVM スタイルの opcode コストとネイティブモジュールのインタラクションのバランスを反映するよう設計されています。 + +#### セキュリティ + +- 単一の信頼できるソースとしての [bank モジュール](/developers-native/core/) は、 + トークン残高が一貫して検証可能であることを保証することで、MTS のセキュリティを支えています。 +- [precompile](/developers-evm/precompiles/) の使用により、 + 状態の非同期化などの一般的な落とし穴を防ぎ、 + どこから開始された操作であっても同じ正規台帳が更新されることを保証します。 +- smart contract 開発のための高度なセキュリティガイドラインとベストプラクティスは、 + セキュリティセクションと外部リソースで提供されています。 + +**ℹ️ 注意:** + +denom のスパムを防止するため、ERC20 module を介した 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..967d7e63 --- /dev/null +++ b/.gitbook/ja/developers-evm/network-information.mdx @@ -0,0 +1,118 @@ +--- +description: Injective EVMネットワークに関する基本情報 +title: EVMネットワーク情報 +--- + + + + + +## ネットワーク情報 + +* Chain ID: `1776` +* JSON-RPC Endpoint: `https://sentry.evm-rpc.injective.network/` +* WS Endpoint: `wss://sentry.evm-ws.injective.network` +* Faucet: N/A、Mainnet 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 Mainnetネットワーク情報](/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 Endpoint: `https://k8s.testnet.json-rpc.injective.network/` +* WS Endpoint: `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 Testnetネットワーク情報](/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 Testnetの詳細については、以下のページを参照してください: + +* 基本: + * [EVMで開発を始める](/developers-evm) + * [初めてのEVM smart contract](/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..bd481e23 --- /dev/null +++ b/.gitbook/ja/developers-evm/permissioned-multivm-token.mdx @@ -0,0 +1,165 @@ +--- +title: 権限付き MTS トークン +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 smart contract コード内でこれらのカスタム管理ルールを実装できます。 + +## MTS トークンで Permissions を使用する理由 + +Injective 上で MTS を使用して現実世界の資産(RWA)をトークン化しており、 +その基礎資産が本質的にパーミッションを必要とする場合、 +それは Injective の `permissions` モジュールを活用する最適なユースケースです。 + +MTS トークンの EVM smart contract は、`permissions` モジュールの機能を利用するために、 +追加の Solidity インターフェースを実装するだけです。 + +## Smart Contract の実装 + +smart contract 内で、`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) + +### Smart Contract の例 + +`PermissionsHook` を拡張する smart contract を作成します: + +```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...", // <-- EVM address of the MTS token + "evm_hook": "0x...", // <-- EVM address of the permissions hook + "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 つにすぎません。 +複数のバリエーションがあります。 +この手順の詳細や他のバリエーションについては、 +[権限付き資産の発行方法](https://docs.injective.network/developers-native/injective/permissions/04_launch_permissioned_asset)を参照してください。 + +## リファレンス実装 + +ステーブルコインにおける権限付き 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..e23f2ea8 --- /dev/null +++ b/.gitbook/ja/developers-evm/precompiles.mdx @@ -0,0 +1,82 @@ +--- +title: Precompiles +--- + +### InjectiveにおけるPrecompilesとは? + +Injectiveでは、precompilesはプロトコルレベルでEVM(Ethereum Virtual Machine)レイヤーに直接組み込まれた、特別で高度に最適化されたsmart contractです。ユーザーがデプロイする標準的なSolidity smart contractとは異なり、precompilesはチェーンのコアロジックの一部です。Solidityではなく Goで記述され、固定アドレスでEVMに公開されているため、他のsmart contractと同様にSolidity smart contractから呼び出すことができます。 + +Injectiveチェーンのネイティブ関数にEthereumスタイルのインターフェースが付与されたものと考えてください。 + +### なぜ必要なのか?(EVMとネイティブモジュールの橋渡し) + +Injective EVMは単独で動作しているわけではありません。Bank module(トークン管理用)、Exchange module(オンチェーンオーダーブック用)、Staking moduleなど、Injectiveの強力なネイティブCosmos SDKモジュールと深く統合されています。 + +Precompilesは、EVMの世界(Solidity contractが存在する場所)とこれらのネイティブInjective機能との間の重要な**橋渡し**として機能します。precompilesがなければ、EVM smart contractは孤立し、より広範なInjectiveエコシステムの豊富な機能と流動性を活用できなくなります。 + +例えば、ネイティブ環境とEVM環境間で統一されたトークン残高を保証する[MultiVM Token Standard (MTS)](/developers-evm/multivm-token-standard)モデルは、**Bank Precompile**に大きく依存しています。 + +### 開発者にとってのメリット + +* **ネイティブ機能へのアクセス:** オンチェーンオーダーブック、ネイティブstaking、ガバナンス、MTSのためのBank moduleなど、Injective独自のモジュールと直接やり取りできます。 +* **パフォーマンスの向上:** precompilesを介して実行される操作は、最適化されたネイティブコードとして実行されるため、複雑なネイティブロジックを純粋にSolidityで再現しようとするよりも大幅に高速でgas効率が良くなります。 +* **シームレスな相互運用性:** EVMとInjectiveのCosmos固有の機能の両方の強みを活かした、真に統合されたアプリケーションを構築できます。 +* **開発の簡素化:** 使い慣れたSolidityインターフェースを通じて複雑なネイティブ機能とやり取りでき、基盤となるCosmosの複雑さの多くを抽象化できます。 + +Bank precompileを基盤としたERC-20実装、precompileインターフェース、および抽象contractが[InjectiveのSolidity Contractsリポジトリ](https://github.com/InjectiveLabs/solidity-contracts)で利用可能です。主要なcontractは以下の通りです: + +* [**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 contractに基づいています。開発者はBank precompileを利用して自由にカスタムERC20 contractを作成できます。 + +### 開発を始めるためのデモ + +Bank、Exchange、Staking precompilesを使用したcontractの構築方法を示すデモをいくつか用意しました。これらの例では、最も一般的なEthereum開発フレームワークである**Foundry**を使用してInjective EVMとやり取りする方法も示しています。 + +Foundryの`cast`ツールを活用することで、ターミナルから直接contractをデプロイし、Injectiveチェーンとやり取りすることが簡単にできます。これにより、ビルダーはInjectiveのネイティブモジュールを活用した強力なアプリケーションを素早く実験、テスト、デプロイすることができます。 + +以下のデモで確認できる内容: + +- トークン管理、取引、stakingのためにprecompilesを呼び出すSolidity contractの記述方法。 +- Foundryスクリプトと`cast`コマンドを使用して、これらのcontractをInjective EVMにデプロイしやり取りする方法。 +- EVMロジックとInjectiveのネイティブ機能を橋渡しするためのベストプラクティス。 + +[Injective Solidity Contractsリポジトリ](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos)をクローンし、各デモディレクトリのステップバイステップガイドに従って開発を始めましょう。 + +* [Bank Precompile Demo](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos/erc20) +* [Exchange Precompile Demo](https://github.com/InjectiveLabs/solidity-contracts/tree/master/demos/exchange) +* [Staking Precompile Demo](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」し、 +その環境でsmart contractを実行した場合、 +以下のようなエラーが表示されることがあります: + +```text +[Revert] call to non-contract address 0x0000000000000000000000000000000000000064 +``` + +これは、Foundryが実際にInjective上で実行されるのではなく、 +Injectiveをローカルで*シミュレート*しているために発生します。 +そのため、Injective固有のシミュレーションではなく、 +*汎用的なEVM*シミュレーションを実行しています。 +その違いは、Injectiveのネイティブ機能が存在しないことにあり、 +したがってprecompilesを認識できないことです。 + +この修正はシンプルです: +Injectiveのprecompilesを含むようにパッチされたバージョンの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..8865ca6f --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/compile-foundry.mdx @@ -0,0 +1,150 @@ +--- +title: Foundry のセットアップと smart contract のコンパイル +--- + +## 前提条件 + +以下のコマンドを実行して、Foundry がインストールされていることを確認してください: + +```shell +forge --version +``` + +このチュートリアルで使用したバージョンは `1.2.3-stable` です。チュートリアルに沿って進める際は、このバージョン以降を使用してください。 + +まだ Foundry をインストールしていない場合は、以下のコマンドを実行してインストールしてください: + +```shell +curl -L https://foundry.paradigm.xyz | bash +``` + + +Foundry のインストール方法は他にもあります。 +[Foundry インストールドキュメント](https://getfoundry.sh/introduction/installation)を参照してください。 + + +ウォレットと、Testnet INJ で資金が入ったアカウントが必要です。 + + +[Injective Testnet faucet](https://testnet.faucet.injective.network/) から EVM testnet の資金をリクエストできます。 + + +アカウントを作成したら、このチュートリアルを完了するために必要になるため、秘密鍵をアクセスしやすい場所にコピーしておいてください。 + + +秘密鍵は慎重に取り扱ってください。 +ここでの手順はローカル開発および Testnet には十分と考えられます。 +しかし、Mainnet で使用する秘密鍵にはセキュリティが**十分ではありません**。 +Mainnet ではキーセキュリティのベストプラクティスに従い、Mainnet と他のネットワーク間で同じキー/アカウントを再利用しないようにしてください。 + + +## 新しい 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 → smart contract の Solidity コード + test/ + Counter.t.sol → テストケース + foundry.toml → 設定ファイル +``` + +`foundry.toml` ファイルは、Injective EVM Testnet に接続するよう既に設定されています。 +次に進む前に必要なのは、Injective Testnet アカウントの秘密鍵を設定することだけです。 + +以下のコマンドを入力して秘密鍵をインポートし、`injTest` という名前のアカウントとして保存します: + +```shell +cast wallet import injTest --interactive +``` + +これにより、秘密鍵の入力を求められ、さらにこのアカウントを使用するたびに入力する必要があるパスワードの設定も求められます。 +先ほど作成して資金を入金したアカウントの秘密鍵を使用してください(例:Injective Testnet faucet 経由)。 +秘密鍵やパスワードを入力またはペーストしても、ターミナルには何も表示されないことに注意してください。 +出力は以下のようになります: + +```text +Enter private key: +Enter password: +`injTest` keystore was saved successfully. Address: 0x58f936cb685bd6a7dc9a21fa83e8aaaf8edd5724 +``` + + +これにより、秘密鍵の暗号化されたバージョンが `~/.foundry/keystores` に保存され、 +以降のコマンドでは `--account` CLI フラグを使用してアクセスできます。 + + +## smart contract の編集 + +このデモに含まれている smart contract は非常にシンプルです。以下の機能があります: + +- 数値である `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; + } +} + +``` + +## smart contract のコンパイル + +以下のコマンドを実行してください: + +```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 プロジェクトのセットアップと smart contract のコンパイルが完了しました。次は smart contract のテストを行いましょう! +次のチュートリアル [Foundry を使用した smart contract のテスト](./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..4b88e360 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/compile-hardhat.mdx @@ -0,0 +1,144 @@ +--- +title: Hardhat のセットアップと smart contract のコンパイル +--- + +## 前提条件 + +最新バージョンの 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) + +ウォレットと、Testnet INJ が入金されたアカウントが必要です。 + + +[Injective Testnet faucet](https://testnet.faucet.injective.network/) から EVM testnet の資金をリクエストできます。 + + +アカウントを作成したら、このチュートリアルを完了するために必要になるため、秘密鍵をアクセスしやすい場所にコピーしておいてください。 + + +秘密鍵は慎重に取り扱う必要があります。 +ここでの手順は、ローカル開発および Testnet での使用には十分と考えられます。 +ただし、Mainnet で使用する秘密鍵に対しては十分なセキュリティとは**言えません**。 +Mainnet では鍵のセキュリティに関するベストプラクティスに従い、Mainnet と他のネットワーク間で同じ鍵やアカウントを再利用しないでください。 + + +## 新しい Hardhat プロジェクトのセットアップ + +git を使用してデモリポジトリをクローンします。プロジェクトはすでに完全にセットアップされています。 + +```shell +git clone https://github.com/injective-dev/hardhat-inj +``` + +npm から依存関係をインストールします: + +```shell +npm install +``` + +## プロジェクト構成の概要 + +npm がダウンロードとインストールを行っている間に、コードエディタ/IDE でリポジトリを開き、ディレクトリ構造を確認しましょう。 + +```text +hardhat-inj/ + contracts/ + Counter.sol → smart contract の Solidity コード + script/ + deploy.js → デプロイスクリプト + test/ + Counter.test.js → テストケース + hardhat.config.js → 設定ファイル + .example.env +``` + +`hardhat.config.js` ファイルは、Injective EVM Testnet に接続するようにあらかじめ設定されています。 +次に進む前に必要なのは、Injective Testnet アカウントの秘密鍵を設定することだけです。 + +```shell +cp .example.env .env +``` + +`.env` ファイルを編集して秘密鍵を追加します。 +必要に応じて、代替の JSON-RPC エンドポイントに更新することもできます。 + +```shell +PRIVATE_KEY=your private key without 0x prefix +INJ_TESTNET_RPC_URL=https://k8s.testnet.json-rpc.injective.network/ + +``` + +## smart contract の編集 + +このデモに含まれている smart contract は非常にシンプルです。以下の機能があります: + +- 数値である `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; + } +} + +``` + +## smart contract のコンパイル + +以下のコマンドを実行します: + +```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 プロジェクトのセットアップと smart contract のコンパイルが完了しました。次は smart contract のテストを行いましょう! +次のチュートリアル [Hardhat を使用した smart contract のテスト](./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..cfeaced0 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/deploy-foundry.mdx @@ -0,0 +1,50 @@ +--- +title: Foundry を使用した smart contract のデプロイ +--- + +## 前提条件 + +Foundry プロジェクトが既にセットアップされており、smart contract のコンパイルが正常に完了している必要があります。 +手順については [Foundry のセットアップと smart contract のコンパイル](./compile-foundry/) チュートリアルを参照してください。 + +任意ですが強く推奨:smart contract のテストも正常に完了していることが望ましいです。 +手順については [Foundry を使用した smart contract のテスト](./test-foundry/) チュートリアルを参照してください。 + +## デプロイの実行 + +以下のコマンドを実行して smart contract をデプロイします: + +```shell +forge create \ + src/Counter.sol:Counter \ + --rpc-url injectiveEvm \ + --legacy \ + --account injTest \ + --gas-price 160000000 \ + --gas-limit 2000000 \ + --broadcast +``` + + +ここでは keystore に保存された `injTest` アカウントを使用しています。 +これは [Foundry のセットアップと smart contract のコンパイル](./compile-foundry/) で事前にセットアップしたものです。 + + +出力は以下のようになります: + +```text +Enter keystore password: +Deployer: 0x58f936cb685Bd6a7dC9a21Fa83E8aaaF8EDD5724 +Deployed to: 0x213bA803265386C10CE04a2cAa0f31FF3440b9cF +Transaction hash: 0x6aa9022f593083c7779da014a3032efd40f3faa2cf3473f4252a8fbd2a80db6c +``` + +デプロイされたアドレスをコピーし、[`https://testnet.blockscout.injective.network`](https://testnet.blockscout.injective.network/) にアクセスして、検索フィールドにアドレスを貼り付けてください。 +デプロイしたばかりの smart contract のブロックエクスプローラーページが表示されます。 + +「Contract」タブをクリックすると、そのコントラクトの EVM bytecode が表示され、コンパイル後のアーティファクトディレクトリにある EVM bytecode と一致していることが確認できます。 + +## 次のステップ + +smart contract のデプロイが完了しました。次は smart contract の検証を行いましょう! +次のチュートリアル [Foundry を使用した smart contract の検証](./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..273eff07 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/deploy-hardhat.mdx @@ -0,0 +1,58 @@ +--- +title: Hardhat を使用した smart contract のデプロイ +--- + +## 前提条件 + +Hardhat プロジェクトがセットアップ済みで、smart contract のコンパイルが正常に完了している必要があります。 +その方法については、[Hardhat のセットアップと smart contract のコンパイル](./compile-hardhat/) チュートリアルを参照してください。 + +任意ですが、強く推奨します:smart contract のテストも正常に完了していることを確認してください。 +その方法については、[Hardhat を使用した smart contract のテスト](./test-hardhat/) チュートリアルを参照してください。 + +## デプロイスクリプトの編集 + +コンピュータ上でコンパイルした smart contract を Injective Testnet 上に存在させるには、ネットワークにデプロイする必要があります。 + +そのために、`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); +} +``` + +smart contract のコンパイル後に `artifacts/contracts/Counter.sol/Counter.json` を確認したことを思い出してください。このスクリプトでは、`ethers.getContractFactory('Counter')` がそのファイルを取得し、ABI と EVM bytecode を抽出します。 +続く行では、その情報を使用してデプロイトランザクションを構築し、ネットワークに送信します。 +成功すると、smart contract がデプロイされたアドレスが出力されます。例: +[`0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b`](https://testnet.blockscout.injective.network/address/0x98798cc92651B1876e9Cc91EcBcfe64cac720a1b) + +他の EVM ネットワークでは、トランザクション(デプロイトランザクションを含む)で gas price と gas limit を指定する必要はありません。ただし、現在 Injective ではこれが必要です。 + +## デプロイスクリプトの実行 + +以下のコマンドを実行して smart contract をデプロイします: + +```shell +npx hardhat run script/deploy.js --network inj_testnet +``` + +デプロイされたアドレスをコピーし、[`https://testnet.blockscout.injective.network`](https://testnet.blockscout.injective.network/) にアクセスして、検索フィールドにアドレスを貼り付けます。 +デプロイしたばかりの smart contract のブロックエクスプローラーページが表示されます。 + +「Contract」タブをクリックすると、そのコントラクトの EVM bytecode が表示され、コンパイル後のアーティファクトディレクトリにある EVM bytecode と一致することが確認できます。 + +## 次のステップ + +smart contract のデプロイが完了しました。次は smart contract の検証を行いましょう! +次のチュートリアル [Hardhat を使用した smart contract の検証](./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..ec4aa111 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/index.mdx @@ -0,0 +1,35 @@ +--- +title: 初めてのEVM Smart Contract +--- + +Smart contractはブロックチェーン上で実行されるコードです。 +Solidity smart contractをコンパイルし、 +InjectiveのEthereum Virtual Machine(EVM)上でテスト、デプロイ、検証、操作を行うことができます。 +標準的なEVM開発ツールやフレームワークを使用することも可能です。 +これらのガイドでは、HardhatとFoundryを使用した方法を説明します。 + +## Hardhat + +このガイドでは、[Hardhat](https://hardhat.org/)を使用してInjective Testnet上でEVM Smart Contractを構築する手順を説明します。 + +* [Hardhatのセットアップとsmart contractのコンパイル](/developers-evm/smart-contracts/compile-hardhat/) +* [Hardhatを使用したsmart contractのテスト](/developers-evm/smart-contracts/test-hardhat/) +* [Hardhatを使用したsmart contractのデプロイ](/developers-evm/smart-contracts/deploy-hardhat/) +* [Hardhatを使用したsmart contractの検証](/developers-evm/smart-contracts/verify-hardhat/) +* [Hardhatを使用したsmart contractの操作](/developers-evm/smart-contracts/interact-hardhat/) + +## Foundry + +このガイドでは、[Foundry](https://getfoundry.sh/)を使用してInjective Testnet上でEVM Smart Contractを構築する手順を説明します。 + +* [Foundryのセットアップとsmart contractのコンパイル](/developers-evm/smart-contracts/compile-foundry/) +* [Foundryを使用したsmart contractのテスト](/developers-evm/smart-contracts/test-foundry/) +* [Foundryを使用したsmart contractのデプロイ](/developers-evm/smart-contracts/deploy-foundry/) +* [Foundryを使用したsmart contractの検証](/developers-evm/smart-contracts/verify-foundry/) +* [Foundryを使用したsmart contractの操作](/developers-evm/smart-contracts/interact-foundry/) + +## 次のステップ + +Smart contractは技術に詳しくないユーザーにユーザーエクスペリエンスを提供しません。 +そのようなユーザーに対応するには、分散型アプリケーションを構築する必要があります。 +構築方法については、[初めての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..7a73ade4 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/interact-foundry.mdx @@ -0,0 +1,136 @@ +--- +title: Foundry を使用した smart contract とのインタラクション +--- + +## 前提条件 + +Foundry プロジェクトが既にセットアップされており、smart contract のデプロイが正常に完了している必要があります。 +手順については [Foundry を使用した smart contract のデプロイ](./deploy-foundry/) チュートリアルを参照してください。 + +任意ですが強く推奨:smart contract の検証も正常に完了していることが望ましいです。 +手順については [Foundry を使用した smart contract の検証](./verify-foundry/) チュートリアルを参照してください。 + +## 関数の呼び出し - クエリ + +クエリは読み取り専用の操作です。 +そのため、smart contract の状態は**更新されません**。 +*状態変更*が不要なため、ウォレット、署名、トランザクション手数料(gas)は必要ありません。 + +以下のコマンドを使用して `value()` 関数をクエリします: + +```shell +cast call \ + --rpc-url injectiveEvm \ + ${SC_ADDRESS} \ + "value()" +``` + +`${SC_ADDRESS}` を smart contract をデプロイしたアドレスに置き換えてください。 + +例えば、smart contract のアドレスが `0x213ba803265386c10ce04a2caa0f31ff3440b9cf` の場合、コマンドは以下のようになります: + +```shell +cast call \ + --rpc-url injectiveEvm \ + 0x213ba803265386c10ce04a2caa0f31ff3440b9cf \ + "value()" +``` + +以下の出力が表示されます。 + +```text +0x0000000000000000000000000000000000000000000000000000000000000000 +``` + + +`0x0000000000000000000000000000000000000000000000000000000000000000` は `0` を意味します。 +これは Solidity の `uint256`(smart contract の `value()` 関数の戻り値の型)の16進数による生の表現です。 + + +## 関数の呼び出し - トランザクション + +トランザクションは書き込み操作です。 +そのため、smart contract の**状態が更新されます**。 +*状態変更*が発生する可能性があるため、トランザクションはウォレットで署名する必要があり、トランザクション手数料(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}` を smart contract をデプロイしたアドレスに置き換えてください。 + +例えば、smart contract のアドレスが `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 smart contract 開発ガイドをすべて完了しました! + +smart contract は非技術的なユーザーにユーザーエクスペリエンスを提供しません。 +そのようなユーザーに対応するには、分散型アプリケーションを構築する必要があります。 +構築するには、[初めての 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..e86e7d52 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/interact-hardhat.mdx @@ -0,0 +1,118 @@ +--- +title: Hardhat を使用した smart contract との対話 +--- + +## 前提条件 + +Hardhat プロジェクトがセットアップ済みで、smart contract のデプロイが正常に完了している必要があります。 +その方法については、[Hardhat を使用した smart contract のデプロイ](./deploy-hardhat/) チュートリアルを参照してください。 + +任意ですが、強く推奨します:smart contract の検証も正常に完了していることを確認してください。 +その方法については、[Hardhat を使用した smart contract の検証](./verify-hardhat/) チュートリアルを参照してください。 + +## Hardhat コンソールの起動 + +以下のコマンドを使用して、対話型 Javascript REPL を起動します。 + +```shell +npx hardhat console --network inj_testnet +``` + +これで、シェルは通常のシェル(bash、zsh など)の代わりに NodeJs REPL になります。 +この REPL で、`Counter` smart contract のインスタンスを作成します。 +そのためには、`ethers.getContractFactory(...)` と `contract.attach('0x...');` を使用します。 +例えば、smart contract が `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` を使用して smart contract と対話できます。 + +## 関数の呼び出し - クエリ + +クエリは読み取り専用の操作です。 +そのため、smart contract の状態は**更新されません**。 +*状態の変更*が不要なため、ウォレット、署名、トランザクション手数料(gas)は必要ありません。 + +以下のコマンドを使用して `value()` 関数をクエリします。 + +```js +await counter.value(); +``` + +以下の出力が表示されます。 + +```js +0n +``` + + +`0n` は `0` を意味し、`n` サフィックスはそれが +[`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number) ではなく +[`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) であることを示します。 + +これは、Solidity の `uint256`(smart contract の `value()` 関数の戻り値の型)が +`Number` では表現できないためです。 +`Number` の最大整数値は `2^53 - 1` です。 +そのため、代わりに `BigInt` を使用する必要があります。 + + +## 関数の呼び出し - トランザクション + +トランザクションは書き込み操作です。 +そのため、smart contract の**状態が更新されます**。 +*状態の変更*が発生する可能性があるため、トランザクションはウォレットで署名する必要があり、トランザクション手数料(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(); +``` + +今回は `0 + 1 = 1` なので、結果は `1n` になります。 + +```js +1n +``` + +## Hardhat コンソールの停止 + +`Ctrl+C` を2回連続で押すか、`.exit` コマンドを入力します。 + +## 次のステップ + +おめでとうございます。Hardhat を使用した Injective での EVM smart contract 開発ガイド全体を完了しました! + +smart contract は、技術に詳しくないユーザーにユーザーエクスペリエンスを提供しません。 +そのようなユーザーに対応するには、分散型アプリケーションを構築する必要があります。 +その方法については、[はじめての 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..8e15fb2c --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/test-foundry.mdx @@ -0,0 +1,84 @@ +--- +title: Foundry を使用した smart contract のテスト +--- + +## 前提条件 + +Foundry プロジェクトが既にセットアップされており、smart contract のコンパイルが正常に完了している必要があります。 +手順については [Foundry のセットアップと smart contract のコンパイル](./compile-foundry/) チュートリアルを参照してください。 + +## テスト仕様の編集 + +テスト対象の smart contract は最小限であるため、必要なテストケースも最小限です。 + +テストの前に、smart contract をデプロイする必要があります。 +これは `setUp` ブロックで行われます。 +smart contract は単独では実行できず、実行するには 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()` が再び更新されたことを確認。 + +## smart contract に対するテストの実行 + +以下のコマンドで、先ほど確認したテストを実行します。 + +```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) +``` + +## 次のステップ + +smart contract のテストが完了しました。次は smart contract のデプロイを行いましょう! +次のチュートリアル [Foundry を使用した smart contract のデプロイ](./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..b2029f37 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/test-hardhat.mdx @@ -0,0 +1,89 @@ +--- +title: Hardhat を使用した smart contract のテスト +--- + +## 前提条件 + +Hardhat プロジェクトがセットアップ済みで、smart contract のコンパイルが正常に完了している必要があります。 +その方法については、[Hardhat のセットアップと smart contract のコンパイル](./compile-hardhat/) チュートリアルを参照してください。 + +## テスト仕様の編集 + +テスト対象の smart contract が最小限であるため、必要なテストケースも最小限です。 + +テストの前に、smart contract をデプロイする必要があります。 +これは `before` ブロックで行われます。 +smart contract は単独では実行できず、実行するには 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()` が再び更新されたことを確認します。 + +## smart contract に対するテストの実行 + +以下のコマンドで、先ほど確認したテストを実行します。 + +```shell +npx hardhat test +``` + +以下のコマンドはテストを実行しますが、エミュレートされた EVM インスタンス内では**実行しません**。 +代わりに、smart contract は Injective Testnet(パブリックネットワーク)にデプロイされ、テストはそれに対して実行されます。 +これはほとんどの場合**推奨されません**。特定の/高度なユースケースでのみ必要です。 + +```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 に関する追加レポートを含むテーブルが続きます。gas は複雑さとトランザクションコストの指標です。 + +## 次のステップ + +smart contract のテストが完了しました。次は smart contract のデプロイを行いましょう! +次のチュートリアル [Hardhat を使用した smart contract のデプロイ](./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..4a9ffa87 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/verify-foundry.mdx @@ -0,0 +1,80 @@ +--- +title: Foundry を使用した smart contract の検証 +--- + +## 前提条件 + +Foundry プロジェクトが既にセットアップされており、smart contract のデプロイが正常に完了している必要があります。 +手順については [Foundry を使用した smart contract のデプロイ](./deploy-foundry/) チュートリアルを参照してください。 + +## smart contract の検証とは? + +検証プロセスは、smart contract 自体やネットワークの他の状態には一切影響しません。 + +これは、特定のアドレスにデプロイされた smart contract の元のソースコードをネットワークエクスプローラーに提供する標準化されたプロセスです。ネットワークエクスプローラーはそのソースコードを**独自にコンパイル**し、生成された bytecode が smart contract のデプロイトランザクションに含まれる bytecode と実際に**一致する**ことを検証します。 + +検証に成功(一致)した場合、ブロックエクスプローラーはその smart contract のページ内で拡張モードを「アンロック」します。 +以下のような smart contract の詳細情報が追加表示されます: +* 完全なソースコード(Solidity) +* ABI(JSON) +* トランザクションとイベントがより詳細に表示されます(ABI を使用してパースされます) + +さらに、ユーザーがウォレットを接続すると、ネットワークエクスプローラー内から直接 smart contract の関数を呼び出してクエリしたり、状態を更新するトランザクションを送信したりすることもできます。 + +{/* 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}` を smart contract をデプロイしたアドレスに置き換えてください。 + +例えば、smart contract のアドレスが `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」サブタブを選択してください。 +以前はこのタブは存在しませんでしたが、 +現在はブロックエクスプローラーから直接すべての smart contract 関数とインタラクションできるようになりました。 + +## 次のステップ + +smart contract のデプロイと検証が完了しました。次は smart contract とのインタラクションを行いましょう! +次のチュートリアル [Foundry を使用した smart contract とのインタラクション](./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..1b3bb7b9 --- /dev/null +++ b/.gitbook/ja/developers-evm/smart-contracts/verify-hardhat.mdx @@ -0,0 +1,100 @@ +--- +title: Hardhat を使用した smart contract の検証 +--- + +## 前提条件 + +Hardhat プロジェクトがセットアップ済みで、smart contract のデプロイが正常に完了している必要があります。 +その方法については、[Hardhat を使用した smart contract のデプロイ](./deploy-hardhat/) チュートリアルを参照してください。 + +## smart contract の検証とは? + +検証プロセスは、smart contract 自体やネットワークの他の状態に影響を与えません。 + +これは、特定のアドレスにデプロイされた smart contract の元のソースコードをネットワークエクスプローラーに提供する標準化されたプロセスです。ネットワークエクスプローラーはそのソースコードを**独自にコンパイル**し、結果の bytecode が smart contract のデプロイトランザクションに含まれる bytecode と実際に**一致する**ことを検証します。 + +検証に合格(一致)すると、ブロックエクスプローラーはその smart contract のページ内で拡張モードを「アンロック」します。 +より詳細な smart contract の情報が表示されるようになります: +* 完全なソースコード(Solidity) +* ABI(JSON) +* トランザクションとイベントがより詳細に表示されます(ABI を使用してパースされます) + +さらに、ユーザーがウォレットを接続すると、ネットワークエクスプローラー内で直接関数を呼び出して smart contract にクエリを実行したり、状態を更新するトランザクションを送信したりできます。 + +{/* TODO consider moving this section to FAQs */} + +## smart contract 検証の設定編集 + +`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 は、それぞれ異なる検証用 API を持つ人気のブロックエクスプローラーです。 +Injective は Blockscout を使用しており、Etherscan API と互換性があります。 +そのため、設定では Sourcify は無効になっています。 +Etherscan の設定内では、`apiKey` の値は不要なので、空でない任意の値で問題ありません。 +`customChains` 内の `inj_testnet` ネットワークには、Injective Testnet の適切な値がすでに設定されています。 + +## 検証コマンドの実行 + +以下のコマンドを入力します: + +```shell +npx hardhat verify --network inj_testnet ${SC_ADDRESS} +``` + +`${SC_ADDRESS}` を smart contract をデプロイしたアドレスに置き換えてください。 + +例えば、smart contract のアドレスが `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」サブタブを選択します。 +以前はこれが存在しませんでしたが、 +現在はブロックエクスプローラーから直接すべての smart contract 関数を操作できます。 + +## 次のステップ + +smart contract のデプロイと検証が完了しました。次は smart contract との対話を行いましょう! +次のチュートリアル [Hardhat を使用した smart contract との対話](./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..52aa0469 --- /dev/null +++ b/.gitbook/ja/developers-evm/wrapped-inj.mdx @@ -0,0 +1,125 @@ +--- +title: Wrapped INJ (wINJ) +--- + +# Wrapped INJ (wINJ) + +## ラップされた暗号通貨とは? + +Injectiveでは、INJはネットワーク上のトランザクション手数料の支払いに使用される暗号通貨です。 + +しかし、一部のdApps(DEXを含む)はインターフェースでERC20トークンのみを受け付けるため、INJはそれらと互換性が**ありません**。 + +解決策は、INJをラップするERC20トークンを作成することです。これを「wrapped INJ」と呼びます。 +そのトークンシンボルは**wINJ**です。 +したがって、ERC20トークンを受け付けるすべてのdAppはwINJも受け付けます。 + +wINJトークンの仕組みはシンプルです: + +- Mint:INJを預け入れるたびに総供給量を増加させます。 +- Burn:INJを引き出すたびに総供給量を減少させます。 + +wINJは、INJと1対1で担保されたERC20トークンと考えることができ、同等の価値を持ちながら技術的なインターフェースが異なるものとして扱うことができます。 + +## wINJはwETHと同じですか? + +Ethereumに馴染みのある方は、 +これがwrapper Ether(wETH)と同じように聞こえると思われるかもしれません。 +その通りです。ここまではwINJはwETHと同じように動作します。 + +ただし、InjectiveネットワークはMultiVM技術アーキテクチャで設計されていることに注意してください。 +これは、wINJがwETHのように*標準的な*ERC20実装で実装された場合、 +Injectiveネットワークの非EVM部分(例:Cosmosトランザクション)との +やり取り時にwINJにアクセス**できない**ことを意味します。 + +これはまさに、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実装のようにsmart contract内に`uint256`値として残高を保存する代わりに、 +wINJ smart contractは`Bank` precompileを使用しています。 +魔法は +[`BankERC20`の`_update`関数](https://github.com/InjectiveLabs/solidity-contracts/blob/b152129a/src/BankERC20.sol#L50-L81) +で起こります。ここでは、`Bank` moduleの`mint`、`burn`、または`transfer`関数が、 +その[EVM precompile](/developers-evm/bank-precompile "EVM precompile for Injective's native Bank module")を介して呼び出されます。 + +これらの残高は`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に変換するには、このsmart contractの`deposit`関数を呼び出します: + +- 関数シグネチャ:`deposit() public payable` +- パラメータとして金額を指定する必要はないことに注意してください。 + 代わりにトランザクションに`value`を設定すると、`payable`がそれを`msg.value`として取得します。 + +wINJをINJに変換するには、このsmart contractの`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に変換するには、このsmart contractの`deposit`関数を呼び出します: + +- wINJトークンのエクスプローラーページで「Contract」タブ、次に「Read/Write contract」サブタブに移動します。 +- `deposit()`関数を見つけ、`>`シンボルをクリックして展開します。 +- 「Send native INJ (uint256)」フィールドに変換したいINJの金額を入力します。 + - この数値は自動的に`10^18`が掛けられるため、手動で変換する必要はありません。 +- 「Write」ボタンを押します。 +- ウォレットでトランザクションを確認して署名・送信します。 +- ウォレットには、選択した金額分のINJの減少とwINJの増加が反映されるはずです。 + - INJの減少はわずかに多くなります。トランザクション手数料の支払いに使用されるためです。 + +wINJをINJに変換するには、このsmart contractの`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の残高を確認します。