| name | injective-evm-developer |
| description | Develop EVM smart contracts and dApps on Injective |
| activates_on | ["*.sol","hardhat.config.*","foundry.toml","*.ts","*.js"] |
| uses | ["injective-mcp-servers","solidity-hardhat-development","solidity-foundry-development","solidity-code-review","solidity-erc-standards","solidity-security-best-practices","solidity-gas-optimization","solidity-adversarial-analysis"] |
| license | MIT |
| metadata | {"author":"bguiz","version":"0.0.0"} |
Injective EVM Developer, Skill Guide
Injective is a layer 1 blockchain that is simultaneously both EVM and Cosmos.
Use this skill when building on Injective's EVM.
It builds on a baseline of skills that apply to developing on any EVM network, and augments that with Injective specifics.
When to apply
- Obtain Injective Testnet funds from faucets
- Interact with native Injective modules via EVM precompiles
bank precompile
exchange precompile
- Configure Injective network details
- Consult Injective documentation
See for detailed list of user stories: ./references/user-stories.md
Their associated sample prompts: ./references/sample-prompts.md
Activities
Faucet
- Note: Only for Injective Testnet
- If you have a brand new wallet, and need up to 1 INJ:
- Visit https://testnet.faucet.injective.network/
- Paste the EVM address of your wallet account (starts with
0x) into the text field for "EVM address"
- Solve the "hCaptcha"
- Press the "Request Tokens" button
- Expect: 1 INJ plus some USDT to arrive in your wallet after around ~ 1 minute
- Note: DDoS protection - Only works for new accounts (cannot have any balance)
- Otherwise:
- Visit https://cloud.google.com/application/web3/faucet/injective/testnet
- Paste the bech32 address of your wallet account (starts with
inj) into the text field for "Wallet address"
- Press the "Get Testnet INJ" button
- Expect: 10 INJ to arrive in your wallet after ~ 10 seconds
- Note: DDoS protection - You must be signed into a Google account
- Note: Works for new and existing accounts (can have a balance) - but cannot have requested in the past 24 hours
- These steps are unlikely to work through agent automation due to DDoS protections
- If you get stuck, prompt your human to complete the remaining steps
Using the bank precompile
Address: 0x0000000000000000000000000000000000000064
Solidity interface exposed by the bank precompile: See ./assets/Bank.sol
The ABI for the bank precompile may be obtained by converting the interface above.
BankERC20 is a "base implementation for MultiVM Token Standard (MTS) token, which is designed to be extended: See ./assets/BankERC20.sol
- Note that this implementation extends the ERC20 implementation from OpenZeppelin, then overrides certain functions to invoke the
bank precompile
- The easiest way is to extend
BankERC20
- Ensure that your constructor (or function responsible for 1st mint) is
payable
- The simplest canonical implementation of an MTS token: See
./assets/FixedSupplyBankERC20.sol
- The most heavily used implementation of an MTS token: See
./assets/WINJ9.sol (used in wrapped INJ)
Reference: https://docs.injective.network/developers-evm/bank-precompile.md
Note that all ./assets/*.sol files can be found in https://raw.githubusercontent.com/InjectiveLabs/solidity-contracts/refs/heads/master/src/*.sol
Using the exchange precompile
Address: 0x0000000000000000000000000000000000000065
Solidity interface exposed by the exchange precompile: See ./assets/Exchange.sol
The ABI for the exchange precompile may be obtained by converting the interface above.
Reference: https://docs.injective.network/developers-evm/exchange-precompile.md
Note that all ./assets/*.sol files can be found in https://raw.githubusercontent.com/InjectiveLabs/solidity-contracts/refs/heads/master/src/*.sol
Configure Injective network details
Production application integrations cheat sheet
See: https://docs.injective.network/developers-evm/evm-integrations-cheat-sheet.md
Tool and library choices
- If undecided on framework
- Use hardhat if you are not using Injective's EVM precompiles, or do not need to emulate them locally
- Use foundry if you wish to work with Injective's EVM precompiles and emulate them locally
- If undecided on client library
- Use viem, as its API is easier to understand
Injective network for hardhat
Sample hardhat.config.js file for Injective EVM testnet: See ./assets/hardhat-testnet-config.js.
Sample script/deploy.js file for Injective Testnet. See ./assets/hardhat-deploy-script.js.
To verify a smart contract with the above configuration and constructor args,
create a constructor-args.js file, run the following command:
npx hardhat verify --force \
--constructor-args ./constructor-args.js \
--network inj_testnet ${SMART_CONTRACT_ADDRESS}
Injective network for viem
The viem/chains repo already contains pre-configured network details for both Injective Mainnet and Injective Testnet, you simply need to import them:
import { injective, injectiveTestnet } from 'viem/chains';
Within a dApp, to connect to Injective Testnet, and switch to the network, use the following function: See ./assets/dapp-viem-connect-evm-wallet-function.js.
Note that the client object will be able to use both client.readContract and client.writeContract to interact with smart contracts.
Consult Injective documentation
- The Injective developer documentation is available
EIP-712 Signing (MetaMask / Web Apps)
When building dApps that sign Injective transactions via MetaMask:
- Use EIP-712 V2 only. V1 (
getEip712TypedData) uses non-standard domain types that cause MetaMask to silently produce invalid signatures. Always use getEip712TypedDataV2 + SIGN_EIP712_V2.
- Fee objects must be identical in both
getEip712TypedDataV2() and createTransaction(). A mismatch (e.g., SDK default vs custom fee) causes hash mismatch → signature verification failure on-chain.
evmChainId is flexible. Injective EIP-712 signing works regardless of which EVM chain MetaMask is connected to. Read from eth_chainId and pass to both the EIP-712 domain and createWeb3Extension.
Troubleshooting common issues
Convert between EVM and bech32 formats for addresses
See: https://docs.injective.network/developers/convert-addresses#convert-hex-bech32-address
Gas configuration
For gas price: Manually set a hardcoded value of 160 million (160e6 in Javascript) for transactions.
For gas amount, use the default mechanism: The eth_estimateGas RPC, which should be invoked when needed by ethers.js or viem.
Critical: inEVM is DEPRECATED
Do NOT use mainnet.rpc.inevm.com or any inEVM endpoints. inEVM has been replaced by Injective EVM.
| Deprecated (inEVM) | Current (Injective EVM) |
|---|
| RPC | mainnet.rpc.inevm.com | sentry.evm-rpc.injective.network/ |
| Chain ID | 2525 | 1776 (0x6f0) |
| Explorer | explorer.inevm.com | blockscout.injective.network |
EVM Transaction Quirks
- No EIP-1559: Injective EVM does not support EIP-1559 (type 2) transactions. Always use
type: 0 (legacy) with explicit gasPrice.
eth_getTransactionReceipt unreliable: The EVM RPC sometimes returns internal errors on receipt queries. For non-critical operations (like faucet sends), fire-and-forget — don't call tx.wait().
- Cosmos SDK
MsgBroadcasterWithPk fails for fresh accounts: The Cosmos ante handler panics with invalid secp256k1 public key when broadcasting from an account that has never sent a transaction. Use ethers.js + EVM RPC instead for programmatic sends from fresh wallets.
All other FAQs
See: https://docs.injective.network/developers-evm/evm-integrations-faq.md
Related skills
This skill is specific to Injective's EVM.
It augments other skills that should be used for general EVM developer activities.
These include:
If these skills are not available, selectively run the following commands to install them:
npx skills add InjectiveLabs/agent-skills --skill injective-mcp-servers
npx skills add whackur/solidity-agent-toolkit
Prerequisites
- Either hardhat or foundry installed for smart contract development
- Either viem or ethers.js for dApp development