5ePLsmVqcCAzFmpLz9XAQaKpsDFWbjWHJtSfkNoLUwMe. This walks through
reproducing it.
Prerequisites
| Piece | Where | Required |
|---|---|---|
| Coordinator running in a Nitro Enclave on EC2 | e.g. 13.206.80.190:4000 | curl /health returns ok |
/enclave_health returns a non-null enclave_object_id | same | means register_enclave already landed on-chain |
Vault on Sui testnet has a positive treasury_balance<SUI> | pinaivu::vault | top_up was called once after publish |
| Local Ollama running | 127.0.0.1:11434 | curl /api/tags lists a model like llama3.2:1b |
Local pinaivu-node built | ~/projects/pinaivu/node/target/release/pinaivu-node | cargo build --release |
Step 1 — get the live coordinator’s peer_id
Step 2 — start the node
--advertise-url 127.0.0.1:5000 only works when the client runs on the
same machine. For a remote client, expose port 5000 (ngrok or a public IP)
and pass that URL so the coordinator’s response gives the client a
reachable node_url.
Step 3 — client submits the request
InferenceRequest on
/pinaivu/inference/any/1.0.0, the dialed node bids on /pinaivu/bids/1.0.0,
the coordinator runs its 200ms auction window, picks the node, and signs the
DispatchToken with its enclave key.
Step 4 — client posts the prompt to the node
coordinator_pubkey it cached from /enclave_health at startup, called
Ollama, built a ProofOfInference, wrapped it in a signed CompletionAck,
and sent it to the coordinator over /pinaivu/completion/1.0.0. The
coordinator verified every signature, signed a RoutingReceipt (BCS
IntentMessage), stored it, inserted a pending row into payments, and
enqueued a settlement job.
Step 5 — wait for settlement
submitted or confirmed):
Step 6 — verify on Sui
request_id matching your UUID’s 16 raw
bytes, payee matching your payout address, amount matching what you
expected, and tx matching the digest from Step 5.
Troubleshooting
| Symptom | Diagnose with | Likely cause |
|---|---|---|
Coordinator boot stalls at CHK 05.1 | tail /tmp/coordinator.log on EC2 | Postgres connect: IPv6-only host, missing sslmode=require, unescaped @ in password (%40) |
Bridges active … socat … Network is unreachable | journalctl -u pinaivu-outbound-postgres | socat resolving AAAA on an IPv4-only EC2 host — use TCP4:, not TCP: |
| Admin endpoint returns 401 with matching secrets | grep admin secret mismatch in coordinator log | env file concatenated by cat without a trailing newline — use awk 1 |
CommandArgumentError { kind: InvalidUsageOfPureArg } | sidecar log | passing a typed vector<Payout> as tx.pure.vector("u8", …); build it via receipts::new_payout + makeMoveVec |
MoveAbort code 1 in vault::settle | sidecar log | EInvalidReceipt: signed bytes diverge from on-chain BCS — most often a UUID encoded as a 36-byte string instead of 16 raw bytes |
MoveAbort code 2 in vault::settle | sidecar log | EPayeeNotInReceipt: settle’s (payee, amount) isn’t present in payouts |
MoveAbort code 3 in vault::settle | sidecar log | EInsufficientTreasury: top up the vault |