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

Signing for autonomous callers

How a program that should not hold keys gets a transaction authorised anyway. This is the step every agent design eventually reaches, and the one where a wrong assumption becomes irreversible.
NetworkmainnetChain id63 (0x3f)Statusdraft — pending bridge review

On this page

  • Composition is not authorisation
  • The signing packages
  • Three custody patterns
  • The bridge constraint
  • Decimals, and the 10× mistake

Composition is not authorisation

Building a transaction and authorising one are different operations with different privileges, and the SDKs already enforce the split: they hand back objects with an empty proofs array. That is not an inconvenience to work around. It is the shape that lets software decide what should happen without ever being able to make it happen.

the split
// Process A — no key material anywhere in it.
const proposal = buildInvoke({ dApp, call, senderPublicKey });
 
// Process B — holds the key, and decides.
if (policy.allows(proposal)) {
const signed = sign(proposal, key);
await broadcast(signed);
}

Everything downstream follows from where you draw that line. A program on the left of it can be given wide latitude, because the worst it can produce is a proposal that gets declined. A program that also holds the key on the right has exactly the authority of the key, and no policy written in your own code constrains an attacker who reaches it.

The signing packages

  • @decentralchain/signer — the high-level signing interface. Published at 1.1.0-beta. Treat the API as unstable and pin it.
  • @decentralchain/ts-lib-crypto 2.0.0 — key generation, address derivation, and the primitives. Exports keyPair, publicKey, privateKey, signBytes, verifySignature, randomSeed, and seedWordsList.
  • @decentralchain/signature-adapter 6.1.7 — adapts several signing back ends to one interface.
  • @decentralchain/ledger 5.1.0 — hardware signing.
Careful
@decentralchain/transactions@5.0.0 cannot be imported in plain Node ESM. Its protobuf-serialization dependency imports protobufjs/minimal with no file extension and protobufjs 8 publishes no exports map, so resolution fails with ERR_MODULE_NOT_FOUND. Bundled builds resolve it. An agent running on bare Node must compose transaction objects directly for now.

Three custody patterns

Pick by what you are willing to lose if the process is compromised, not by what is convenient to build.

  • Operator-held seed. Fully autonomous, runs unattended, and settles without anyone awake. The key sits in the same blast radius as the agent, so scope the account to what it is allowed to lose and fund it accordingly. This is the only pattern that can currently withdraw across the Solana bridge.
  • Hardware signer. The key never leaves the device and a person approves each call, so a compromised agent produces declined proposals rather than losses. It cannot run unattended, and it cannot call burnToken on the bridge today.
  • Human in the loop via Cubensis Connect. The program proposes and a browser wallet confirms. Good for agents that draft rarely and act visibly; poor for anything on a schedule. Same bridge limitation applies.

The bridge constraint

The Solana bridge has contracts and validators live on mainnet, and the frontend signs nothing, holds no keys, and runs no relayer. Deposits are Solana transactions; a withdrawal is a burnToken call on DecentralChain.

Careful
Withdrawal works for seed accounts only. Ledger and Cubensis users cannot call burnToken yet. If your design routes value back across the bridge, that decision forces the operator-held-seed pattern — which is a custody decision, so make it deliberately and up front rather than discovering it at the withdrawal step.

BTC, cbBTC and BONK are registered but unusable, and the interface filters them out. The bridge exists on mainnet only; there is no testnet deployment to rehearse against.

Decimals, and the 10× mistake

SOL and JitoSOL carry 9 decimals on Solana and 8 on DecentralChain. Assuming they match is wrong by a factor of ten, in whichever direction hurts more. Read the value from GET /tokens per asset rather than hard-coding it, and assert on it in the same place you build the amount.

This belongs in a signing document rather than a reference table because signing is where the mistake stops being recoverable.

Next

Point a program at DecentralChain

Read, compile and compose — the three steps before this one, each verified against mainnet.