Build & Deployment Plan · FOR CTO APPROVAL · Source-Verified

Stable Testnet — Build & Deployment Plan Deploy Shyft core → enable payments → launch on Stable. Built from existing audited contracts; new code kept to a minimum. Approve this before any building begins.

⏸ APPROVAL-GATED · no build yet REUSE existing audited contracts NEW code: deploy script + smoke (+ optional fee router)
What you're approving: a plan to stand up the Antilles/Shyft trust stack on Stable testnet using contracts that already exist and are audited — restore Shyft core, deploy the RMT layer, deploy only the minimal EAS pieces, turn on the native fee mechanisms, and launch. I should be building almost nothing new — the only genuinely new code is the deploy script + smoke test, plus (optional, your call) a thin fee-splitter. Everything else is deploy-and-wire.
00

The goal — three steps

1

Deploy all Shyft core

Restore the audited Shyft core + the RMT layer + the minimal EAS pieces; wire them together on Stable.

mostly deploy-existing
2

Enable payments

Turn on the native fee mechanisms so the Shyft token has intrinsic value even though gas is USDT.

fee logic already built
3

Launch on Stable

One-command deploy + a smoke test that registers an agent, cites, and reads a capped score.

deploy script + smoke = new

✔ Guiding principle (your instruction)

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.

01

Step 1 — Deploy all Shyft core (the EAS question, resolved)

✔ Confirmed: your EAS recollection was right

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

RESTORE

Shyft core — identity & attestation

TrustAnchorManager, TrustAnchorStorage (+ Availability + PaymentModule), TrustChannelManager, ShyftCacheGraph, ShyftConduit, ShyftKycContract, Administrable. Audited core — restore from git, deploy as-is.

restore from 710536b · upstream master = audited source
EXISTS

RMT layer — reputation & citations

ShyftGatedResolver, ReputationEngine, PageRankOracle, CitationCounters, RMTToken, DomainRegistry/Factory, ERC8004Bridge, MachineConsentHelper. 33 audited files, deployable as-is.

antilles-v2 @ main · 33 RMT files
DEPLOY MINIMAL

EAS — citation layer only

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.

~2 contracts + 1 schema registration · not the full EAS ecosystem
EXISTS

Wiring

The real cycle PageRankOracle ↔ ReputationEngine + resolver setters (setCitationCounters, setReputationEngine, setRmtToken). All setters exist; this is configuration.

verified setters: PageRankOracle.sol:192 ↔ ReputationEngine.sol:231
02

Step 2 — Enable payments (the two fee layers — analyzed)

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.

💳 Shyft-core attestation fee IDENTITY LAYER

contractTrustAnchorStorage + TrustAnchorStorage_PaymentModule (Shyft core)
charged onsetAttestation() — a Trust Anchor attesting an identity
tokenconfigurable: PaymentMode = NONE / BASE (native = USDT on Stable) / ERC20 (point at Shyft token or RMT)
receiversingle paymentReceiverAddress · amount via setPaymentForAttestation · multisig-gated module
statusalready built & tested — dual-denomination is native. PaymentModule.sol:23,59,150,160 · test 27

🔗 RMT citation fee REPUTATION LAYER

contractShyftGatedResolver (RMT layer)
charged onattest() — one bot citing another (via EAS)
tokenRMT token (ERC20), attester → cited bot directly
receiverthe cited bot (toBot) · amount via setCitationFee
statusalready built & tested. ShyftGatedResolver.sol:177–180 · test_citationFees.js

↳ Recommendation: keep both — they're not redundant, and the Shyft-token economics live at the attestation layer

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. If you want a split/conversion, that's the only candidate for a small new contract (a fee router set as the receiver). I recommend launching with the existing single-mode fee first, and deciding on a router after.

03

Step 3 — Launch on Stable

NEW (operational)

Deploy script — deploy-stable-testnet.js

One command, idempotent/resumable, USDT0 gas (0-tip), deploys the order above + registers the EAS schema + wires everything + writes an address ledger. Design already drafted.

