Zycord

gitlab.com/zycord-group/zycord-node — a580df8ccc081a678fd6bee2cf55cbdba48830c6

Audit date ·

This is a point-in-time review of code quality and tokenomics at the commit above, not a safety certification. Projects can change after this date. Check for newer releases or a newer audit before relying on these scores.

RandomX Go L1; no premine, height-based issuance, and a keyless, time-limited treasury.

Code 9.5 · Tokenomics 10 · Risk 9.5 · FAVORABLE

🪙 Zycord (ZCD) — Code & Tokenomics Audit

Repo: gitlab.com/zycord-group/zycord-node at commit a580df8ccc081a678fd6bee2cf55cbdba48830c6
Date: 2026-10-17 Scope: recon, code review (money and consensus path read line by line), tokenomics, write-up. All phases ran. Hashrate and profitability were not measured — they are out of scope for this scale.

🎯 Assessment: FAVORABLE (reviewed code and tokenomics only; not a safety certification)

Zycord is a hand-written Go layer-1 with a RandomX v2 CPU subsidy and an unusually strict codebase. Issuance is a pure function of block height: every node recomputes the subsidy from the height alone, and no header carries an amount. There is no premine, no mint path to the native coin, and the founder share is 3% and time-boxed.

This scores code and tokenomics only. It says nothing about whether Zycord survives, whether anyone will trade it, or whether it outlives its author. The chain is about ten days old at audit and the author is anonymous. Those are survival questions, not trust problems, and they do not move the number.

🔑 At a glance

FieldValue
ProjectZycord (ZCD)
Chain / consensusOwn L1, PoW RandomX v2, 30 s target; PoS gate at height 1,576,800
Code score9.5 / 10
Tokenomics score10.0 / 10
Risk score9.5 / 10 (the lower of the two)
AssessmentFAVORABLE (code and tokenomics only; not a safety certification)

🔗 Links & sources

WhatLinkStatus
🏠 Homepage—
💻 Source✅ fetched, HTTP 200
🔎 Explorer🔍 cited in this note, not fetched
📄 Whitepaper—
📣 Announcement—
💬 Socials—

🧮 Risk score inputs

#Findingfile:lineReachableDeductionApplies to
1LOW — the header carries its own PoWHash and CheckWork compares the recomputed digest to it, so the cheap pre-execution gate passes an easy-looking header and costs one full RandomX hash per unverified header to reject. Bounded per-peer cost, not an issuance flawcore/pow/pow.go:57-73, core/pow/pow.go:95-105, node/verify/work.go:42live−0.5code
2No hard cap — tail emission continues forever — Deliberate design, stated in the params file itself. Not a missing-cap findingspec/params.json:35-38, core/params/params.go:269-276live−0tokenomics
3Issuance is a pure function of height and every node recomputes it — so no MAX_SUPPLY constant is needed and nothing is unboundedcore/params/params.go:256-296, core/fold/fold.go:402live−0tokenomics
4Founder tax 3% of subsidy until height 3,153,600 — below the scale's 5% floorspec/params.json:41, core/params/founder.go:58-70live−0tokenomics
5Treasury 3% (6% after height 3,153,600) has no spend path — so no live-spending-key deductioncore/validity/validity.go:618-624, core/fold/fold.go:1591-1597live−0tokenomics
6Docs-vs-code block-1 payout mismatch — resolved, stale note, not a contradiction (commit b4303e1 changed emission_ramp_blocks)spec/params.json:64live−0tokenomics
code deductions, one at a time:
  0.5
tokenomics deductions, one at a time:
  0.0

code_score       = 10 - 0.5                            = 9.5
tokenomics_score = 10 - 0                              = 10.0
risk_score       = min(code, tokenomics)               = 9.5

Instant-AVOID override fired: none. All five checked —

  1. No key, role or admin path mints native supply or edits the schedule outside consensus. deriveMint refuses a MINT unless the asset carries version byte 0x03, so the all-zero native asset cannot be minted (core/validity/derive.go:216-224, core/types/slots.go:10-11).
  2. No code sends a seed, key or wallet contents anywhere; the phrase path says so outright (wallet/phrase.go:23-25).
  3. No backdoor, killswitch or remote-code path found in node/, core/, wallet/.
  4. Not a fork presented as original work — RandomX is an external algorithm behind a build tag and is declared in the consensus root (spec/params.json:56).
  5. No supply or privacy claim that the code contradicts — see the tokenomics table.

🔒 Code

Commit audited: a580df8

📊 Tokenomics

