Previous proposal_spend and proposal_mint reference script UTxOs were
consumed. Redeployed all 5 governance reference scripts to unspendable
script-hash-derived addresses via redeploy_ref_scripts.py.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Repoint REGISTRY_SCRIPT_CBOR + REGISTRY_POLICY_ID from
5dd5118943d5aa7329696181252a6565a27dbf2c6de92b02a6aae361 (v1) to
be1a0a2912da180757ed3cd61b56bb8eab0188c19dc3c0e3912d2c01 (v2),
deployed to Vector mainnet via TX
3c53fa482245a82f88a39e90191a90cce3b6f09f6e28613bc53d35a0c3ba8587.
v2 enforces indefinite-length CBOR (D8 79 9F ... FF) for the
OutputReference inside the asset-name derivation, matching Aiken's
builtin.serialise_data() on Conway. Lucid's Data.to(new Constr(...))
emits definite-length arrays (D8 79 82 ...), so deriveNftAssetName is
hand-rolled from cborUint + cborBytes primitives. Verified byte-for-byte
against pycardano OutputReference.to_cbor() and agent-sdk-py
plutus_serialise_data across 5 test vectors (see new
test/derive-asset-name.test.ts).
governance.ts: AGENT_REGISTRY_POLICY env-fallback updated to v2.
Datum/redeemer schemas are unchanged between v1 and v2 — no other
tx-building changes required.
Follow-up: agent-sdk-ts at /home/david/code/agent-sdk-ts still ships
v1 constants and the pre-Conway Lucid asset-name derivation; needs the
same migration before consumers can use v2 from that SDK.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove the internal Lock TX hash from submit_proposal output and label the
Proposal TX explicitly so agents use the correct hash as proposalTxHash.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Plutus validity_range.lower_bound is POSIX time in ms, not a slot number.
The validator's get_slot trace misleadingly names it 'current_slot' but
it's actually POSIX ms. Activity datum and proposal datum timestamps
must use POSIX ms to match the tx validity range.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use Lucid's own conversion function to ensure the POSIX→slot→POSIX
roundtrip produces the exact same slot in the tx validity range
as the spendSlot used in the activity datum.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Validator requires activity.last_proposal_slot == tx_validity_lower_bound.
Derive POSIX time from the same slot used in the datum to guarantee
they convert to the same slot after Lucid's POSIX→slot roundtrip.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Full redeployment with AGENT_REGISTRY_HASH=5dd51189... (matching the
MCP agent-network registry). All validator hashes, reference scripts,
and infrastructure UTxO refs updated.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The registry NFT is locked at the registry script address with
the 10 AP3X deposit, not in the agent's wallet. Use getUtxoByUnit
to find it on-chain regardless of address.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The on-chain proposal_spend validator checks did_valid by looking for
the agent's registry NFT in reference inputs. Added lookup + .readFrom()
for the NFT UTxO in Step 2 of proposal submission.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SLOT_CONFIG_NETWORK.Mainnet was using Cardano mainnet genesis (2020),
causing POSIX→slot conversion to produce slots far beyond the Vector
testnet's era boundaries. Set to Vector testnet genesis 2025-07-09.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Lucid-Evolution .validFrom/.validTo expect POSIX time in milliseconds.
The code was passing raw slot numbers, which Lucid tried to convert
back causing unsigned integer wraparound and PastHorizon errors.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Missing method caused slot=0, then spendSlot=-60, which wraps to
a huge unsigned int triggering PastHorizon errors from Ogmios.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ogmios v6+ returns script references as { language: "plutus:v3", cbor: "..." }
but the parser only handled the legacy { "plutus:v3": "..." } format.
This caused scriptRef to always be null, breaking reference script
resolution for governance proposal submission.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previous batch deployment consumed the spend ref as a coin input.
Redeployed in isolation and verified on-chain at index #0.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The proposal_spend reference script UTxO was accidentally consumed,
causing MISSING_SCRIPT errors on proposal submission. Updated to the
redeployed UTxO ref and added validation that detects consumed/missing
reference scripts with actionable error messages.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes transaction build failures by passing localUPLCEval: false
to all three governance lock operations (proposal, critique, endorsement).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the lock-only proposal submission with the full validated flow:
- Step 1: Lock ProposalDatum at proposal_spend address
- Step 2: Spend locked UTxO + mint prop_ token + mint pact_ activity token
using CIP-33 reference scripts and governance reference inputs
This makes proposals visible on the Foundation dashboard (which filters
out tokenless proposals). The flow mirrors the Python SDK's
validated_submit_proposal.
Adds:
- Reference script UTxO env vars (CIP-33) with deployment.json defaults
- Infrastructure UTxO env vars (GovernanceParams, Oracle, CrossRefs)
- parseUtxoRef() and waitForTx() helpers
- Activity datum creation (first-time proposer, count=1)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Protocol parameter fields (minFeeA, minFeeB, maxTxSize, maxValSize)
lacked fallback defaults, causing "Cannot convert undefined to a BigInt"
when Lucid-Evolution processed them. Added safe defaults sourced from
Vector public testnet and updated deposit values to match. Made
lovelaceToAda() defensive against undefined/null. Added diagnostic
logging to getWalletInfo and getProtocolParameters error paths.
Converted Dockerfile to multi-stage build and added docker-compose.yml
with inline Vector testnet environment config.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add 5 new MCP tools: vector_build_transaction, vector_dry_run,
vector_get_transaction_history, vector_deploy_contract,
vector_interact_contract
- Persist audit log to JSON file with daily spend recovery on restart
- Add evaluateTransaction and getTransactionHistory to OgmiosProvider
- Support PlutusV1/V2/V3 contract deployment and interaction
- Update docs, types, and bump build heap to 12GB for lucid-cardano
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>