Injective primer
A short, integration-focused tour of Injective.
What is Injective?
Injective is a Cosmos-SDK Layer-1 with CometBFT consensus, CosmWasm 2.0 smart contracts, and a custom set of finance-native modules (orderbook, oracle, insurance, peggy). The native token is INJ (inj, 18 decimals), with sub-second finality and IBC connectivity to the broader Cosmos network.
For Cascade integration purposes, three facts about Injective matter:
- It runs CosmWasm 2.0, so contracts are Rust crates compiled to Wasm with
cosmwasm-std ≥ 2.0. - It uses
eth_secp256k1key derivation (Ethereum's curve) rather than the standardsecp256k1used by Lumera and most Cosmos chains. This changes how Keplr is configured and how signing works. - The bech32 prefix is
inj. Addresses look likeinj1….
Networks
| Testnet | Mainnet | |
|---|---|---|
| Chain ID | injective-888 | injective-1 |
| RPC | https://testnet.sentry.tm.injective.network:443 | https://sentry.tm.injective.network:443 |
| LCD/REST | https://testnet.sentry.lcd.injective.network:443 | https://sentry.lcd.injective.network:443 |
| gRPC | testnet.sentry.chain.grpc.injective.network:443 | sentry.chain.grpc.injective.network:443 |
| Explorer | testnet.explorer.injective.network | explorer.injective.network |
| Coin denom | inj (18 decimals → INJ) | same |
| Gas price | 500000000inj (≈0.5 Gwei equivalent) | similar |
| Faucet | testnet.faucet.injective.network | inj.supply |
CosmWasm on Injective
Injective ships CosmWasm 2.0. Anything you can write in cosmwasm-std ≥ 2.0 and compile with the cosmwasm/optimizer Docker image will run on Injective once stored. Two Injective-specific things to know:
cosmwasm-2.0only. Older CW 1.x bytecode will not store. Pincosmwasm-std = "2.x"in yourCargo.toml.- Bonds, bets, and fees are paid in the native
injdenom, which is the base unit (inj= 1 wei-equivalent). A 1-INJ value is1000000000000000000(1 × 10¹⁸). The gas price is denominated ininjbase units;--gas-prices 500000000injworks for testnet.
A minimal deploy from a box with injectived installed:
You get back a code_id; instantiate with injectived tx wasm instantiate <code_id> <init-json>.
The native orderbook
Injective has a chain-level orderbook for spot and derivatives markets. If you're building a product where price discovery matters, such as a derivatives market with permanent settlement evidence or a perpetual with permanent funding-rate justifications, the orderbook is the natural fit. Cascade serves as permanent storage for the receipts, the oracle inputs, and the dispute justifications, with action_id pointers held in the matching contract.
Wallets and signing
The Injective wallet model is essentially Ethereum's: the curve is eth_secp256k1, derivation is BIP-44 with coinType: 60, and addresses are bech32-encoded keccak256. A typical Keplr chain registration looks like this:
The two things that differ from a standard Cosmos chain registration are bip44.coinType: 60 and the features: ['eth-address-gen', 'eth-key-sign'] array. Without eth-key-sign, Keplr signs over the wrong digest and Injective rejects every transaction.
Injective's eth_secp256k1 keys are not direct-mode-friendly under the current cosmjs build. Use keplr.getOfflineSignerOnlyAmino(chainId) rather than getOfflineSigner. If you use SigningCosmWasmClient with the standard direct-mode signer, you'll get opaque signature-mismatch errors.
The signing client wires up as:
Once you have a SigningCosmWasmClient, contract calls look like any other Cosmos chain: client.execute(sender, contractAddr, msg, 'auto', memo, funds).
Cross-chain signing
If your dApp asks users to sign Cascade writes themselves (the user-driven pattern), a session needs two addresses: an inj1… address for Injective contract calls, and a lumera1… address for Cascade uploads. Both can come from the same Keplr extension. The user enables the Injective chain (eth_secp256k1) for Injective and the Lumera chain (standard secp256k1) for Cascade. They derive from different BIP-44 paths, so the addresses differ across the two chains.
Many integrations avoid this entirely by signing Cascade writes server-side (the cascade-api path), so the user only ever signs on Injective. See Cascade from Injective for both options.
A note on IBC and Interchain Accounts
Injective is IBC-connected, and in principle a CosmWasm contract on Injective can drive an ICS-27 Interchain Account on Lumera to write to Cascade autonomously. You almost certainly do not need this. The IBC round-trip adds 30–60s of latency and degrades when the relayer is backed up, so it is the wrong tool for any user-facing flow.
The recommended integration paths don't involve IBC: they are either server-signed via the cascade-api, or user-signed from a wallet. Treat ICA as an advanced option reserved for the narrow case where a contract itself must be the signer of a canonical write with no user in the loop. It is covered, with that framing, in Cascade from Injective.
Tools you will use
| Package | What for |
|---|---|
@cosmjs/cosmwasm-stargate | Build and sign Injective MsgExecuteContract |
@keplr-wallet/types | Type-safe Keplr chain info and signer |
@injectivelabs/sdk-ts | Injective-specific helpers (optional; cosmjs is enough for CW calls) |
@lumera-protocol/sdk-js | Sign Lumera transactions and write to Cascade directly |
injectived | The CLI for storing, instantiating, and executing contracts |