ItemValueEvidenceFlag
PremineNone. Emission(0) returns zero: "The genesis block pays no coinbase: there is no miner to pay, and a reproducible genesis must not credit an address". B10 also refuses a genesis block that names a payout addresscore/params/params.go:256-260, core/fold/blockrules.go:643-645✅
Mint authority over the native coinNone. deriveMint refuses unless args.Asset[0] == AddrVersionAsset (0x03); the native asset is the all-zero address, version 0x00. Asset mints are capped against AssetCapSlotcore/validity/derive.go:216-243, core/types/slots.go:10-11✅ none
Issuance enforced in consensusYes. Every node recomputes the split per block from the height (core/fold/fold.go:402 via p.SubsidySplit). No header field carries an amount. The schedule also bounds user-side claims: V5 refuses a deposit larger than CumulativeEmission(TTL)core/fold/fold.go:402, core/params/founder.go:58-70, core/validity/validity.go:755✅ enforced in consensus
Hard capNo hard cap — tail emission continues forever. The decaying schedule runs epochs 0-4375, then a permanent tail of 33000000 drops (0.33 ZCD per block) from epoch 4376, height 12,602,880. Stated as a design choice in the params filespec/params.json:35-38, core/params/params.go:269-276✅ deliberate tail emission
Emission curveNo halving step. Per-epoch geometric decay, divisor 1054 per 2,880-block epoch → yearly factor 0.70702, so the rate halves every two years. Slow start over 86,400 blocks (30 days): block 1 pays 0.00023623 ZCD, block 43,200 pays 10.21 ZCD, block 86,400 is the first full rate at about 20.41 ZCDspec/params.json:35-38, core/params/params.go:269-290✅
Supply totals (not a cap)Pre-tail sum 62,744,838.47 ZCD; 62,744,817.47 reachable because genesis pays nothing; about 61,836,900.03 actually issued because the slow start withholds 907,917.44 forever. The file warns that the easy product 63,745,920 overshoots by 1.6% and is only an upper boundspec/params.json:63 note✅
Dev / founder share3% of the subsidy (300 bps) to 0x02f29dc4...abe9b11, until height 3,153,600 (3 years at 30 s). Ends there. About 1,208,790 ZCD in total, 3% of what is issued by then. On the subsidy only, never on feesspec/params.json:41, core/params/founder.go:58-70✅ 3% tax — below the 5% floor
Producer share94% while the founder share is active, exact remainder via saturating math, so the shares always sum to the subsidycore/params/founder.go:58-70✅
TreasuryNo spend path. Credited into TreasurySlot(), the native balance cell of ProtocolAddress = version byte 0x00 + 31 zero bytes. V7 rejects any certificate write to a 0x00 cell; F13 repeats it at apply; debits elsewhere require IsUserAddress, which is false for the protocol address. No key signs for it, no timelock, no multisig — inert. From height 3,153,600 it also takes the founder's 3%, so 6% accruescore/types/slots.go:122-123, core/crypto/crypto.go:131-132,161-166, core/validity/validity.go:618-624, core/fold/fold.go:433-440,1591-1597✅ no spend path
Docs vs codeOld vault claim: block 1 pays 0.00022207. Params and code: block 1 pays 0.00023623. Cause found — commit b4303e1 (2026-10-03) set emission_ramp_blocks to 86,400 and rewrote the ramp notes. Code matches current docs; the 2026-10-15 figure was stalespec/params.json:64, commit b4303e1✅ no contradiction
Genesis reproducible from published paramsYes. Params are embedded and in the consensus root; spec/chain-ids.json is a chain-id ledger, so a released binary refuses a parameter file that reuses a spent chain id under another genesisspec/chainids.go:16-69, commit b4303e1✅
Params tamper resistanceValidate() holds treasury_share_bps below 10,000 and founder bps below 10000 - treasury_bps, with an explicit anti-integer-wrap comment ("a founder bps near 2^64 would then pass and mint without bound"); the founder address must be a persistent 0x02 address and end_height is required. Changing any of it changes the consensus root, so it needs a hard fork the network acceptscore/params/params.go:659-661, core/params/founder.go:75-95✅

🕵️ Privacy

🚩 Red flags

✅ Green flags

📋 Context (does not affect the score)

SignalValue
Repo / commit auditedgitlab.com/zycord-group/zycord-node at a580df8ccc081a678fd6bee2cf55cbdba48830c6; shallow clone holds 377 commits
Contributors / commits🔍 not resolvable from a shallow clone; GitLab authorship needs auth
AI-assisted commitsyes — 279 commits carry Co-Authored-By: Claude, 2 more carry a Claude Opus co-author trailer
Relaunch, rename or abandoned predecessoryes in the launch history — b4303e1 (2026-10-03) references frozen relaunch parameters and pins both chain ids live; an earlier h1_bond of 40,320 was superseded before launch
Independent auditnone found in-repo; SECURITY.md exists
Public RPC or explorer reachableno working API. https://explorer.zycord.com/api/block/1 and /api/status both returned 404 page not found (fetched 2026-10-18, --max-time 25). The explorer UI exists but exposes no JSON endpoint, so on-chain supply stays unverified, not clean
Market datanot relevant at this stage
Hashrate, difficulty, power cost, profitabilityout of scope for this scale

❓ What I could not check

🧭 Bottom line

This is one of the better-engineered small PoW chains reviewed here. The subsidy is a pure function of height, every node recomputes it, height continuity is enforced before the subsidy is read, and the treasury share has no spend path at all — it accrues into a protocol cell that no certificate can debit.

Tokenomics scores 10.0 because there is nothing to deduct: no premine in code, no native mint path, a 3% founder share that ends at height 3,153,600, and a deliberate perpetual tail of 0.33 ZCD per block from height 12,602,880. There is no hard cap and the tail continues forever — the project states that as design, and issuance being a pure function of height means an absent MAX_SUPPLY constant is not a defect.

Code scores 9.5: one LOW finding about the cheap work gate accepting a header-declared PoWHash. That is resource exhaustion per peer, not a consensus break. To reach 10.0 the node needs per-peer rate limits on work evaluations.

What would move it down a band: a parameter change that raises founder_share.bps or moves end_height without the chain-id ledger refusing it, or evidence of specialised RandomX hardware exploiting the fixed key schedule. Watch the PoS gate at height 1,576,800 and the founder end at 3,153,600.


Citations

core/pow/pow.go:57-73

core/pow/pow.go:95-105

node/verify/work.go:42

spec/params.json:35-38

core/params/params.go:269-276

core/params/params.go:256-296

core/params/founder.go:58-70

core/validity/validity.go:618-624

core/validity/derive.go:216-224

core/types/slots.go:10-11

Every citation on this page points at a file that was opened during the audit. Nothing here is a guess.

Back to Projects