Restore the audited Shyft core + the RMT layer + the minimal EAS pieces; wire them together on Stable.
Turn on the native fee mechanisms so the Shyft token has intrinsic value even though gas is USDT.
One-command deploy + a smoke test that registers an agent, cites, and reads a capped score.
Don't build new contracts. The Shyft core and the RMT layer are already written and audited. The attestation fee and citation fee are already implemented. The job is to deploy what exists, wire it, and configure the fees — not to author new Solidity. The two exceptions are operational glue (a deploy script + a smoke test), and one optional contract only if you want a fee split.
The recorded decision (5 docs, 11 cross-model reviews) is "EAS + Shyft", not "deploy full EAS": keep the Shyft core attestation contracts intact for identity, and for the citation layer pull only the minimal EAS pieces. Shyft's own attestation system (TrustAnchorStorage.setAttestation) handles identity natively — no EAS needed there. EAS is used only for bot-to-bot citations, and even there we self-deploy just the two small canonical contracts (EAS + SchemaRegistry) and pull the ISchemaResolver interface locally (already in the code). We are NOT deploying the full EAS ecosystem and NOT building a new attestation system. EAS_VS_SHYFT_COMPARATIVE_ANALYSIS.md:608–616 · STABLE_DEPLOYMENT_DOSSIER.md · IShyftGatedResolver.sol:4–6
TrustAnchorManager, TrustAnchorStorage (+ Availability + PaymentModule), TrustChannelManager, ShyftCacheGraph, ShyftConduit, ShyftKycContract, Administrable. Audited core — restore from git, deploy as-is.
ShyftGatedResolver, ReputationEngine, PageRankOracle, CitationCounters, RMTToken, DomainRegistry/Factory, ERC8004Bridge, MachineConsentHelper. 33 audited files, deployable as-is.
Self-deploy just EAS.sol + SchemaRegistry.sol (the small open MIT contracts), register the citation schema, read the schemaUID back. ISchemaResolver already pulled locally. MockEAS stays tests-only.
The real cycle PageRankOracle ↔ ReputationEngine + resolver setters (setCitationCounters, setReputationEngine, setRmtToken). All setters exist; this is configuration.
You asked whether the attestation fee and the RMT citation fee are one thing or two, and whether to use one. They are two different fee events at two different layers — both already built. Here's exactly what each is, source-verified.
| contract | TrustAnchorStorage + TrustAnchorStorage_PaymentModule (Shyft core) |
| charged on | setAttestation() — a Trust Anchor attesting an identity |
| token | configurable: PaymentMode = NONE / BASE (native = USDT on Stable) / ERC20 (point at Shyft token or RMT) |
| receiver | single paymentReceiverAddress · amount via setPaymentForAttestation · multisig-gated module |
| status | already built & tested — dual-denomination is native. PaymentModule.sol:23,59,150,160 · test 27 |
| contract | ShyftGatedResolver (RMT layer) |
| charged on | attest() — one bot citing another (via EAS) |
| token | RMT token (ERC20), attester → cited bot directly |
| receiver | the cited bot (toBot) · amount via setCitationFee |
| status | already built & tested. ShyftGatedResolver.sol:177–180 · test_citationFees.js |
Different trigger (identity attestation vs reputation citation), payer, receiver, and purpose — they're cleanly separable and complementary, so use both. Your goal — "ensure the Shyft token holds intrinsic value even though gas is USDT" — is served right now with zero new code: set the Shyft-core attestation fee to ERC20 mode pointed at the Shyft token (or RMT), and/or keep the RMT citation fee in RMT. The protocol can also choose USDT (BASE mode). The one thing the modules do NOT do is a multi-recipient split or an on-chain USDT↔Shyft conversion — they're single-receiver, single-mode. The split/conversion is delivered by a small fee router set as the receiver — now required scope per approval (Story 5).
deploy-stable-testnet.jsOne command, idempotent/resumable, USDT0 gas (0-tip), deploys the order above + registers the EAS schema + wires everything + writes an address ledger. Design already drafted.
register-test-agent.jsRegister a test agent → write a citation → read the tier-capped score end-to-end. Faucet-funded.
A thin contract set as the attestation paymentReceiverAddress that splits (treasury / burn / receiver) and/or swaps USDT→Shyft. Required per approval (Story 5).
The honest, minimal scope. Everything else is deploy-existing-and-configure.
~200 LOC orchestration. No new on-chain logic.
~80 LOC. Proves the deployment works end-to-end.
Canonical open-source EAS + SchemaRegistry — copied, not written.
The single piece of genuinely-new on-chain code — required per approval (Story 5). Deep-audited + red-teamed before deploy.
Traced attestation → CitationCounters → oracle → ReputationEngine on the main branch; built the "where citations land" map.
Confirmed "EAS + Shyft" hybrid across 5 docs + 11 reviews — matches your recollection (keep Shyft, pull minimal EAS).
Pulled 27_test_attestationFee.js + TrustAnchorStorage_PaymentModule.sol via the GitHub API and read the fee logic directly.
PaymentModule has PaymentMode {NONE, BASE, ERC20} — native (USDT) or ERC20 (Shyft/RMT). Single receiver, single mode; no native split/conversion.
Attestation fee (identity) vs RMT citation fee (reputation) — separable, complementary; recommend keeping both.
Pulled the exact recorded thesis, 5 templates, L0–L4 stack, and proven/proposed/blocked status — see the linked explainer.