05 · Deployments & on-chain artifacts
Every value here is real, on Sui testnet, and sourced from
DEPLOYMENTS.md and the package source. Explorer links use
https://suiscan.xyz/testnet/. Built with Sui 1.73.1.
Package lineage (v1 → v2 → v3)
Ballast was upgraded in place twice. The type origin never changes, so all
AgentIdentity and BallastCap objects survive every upgrade. Only the call
target advances.
v3 adds trading::execute_trade_attested and attestation::verify_nautilus, and
keeps the mock verify and execute_trade byte for byte, so the mock demo path
cannot regress.
DeepBook (testnet)
Coin types: SUI = 0x2::sui::SUI · DBUSDC =
0xf7152c05930480cd740d7311b5b8b45c6f488e3a53a11c3f74a6fac36a52e0d7::DBUSDC::DBUSDC
· DEEP = 0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8::deep::DEEP
(unused, since trading runs pay_with_deep = false).
Shared demo objects
Nautilus attestation artifacts
| Item |
Value |
| EnclaveConfig (shared, trusted PCRs) |
0xd41be8d6…45ef781 |
Cap<BallastEnclave> (deployer-owned, for update_pcrs) |
0x5ac2d8c9…e94f187dd |
Enclave<BallastEnclave> (registered TEE key) |
0xc2a17908…51ba1 |
| Attested enclave public key |
389fb0ebd4db1e2eb3e5fbdac9903ff852feb1f09fd445186a980b45bfd659f4 |
| PCR0 = PCR1 |
d2f558244d778dc8c8553f3a5a10adf3e2fd146bd02e4f7b928af6906bd303dff0d6899f5b4b571f9fdaa75c5b101582 |
| PCR2 |
21b9efbc184807662e966d34f390821309eeac6802309798826296bf3e8bec7c10edb30948c90ba67310f7b964fc500a |
| EIF image |
105 MB, sha256 815308eb5314b640cd9539951e96d6f2fbfd706a57095edc1e43b17094b28e21 |
| Enclave host (now torn down) |
http://52.3.234.171:3000 |
Transaction receipts
Real Nautilus attestation (v3)
| Step |
Digest |
Result |
init_attestation (registers expected PCRs) |
AbSfMc54… |
created EnclaveConfig + Cap |
register_enclave (AWS cert chain + PCR check on-chain) |
3LRQyhW3… |
created Enclave<BallastEnclave>; pk stored == live pk |
execute_trade_attested<SUI,DBUSDC>, enclave-signed SELL of 1 SUI |
2aPiwNyN… |
success, filled; reputation 5→6; TradeExecuted |
Forged signature, bogus 64-byte sig vs the same Enclave |
DMUp8tHg… |
abort code 1 EAttestationFailed, rejected before enforce/DeepBook |
Mock-path non-regression on v3
| Action |
Digest |
Code |
| Rogue: over-spend |
3qoLuTxQ… |
5 ESpendExceeded |
| Rogue: over-leverage |
3MaWcQF3… |
4 ELeverageExceeded |
| Rogue: disallowed market |
8nASLDer… |
3 EMarketNotAllowed |
| Rogue: after revocation |
8kJJbnAJ… |
1 ERevoked |
| Honest: gated SELL fill |
BnfiqJcp… |
success, rep 4→5 |
Earlier real runs (same package family)
| Action |
Digest |
Note |
| v2 SDK honest fill |
FMLhBke5… |
rep 3→4 |
| v2 BalanceManager deposit (2 SUI) |
6zGc4W1G… |
funds the fill |
The dashboard generates fresh real digests on every honest or rogue run. The
tables above are the canonical recorded receipts. DEPLOYMENTS.md additionally
records the original v1 CLI-driven aborts and the first SDK-era v2 rogue set.
Honesty notes
EExpired (2) and ENotOwner (6) are enforced by capability::enforce and
capability::revoke but have no standalone recorded abort transaction. The four
demonstrated capability aborts are 5/4/3/1.
- The live enclave host (
52.3.234.171) is torn down. The enclave’s ephemeral key
is not persisted across restarts, so re-running produces a new key and a new
Enclave id. The registered Enclave object and its key persist on-chain, which
is why the forged-signature rejection could be captured after the host was
stopped. To re-demo a live attested fill, re-run the enclave and re-register.