Build on Enjin Matrix โ The NFT-Native Application Layer
Enjin RPC
With Dwellir, you get access to our global Enjin network which always routes your API requests to the nearest available location, ensuring low latency and the fastest speeds.
Why Build on Enjin Matrix?โ
๐ฎ NFT-First Runtimeโ
- Protocol-level NFT minting, on-chain metadata, and marketplace enforcement remove the need for bespoke smart contracts (Enjin Blockchain overview).
- ENJ-denominated fees are tuned for games and app developers, giving predictable operating costs for live services (Enjin Blockchain overview).
โ๏ธ Fuel Tanks & Managed Walletsโ
- Fuel tanks sponsor transaction fees for specific players or apps, smoothing onboarding into Matrixchain (Fuel Tanks docs).
- Managed wallets let users receive NFTs before creating self-custodial accounts, ideal for mainstream launches (Managed wallets docs).
๐ก๏ธ Dual-Layer Securityโ
- Matrixchain execution is secured by the Enjin Relaychain, combining Aura authoring with relay-governed GRANDPA finality (Enjin Blockchain overview).
- Custom matrixchains can connect while inheriting the same security and cross-chain routing primitives provided by the Relaychain (Enjin Blockchain overview).
Quick Start with Enjinโ
๐ RPC Endpoints
Quick Connect:
curl -X POST https://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"chain_getBlock","params":[],"id":1}'
Sign up at the Dwellir dashboard to generate an API key, then replace YOUR_API_KEY
in the endpoints above. Keys can be scoped per environment to manage limits and analytics.
Installation & Setupโ
- Polkadot.js
- Rust (subxt)
- Python (py-substrate-interface)
- cURL
import { ApiPromise, WsProvider } from '@polkadot/api';
const provider = new WsProvider('wss://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY');
const api = await ApiPromise.create({ provider });
const [chain, runtime, head] = await Promise.all([
api.rpc.system.chain(),
api.rpc.state.getRuntimeVersion(),
api.rpc.chain.getHeader()
]);
console.log(`Connected to ${chain} specVersion ${runtime.specVersion}`);
console.log(`Best block #${head.number.toNumber()} (${head.hash.toHex()})`);
const validator = 'efS1ZdvCHHviX7qnTGZEZQX9Uz3qpibG9L5RpF9niM8ne5RBn';
const account = await api.query.system.account(validator);
console.log('Validator free balance:', account.data.free.toHuman());
use subxt::{OnlineClient, PolkadotConfig};
use subxt::ext::sp_core::crypto::AccountId32;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let api = OnlineClient::<PolkadotConfig>::from_url(
"wss://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY"
).await?;
let runtime = api.rpc().runtime_version(None).await?;
println!("specVersion={} txVersion={}", runtime.spec_version, runtime.transaction_version);
let account: AccountId32 = "efS1ZdvCHHviX7qnTGZEZQX9Uz3qpibG9L5RpF9niM8ne5RBn".parse()?;
let balance = api
.storage()
.at_latest()
.await?
.fetch(&subxt::dynamic::storage("System", "Account", vec![account.clone().into()]))
.await?;
println!("Account info: {:?}", balance);
Ok(())
}
from substrateinterface import SubstrateInterface
substrate = SubstrateInterface(
url="wss://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY"
)
chain = substrate.rpc_request("system_chain", [])
print("Chain:", chain["result"])
account_info = substrate.query(
module='System',
storage_function='Account',
params=['efS1ZdvCHHviX7qnTGZEZQX9Uz3qpibG9L5RpF9niM8ne5RBn']
)
print("Free balance:", account_info.value['data']['free'])
# Health check
curl -s https://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"system_health","params":[],"id":1}'
# Latest finalized head
curl -s https://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"chain_getFinalizedHead","params":[],"id":2}'
# Runtime versions
curl -s https://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"state_getRuntimeVersion","params":[],"id":3}'
Network Informationโ
Genesis Hash
0x3af4ff48ec76d2efc8476730f423ac07e25ad48f5f4c9dc39c778b164d808615
Verified viachain_getBlockHash(0)
Runtime Spec
1022
Transaction version 11 (state_getRuntimeVersion
)SS58 Prefix
1110
system_properties
resultNative Token
ENJ
18 decimals (system_properties
)- Relay chain: Enjin Relaychain (
0xd8761d3c88f26dc12875c00d3165f7d67243d56fc85b4cf19937601a7916e5a9
, verified viachain_getBlockHash(0)
on archive.relay.blockchain.enjin.io) - Finality: Aura authorship with GRANDPA finality shared by the Enjin Relaychain
- Address format: SS58 prefix
1110
returned bysystem_properties
on archive.matrix.blockchain.enjin.io - Runtime: spec version
1022
, transaction version11
perstate_getRuntimeVersion
on archive.matrix.blockchain.enjin.io - Explorers: Matrix Console (mainnet & canary)
- Canary runtime: Enjin Matrix Canary (
wss://api-enjin-canary-matrix.n.dwellir.com/YOUR_API_KEY
)
Available JSON-RPC Methodsโ
Core Substrate Namespacesโ
Matrix-Specific Extensionsโ
Namespace | Purpose | Notes |
---|---|---|
fuelTanks_* | Determine sponsorship coverage from fuel tanks | Requires authenticated access; discover endpoints via rpc_methods . |
multitokens_* | Read cross-game NFT inventory and claimable drops | Returns managed-wallet data for onboarding flows. |
ismp_* | Inspect interoperability packets and consensus state | Enables monitoring for custom matrixchains secured by Enjin Relaychain. |
transactionWatch_v1_* | Subscribe to transaction status without author RPC | Lightweight watchers for infrastructure dashboards. |
Tip: Use
rpc_methods
to verify which optional namespaces (fuel tanks, multitokens, ISMP) are enabled for your API key and environment.
Additional Substrate namespaces such as childstate_*
, offchain_*
, and read-proof helpers follow the standard Substrate semantics; their availability depends on node configuration and authorization. Use rpc_methods
to inspect support before invoking them from clients.
Common Integration Patternsโ
- Fuel tank sponsorship โ poll
fuelTanks_selectFuelTank
to determine which tank will cover fees for a user, then handle top-ups via governance-controlled accounts. - Managed wallet onboarding โ detect custodial wallets via metadata and migrate them to self-custody by monitoring
Balances.Transfer
events to managed accounts. - NFT marketplace indexing โ subscribe to
chain_subscribeFinalizedHeads
, pull block extrinsics, and decode marketplace pallets to track listings, royalty enforcement, and burns.
Performance Best Practicesโ
- Prefer WebSocket endpoints for subscriptions and batched queries; fall back to HTTPS for stateless reads.
- Cache runtime metadata keyed by
specVersion
to avoid re-fetching large SCALE blobs on each connection. - Use
state_getKeysPaged
with modest page sizes (โค500) when walking storage maps to respect rate limits. - Implement exponential backoff and retry logic for transient
429
or networking errors.
Troubleshootingโ
- Connection refused โ ensure
YOUR_API_KEY
is present and the hostname matches the region you activated in Dwellir. - Invalid SS58 โ use prefix
1110
when encoding Matrixchain addresses; relay chain accounts use prefix2135
. - Extrinsic failures โ decode the
DispatchError
using the latest metadata; many marketplace pallets return module-specific error codes. - Missing custom RPCs โ extend Polkadot.js type bundles with Enjin-specific RPC definitions when
API/INIT
warns about undecorated methods.
Smoke Testsโ
Run these endpoints after deployment to validate connectivity:
# Health (should report peers > 0)
curl -s https://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"system_health","params":[],"id":1}'
# Latest finalized hash
curl -s https://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"chain_getFinalizedHead","params":[],"id":2}'
# Runtime versions
curl -s https://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"state_getRuntimeVersion","params":[],"id":3}'
# RPC surface area
curl -s https://api-enjin-matrixchain.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"rpc_methods","params":[],"id":4}'
Migration Guide (Polkadot/Westend โ Enjin Matrix)โ
- Endpoints โ replace legacy Polkadot/Westend RPC URLs with Dwellir Matrix endpoints listed above.
- Address format โ re-encode accounts with SS58 prefix
1110
; update wallet tooling accordingly. - Fee economics โ call
payment_queryInfo
to account for ENJ-denominated fees and optional fuel tank sponsorships. - Runtime pallets โ verify availability of Matrix-specific pallets (fuel tanks, managed wallets) and adjust type bundles.
- Event handling โ update indexers to interpret Enjin marketplace and multitoken events instead of Polkadot parachain events.
Resources & Toolsโ
- Enjin Blockchain Technology Overview โ architecture, performance targets, and ecosystem highlights.
- Console Explorer โ monitor blocks, accounts, and collections across mainnet and canary.
- Dwellir Dashboard โ manage API keys, usage analytics, and plan limits.
- Subscan (Matrixchain) โ alternative explorer for validators and extrinsics.
Ready to go live? Deploy against Matrix mainnet using Dwellirโs globally anycasted infrastructure, then automate observability with the smoke tests above.