Yaci-Store Plugin API Reference
Complete Developer Reference for Plugin Development
Table of Contents
Overview
This reference guide provides comprehensive documentation for all extension points, domain classes, and variables available to plugin developers in the yaci-store system. The primary focus is on MVEL plugins with additional examples in JavaScript and Python.
Key Concepts
- Extension Points: Predefined hooks where plugins can intercept and process data
- Domain Classes: Core blockchain data structures (blocks, transactions, assets, etc.)
- Event Classes: Data containers representing blockchain events
- Plugin Variables: Built-in variables for database access, HTTP calls, and utilities
- Field Names: All field names use camelCase (e.g.,
lovelaceAmount
,txHash
,ownerAddr
) - Parameter Signatures:
- Storage plugins (filter, pre-action, post-action):
function(items)
- Event handlers:
function(event)
- Variables are directly available by name (no context parameter)
- Storage plugins (filter, pre-action, post-action):
Important: Field Access Patterns by Language
Different plugin languages have different ways of accessing Java object fields. This is crucial to understand for writing working plugins.
MVEL and SPEL
- Direct field access: You can access fields directly using dot notation (e.g.,
item.label
,utxo.lovelaceAmount
) - Getter/setter access: Also supports standard getter/setter methods (e.g.,
item.getLabel()
,utxo.setLovelaceAmount()
) - Both patterns work: Choose based on preference, but direct field access is more concise
// MVEL - Direct field access (recommended)
if (item.label == "721") { ... }
amount = utxo.lovelaceAmount;
// MVEL - Getter/setter access (also works)
if (item.getLabel() == "721") { ... }
amount = utxo.getLovelaceAmount();
JavaScript and Python
- Only getter/setter access: Must use getter/setter methods to access fields
- Direct field access will NOT work:
item.label
will returnundefined
or throw an error - Always use methods:
getFieldName()
to read,setFieldName(value)
to write
// JavaScript - CORRECT
if (item.getLabel() === "721") { ... }
const amount = utxo.getLovelaceAmount();
// JavaScript - INCORRECT (will not work)
if (item.label === "721") { ... } // ❌ Returns undefined
# Python - CORRECT
if item.getLabel() == "721": ...
amount = utxo.getLovelaceAmount()
# Python - INCORRECT (will not work)
if item.label == "721": ... # ❌ Throws AttributeError
Quick Reference:
- MVEL/SPEL:
object.field
orobject.getField()
- JavaScript/Python:
object.getField()
only
Storage Extension Points
Storage extension points are predefined hooks where storage plugins can intercept data before it's saved to the database. Each extension point is identified by a unique key and processes specific domain objects.
UTXO Store Extension Points
utxo.unspent.save
Purpose: Process new unspent UTXOs before storage
Domain Object: AddressUtxo
MVEL Example:
// Filter high-value UTXOs (> 1000 ADA)
def filterHighValueUtxos(items) {
filtered = [];
for (utxo : items) {
if (utxo.lovelaceAmount > 1000000000) {
filtered.add(utxo);
}
}
return filtered;
}
# Configuration
store:
plugins:
filters:
utxo.unspent.save:
- name: "High Value UTXO Filter"
lang: mvel
expression: lovelaceAmount > 1000000000
utxo.spent.save
Purpose: Process spent UTXOs before storage
Domain Object: TxInput
Transaction Store Extension Points
transaction.save
Purpose: Process transaction data before storage
Domain Object: Txn
// Filter high-fee transactions
def filterHighFeeTransactions(items) {
filtered = [];
for (txn : items) {
if (txn.fee > 10000000) { // > 10 ADA
filtered.add(txn);
}
}
return filtered;
}
transaction.witness.save
Purpose: Process transaction witnesses before storage
Domain Object: TxnWitness
transaction.withdrawal.save
Purpose: Process stake withdrawals before storage
Domain Object: Withdrawal
Metadata Store Extension Points
metadata.save
Purpose: Process transaction metadata before storage
Domain Object: TxMetadataLabel
MVEL Example:
// Filter NFT metadata (CIP-25)
expression: label == "721"
JavaScript Example:
// Process NFT metadata
function processNFTMetadata(items) {
const nftMetadata = [];
for (const item of items) {
if (item.getLabel() === "721") {
try {
// Parse NFT metadata
const metadata = JSON.parse(item.getBody());
console.log(`NFT metadata in tx: ${item.getTxHash()}`);
nftMetadata.push(item);
} catch (e) {
console.error(`Invalid NFT metadata in ${item.getTxHash()}: ${e.message}`);
}
}
}
return nftMetadata;
}
Asset Store Extension Points
asset.save
Purpose: Process native asset mint/burn operations before storage
Domain Object: TxAsset
MVEL Example:
// Filter NFT mints (quantity = 1)
def filterNFTMints(items) {
nfts = [];
for (asset : items) {
if (asset.quantity == 1 && asset.mintType.name() == "MINT") {
nfts.add(asset);
}
}
return nfts;
}
Note: The
mintType
field is an enum with valuesMINT
andBURN
. Enum values can be accessed usingname()
method.
Block Store Extension Points
block.save
Purpose: Process block data before storage
Domain Object: Block
// Filter high-activity blocks
expression: noOfTxs > 500
Script Store Extension Points
script.save
Purpose: Process script definitions before storage
Domain Object: Script
script.datum.save
Purpose: Process datum data before storage
Domain Object: Datum
script.tx_script.save
Purpose: Process transaction script executions before storage
Domain Object: TxScript
Staking Store Extension Points
staking.key_registration.save
Purpose: Process stake key registrations before storage
Domain Object: StakeRegistrationDetail
staking.key_delegation.save
Purpose: Process stake delegations before storage
Domain Object: Delegation
staking.pool_registration.save
Purpose: Process pool registrations before storage
Domain Object: PoolRegistration
// Filter high-pledge pools
def filterHighPledgePools(items) {
highPledge = [];
for (pool : items) {
if (pool.pledge > 1000000000000) { // > 1M ADA
highPledge.add(pool);
}
}
return highPledge;
}
staking.pool_retirement.save
Purpose: Process pool retirements before storage
Domain Object: PoolRetirement
staking.pool.save
Purpose: Process pool status updates before storage
Domain Object: Pool
Governance Store Extension Points (Conway Era)
governance.gov_action_proposal.save
Purpose: Process governance proposals before storage
Domain Object: GovActionProposal
// Filter high-deposit proposals
expression: deposit > 10000000000 // > 10k ADA
governance.voting_procedure.save
Purpose: Process votes before storage
Domain Object: VotingProcedure
governance.drep_registration.save
Purpose: Process DRep registrations before storage
Domain Object: DRepRegistration
governance.drep.save
Purpose: Process DRep status updates before storage
Domain Object: DRep
governance.delegation_vote.save
Purpose: Process vote delegations before storage
Domain Object: DelegationVote
governance.committee_registration.save
Purpose: Process committee registrations before storage
Domain Object: CommitteeRegistration
governance.committee_member.save
Purpose: Process committee member updates before storage
Domain Object: CommitteeMember
governance.committee_deregistration.save
Purpose: Process committee deregistrations before storage
Domain Object: CommitteeDeRegistration
Event Classes
Event classes represent blockchain events that can be processed by event handler plugins. Event handlers take one parameter: event
.
Common Field: All event classes (except RollbackEvent and internal events) contain an EventMetadata metadata
field with block context information like blockNumber
, blockHash
, slot
, epochNumber
, etc.
System Events
RollbackEvent
Purpose: Notifies when blockchain rollback occurs
def handleRollback(event) {
System.out.println("Rollback to slot: " + event.rollbackTo.slot);
System.out.println("Current block: " + event.currentBlock);
// Cleanup plugin state if needed
// global_state.removeKeysAfterSlot(event.rollbackTo.slot);
}
CommitEvent
Purpose: Triggered at the end of each block batch processing, enabling sequential post-processing after parallel block ingestion
How it Works:
- During Initial Sync: Blocks are processed in parallel batches (typically 200 blocks). CommitEvent fires when the entire batch is committed to storage
- Sequential Processing: Runs after parallel block processing is complete, ensuring all batch data is available
- At Chain Tip: After reaching tip, batch size becomes 1, but CommitEvent still fires for each block
- Timing: Perfect for operations that need to run sequentially after parallel processing completes
Use Cases: Aggregate calculations, cleanup tasks, external notifications, batch statistics, triggering dependent systems
def handleCommitEvent(event) {
System.out.println("Batch committed - processing complete for batch");
System.out.println("Metadata: " + event.metadata);
// Perform sequential post-processing
// - Calculate batch statistics
// - Send batch completion notifications
// - Trigger dependent systems
// - Cleanup temporary data
// Example: Aggregate batch metrics
batchKey = "batch_" + event.metadata.blockNumber;
global_state.put(batchKey + "_processed", true);
System.out.println("Batch post-processing completed");
}
PreCommitEvent
Purpose: Triggered before data commit operations
PreEpochTransitionEvent
Purpose: Triggered before epoch transition processing
EpochTransitionCommitEvent
Purpose: Triggered during epoch transition commit phase
EpochChangeEvent
Purpose: Notifies when epoch changes
JavaScript Example:
function handleEpochChange(event) {
const metadata = event.getMetadata();
console.log(`Epoch changed from ${event.getPreviousEpoch()} to ${metadata.getEpochNumber()}`);
// Trigger epoch-specific processing
if (metadata.getEpochNumber() % 10 === 0) {
console.log("Milestone epoch reached!");
}
}
Blockchain Data Events
BlockEvent
Purpose: Contains complete block data
Key Fields:
EventMetadata metadata
- Block context informationBlock block
- Complete block data from yaci-core (seeBlock
)
def handleBlockEvent(event) {
block = event.block; // This is the yaci-core Block object
metadata = event.metadata;
// Access yaci-core Block fields
System.out.println("Era: " + block.era);
System.out.println("Block number: " + block.header.headerBody.blockNumber);
System.out.println("Slot: " + block.header.headerBody.slot);
System.out.println("Previous hash: " + block.header.headerBody.prevHash);
System.out.println("Block hash: " + block.header.headerBody.blockHash);
// Transaction information
System.out.println("Transactions: " + block.transactionBodies.size());
System.out.println("Witnesses: " + block.transactionWitness.size());
// Check for invalid transactions
if (!block.invalidTransactions.isEmpty()) {
System.out.println("Invalid transactions: " + block.invalidTransactions);
}
// Check auxiliary data
if (!block.auxiliaryDataMap.isEmpty()) {
System.out.println("Blocks with metadata: " + block.auxiliaryDataMap.size());
}
}
TransactionEvent
Purpose: Contains transaction data from yaci-helper
Key Fields:
EventMetadata metadata
- Block context informationList<Transaction> transactions
- Transaction data (seeTransaction
)
Python Example:
def handle_transaction_event(event):
"""Process transaction events"""
transactions = event.getTransactions()
metadata = event.getMetadata()
high_value_count = 0
smart_contract_count = 0
for tx in transactions:
# Calculate total output
total_output = sum(out.getAmount() for out in tx.getOutputs() if hasattr(out, 'getAmount'))
# Track high-value transactions
if total_output > 1000 * 1_000_000: # > 1000 ADA
high_value_count += 1
print(f"High value transaction: {tx.getHash()}")
# Track smart contract transactions
if hasattr(tx, 'getScriptDataHash') and tx.getScriptDataHash():
smart_contract_count += 1
if high_value_count > 0:
print(f"Found {high_value_count} high-value transactions")
if smart_contract_count > 0:
print(f"Found {smart_contract_count} smart contract transactions")
MintBurnEvent
Purpose: Contains asset mint/burn operations
Key Fields:
EventMetadata metadata
- Block context informationList<TxMintBurn> txMintBurns
- Asset mint/burn operations (seeTxMintBurn
)
MVEL Example:
def handleMintBurnEvent(event) {
for (mintBurn : event.txMintBurns) {
if (mintBurn.quantity > 0) {
System.out.println("MINT: " + mintBurn.quantity + " of " + mintBurn.policy);
} else {
System.out.println("BURN: " + Math.abs(mintBurn.quantity) + " of " + mintBurn.policy);
}
// Track NFT operations
if (Math.abs(mintBurn.quantity) == 1) {
System.out.println("NFT operation detected: " + mintBurn.policy + "." + mintBurn.assetName);
}
}
}
GovernanceEvent
Purpose: Contains Conway era governance data
Key Fields:
EventMetadata metadata
- Block context informationList<TxGovernance> txGovernanceList
- Governance transactions
JavaScript Example:
function handleGovernanceEvent(event) {
const govList = event.getTxGovernanceList();
for (const govTx of govList) {
console.log(`Governance transaction: ${govTx.getTransactionHash()}`);
// Process proposals
if (govTx.getProposalProcedures()) {
for (const proposal of govTx.getProposalProcedures()) {
console.log(`New proposal: ${proposal.getGovActionType()}`);
console.log(`Deposit: ${proposal.getDeposit() / 1_000_000} ADA`);
}
}
// Process votes
if (govTx.getVotingProcedures()) {
for (const vote of govTx.getVotingProcedures()) {
console.log(`Vote: ${vote.getVoterType()} voted ${vote.getVote()}`);
}
}
}
}
CertificateEvent
Purpose: Contains stake pool and delegation certificate data
Key Fields:
EventMetadata metadata
- Block context informationList<TxCertificates> txCertificatesList
- Certificate data (seeTxCertificates
)
UpdateEvent
Purpose: Contains protocol parameter update information
Key Fields:
EventMetadata metadata
- Block context informationList<TxUpdate> updates
- Protocol parameter updates
Staking Events
PoolRegistrationEvent
Purpose: Contains stake pool registration data
Key Fields:
EventMetadata metadata
- Block context informationList<PoolRegistration> poolRegistrations
- Pool registration certificates (seePoolRegistration
)
PoolRetiredEvent
Purpose: Notifies when stake pools are retired
Key Fields:
EventMetadata metadata
- Block context informationList<Pool> retiredPools
- Retired pool information (seePool
)
PoolRetirementEvent
Purpose: Contains stake pool retirement certificate data
Key Fields:
EventMetadata metadata
- Block context informationList<PoolRetirement> poolRetirements
- Pool retirement certificates (seePoolRetirement
)
StakeRegDeregEvent
Purpose: Contains stake key registration/deregistration data
Key Fields:
EventMetadata metadata
- Block context informationList<StakeRegistrationDetail> stakeRegistrationDetails
- Registration/deregistration details (seeStakeRegistrationDetail
)
StakingDepositEvent
Purpose: Contains staking-related deposit information
Key Fields:
EventMetadata metadata
- Block context informationint stakeKeyRegistrationCount
- Number of stake key registrationsint stakeKeyDeRegistrationCount
- Number of stake key deregistrationsint stakePoolRegistrationCount
- Number of pool registrations
Store-Specific Events
AddressUtxoEvent
Purpose: Address UTXO changes
Key Fields:
EventMetadata metadata
- Block context informationList<TxInputOutput> txInputOutputs
- UTXO changes
MVEL Example:
def handleAddressUtxoEvent(event) {
for (txInputOutput : event.txInputOutputs) {
if (txInputOutput.type == "OUTPUT") {
System.out.println("New UTXO: " + txInputOutput.txHash + "#" + txInputOutput.outputIndex);
} else {
System.out.println("Spent UTXO: " + txInputOutput.txHash + "#" + txInputOutput.outputIndex);
}
}
}
TxMetadataEvent
Purpose: Processed metadata events
Key Fields:
EventMetadata metadata
- Block context informationList<TxMetadata> txMetadataList
- Transaction metadata
TxnEvent
Purpose: Processed transaction events
Key Fields:
EventMetadata metadata
- Block context informationList<Txn> txnList
- Processed transactions (seeTxn
)
Domain Classes
Domain classes represent the core blockchain data structures. All field names use camelCase.
Mutability: Most domain classes are mutable (provide both getters and setters), except where noted as immutable (getters only).
Core Classes
AddressUtxo
Purpose: Represents a UTXO at a specific address (see utxo.unspent.save)
Mutability: Mutable (getters and setters)
Nested Classes: Amt
Key Fields:
// UTXO identification
utxo.txHash // String: Source transaction hash
utxo.outputIndex // Integer: Output index
utxo.slot // Long: Creation slot
utxo.blockHash // String: Creation block hash
utxo.epoch // Integer: Creation epoch
// Address information
utxo.ownerAddr // String: Owner address (bech32)
utxo.ownerStakeAddr // String: Stake address
utxo.ownerPaymentCredential // String: Payment credential
utxo.ownerStakeCredential // String: Stake credential
// Value
utxo.lovelaceAmount // BigInteger: ADA amount in lovelace
utxo.amounts // List<Amt>: Native asset amounts
// Smart contract data
utxo.dataHash // String: Datum hash
utxo.inlineDatum // String: Inline datum
utxo.scriptRef // String: Script reference
utxo.referenceScriptHash // String: Reference script hash
// Special flags
utxo.isCollateralReturn // Boolean: Whether this is collateral return
Usage Example:
def analyzeUtxo(items) {
highValue = [];
nftUtxos = [];
scriptUtxos = [];
for (utxo : items) {
// High-value detection
if (utxo.lovelaceAmount > 1000000000) {
highValue.add(utxo);
}
// NFT detection
if (utxo.amounts != null) {
for (amount : utxo.amounts) {
if (amount.quantity == 1) {
nftUtxos.add(utxo);
break;
}
}
}
// Script UTXO detection
if (utxo.dataHash != null || utxo.inlineDatum != null || utxo.scriptRef != null) {
scriptUtxos.add(utxo);
}
}
System.out.println("High-value UTXOs: " + highValue.size());
System.out.println("NFT UTXOs: " + nftUtxos.size());
System.out.println("Script UTXOs: " + scriptUtxos.size());
return items;
}
Block
Purpose: Represents a blockchain block
Mutability: Mutable (getters and setters)
Nested Classes: Vrf
Key Fields:
// Block identification
block.hash // String: Block hash
block.number // Long: Block number
block.slot // Long: Slot number
block.epochNumber // Integer: Epoch number
block.epochSlot // Integer: Slot within epoch
// Block content
block.prevHash // String: Previous block hash
block.totalOutput // BigInteger: Total output in lovelace
block.totalFees // BigInteger: Total fees in lovelace
block.noOfTxs // int: Number of transactions
// Timing
block.blockTime // Long: Block timestamp
// Block producer info
block.slotLeader // String: Slot leader
block.issuerVkey // String: Block issuer verification key
block.vrfVkey // String: VRF verification key
block.nonceVrf // Vrf: Nonce VRF
block.leaderVrf // Vrf: Leader VRF
block.vrfResult // Vrf: VRF result
// Block structure
block.blockBodySize // long: Body size in bytes
block.blockBodyHash // String: Body hash
block.protocolVersion // String: Protocol version
TxMetadataLabel
Purpose: Transaction metadata organized by label
Mutability: Immutable (getters only)
Key Fields:
// Transaction reference
metadata.txHash // String: Transaction hash
metadata.slot // Long: Slot number
// Metadata content
metadata.label // String: Metadata label
metadata.body // String: Metadata body (JSON)
metadata.cbor // String: Raw CBOR data
Usage Example: JavaScript Example:
function processMetadata(items) {
const nftMetadata = [];
const tokenMetadata = [];
for (const item of items) {
switch (item.getLabel()) {
case "721":
// NFT metadata (CIP-25)
try {
const nftData = JSON.parse(item.getBody());
console.log(`NFT metadata in ${item.getTxHash()}`);
nftMetadata.push(item);
} catch (e) {
console.error(`Invalid NFT metadata: ${e.message}`);
}
break;
case "1967":
// Token metadata
tokenMetadata.push(item);
break;
case "674":
// Message metadata
console.log(`Message in ${item.getTxHash()}: ${item.getBody()}`);
break;
}
}
console.log(`Processed ${nftMetadata.length} NFT metadata items`);
return items;
}
TxAsset
Purpose: Represents native assets in transactions (see asset.save)
Mutability: Immutable (getters only)
Nested Classes: MintType
(enum)
Key Fields:
// Asset identification
asset.policy // String: Policy ID (hex)
asset.assetName // String: Asset name (hex)
asset.unit // String: Policy + asset name
asset.fingerprint // String: Asset fingerprint (CIP-14)
// Transaction context
asset.slot // Long: Slot number
asset.txHash // String: Transaction hash
// Asset operation
asset.quantity // BigInteger: Asset quantity
asset.mintType // MintType: "MINT" or "BURN"
Txn
Purpose: Represents a processed transaction (see transaction.save)
Mutability: Mutable (getters and setters)
Nested Classes: UtxoKey
, TxOuput
Key Fields:
// Transaction identification
txn.txHash // String: Transaction hash
txn.blockHash // String: Containing block hash
txn.slot // Long: Slot number
txn.txIndex // Integer: Index within block
// Transaction structure
txn.fee // BigInteger: Transaction fee in lovelace
txn.ttl // Long: Time to live
txn.auxiliaryDataHash // String: Metadata hash
txn.scriptDataHash // String: Script data hash
txn.inputs // List<UtxoKey>: Transaction inputs
txn.outputs // List<UtxoKey>: Transaction outputs
txn.collateralInputs // List<UtxoKey>: Collateral inputs
txn.referenceInputs // List<UtxoKey>: Reference inputs
txn.collateralReturn // UtxoKey: Collateral return
txn.collateralReturnJson // TxOuput: Collateral return details
txn.requiredSigners // Set<String>: Required signers
// Status
txn.invalid // Boolean: Whether transaction is invalid
TxnWitness
Purpose: Represents transaction witness data (see transaction.witness.save)
Mutability: Mutable (getters and setters)
Key Fields:
// Transaction reference
witness.txHash // String: Transaction hash
witness.index // Integer: Witness index
witness.slot // Long: Slot number
// Witness data
witness.pubKey // String: Public key
witness.signature // String: Signature
witness.pubKeyhash // String: Public key hash
witness.type // TxWitnessType: Witness type enum
witness.additionalData // JsonNode: Additional witness data
Withdrawal
Purpose: Represents stake withdrawal operations (see transaction.withdrawal.save)
Mutability: Mutable (getters and setters)
Key Fields:
// Transaction reference
withdrawal.txHash // String: Transaction hash
withdrawal.slot // Long: Slot number
withdrawal.blockNumber // String: Block number
withdrawal.epoch // Integer: Epoch number
// Withdrawal details
withdrawal.address // String: Reward address
withdrawal.amount // BigInteger: Withdrawal amount in lovelace
TxInput
Purpose: Represents transaction inputs/spent UTXOs (see utxo.spent.save)
Mutability: Mutable (getters and setters)
Key Fields:
// Input reference
input.txHash // String: Source transaction hash
input.outputIndex // Integer: Output index being spent
// Spent information
input.spentAtSlot // Long: Slot when UTXO was spent
input.spentAtBlock // Long: Block number when spent
input.spentAtBlockHash // String: Block hash when spent
input.spentBlockTime // Long: Block timestamp when spent
input.spentEpoch // Integer: Epoch when spent
input.spentTxHash // String: Transaction hash that spent this UTXO
Smart Contract Classes
Datum
Purpose: Represents datum data in smart contracts (see script.datum.save)
Mutability: Mutable (getters and setters)
Key Fields:
// Datum identification
datum.hash // String: Datum hash
datum.datum // String: CBOR representation
datum.createdAtTx // String: Created at tx hash
Script
Purpose: Represents script definitions (see script.save)
Mutability: Mutable (getters and setters)
Nested Classes: ScriptType
(enum)
Key Fields:
// Script identification
script.scriptHash // String: Script hash
script.scriptType // ScriptType: Script type
script.content // String: Script content
TxScript
Purpose: Represents script execution in transactions (see script.tx_script.save)
Mutability: Mutable (getters and setters)
Nested Classes: RedeemerTag
(enum), ScriptType
(enum)
Key Fields:
// Transaction reference
txScript.txHash // String: Transaction hash
txScript.slot // Long: Slot number
txScript.blockHash // String: Block hash
// Script execution context
txScript.scriptHash // String: Script hash
txScript.type // ScriptType: Script type
txScript.redeemerCbor // String: Redeemer CBOR data
txScript.datum // String: Datum data
txScript.datumHash // String: Datum hash
txScript.unitMem // BigInteger: Memory units consumed
txScript.unitSteps // BigInteger: CPU steps consumed
txScript.purpose // RedeemerTag: Script execution purpose
txScript.redeemerIndex // Integer: Redeemer index
txScript.redeemerData // String: Redeemer data
txScript.redeemerDatahash // String: Redeemer data hash
Staking Classes
PoolRegistration
Purpose: Represents stake pool registration certificates (see staking.pool_registration.save)
Mutability: Mutable (getters and setters)
Nested Classes: Relay
Key Fields:
// Transaction reference
pool.txHash // String: Transaction hash
pool.certIndex // int: Certificate index
pool.txIndex // int: Transaction index
pool.slot // long: Slot number
pool.blockHash // String: Block hash
pool.epoch // int: Epoch number
// Pool identification
pool.poolId // String: Pool ID (hex)
pool.vrfKeyHash // String: VRF key hash
pool.pledge // BigInteger: Pool pledge in lovelace
pool.cost // BigInteger: Pool cost in lovelace
pool.margin // double: Pool margin
pool.marginNumerator // BigInteger: Margin numerator
pool.marginDenominator // BigInteger: Margin denominator
// Pool metadata
pool.rewardAccount // String: Reward account
pool.poolOwners // Set<String>: Pool owner stake keys
pool.relays // List<Relay>: Pool relays
pool.metadataUrl // String: Pool metadata URL
pool.metadataHash // String: Pool metadata hash
PoolRetirement
Purpose: Represents stake pool retirement certificates (see staking.pool_retirement.save)
Mutability: Mutable (getters and setters)
Key Fields:
// Transaction reference
retirement.txHash // String: Transaction hash
retirement.certIndex // int: Certificate index
retirement.txIndex // int: Transaction index
retirement.slot // long: Slot number
retirement.blockHash // String: Block hash
retirement.epoch // int: Epoch number
// Retirement details
retirement.poolId // String: Pool ID being retired
retirement.retirementEpoch // int: Epoch when pool retires
Pool
Purpose: Represents current pool state (see staking.pool.save)
Mutability: Mutable (getters and setters)
Nested Classes: PoolStatusType
(enum)
Key Fields:
// Transaction reference
pool.txHash // String: Transaction hash
pool.certIndex // Integer: Certificate index
pool.txIndex // Integer: Transaction index
pool.slot // Long: Slot number
pool.blockHash // String: Block hash
pool.epoch // Integer: Epoch number
// Pool state
pool.poolId // String: Pool ID
pool.status // PoolStatusType: Pool status
pool.amount // BigInteger: Pool amount
pool.activeEpoch // Integer: Active epoch
pool.retireEpoch // Integer: Retirement epoch
pool.registrationSlot // Long: Registration slot
StakeRegistrationDetail
Purpose: Represents stake key registration/deregistration (see staking.key_registration.save)
Mutability: Mutable (getters and setters)
Nested Classes: CredentialType
(enum), CertificateType
(enum)
Key Fields:
// Transaction reference
reg.txHash // String: Transaction hash
reg.certIndex // int: Certificate index
reg.txIndex // int: Transaction index
reg.slot // long: Slot number
reg.blockHash // String: Block hash
reg.epoch // int: Epoch number
// Registration details
reg.credential // String: Stake credential
reg.credentialType // CredentialType: Credential type
reg.address // String: Stake address
reg.type // CertificateType: Certificate type
Delegation
Purpose: Represents stake delegation operations (see staking.key_delegation.save)
Mutability: Mutable (getters and setters)
Nested Classes: CredentialType
(enum)
Key Fields:
// Transaction reference
delegation.txHash // String: Transaction hash
delegation.certIndex // int: Certificate index
delegation.txIndex // int: Transaction index
delegation.slot // long: Slot number
delegation.blockHash // String: Block hash
delegation.epoch // int: Epoch number
// Delegation details
delegation.credential // String: Delegating credential
delegation.credentialType // CredentialType: Credential type
delegation.address // String: Delegating stake address
delegation.poolId // String: Target pool ID
Relay
Purpose: Represents stake pool relay information (used in PoolRegistration.relays
)
Mutability: Mutable (getters and setters)
Key Fields:
// Network configuration
relay.port // Integer: Port number
relay.ipv4 // String: IPv4 address
relay.ipv6 // String: IPv6 address
relay.dnsName // String: DNS name
Usage Example:
def analyzePoolRelays(items) {
for (pool : items) {
if (pool.relays != null) {
System.out.println("Pool " + pool.poolId + " has " + pool.relays.size() + " relays:");
for (relay : pool.relays) {
if (relay.dnsName != null) {
System.out.println(" DNS: " + relay.dnsName + ":" + relay.port);
} else if (relay.ipv4 != null) {
System.out.println(" IPv4: " + relay.ipv4 + ":" + relay.port);
} else if (relay.ipv6 != null) {
System.out.println(" IPv6: " + relay.ipv6 + ":" + relay.port);
}
}
}
}
return items;
}
Governance Classes (Conway Era)
GovActionProposal
Purpose: Represents governance action proposals (see governance.gov_action_proposal.save)
Mutability: Mutable (getters and setters)
Nested Classes: GovActionType
(enum)
Key Fields:
// Transaction reference
proposal.txHash // String: Transaction hash
proposal.index // long: Proposal index
proposal.txIndex // int: Transaction index
proposal.slot // Long: Slot number
proposal.epoch // Integer: Epoch number
// Proposal details
proposal.deposit // BigInteger: Proposal deposit
proposal.returnAddress // String: Return address
proposal.type // GovActionType: Action type
proposal.details // JsonNode: Proposal details
proposal.anchorUrl // String: Anchor URL
proposal.anchorHash // String: Anchor hash
VotingProcedure
Purpose: Represents votes on governance proposals (see governance.voting_procedure.save)
Mutability: Mutable (getters and setters)
Nested Classes: VoterType
(enum), Vote
(enum)
Key Fields:
// Transaction reference
vote.txHash // String: Transaction hash
vote.index // long: Vote index
vote.txIndex // int: Transaction index
vote.slot // Long: Slot number
vote.epoch // Integer: Epoch number
// Vote details
vote.voterType // VoterType: Voter type
vote.voterHash // String: Voter hash
vote.govActionTxHash // String: Governance action transaction hash
vote.govActionIndex // Integer: Governance action index
vote.vote // Vote: Vote value
vote.anchorUrl // String: Anchor URL
vote.anchorHash // String: Anchor hash
DRepRegistration
Purpose: Represents DRep registration certificates (see governance.drep_registration.save)
Mutability: Mutable (getters and setters)
Nested Classes: CertificateType
(enum), StakeCredType
(enum)
Key Fields:
// Transaction reference
drep.txHash // String: Transaction hash
drep.certIndex // long: Certificate index
drep.txIndex // int: Transaction index
drep.slot // Long: Slot number
drep.epoch // Integer: Epoch number
// DRep registration
drep.type // CertificateType: Certificate type
drep.deposit // BigInteger: Registration deposit
drep.drepHash // String: DRep hash
drep.drepId // String: DRep ID
drep.anchorUrl // String: Anchor URL
drep.anchorHash // String: Anchor hash
drep.credType // StakeCredType: Credential type
DRep
Purpose: Represents current DRep state (see governance.drep.save)
Mutability: Mutable (getters and setters)
Nested Classes: CertificateType
(enum), DRepStatus
(enum)
Key Fields:
// Transaction reference
drep.txHash // String: Transaction hash
drep.certIndex // Integer: Certificate index
drep.txIndex // Integer: Transaction index
drep.slot // Long: Slot number
drep.blockHash // String: Block hash
drep.epoch // Integer: Epoch number
// DRep state
drep.drepId // String: DRep ID
drep.drepHash // String: DRep hash
drep.certType // CertificateType: Certificate type
drep.status // DRepStatus: DRep status
drep.deposit // BigInteger: Deposit amount
drep.registrationSlot // Long: Registration slot
DelegationVote
Purpose: Represents vote delegations to DReps (see governance.delegation_vote.save)
Mutability: Mutable (getters and setters)
Nested Classes: DrepType
(enum), StakeCredType
(enum)
Key Fields:
// Transaction reference
delegation.txHash // String: Transaction hash
delegation.certIndex // long: Certificate index
delegation.txIndex // int: Transaction index
delegation.slot // Long: Slot number
delegation.epoch // Integer: Epoch number
// Vote delegation
delegation.address // String: Delegating stake address
delegation.drepHash // String: Target DRep hash
delegation.drepId // String: Target DRep ID
delegation.drepType // DrepType: DRep type
delegation.credential // String: Delegating credential
delegation.credType // StakeCredType: Credential type
CommitteeRegistration
Purpose: Represents constitutional committee registrations (see governance.committee_registration.save)
Mutability: Mutable (getters and setters)
Nested Classes: StakeCredType
(enum)
Key Fields:
// Transaction reference
committee.txHash // String: Transaction hash
committee.certIndex // long: Certificate index
committee.txIndex // int: Transaction index
committee.slot // Long: Slot number
committee.epoch // Integer: Epoch number
// Committee registration
committee.coldKey // String: Cold key hash
committee.hotKey // String: Hot key hash
committee.credType // StakeCredType: Credential type
CommitteeMember
Purpose: Represents committee member state (see governance.committee_member.save)
Mutability: Mutable (getters and setters)
Nested Classes: CredentialType
(enum)
Key Fields:
// Member identification
member.hash // String: Member hash
member.slot // Long: Slot number
member.credType // CredentialType: Credential type
member.epoch // Integer: Epoch number
// Member state
member.startEpoch // Integer: Start epoch
member.expiredEpoch // Integer: Expiration epoch
CommitteeDeRegistration
Purpose: Represents committee member deregistrations (see governance.committee_deregistration.save)
Mutability: Mutable (getters and setters)
Nested Classes: StakeCredType
(enum)
Key Fields:
// Transaction reference
dereg.txHash // String: Transaction hash
dereg.certIndex // long: Certificate index
dereg.txIndex // int: Transaction index
dereg.slot // Long: Slot number
dereg.epoch // Integer: Epoch number
// Deregistration
dereg.anchorUrl // String: Anchor URL
dereg.anchorHash // String: Anchor hash
dereg.coldKey // String: Cold key being deregistered
dereg.credType // StakeCredType: Credential type
Event-Specific Domain Classes
These domain classes are used specifically in event contexts and are not part of the main storage domain classes.
TxInputOutput
Purpose: Represents UTXO changes in transactions (used in AddressUtxoEvent
)
Mutability: Immutable (getters only)
Nested Classes: TxInput
, AddressUtxo
Key Fields:
// Transaction reference
txInputOutput.txHash // String: Transaction hash
txInputOutput.inputs // List<TxInput>: Transaction inputs
txInputOutput.outputs // List<AddressUtxo>: Transaction outputs
TxCertificates
Purpose: Represents certificates in transactions (used in CertificateEvent
)
Mutability: Immutable (getters only)
Key Fields:
// Transaction reference
txCerts.txHash // String: Transaction hash
txCerts.txIndex // int: Transaction index
txCerts.certificates // List<Certificate>: Certificate data (yaci-core)
TxMintBurn
Purpose: Represents asset mint/burn operations (used in MintBurnEvent
)
Mutability: Immutable (getters only)
Key Fields:
// Transaction reference
txMintBurn.txHash // String: Transaction hash
txMintBurn.amounts // List<Amount>: Asset amounts (see [`Amount`](#amount))
TxGovernance
Purpose: Represents governance data in transactions (used in GovernanceEvent
)
Mutability: Immutable (getters only)
Key Fields:
// Transaction reference
txGov.txHash // String: Transaction hash
txGov.txIndex // int: Transaction index
txGov.votingProcedures // VotingProcedures: Voting data (see [`VotingProcedures`](#votingprocedures-1))
txGov.proposalProcedures // List<ProposalProcedure>: Proposal data (see [`ProposalProcedure`](#proposalprocedure))
TxAuxData
Purpose: Represents auxiliary/metadata in transactions (used in AuxDataEvent
)
Mutability: Immutable (getters only)
Key Fields:
// Transaction reference
txAux.txHash // String: Transaction hash
txAux.auxData // AuxData: Auxiliary data (yaci-core)
TxUpdate
Purpose: Represents protocol updates in transactions (used in UpdateEvent
)
Mutability: Immutable (getters only)
Key Fields:
// Transaction reference
txUpdate.txHash // String: Transaction hash
txUpdate.update // Update: Protocol update data (yaci-core)
TxScripts
Purpose: Represents script data in transactions (used in ScriptEvent
)
Mutability: Immutable (getters only)
Key Fields:
// Transaction reference
txScripts.txHash // String: Transaction hash
txScripts.plutusV1Scripts // List<PlutusScript>: Plutus V1 scripts (yaci-core)
txScripts.plutusV2Scripts // List<PlutusScript>: Plutus V2 scripts (yaci-core)
txScripts.plutusV3Scripts // List<PlutusScript>: Plutus V3 scripts (yaci-core)
txScripts.nativeScripts // List<NativeScript>: Native scripts (yaci-core)
txScripts.datums // List<Datum>: Script datums (yaci-core)
txScripts.redeemers // List<Redeemer>: Script redeemers (yaci-core)
OutputDatumContext
Purpose: Represents output datum context (used in DatumEvent
)
Mutability: Immutable (getters only)
Nested Classes: Datum
Key Fields:
// Output context
outputDatum.txHash // String: Transaction hash
outputDatum.outputIndex // Integer: Output index
outputDatum.outputAddress // String: Output address
outputDatum.datum // Datum: Datum data
WitnessDatumContext
Purpose: Represents witness datum context (used in DatumEvent
)
Mutability: Immutable (getters only)
Nested Classes: Datum
Key Fields:
// Witness context
witnessDatum.txHash // String: Transaction hash
witnessDatum.datum // Datum: Datum data
Transaction
Purpose: Represents complete transaction data from yaci-helper (used in TransactionEvent
)
Mutability: Mutable (getters and setters)
Nested Classes: TransactionBody
, Utxo
, Witnesses
, AuxData
Key Fields:
// Transaction context
tx.blockNumber // long: Block number
tx.slot // long: Slot number
tx.txHash // String: Transaction hash
tx.invalid // boolean: Whether transaction is invalid
// Transaction data
tx.body // TransactionBody: Transaction body
tx.utxos // List<Utxo>: Transaction UTXOs
tx.collateralReturnUtxo // Utxo: Collateral return UTXO
tx.witnesses // Witnesses: Transaction witnesses
tx.auxData // AuxData: Auxiliary data/metadata
Usage Example:
def analyzeTransactions(items) {
for (tx : items) {
System.out.println("Transaction: " + tx.txHash);
System.out.println("Block: " + tx.blockNumber + ", Slot: " + tx.slot);
System.out.println("Fee: " + (tx.body.fee / 1000000) + " ADA");
System.out.println("Inputs: " + tx.body.inputs.size());
System.out.println("Outputs: " + tx.body.outputs.size());
// Check for smart contract interaction
if (tx.witnesses.plutusV1Scripts.size() > 0 || tx.witnesses.plutusV2Scripts.size() > 0) {
System.out.println("Smart contract transaction detected");
}
// Check for metadata
if (tx.auxData != null && tx.auxData.metadataJson != null) {
System.out.println("Transaction has metadata");
}
}
return items;
}
TransactionBody
Purpose: Represents transaction body data (yaci-core class)
Mutability: Immutable (builder pattern)
Nested Classes: TransactionInput
, TransactionOutput
, Amount
Key Fields:
// Basic transaction data
body.txHash // String: Transaction hash
body.fee // BigInteger: Transaction fee
body.ttl // long: Time to live
body.validityIntervalStart // long: Validity interval start
// Transaction structure
body.inputs // Set<TransactionInput>: Transaction inputs
body.outputs // List<TransactionOutput>: Transaction outputs
body.collateralInputs // Set<TransactionInput>: Collateral inputs
body.referenceInputs // Set<TransactionInput>: Reference inputs
body.collateralReturn // TransactionOutput: Collateral return
body.totalCollateral // BigInteger: Total collateral
// Advanced features
body.certificates // List<Certificate>: Certificates
body.withdrawals // Map<String, BigInteger>: Stake withdrawals
body.mint // List<Amount>: Minted assets (see [`Amount`](#amount))
body.requiredSigners // Set<String>: Required signers
// Metadata and scripts
body.auxiliaryDataHash // String: Metadata hash
body.scriptDataHash // String: Script data hash
// Governance (Conway era)
body.votingProcedures // VotingProcedures: Governance votes (see [`VotingProcedures`](#votingprocedures-1))
body.proposalProcedures // List<ProposalProcedure>: Governance proposals (see [`ProposalProcedure`](#proposalprocedure))
Utxo
Purpose: Represents UTXO data from yaci-helper
Mutability: Mutable (getters and setters)
Nested Classes: Amount
Key Fields:
// UTXO identification
utxo.txHash // String: Transaction hash
utxo.index // int: Output index
utxo.address // String: Address
// Value and assets
utxo.amounts // List<Amount>: Asset amounts (see [`Amount`](#amount))
// Smart contract data
utxo.datumHash // String: Datum hash
utxo.inlineDatum // String: Inline datum
utxo.scriptRef // String: Script reference
Witnesses
Purpose: Represents transaction witnesses (yaci-core class)
Mutability: Immutable (builder pattern)
Key Fields:
// Signature witnesses
witnesses.vkeyWitnesses // List<VkeyWitness>: Verification key witnesses
witnesses.bootstrapWitnesses // List<BootstrapWitness>: Bootstrap witnesses
// Script witnesses
witnesses.nativeScripts // List<NativeScript>: Native scripts
witnesses.plutusV1Scripts // List<PlutusScript>: Plutus V1 scripts
witnesses.plutusV2Scripts // List<PlutusScript>: Plutus V2 scripts
witnesses.plutusV3Scripts // List<PlutusScript>: Plutus V3 scripts
// Script execution data
witnesses.datums // List<Datum>: Script datums
witnesses.redeemers // List<Redeemer>: Script redeemers
AuxData
Purpose: Represents auxiliary data/metadata (yaci-core class)
Mutability: Immutable
Key Fields:
// Metadata
auxData.metadataCbor // String: Metadata in CBOR format
auxData.metadataJson // String: Metadata in JSON format
// Scripts
auxData.nativeScripts // List<NativeScript>: Native scripts
auxData.plutusV1Scripts // List<PlutusScript>: Plutus V1 scripts
auxData.plutusV2Scripts // List<PlutusScript>: Plutus V2 scripts
auxData.plutusV3Scripts // List<PlutusScript>: Plutus V3 scripts
TransactionInput
Purpose: Represents transaction input reference (yaci-core class)
Key Fields:
input.transactionId // String: Referenced transaction ID
input.index // int: Referenced output index
TransactionOutput
Purpose: Represents transaction output (yaci-core class)
Nested Classes: Amount
Key Fields:
output.address // String: Output address
output.amounts // List<Amount>: Output amounts (see [`Amount`](#amount))
output.datumHash // String: Datum hash
output.inlineDatum // String: Inline datum
output.scriptRef // String: Script reference
Amount
Purpose: Represents asset amounts in yaci-core (different from yaci-store Amt)
Key Fields:
amount.unit // String: Asset unit
amount.policyId // String: Policy ID
amount.assetName // String: Asset name
amount.assetNameBytes // byte[]: Asset name bytes
amount.quantity // BigInteger: Asset quantity
VotingProcedures
Purpose: Represents governance voting procedures (yaci-core governance class)
Mutability: Mutable
Nested Classes: Voter
, GovActionId
, VotingProcedure
Key Fields:
// Voting structure
votingProcs.voting // Map<Voter, Map<GovActionId, VotingProcedure>>: Nested voting map
Usage Example:
def analyzeVotingProcedures(items) {
for (txGov : items) {
if (txGov.votingProcedures != null && txGov.votingProcedures.voting != null) {
voterMap = txGov.votingProcedures.voting;
System.out.println("Voters in transaction: " + voterMap.size());
for (voter : voterMap.keySet()) {
govActions = voterMap.get(voter);
System.out.println("Voter " + voter.hash + " voted on " + govActions.size() + " actions");
for (actionId : govActions.keySet()) {
vote = govActions.get(actionId);
System.out.println(" Vote: " + vote.vote + " on action " + actionId.transactionId);
}
}
}
}
return items;
}
ProposalProcedure
Purpose: Represents governance proposal procedures (yaci-core governance class)
Mutability: Mutable
Nested Classes: GovAction
, Anchor
Key Fields:
// Proposal details
proposal.deposit // BigInteger: Proposal deposit amount
proposal.rewardAccount // String: Reward account
proposal.govAction // GovAction: Governance action
proposal.anchor // Anchor: Metadata anchor
Usage Example:
def analyzeProposals(items) {
for (txGov : items) {
if (txGov.proposalProcedures != null) {
for (proposal : txGov.proposalProcedures) {
depositAda = proposal.deposit / 1000000;
System.out.println("Proposal deposit: " + depositAda + " ADA");
System.out.println("Action type: " + proposal.govAction.type);
System.out.println("Reward account: " + proposal.rewardAccount);
if (proposal.anchor != null) {
System.out.println("Metadata URL: " + proposal.anchor.anchorUrl);
}
}
}
}
return items;
}
Voter
Purpose: Represents a governance voter (yaci-core governance class)
Key Fields:
voter.type // VoterType: Voter type (DREP, SPO, Committee)
voter.hash // String: Voter key/script hash
GovActionId
Purpose: Represents governance action identifier (yaci-core governance class)
Key Fields:
actionId.transactionId // String: Transaction ID
actionId.govActionIndex // Integer: Action index within transaction
VotingProcedure
Purpose: Represents individual voting procedure (yaci-core governance class)
Key Fields:
votingProc.vote // Vote: Vote value (YES, NO, ABSTAIN)
votingProc.anchor // Anchor: Vote metadata anchor
GovAction
Purpose: Interface for governance actions (yaci-core governance class)
Key Fields:
govAction.type // GovActionType: Action type (PARAMETER_CHANGE, HARD_FORK, etc.)
Anchor
Purpose: Represents metadata anchor (yaci-core governance class)
Key Fields:
anchor.anchorUrl // String: Metadata URL
anchor.anchorDataHash // String: Metadata hash
Nested/Dependent Classes
These classes are used as field types within the main domain classes. Understanding these is crucial for accessing nested data in plugins.
Core Nested Classes
Amt
Purpose: Represents native asset amounts (used in AddressUtxo.amounts
, TxOuput.amounts
)
Key Fields:
// Asset identification
amount.unit // String: Asset unit (policy + asset name)
amount.policyId // String: Policy ID
amount.assetName // String: Asset name
amount.quantity // BigInteger: Asset quantity
Usage Example: MVEL Example:
def analyzeAssets(items) {
for (utxo : items) {
if (utxo.amounts != null) {
for (amount : utxo.amounts) {
System.out.println("Asset: " + amount.policyId + "." + amount.assetName);
System.out.println("Quantity: " + amount.quantity);
// Check if it's an NFT
if (amount.quantity == 1) {
System.out.println("NFT detected: " + amount.unit);
}
}
}
}
return items;
}
Vrf
Purpose: Represents VRF (Verifiable Random Function) data (used in Block.nonceVrf
, Block.leaderVrf
, Block.vrfResult
)
Key Fields:
// VRF data
vrf.output // String: VRF output
vrf.proof // String: VRF proof
UtxoKey
Purpose: Represents UTXO reference (used in Txn.inputs
, Txn.outputs
, etc.)
Key Fields:
// UTXO reference
utxoKey.txHash // String: Transaction hash
utxoKey.outputIndex // Integer: Output index
TxOuput
Purpose: Represents transaction output data (used in Txn.collateralReturnJson
)
Nested Classes: Amt
Key Fields:
// Output details
output.address // String: Output address
output.amounts // List<Amt>: Asset amounts
output.dataHash // String: Datum hash
output.inlineDatum // String: Inline datum
output.referenceScriptHash // String: Reference script hash
Amount
Purpose: Alternative asset amount representation (used in some contexts)
Key Fields:
// Simple amount
amount.unit // String: Asset unit
amount.quantity // BigInteger: Quantity
RewardAmt
Purpose: Represents reward amounts (used in reward-related events)
Nested Classes: RewardType
(enum)
Key Fields:
// Reward details
reward.rewardType // RewardType: Type of reward
reward.poolId // String: Pool ID
reward.address // String: Reward address
reward.amount // BigInteger: Reward amount
BlockAwareDomain
Purpose: Base class providing block context (extended by many domain classes)
Key Fields:
// Block context
entity.blockNumber // Long: Block number
entity.blockTime // Long: Block timestamp
Enum Classes
These enum values are used throughout the domain classes to represent specific states or types.
Enum values are accessed using name() method in plugin script.
Example:
if (asset.mintType.name() == "MINT") {
// Handle mint operation
}
MintType
Purpose: Represents asset minting operation type (used in TxAsset.mintType
)
Values:
"MINT"
- Asset minting operation"BURN"
- Asset burning operation
def filterMintOperations(items) {
mints = [];
burns = [];
for (asset : items) {
if (asset.mintType.name() == "MINT") {
mints.add(asset);
} else if (asset.mintType.name() == "BURN") {
burns.add(asset);
}
}
System.out.println("Mints: " + mints.size() + ", Burns: " + burns.size());
return items;
}
ScriptType
Purpose: Represents script types (used in Script.type
, TxScript.type
)
Values:
"NATIVE_SCRIPT"
- Native script"PLUTUS_V1"
- Plutus V1 script"PLUTUS_V2"
- Plutus V2 script"PLUTUS_V3"
- Plutus V3 script
RewardType
Purpose: Represents reward types (used in RewardAmt.rewardType
)
Values:
"member"
- Pool member reward"leader"
- Pool leader reward"refund"
- Deposit refund
RedeemerTag
Purpose: Represents script execution purpose (used in TxScript.purpose
, Redeemer.tag
)
Common Values:
"Spend"
- Spending script"Mint"
- Minting script"Cert"
- Certificate script"Reward"
- Reward script"Voting"
- Voting script"Proposing"
- Proposing script
Vote
Purpose: Represents governance vote values (used in VotingProcedure.vote
)
Values:
"YES"
- Yes vote"NO"
- No vote"ABSTAIN"
- Abstain vote
VoterType
Purpose: Represents governance voter types (used in VotingProcedure.voterType
)
Values:
"CONSTITUTIONAL_COMMITTEE_HOT_KEY_HASH"
- Constitutional Committee Hot Key Hash"CONSTITUTIONAL_COMMITTEE_HOT_SCRIPT_HASH"
- Constitutional Committee Hot Script Hash"DREP_KEY_HASH"
- DRep Key Hash"DREP_SCRIPT_HASH"
- DRep Script Hash"STAKING_POOL_KEY_HASH"
- Staking Pool Key Hash
PoolStatusType
Purpose: Represents pool status types (used in Pool.status
)
Values:
"REGISTRATION"
- Pool registration"UPDATE"
- Pool update"RETIRING"
- Pool retiring"RETIRED"
- Pool retired
CertificateType
Purpose: Represents certificate types (used in StakeRegistrationDetail.type
, DRepRegistration.type
, DRep.certType
)
Values:
"STAKE_REGISTRATION"
- Stake key registration"STAKE_DEREGISTRATION"
- Stake key deregistration"STAKE_DELEGATION"
- Stake delegation"POOL_REGISTRATION"
- Pool registration"POOL_RETIREMENT"
- Pool retirement"GENESIS_KEY_DELEGATION"
- Genesis key delegation"MOVE_INSTATENEOUS_REWARDS_CERT"
- Move instantaneous rewards certificate"REG_CERT"
- Registration certificate"UNREG_CERT"
- Unregistration certificate"VOTE_DELEG_CERT"
- Vote delegation certificate"STAKE_VOTE_DELEG_CERT"
- Stake vote delegation certificate"STAKE_REG_DELEG_CERT"
- Stake registration delegation certificate"VOTE_REG_DELEG_CERT"
- Vote registration delegation certificate"STAKE_VOTE_REG_DELEG_CERT"
- Stake vote registration delegation certificate"AUTH_COMMITTEE_HOT_CERT"
- Authorize committee hot certificate"RESIGN_COMMITTEE_COLD_CERT"
- Resign committee cold certificate"REG_DREP_CERT"
- Register DRep certificate"UNREG_DREP_CERT"
- Unregister DRep certificate"UPDATE_DREP_CERT"
- Update DRep certificate
DrepType
Purpose: Represents DRep types (used in DelegationVote.drepType
)
Values:
"ADDR_KEYHASH"
- Address key hash"SCRIPTHASH"
- Script hash"ABSTAIN"
- Abstain"NO_CONFIDENCE"
- No confidence
StakeCredType
Purpose: Represents stake credential types (used in DRepRegistration.credType
, DelegationVote.credType
, CommitteeRegistration.credType
, CommitteeDeRegistration.credType
)
Values:
"ADDR_KEYHASH"
- Address key hash"SCRIPTHASH"
- Script hash
CredentialType
Purpose: Represents credential types (used in StakeRegistrationDetail.credentialType
, Delegation.credentialType
, CommitteeMember.credType
)
Values:
"ADDR_KEYHASH"
- Address key hash"SCRIPTHASH"
- Script hash
GovActionType
Purpose: Represents governance action types (used in GovActionProposal.type
)
Values:
"PARAMETER_CHANGE_ACTION"
- Parameter change action"HARD_FORK_INITIATION_ACTION"
- Hard fork initiation action"TREASURY_WITHDRAWALS_ACTION"
- Treasury withdrawals action"NO_CONFIDENCE"
- No confidence action"UPDATE_COMMITTEE"
- Update committee action"NEW_CONSTITUTION"
- New constitution action"INFO_ACTION"
- Info action
DRepStatus
Purpose: Represents DRep status (used in DRep.status
)
Values:
"REGISTERED"
- DRep registered"UPDATED"
- DRep updated"RETIRED"
- DRep retired
External Dependencies
Some classes are imported from the yaci-core library and represent standard Cardano data structures:
Relay
- Pool relay informationCertificate
- Cardano certificatesExUnits
- Execution units for scriptsUnitInterval
- Values between 0 and 1NonNegativeInterval
- Non-negative numeric intervals
These external classes follow similar patterns and can be accessed using standard field notation in plugins.
Yaci-Core Classes
These classes are from the yaci-core library and are used in various events:
Block
(yaci-core)
Purpose: Represents a complete Cardano block structure from yaci-core (used in BlockEvent
)
Package: com.bloxbean.cardano.yaci.core.model.Block
Key Fields:
// Block era
block.era // Era: Cardano era (Byron, Shelley, Allegra, Mary, Alonzo, Babbage, Conway)
// Block header
block.header // BlockHeader: Block header information
block.header.headerBody // HeaderBody: Header body with block metadata
block.header.bodySignature // String: Body signature
// Transaction data
block.transactionBodies // List<TransactionBody>: Transaction bodies
block.transactionWitness // List<Witnesses>: Transaction witnesses
block.auxiliaryDataMap // Map<Integer, AuxData>: Auxiliary data by index
block.invalidTransactions // List<Integer>: Invalid transaction indices
// Raw data
block.cbor // String: CBOR representation of the block
BlockHeader
(yaci-core)
Purpose: Contains block header information
Key Fields:
header.headerBody // HeaderBody: Header body data
header.bodySignature // String: Body signature
HeaderBody
(yaci-core)
Purpose: Contains detailed block header metadata
Key Fields:
// Block identification
headerBody.blockNumber // long: Block number
headerBody.slot // long: Slot number
headerBody.prevHash // String: Previous block hash
headerBody.blockHash // String: Current block hash (derived)
// Block producer
headerBody.issuerVkey // String: Issuer verification key
headerBody.vrfVkey // String: VRF verification key
// VRF certificates
headerBody.nonceVrf // VrfCert: Nonce VRF (removed in Babbage)
headerBody.leaderVrf // VrfCert: Leader VRF (removed in Babbage)
headerBody.vrfResult // VrfCert: VRF result (Babbage onwards)
// Block structure
headerBody.blockBodySize // long: Body size in bytes
headerBody.blockBodyHash // String: Body hash
// Operational data
headerBody.operationalCert // OperationalCert: Operational certificate
headerBody.protocolVersion // ProtocolVersion: Protocol version
VrfCert
(yaci-core)
Purpose: VRF certificate data
Key Fields:
vrf._1 // String: First component
vrf._2 // String: Second component
OperationalCert
(yaci-core)
Purpose: Operational certificate for block production
Key Fields:
opCert.hotVKey // String: Hot verification key
opCert.sequenceNumber // Integer: Sequence number
opCert.kesPeriod // Integer: KES period
opCert.sigma // String: Signature
Usage Example:
def analyzeBlockStructure(event) {
block = event.block;
headerBody = block.header.headerBody;
// Era-specific handling
if (block.era == "CONWAY") {
System.out.println("Conway era block detected");
}
// Check VRF data based on era
if (block.era == "BABBAGE" || block.era == "CONWAY") {
if (headerBody.vrfResult != null) {
System.out.println("VRF Result: " + headerBody.vrfResult._1);
}
} else {
if (headerBody.nonceVrf != null) {
System.out.println("Nonce VRF: " + headerBody.nonceVrf._1);
}
}
// Operational certificate
if (headerBody.operationalCert != null) {
System.out.println("KES Period: " + headerBody.operationalCert.kesPeriod);
System.out.println("Sequence: " + headerBody.operationalCert.sequenceNumber);
}
// Transaction analysis
System.out.println("Transaction count: " + block.transactionBodies.size());
// Check for transactions with metadata
metadataCount = 0;
for (index : block.auxiliaryDataMap.keySet()) {
auxData = block.auxiliaryDataMap.get(index);
if (auxData != null) {
metadataCount++;
}
}
System.out.println("Transactions with metadata: " + metadataCount);
}
This comprehensive API reference provides plugin developers with all the information needed to build sophisticated blockchain data processing plugins for the yaci-store system.