services/scribe/db/datastore/sql/base/model.go
package base
import (
"database/sql"
"github.com/synapsecns/sanguine/core/dbcommon"
"gorm.io/gorm"
)
// define common field names. See package docs for an explanation of why we have to do this.
// note: some models share names. In cases where they do, we run the check against all names.
// This is cheap because it's only done at startup.
func init() {
namer := dbcommon.NewNamer(GetAllModels())
TxHashFieldName = namer.GetConsistentName("TxHash")
ChainIDFieldName = namer.GetConsistentName("ChainID")
BlockNumberFieldName = namer.GetConsistentName("BlockNumber")
ContractAddressFieldName = namer.GetConsistentName("ContractAddress")
BlockIndexFieldName = namer.GetConsistentName("BlockIndex")
BlockHashFieldName = namer.GetConsistentName("BlockHash")
ConfirmedFieldName = namer.GetConsistentName("Confirmed")
TransactionIndexFieldName = namer.GetConsistentName("TransactionIndex")
}
var (
// TxHashFieldName is the field name of the tx hash.
TxHashFieldName string
// ChainIDFieldName gets the chain id field name.
ChainIDFieldName string
// BlockNumberFieldName is the name of the block number field.
BlockNumberFieldName string
// ContractAddressFieldName is the address of the contract.
ContractAddressFieldName string
// BlockIndexFieldName is the index field name.
BlockIndexFieldName string
// BlockHashFieldName is the block hash field name.
BlockHashFieldName string
// ConfirmedFieldName is the confirmed field name.
ConfirmedFieldName string
// TransactionIndexFieldName is the name of the transaction block field.
TransactionIndexFieldName string
)
// PageSize is the amount of entries per page of logs.
var PageSize = 100
// LogColumns are all of the columns of the Log table.
const LogColumns = "contract_address,chain_id,primary_topic,topic_a,topic_b,topic_c,data,block_number,tx_hash,tx_index,block_hash,block_index,removed,confirmed"
// Log stores the log of an event.
type Log struct {
// ContractAddress is the address of the contract that generated the event
ContractAddress string `gorm:"column:contract_address;primaryKey;index:idx_address,priority:1,sort:desc"`
// ChainID is the chain id of the contract that generated the event
ChainID uint32 `gorm:"column:chain_id;primaryKey;index:idx_address,priority:2,sort:desc"`
// PrimaryTopic is the primary topic of the event. Topics[0]
PrimaryTopic sql.NullString `gorm:"primary_topic"`
// TopicA is the first topic. Topics[1]
TopicA sql.NullString `gorm:"topic_a"`
// TopicB is the second topic. Topics[2]
TopicB sql.NullString `gorm:"topic_b"`
// TopicC is the third topic. Topics[3]
TopicC sql.NullString `gorm:"topic_c"`
// Data is the data provided by the contract
Data []byte `gorm:"data"`
// BlockNumber is the block in which the transaction was included
BlockNumber uint64 `gorm:"column:block_number;index:idx_block_number,priority:1,sort:desc"`
// TxHash is the hash of the transaction
TxHash string `gorm:"column:tx_hash;primaryKey;index:idx_tx_hash,priority:1,sort:desc"`
// TxIndex is the index of the transaction in the block
TxIndex uint64 `gorm:"tx_index"`
// BlockHash is the hash of the block in which the transaction was included
BlockHash string `gorm:"column:block_hash;index:idx_block_hash,priority:1,sort:desc"`
// Index is the index of the log in the block
BlockIndex uint64 `gorm:"column:block_index;primaryKey;index:idx_block_number,priority:2,sort:desc"`
// Removed is true if this log was reverted due to a chain re-organization
Removed bool `gorm:"removed"`
// Confirmed is true if this log has been confirmed by the chain
Confirmed bool `gorm:"confirmed"`
}
// ReceiptColumns are all of the columns of the Receipt table.
const ReceiptColumns = "chain_id,receipt_type,post_state,status,cumulative_gas_used,bloom,tx_hash,contract_address,gas_used,block_hash,block_number,transaction_index,confirmed"
// Receipt stores the receipt of a transaction.
type Receipt struct {
// ChainID is the chain id of the receipt
ChainID uint32 `gorm:"column:chain_id;primaryKey"`
// Type is the type
Type uint8 `gorm:"column:receipt_type"`
// PostState is the post state
PostState []byte `gorm:"column:post_state"`
// Status is the status of the transaction
Status uint64 `gorm:"column:status"`
// CumulativeGasUsed is the total amount of gas used when this transaction was executed in the block
CumulativeGasUsed uint64 `gorm:"column:cumulative_gas_used"`
// Bloom is the bloom filter
Bloom []byte `gorm:"column:bloom"`
// TxHash is the hash of the transaction
TxHash string `gorm:"column:tx_hash;primaryKey"`
// ContractAddress is the address of the contract
ContractAddress string `gorm:"column:contract_address"`
// GasUsed is the amount of gas used by this transaction alone
GasUsed uint64 `gorm:"column:gas_used"`
// BlockHash is the hash of the block in which this transaction was included
BlockHash string `gorm:"column:block_hash"`
// BlockNumber is the block in which this transaction was included
BlockNumber uint64 `gorm:"column:block_number;index:idx_block_number_receipt,priority:1,sort:desc"`
// TransactionIndex is the index of the transaction in the block
TransactionIndex uint64 `gorm:"column:transaction_index;index:idx_block_number_receipt,priority:2,sort:desc"`
// Confirmed is true if this log has been confirmed by the chain
Confirmed bool `gorm:"column:confirmed"`
}
// EthTxColumns are all of the columns of the EthTx table.
const EthTxColumns = "tx_hash,chain_id,block_hash,block_number,raw_tx,gas_fee_cap,gas_tip_cap,confirmed,transaction_index"
// EthTx contains a processed ethereum transaction.
type EthTx struct {
// TxHash is the hash of the transaction
TxHash string `gorm:"column:tx_hash;primaryKey"`
// ChainID is the chain id of the transaction
ChainID uint32 `gorm:"column:chain_id;primaryKey"`
// BlockHash is the hash of the block in which the transaction was included
BlockHash string `gorm:"column:block_hash;index:idx_tx_block_hash,priority:1,sort:desc"`
// BlockNumber is the block in which the transaction was included
BlockNumber uint64 `gorm:"column:block_number;index:idx_block_number_tx,priority:1,sort:desc"`
// RawTx is the raw serialized transaction
RawTx []byte `gorm:"column:raw_tx"`
// GasFeeCap contains the gas fee cap stored in wei
GasFeeCap uint64
// GasTipCap contains the gas tip cap stored in wei
GasTipCap uint64
// Confirmed is true if this log has been confirmed by the chain
Confirmed bool `gorm:"column:confirmed"`
// TransactionIndex is the index of the transaction in the block
TransactionIndex uint64 `gorm:"column:transaction_index;index:idx_block_number_tx,priority:2,sort:desc"`
}
// LastIndexedInfo contains information on when a contract was last indexed.
type LastIndexedInfo struct {
gorm.Model
// ContractAddress is the contract address
ContractAddress string `gorm:"column:contract_address;index:idx_last_indexed,priority:1;uniqueIndex:idx_contract_chain"`
// BlockNumber is the last block number indexed
BlockNumber uint64 `gorm:"column:block_number;index:idx_last_indexed,priority:2"`
// ChainID is the chain id of the contract
ChainID uint32 `gorm:"column:chain_id;index:idx_last_indexed;uniqueIndex:idx_contract_chain"`
}
// LastConfirmedBlockInfo contains information on when a chain last had a block pass the required confirmation
// threshold and was validated.
type LastConfirmedBlockInfo struct {
gorm.Model
// ChainID is the chain id of the contract
ChainID uint32 `gorm:"column:chain_id"`
// BlockNumber is the last block number indexed
BlockNumber uint64 `gorm:"column:block_number"`
}
// BlockTime contains the timestamp of a block.
type BlockTime struct {
// ChainID is the chain id of the contract
ChainID uint32 `gorm:"column:chain_id;primaryKey;index:idx_block_time_chain,priority:1"`
// BlockNumber is the block number
BlockNumber uint64 `gorm:"column:block_number;primaryKey"`
// Timestamp is the timestamp of the block
Timestamp uint64 `gorm:"column:timestamp"`
}
// LastBlockTime contains the last block that had its timestamp stored.
type LastBlockTime struct {
gorm.Model
// ChainID is the chain id of the contract
ChainID uint32 `gorm:"column:chain_id;primaryKey"`
// BlockNumber is the block number
BlockNumber uint64 `gorm:"column:block_number"`
}
// LogAtHead stores the log of an event that occurred near the tip of the chain.
type LogAtHead struct {
// ContractAddress is the address of the contract that generated the event
ContractAddress string `gorm:"column:contract_address;primaryKey;index:idx_head_address,priority:1,sort:desc"`
// ChainID is the chain id of the contract that generated the event
ChainID uint32 `gorm:"column:chain_id;primaryKey;index:idx_head_address,priority:2,sort:desc"`
// PrimaryTopic is the primary topic of the event. Topics[0]
PrimaryTopic sql.NullString `gorm:"primary_topic"`
// TopicA is the first topic. Topics[1]
TopicA sql.NullString `gorm:"topic_a"`
// TopicB is the second topic. Topics[2]
TopicB sql.NullString `gorm:"topic_b"`
// TopicC is the third topic. Topics[3]
TopicC sql.NullString `gorm:"topic_c"`
// Data is the data provided by the contract
Data []byte `gorm:"data"`
// BlockNumber is the block in which the transaction was included
BlockNumber uint64 `gorm:"column:block_number;index:idx_head_block_number,priority:1,sort:desc"`
// TxHash is the hash of the transaction
TxHash string `gorm:"column:tx_hash;primaryKey;index:idx_head_tx_hash,priority:1,sort:desc"`
// TxIndex is the index of the transaction in the block
TxIndex uint64 `gorm:"tx_index"`
// BlockHash is the hash of the block in which the transaction was included
BlockHash string `gorm:"column:block_hash;index:idx_head_block_hash,priority:1,sort:desc"`
// Index is the index of the log in the block
BlockIndex uint64 `gorm:"column:block_index;primaryKey;index:idx_head_block_number,priority:2,sort:desc"`
// Removed is true if this log was reverted due to a chain re-organization
Removed bool `gorm:"removed"`
// Confirmed is true if this log has been confirmed by the chain
Confirmed bool `gorm:"confirmed"`
// InsertTime is the time at which this log was inserted
InsertTime uint64 `gorm:"column:insert_time"`
}
// ReceiptAtHead stores the receipt of a transaction at the tip.
type ReceiptAtHead struct {
// ChainID is the chain id of the receipt
ChainID uint32 `gorm:"column:chain_id;primaryKey"`
// Type is the type
Type uint8 `gorm:"column:receipt_type"`
// PostState is the post state
PostState []byte `gorm:"column:post_state"`
// Status is the status of the transaction
Status uint64 `gorm:"column:status"`
// CumulativeGasUsed is the total amount of gas used when this transaction was executed in the block
CumulativeGasUsed uint64 `gorm:"column:cumulative_gas_used"`
// Bloom is the bloom filter
Bloom []byte `gorm:"column:bloom"`
// TxHash is the hash of the transaction
TxHash string `gorm:"column:tx_hash;primaryKey"`
// ContractAddress is the address of the contract
ContractAddress string `gorm:"column:contract_address"`
// GasUsed is the amount of gas used by this transaction alone
GasUsed uint64 `gorm:"column:gas_used"`
// BlockHash is the hash of the block in which this transaction was included
BlockHash string `gorm:"column:block_hash"`
// BlockNumber is the block in which this transaction was included
BlockNumber uint64 `gorm:"column:block_number;index:idx_head_block_number_receipt,priority:1,sort:desc"`
// TransactionIndex is the index of the transaction in the block
TransactionIndex uint64 `gorm:"column:transaction_index;index:idx_head_block_number_receipt,priority:2,sort:desc"`
// Confirmed is true if this log has been confirmed by the chain
Confirmed bool `gorm:"column:confirmed"`
// InsertTime is the time at which this receipt was inserted
InsertTime uint64 `gorm:"column:insert_time"`
}
// EthTxAtHead contains a processed ethereum transaction at the tip of the chain.
type EthTxAtHead struct {
// TxHash is the hash of the transaction
TxHash string `gorm:"column:tx_hash;primaryKey"`
// ChainID is the chain id of the transaction
ChainID uint32 `gorm:"column:chain_id;primaryKey"`
// BlockHash is the hash of the block in which the transaction was included
BlockHash string `gorm:"column:block_hash;index:idx_head_tx_block_hash,priority:1,sort:desc"`
// BlockNumber is the block in which the transaction was included
BlockNumber uint64 `gorm:"column:block_number;index:idx_head_block_number_tx,priority:1,sort:desc"`
// RawTx is the raw serialized transaction
RawTx []byte `gorm:"column:raw_tx"`
// GasFeeCap contains the gas fee cap stored in wei
GasFeeCap uint64
// GasTipCap contains the gas tip cap stored in wei
GasTipCap uint64
// Confirmed is true if this log has been confirmed by the chain
Confirmed bool `gorm:"column:confirmed"`
// TransactionIndex is the index of the transaction in the block
TransactionIndex uint64 `gorm:"column:transaction_index;index:idx_head_block_number_tx,priority:2,sort:desc"`
// InsertTime is the time at which this tx was inserted
InsertTime uint64 `gorm:"column:insert_time"`
}