Protocol security
What is wired — and what is still a spec
ProveXAgent is a PulseChain-native orchestration layer. ProveX core addresses are pinned. Kernel fail-closes illegal settlements. RPC, wallets, and the buyer extension are still unbound.
Kernel-enforced
5
Live gates in this app
Simulated
4
Correct math, no bytecode
Unwired
5
RPC, wallet, adapter, $PXA
Circuit breaker
Closed
PulseChain 369
ProveX.com core — verified ABI
These are the only legal ProveX targets. Explorer is PulseChain scan via Pinata. Gating is an EOA. Proofs that name any other escrow fail closed.
PulseChain 369 · verified ProveX rails
ProveX core
Escrowverified
Seller createDeposit(). Only contract that may hold settlement funds.
0x0B42…f11aProveX core
Orchestratorverified
signalIntent() / fulfillIntent(paymentProof). Adapter talks here; agents never hold keys.
0x742d…b080ProveX core
Payment Verifier Registryverified
getVerifier(paymentMethod). Unknown methods cannot release escrow.
0x6a4f…597AProveX core
Unified Payment Verifierverified
verifyPayment(intentHash, paymentProof). Called inside fulfillIntent.
0x0e73…81DbAccess
Gating serviceEOA
EOA stored as intentGatingService on deposits. Signs signalIntent. Not a contract.
0x4Bd6…f9CfTokens
$PRVXverified
ProveX settlement token. Core 2% + Agent extra 40 bps buy-and-burn target.
0xF6f8…0b11Tokens
USDCverified
PulseChain USDC (from Ethereum). Default on-ramp asset.
0x15D3…1f07Tokens
WPLSverified
Wrapped Pulse. PulseX pairs are WPLS, never native PLS.
0xA107…9a27
Verified ABI · adapter call surface
Seller
Escrow.createDeposit(CreateDepositParams)
Lock inventory. Seller signs. Funds stay in Escrow, never an agent.
Buyer
Orchestrator.signalIntent(SignalIntentParams)
Bind a take. Params.escrow MUST be the pinned Escrow address.
Orchestrator
UnifiedPaymentVerifier.verifyPayment(intentHash, paymentProof, data)
On-chain payment-proof check. Returns success + releaseAmount.
Buyer / agent
Orchestrator.fulfillIntent(paymentProof, intentHash, verificationData)
Submit extension proof. Releases via Escrow.unlockAndTransferFunds.
Buyer
Orchestrator.cancelIntent(intentHash)
Abort a signaled take. Unlocks deposit liquidity.
Connection matrix
- Connected
Off-chain orchestrator
Natural-language orchestrator
Per-template tool allow-list + system prompt. Local parser + optional Grok narration.
Keep prompts sanitized; never send keys or proofs to the LLM.
- Connected
Client
Pre-trade ticket
ProveX 2% + Agent 0.5/0.5 + you receive + seller lock + 2.4% PRVX pressure before confirm.
Bind the same quote object to the adapter call so on-chain fees cannot drift.
- Simulated
Client
Offer book + seller desk
Local inventory, fiat rails, score floor. Execute blocked below 70.
Replace seed book with on-chain ProveX inventory events.
- Connected
Off-chain orchestrator
Security kernel
Every instruct / advance / proof release is fail-closed through the kernel.
Mirror the same checks in on-chain modifiers when contracts deploy.
- Connected
Off-chain orchestrator
Server attestation
Domain-separated receipt hash for start + proof + release.
Replace demo hash with an EIP-712 typed signature from the adapter.
- Simulated
ProveXAgent contracts
AgentRegistry.sol
In-memory agents, permissions, pause. No contract address.
Deploy proxy on PulseChain 369; registerAgent() from this UI.
- Simulated
ProveXAgent contracts
StakeManager.sol / vePXA
Local PXA balances and lock days. Voting power is a client formula.
Wire ERC-20 approve + stake() / lock() against $PXA.
- Simulated
ProveXAgent contracts
FeeRouter.sol
ProveX 2% (PRVX burn) is separate. Agent 1% (0.5/0.5) splits 40/40/20 in-kernel. No DEX buy-burn yet.
collectFee() → PulseX market buy → burn PXA + PRVX.
- Connected
ProveXAgent contracts
CircuitBreaker.sol
Pause is fail-closed in the kernel and the settlement stepper.
On-chain pause() + emergencyWithdraw() via vePXA vote.
- Not wired
ProveXAgent contracts
ProveXEscrowAdapter.sol
Lifecycle is modeled. Target escrow is now pinned. No adapter bytecode.
Deploy adapter; only createDeposit / signalIntent / fulfillIntent against pinned targets.
- Pinned
ProveX core
ProveX escrow
Verified Escrow. createDeposit / lockFunds / unlockAndTransferFunds. Proofs fail if they target any other address.
Seller wallet signs createDeposit. Still no eth_sendTransaction from this UI.
- Pinned
ProveX core
ProveX orchestrator
Verified Orchestrator. signalIntent → fulfillIntent(paymentProof). protocolFee() is the core 2% meter.
Buyer/agent posts extension proof via fulfillIntent. Needs wallet + RPC.
- Pinned
ProveX core
Payment verifiers
Verified Registry + UnifiedPaymentVerifier.verifyPayment(intentHash, paymentProof).
Replace kernel schema checks with the on-chain verifier result.
- Pinned
ProveX core
Gating service
EOA 0x4Bd6…f9Cf — intentGatingService on deposits, signs signalIntent. Not a contract.
Obtain gating signatures for agent-originated takes.
- Not wired
Client
Buyer ZK browser extension
Kernel mints a structural Groth16-shaped proof bound to the pinned escrow.
Install the ProveX extension; post real proof bytes through the adapter.
- Not wired
PulseChain / PulseX
PulseChain RPC (chain id 369)
Chain id and escrow address are enforced. No JSON-RPC session.
Connect https://rpc.pulsechain.com (or a private node) + wallet.
- Not wired
Client
Injected wallet / WalletConnect
UI is read-only on balances. No eth_sendTransaction.
Add PulseChain (369) provider; seller signs escrow lock.
- Pinned
PulseChain / PulseX
PulseX DEX (WPLS pairs)
Hero terminal links to pulsex.com. Pairs labeled PXA/WPLS, PRVX/WPLS. WPLS 0xA1077a29…
Router address + buy-and-burn path from FeeRouter.
- Pinned
PulseChain / PulseX
$PRVX / USDC / WPLS
PRVX 0xF6f8Db0aBa00007681F8fAF16A0FDa1c9B030b11 · USDC 0x15D38573d2feeb82e7ad5187aB8c1D52810B1f07. $PXA unpublished.
Publish $PXA. Verify burn events on PulseScan.
- Not wired
Identity
EAS identity attestations
Reputation scores live in local state only.
Anchor ReputationAttestor to an EAS schema UID on PulseChain.
| Layer | Component | Status | Bound to | Still needed |
|---|---|---|---|---|
| Off-chain orchestrator | Natural-language orchestrator | Connected | Per-template tool allow-list + system prompt. Local parser + optional Grok narration. | Keep prompts sanitized; never send keys or proofs to the LLM. |
| Client | Pre-trade ticket | Connected | ProveX 2% + Agent 0.5/0.5 + you receive + seller lock + 2.4% PRVX pressure before confirm. | Bind the same quote object to the adapter call so on-chain fees cannot drift. |
| Client | Offer book + seller desk | Simulated | Local inventory, fiat rails, score floor. Execute blocked below 70. | Replace seed book with on-chain ProveX inventory events. |
| Off-chain orchestrator | Security kernel | Connected | Every instruct / advance / proof release is fail-closed through the kernel. | Mirror the same checks in on-chain modifiers when contracts deploy. |
| Off-chain orchestrator | Server attestation | Connected | Domain-separated receipt hash for start + proof + release. | Replace demo hash with an EIP-712 typed signature from the adapter. |
| ProveXAgent contracts | AgentRegistry.sol | Simulated | In-memory agents, permissions, pause. No contract address. | Deploy proxy on PulseChain 369; registerAgent() from this UI. |
| ProveXAgent contracts | StakeManager.sol / vePXA | Simulated | Local PXA balances and lock days. Voting power is a client formula. | Wire ERC-20 approve + stake() / lock() against $PXA. |
| ProveXAgent contracts | FeeRouter.sol | Simulated | ProveX 2% (PRVX burn) is separate. Agent 1% (0.5/0.5) splits 40/40/20 in-kernel. No DEX buy-burn yet. | collectFee() → PulseX market buy → burn PXA + PRVX. |
| ProveXAgent contracts | CircuitBreaker.sol | Connected | Pause is fail-closed in the kernel and the settlement stepper. | On-chain pause() + emergencyWithdraw() via vePXA vote. |
| ProveXAgent contracts | ProveXEscrowAdapter.sol | Not wired | Lifecycle is modeled. Target escrow is now pinned. No adapter bytecode. | Deploy adapter; only createDeposit / signalIntent / fulfillIntent against pinned targets. |
| ProveX core | ProveX escrow | Pinned | Verified Escrow. createDeposit / lockFunds / unlockAndTransferFunds. Proofs fail if they target any other address. | Seller wallet signs createDeposit. Still no eth_sendTransaction from this UI. |
| ProveX core | ProveX orchestrator | Pinned | Verified Orchestrator. signalIntent → fulfillIntent(paymentProof). protocolFee() is the core 2% meter. | Buyer/agent posts extension proof via fulfillIntent. Needs wallet + RPC. |
| ProveX core | Payment verifiers | Pinned | Verified Registry + UnifiedPaymentVerifier.verifyPayment(intentHash, paymentProof). | Replace kernel schema checks with the on-chain verifier result. |
| ProveX core | Gating service | Pinned | EOA 0x4Bd6…f9Cf — intentGatingService on deposits, signs signalIntent. Not a contract. | Obtain gating signatures for agent-originated takes. |
| Client | Buyer ZK browser extension | Not wired | Kernel mints a structural Groth16-shaped proof bound to the pinned escrow. | Install the ProveX extension; post real proof bytes through the adapter. |
| PulseChain / PulseX | PulseChain RPC (chain id 369) | Not wired | Chain id and escrow address are enforced. No JSON-RPC session. | Connect https://rpc.pulsechain.com (or a private node) + wallet. |
| Client | Injected wallet / WalletConnect | Not wired | UI is read-only on balances. No eth_sendTransaction. | Add PulseChain (369) provider; seller signs escrow lock. |
| PulseChain / PulseX | PulseX DEX (WPLS pairs) | Pinned | Hero terminal links to pulsex.com. Pairs labeled PXA/WPLS, PRVX/WPLS. WPLS 0xA1077a29… | Router address + buy-and-burn path from FeeRouter. |
| PulseChain / PulseX | $PRVX / USDC / WPLS | Pinned | PRVX 0xF6f8Db0aBa00007681F8fAF16A0FDa1c9B030b11 · USDC 0x15D38573d2feeb82e7ad5187aB8c1D52810B1f07. $PXA unpublished. | Publish $PXA. Verify burn events on PulseScan. |
| Identity | EAS identity attestations | Not wired | Reputation scores live in local state only. | Anchor ReputationAttestor to an EAS schema UID on PulseChain. |
Kernel invariants (live)
Agents never take custody
Enforced in the kernel. No code path assigns balances to an agent.
Bound to PulseChain 369
Settlements reject any other chain id.
Two meters: ProveX 2% + Agent 1% (0.5 / 0.5 · 40 / 40 / 20)
ProveX 2% buys and burns $PRVX. Agent 1% is separate: 50 bps buyer, 50 bps seller, then 40/40/20. Integer cents.
ZK verifier is a schema simulator
Proofs are bound to the pinned Escrow. UnifiedPaymentVerifier.verifyPayment is the live ABI; this kernel still only schema-checks.
ProveX core ABI pinned
Escrow.createDeposit · Orchestrator.signalIntent/fulfillIntent · UnifiedPaymentVerifier.verifyPayment. Adapter, RPC, and $PXA still unpublished.
Registry + stake gates
3 active agents.
Open settlements
0 in-flight. Rate limiter caps 8/min.
Threat model — already gated
- Custody theft. No path assigns user balances to an agent. Custody flag must stay 0 or the settlement is aborted.
- Step skipping / replay. State machine only allows n → n+1. Nonces are unique; reused nonces fail.
- Prompt injection / XSS. Instructions are stripped of HTML, control chars, and javascript: URIs, then capped at 500 chars. Chat renders as text, not HTML.
- Fee drift. Two meters. ProveX 2% (PRVX burn) is separate. Agent 1% (0.5% buyer / 0.5% seller) splits 40/40/20 in integer cents. Remainder of the Agent take always treasury.
- Dust / griefing / oversize. Notional must sit between $10 and $1,000,000, inside the agent’s max-spend, and under 8 settlements per minute.
- Wrong chain / asset. Proofs and settlements bind PulseChain 369. Assets are allow-listed (WPLS not confused with native PLS pairs).
- Low-reputation counterparties. A2A floor is 70. Agents refuse below it.
Still required before mainnet
- PulseChain JSON-RPC + wallet. Addresses are pinned. Seller must still sign the lock; this demo cannot move real WPLS.
- ProveXEscrowAdapter + $PXA. Agent-side bytecode is unpublished. It may only call createDeposit, signalIntent, fulfillIntent, and verifyPayment on the pinned verified targets.
- Buyer ZK extension. Real fiat-payment proofs replace the kernel-minted Groth16-shaped placeholder and must verify at the Unified Payment Verifier.
- FeeRouter → PulseX. Two meters stay separate on-chain: ProveX core 2% buy-and-burn $PRVX; Agent 1% (0.5/0.5) then 40/40/20 on WPLS pairs. Events on PulseScan.
- EAS schema + upgrade timelock. Identity attestations and CircuitBreaker.propose/vote on-chain, not just the local pause.
Demo path: run a settlement in Console — the kernel, nonce, proof hash, and receipt are attached to the rail.
Security event log
- KERNEL_ONLINESecurity kernel online. Non-custodial invariant armed. PulseChain 369.—