scripts/deploy-stable-testnet.PROPOSAL.md exists; script does not yet
NEW (operational)

Smoke test — register-test-agent.js

Register a test agent → write a citation → read the tier-capped score end-to-end. Faucet-funded.

blocked on operator funding the deployer via faucet.stable.xyz
OPTIONAL

Fee router/splitter — only if you want a split/conversion

A thin contract set as the attestation paymentReceiverAddress that splits (treasury / burn / receiver) and/or swaps USDT→Shyft. Only built if you approve it — otherwise skipped.

your call · not required for launch
04

What you'd actually be approving me to build

The honest, minimal scope. Everything else is deploy-existing-and-configure.

BUILD

1 · Deploy/launch script (operational glue, not protocol code)

~200 LOC orchestration. No new on-chain logic.

BUILD

2 · Smoke / verify script

~80 LOC. Proves the deployment works end-to-end.

DEPLOY (no build)

3 · The 2 minimal EAS contracts

Canonical open-source EAS + SchemaRegistry — copied, not written.

ONLY IF APPROVED

4 · Fee router (split/conversion)

The single piece of genuinely-new on-chain code — and only if you want a fee split or USDT↔Shyft conversion.

05

How it ships — FSM phases & the approval gate

NOW
PLAN
◆ approve this
P1
DESIGN
deploy order + fee config
P2
BUILD
scripts only
P3
VALIDATE
testnet dry-run
P4
REVIEW
cross-model
P5
LAUNCH
deploy + smoke

Approve these and I proceed (and only then start building)

06

What I did to produce this (full breakdown)

1

Verified the citation/oracle mechanism against source

Traced attestation → CitationCounters → oracle → ReputationEngine on the main branch; built the "where citations land" map.

antilles-v2 @ main · 33 RMT files
2

Found the recorded EAS decision

Confirmed "EAS + Shyft" hybrid across 5 docs + 11 reviews — matches your recollection (keep Shyft, pull minimal EAS).

EAS_VS_SHYFT_COMPARATIVE_ANALYSIS.md + dossier + seed-brief
3

Read your attestation-fee reference from the private Shyft repo

Pulled 27_test_attestationFee.js + TrustAnchorStorage_PaymentModule.sol via the GitHub API and read the fee logic directly.

ShyftNetwork/shyft_shyftcorecontracts @ master
4

Confirmed the dual-denomination capability (no assumption)

PaymentModule has PaymentMode {NONE, BASE, ERC20} — native (USDT) or ERC20 (Shyft/RMT). Single receiver, single mode; no native split/conversion.

PaymentModule.sol:23,59,150,160
5

Analyzed the two fee layers

Attestation fee (identity) vs RMT citation fee (reputation) — separable, complementary; recommend keeping both.

ShyftGatedResolver.sol:177–180 vs PaymentModule
6

Mined the trust-channel generalization plan

Pulled the exact recorded thesis, 5 templates, L0–L4 stack, and proven/proposed/blocked status — see the linked explainer.

x402-trust-channels research · cited
Provenance. Shyft-core fee: ShyftNetwork/shyft_shyftcorecontracts @ master — TrustAnchorStorage_PaymentModule.sol (PaymentMode enum:23, setPaymentMode:59, processPayment BASE:150 / ERC20:160), test/27_test_attestationFee.js (setPaymentMode 0/1/2, setPaymentForAttestation, single paymentReceiverAddress, paid via setAttestation value). RMT fee: antilles-v2 ShyftGatedResolver.sol:177–180 (RMT token, attester→toBot). EAS decision: EAS_VS_SHYFT_COMPARATIVE_ANALYSIS.md:608–616, IShyftGatedResolver.sol:4–6.
Status. This is a PLAN for approval — nothing has been built or deployed. No new contracts written. Shyft core restorable from 710536b; RMT layer on antilles-v2 main; EAS = 2 minimal open-source contracts.
Companion explainers: RMT citation/oracle map · Generalized Trust Channels · RMT schematic · Trust framework · Attestation payment flow.