DecentralChainDecentralChain
  • Technologysubmenu
    Why DecentralChainWhat sets this chain apartHow the chain worksPublic blocks, public validatorsBlockchain featuresWhat is on, what is being voted onFinalityThe rollback bound, and what is unverifiedRIDEContracts that cannot run foreverFor machinesUnsigned transactions and RIDE in processSolana bridgePhantom and Solflare, mainnet onlyNetwork statusHeight, sync and peers, read live
  • Ecosystemsubmenu
    DCC public saleOpens 26 SeptemberDecentralCoinSupply, allocation and tokenomicsDecentral.ExchangeexternalDecentralPropDecentralScansoonCubensis ConnectDecentralAmericasoon
  • Developerssubmenu
    QuickstartRead, compile and composeREST APIEvery endpoint, no key, no accountSDK packages19 on npm, 5 in the workspaceSigningAuthorising without custodyMCP & AgentsThe chain, and the tools we have builtDecentralChain NodeRun a validator, and what LPoS pays
  • Communitysubmenu
    ChannelsTelegram, X and the reposDCC AirdropAllocated, not yet arrangedGovernanceWho can actually decide anythingBrand kitThe mark, and how to use it
  • Documentation
XGitHub
Start buildingarrow
DecentralChainDecentralChain

An open Layer-1 with Leased Proof of Stake.

Native token: DecentralCoin (DCC)

Fixed supply 100,000,000 DCC
Minted at genesis, never inflated

  • X
  • GitHub
  • Telegram

Build

  • Quickstart
  • REST API
  • SDK packages
  • Signing
  • MCP & Agents
  • Documentation

Ecosystem

  • DCC public sale
  • DecentralCoin
  • Decentral.Exchange
  • DecentralProp
  • DecentralSwap
  • Cubensis Connect

Network

  • Blockchain features
  • Finality
  • RIDE
  • Solana bridge
  • Run a node
  • Network status

Project

  • Community
  • DCC Airdrop
  • Governance
  • Brand kit
  • GitHub
mainnetHeight—Node—read from your browser
© 2026 DecentralChainOperated by DecentralExchange · Cédula Jurídica 3-102-956858
Jacó, Garabito, Costa Rica
TermsPrivacySecurityLicensingdecentralchain.io

For machines

Point a program at DecentralChain

Everything below runs without an account, an API key, or a signup. Every runnable sample here was executed against mainnet before it was written down, and the three things that turned out to be broken are marked as loudly as the parts that work.
NetworkmainnetNodemainnet-node.decentralchain.ioVerified2026-08-30

On this page

  • Read without a credential
  • Or connect a model to it
  • Compile RIDE in process
  • Compose an unsigned call
  • Hand it to a signer
  • What the chain will not do

Read without a credential

A read is a plain GET. There is no key to obtain, no account to register, and no rate-limit tier to negotiate. The node reflects the request Origin header, so browser code on any domain reaches it directly without a proxy in between.

read-height.mjs
// No key, no account, no SDK. The node reflects the request Origin,
// so this same call works from a browser, a server, or a sandbox.
const res = await fetch(
'https://mainnet-node.decentralchain.io/blocks/height',
);
 
const { height } = await res.json();

Two other endpoints are verified and safe to depend on: /blocks/headers/last for a full block header, and /node/version for the running node build.

Careful
/blocks/height/finalized does not exist on mainnet. It returns HTTP 400, because the node parses finalized as a block signature. That path comes from a testnet finality spec and will not work here. /node/status is unverified on mainnet — check it before you build on it.

Or connect a model to it

The same reads, plus the compiler below, are wrapped as an MCP server. Point any MCP client at it and a model can inspect mainnet and check that a contract compiles, with no key to configure — because there is no key. The configuration is the whole setup:

mcp client configuration
{
"mcpServers": {
"decentralchain": {
"command": "npx",
"args": ["-y", "@decentralchain/mcp-node"]
}
}
}

Six tools: get_chain_height, get_last_block, get_node_version, compile_ride, script_info_ride and decompile_ride. Reads go over plain HTTP; compilation happens inside the server's own process, so nothing leaves the machine. Set DECENTRALCHAIN_NODE to point it somewhere other than mainnet.

No tool holds a seed, signs a transaction, or broadcasts one, and none is planned. That boundary is what makes the server safe to hand to an autonomous agent: it can learn everything and still move nothing.

Careful
Not published to npm yet, so the command above does not resolve today. The package is built and its smoke test passes against mainnet — it lists its tools, reads live height and node version, compiles a contract, and returns a clean parse error for invalid source. Everything else on this page works right now.

