How it works

Sepolia emits an observation. Attestcoin proves the receipt. Creditcoin is the first place Affest is allowed to treat that observation as a signal.

The dashboard and the MCP server are consumers. They do not grant permission to move vault assets. Ethereum logs and the worker database are also observations. The verifier is the first component that may turn a source receipt into a verified event key.

The path

Ethereum Sepolia  PortfolioSignalEmitter
        logs + receipt
        v
AttestationWorker  Attestcoin proof API / @gluwa/usc-sdk
        persisted trigger + proof
        v
AffestExecutor  AffestAttestationVerifier  BlockProver precompile
        verified event key
        v
AffestStrategyManager  AffestVault  ISwapAdapter

Sepolia is Attestcoin chain key 1. The Creditcoin BlockProver precompile is 0x0000000000000000000000000000000000000FD2. The worker talks to Attestcoin with @gluwa/usc-sdk@0.18.0.

Trust boundaries

  • AffestAttestationVerifier checks receipt success, emitter, event signature, decoded user, asset, amount, signal type, source chain key, log index, and replay.
  • AffestStrategyManager then enforces allocation and execution policy. Per-action, weekly, and slippage caps live on the strategy.
  • AffestExecutor can only call the vault with an allowlisted adapter and assets. It cannot pass arbitrary calldata.
  • The demo adapter is a fixed pair at 1:1. It is not a DEX and not a price oracle.

Why two chains

This testnet exists to prove a Sepolia observation on Creditcoin, not to run a single-chain vault. The signal is emitted where the observation happens, Ethereum Sepolia. The funds Affest can move on Creditcoin sit in a CC3 vault. Bridging a log by trusting the dashboard would skip Attestcoin. Affest does not do that.

ETH you deposit stays on Sepolia as WETH. TCTC you deposit sits in the CC3 vault as WTCTC. The strategy names both legs. A verified proof is still required before the manager records an execution.

Restart safety

The worker stores coordination state with a unique (source_chain, source_transaction_hash, log_index) key. A restart must not replay a source event or drop a proof that is waiting for Creditcoin. The verifier also rejects a second submission of the same receipt log with EventAlreadyProcessed.

The event shape and the verifier checks are on Proofs. Chain IDs and addresses are on Chains and contracts.