Compile RIDE in process

@decentralchain/ride-lang is the RIDE compiler cross-built from Scala with Scala.js and published to npm. It runs inside your process — no toolchain to provision, no compiler service to call, and nothing to keep running between invocations.

Careful
Two things will stop you, and neither is documented upstream. The bundle calls blake2b256, keccak256 and sha256 as bare globals that it does not ship, so importing it and calling compile throws ReferenceError: blake2b256 is not defined. And the estimator version is capped at 3 — omit it or pass anything higher and you get back { error: "Version of estimator must be not greater than 3" } instead of a compiled script. The shim below fixes both.
compile-ride.mjs
import { blake2b, keccak, sha256 } from '@decentralchain/ts-lib-crypto';
 
// ride-lang is a Scala.js build. It reaches for three hash functions as
// bare globals and does not bundle them, so install them first.
globalThis.blake2b256 = (b) => blake2b(new Uint8Array(b));
globalThis.keccak256 = (b) => keccak(new Uint8Array(b));
globalThis.sha256 = (b) => sha256(new Uint8Array(b));
 
const { compile } = await import('@decentralchain/ride-lang');
 
const source = `{-# STDLIB_VERSION 6 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
 
@Callable(i)
func ping() = [ IntegerEntry("pong", height) ]
`;
 
// Second argument is the estimator version. 3 is the maximum.
const out = compile(source, 3);
 
out.complexity; // 3
out.result; // ArrayBuffer — the serialized script

The same package exports decompile, parseAndCompile, scriptInfo and contractLimits. @decentralchain/ride-repl ships the evaluator alongside it if you want to run a contract rather than only build one.

Compose an unsigned call

This is the part that matters for autonomous software. A program can build a complete, well-formed transaction and still have no authority to send it, because signing is a separate step performed by whoever holds the key. The composing process never needs custody of anything.

compose-invoke.mjs
// An invoke nobody has authorised: proofs is empty and no seed was
// involved in building it. This object is a proposal, not a transaction.
const unsigned = {
type: 16, // INVOKE_SCRIPT
version: 2,
chainId: 63, // 0x3f — DecentralChain mainnet
dApp: '3DcZHm89byJjfdkHTJ9m89pyeMk8vChDGtD',
call: { function: 'swap', args: [] },
payment: [],
senderPublicKey: OPERATOR_PUBLIC_KEY,
timestamp: Date.now(),
proofs: [],
};

The chain id is 63, not 76. A DecentralChain address carries its chain byte at index 1, and decoding either live AMM contract address from base58 yields 0x3f — decimal 63, the character ?. The @decentralchain/transactions README shows chainId: 'L', and L is 76. That value is inherited from a different network, and it builds transactions DecentralChain mainnet rejects.

Careful
@decentralchain/transactions@5.0.0 does not import under Node ESM. Its dependency @decentralchain/protobuf-serialization imports protobufjs/minimal without a file extension, and protobufjs 8 ships no exports map, so Node fails resolution with ERR_MODULE_NOT_FOUND before any of your code runs. It resolves correctly under a bundler. Until that is fixed, compose the object literally as above, or run your agent through a bundled build.

Hand it to a signer

An unsigned transaction is inert until something with a key adds a proof. Which signer you choose decides what your program can do on its own and what it must ask a person for — the trade-offs, the packages, and the patterns that are safe to automate are covered separately.

  • Operator-held seed — fully autonomous, and the key lives wherever your process lives.
  • Hardware signer via @decentralchain/ledger — a person approves each call.
  • Human in the loop through Cubensis Connect — the program proposes, a wallet confirms.

What the chain will not do

Anything you automate should be designed against these, not discovered by them in production.

  • Finality is T0 DeterministicFinality. HotStuff is authoritative on testnet only; its mainnet status is unverified, so do not design settlement around it. The chain carries a max-rollback-depth of 100 blocks — that is the bound to plan against.
  • Blocks arrive about every 60 seconds, as an average rather than a promise. Do not build a loop that assumes a deadline.
  • Bridge withdrawal works for seed accounts only. Ledger and Cubensis users cannot call burnToken yet, so a hardware-signed agent cannot withdraw across the Solana bridge today.
  • Five packages are workspace-only and cannot be installed: types, protobuf-schemas, node-api, data-service-client and @dcc-amm/sdk. Published near-equivalents exist for some — the type package on npm is @decentralchain/ts-types, not @decentralchain/types.

Next

Signing for autonomous callers

How a program that should not hold keys gets a transaction authorised anyway, and what each custody pattern costs you.