Documentation ¶
Index ¶
- Constants
- Variables
- func CheckEthTxQueueCapacity(db *gorm.DB, fromAddress common.Address, maxQueuedTransactions uint64) (err error)
- func CountUnconfirmedTransactions(db *gorm.DB, fromAddress common.Address) (count uint32, err error)
- func CountUnstartedTransactions(db *gorm.DB, fromAddress common.Address) (count uint32, err error)
- func GetNextNonce(db *gorm.DB, address gethCommon.Address) (int64, error)
- func IncrementNextNonce(db *gorm.DB, address gethCommon.Address, currentNonce int64) error
- type BulletproofTxManager
- func (b *BulletproofTxManager) Close() (merr error)
- func (b *BulletproofTxManager) Connect(*models.Head) error
- func (b *BulletproofTxManager) CreateEthTransaction(db *gorm.DB, fromAddress, toAddress common.Address, payload []byte, ...) (etx EthTx, err error)
- func (b *BulletproofTxManager) GetGasEstimator() gas.Estimator
- func (b *BulletproofTxManager) OnNewLongestChain(ctx context.Context, head models.Head)
- func (b *BulletproofTxManager) Start() (merr error)
- func (b *BulletproofTxManager) Trigger(addr common.Address)
- type Config
- type DropOldestStrategy
- type EthBroadcaster
- type EthConfirmer
- func (ec *EthConfirmer) CheckForReceipts(ctx context.Context, blockNum int64) error
- func (ec *EthConfirmer) Close() error
- func (ec *EthConfirmer) EnsureConfirmedTransactionsInLongestChain(ctx context.Context, head models.Head) error
- func (ec *EthConfirmer) ForceRebroadcast(beginningNonce uint, endingNonce uint, gasPriceWei uint64, ...) error
- func (ec *EthConfirmer) ProcessHead(ctx context.Context, head models.Head) error
- func (ec *EthConfirmer) RebroadcastWhereNecessary(ctx context.Context, blockHeight int64) error
- func (ec *EthConfirmer) SetBroadcastBeforeBlockNum(blockNum int64) error
- func (ec *EthConfirmer) Start() error
- type EthReceipt
- type EthResender
- type EthTaskRunTx
- type EthTx
- func FindEthTxsRequiringGasBump(db *gorm.DB, address gethCommon.Address, ...) (etxs []EthTx, err error)
- func FindEthTxsRequiringRebroadcast(db *gorm.DB, address gethCommon.Address, ...) (etxs []EthTx, err error)
- func FindEthTxsRequiringResubmissionDueToInsufficientEth(db *gorm.DB, address gethCommon.Address) (etxs []EthTx, err error)
- func SendEther(db *gorm.DB, from, to common.Address, value assets.Eth, gasLimit uint64) (etx EthTx, err error)
- type EthTxAttempt
- type EthTxAttemptState
- type EthTxState
- type KeyStore
- type Log
- type NSinserttx
- type NonceSyncer
- type NullTxManager
- func (n *NullTxManager) Close() error
- func (n *NullTxManager) Connect(*models.Head) error
- func (n *NullTxManager) CreateEthTransaction(*gorm.DB, common.Address, common.Address, []byte, uint64, interface{}, ...) (etx EthTx, err error)
- func (n *NullTxManager) GetGasEstimator() gas.Estimator
- func (n *NullTxManager) Healthy() error
- func (n *NullTxManager) OnNewLongestChain(context.Context, models.Head)
- func (n *NullTxManager) Ready() error
- func (n *NullTxManager) Start() error
- func (n *NullTxManager) Trigger(common.Address)
- type Reaper
- type ReaperConfig
- type Receipt
- type SendEveryStrategy
- type TxManager
- type TxStrategy
Constants ¶
const ( EthTxUnstarted = EthTxState("unstarted") EthTxInProgress = EthTxState("in_progress") EthTxFatalError = EthTxState("fatal_error") EthTxUnconfirmed = EthTxState("unconfirmed") EthTxConfirmed = EthTxState("confirmed") EthTxConfirmedMissingReceipt = EthTxState("confirmed_missing_receipt") EthTxAttemptInProgress = EthTxAttemptState("in_progress") EthTxAttemptInsufficientEth = EthTxAttemptState("insufficient_eth") EthTxAttemptBroadcast = EthTxAttemptState("broadcast") )
const InFlightTransactionRecheckInterval = 1 * time.Second
InFlightTransactionRecheckInterval controls how often the EthBroadcaster will poll the unconfirmed queue to see if it is allowed to send another transaction
Variables ¶
var ( // ErrCouldNotGetReceipt is the error string we save if we reach our finality depth for a confirmed transaction without ever getting a receipt // This most likely happened because an external wallet used the account for this nonce ErrCouldNotGetReceipt = "could not get receipt" )
Functions ¶
func CheckEthTxQueueCapacity ¶ added in v0.10.8
func CheckEthTxQueueCapacity(db *gorm.DB, fromAddress common.Address, maxQueuedTransactions uint64) (err error)
CheckEthTxQueueCapacity returns an error if inserting this transaction would exceed the maximum queue size.
func CountUnconfirmedTransactions ¶ added in v0.10.8
func CountUnconfirmedTransactions(db *gorm.DB, fromAddress common.Address) (count uint32, err error)
CountUnconfirmedTransactions returns the number of unconfirmed transactions
func CountUnstartedTransactions ¶ added in v0.10.11
CountUnstartedTransactions returns the number of unconfirmed transactions
func GetNextNonce ¶
GetNextNonce returns keys.next_nonce for the given address
func IncrementNextNonce ¶
IncrementNextNonce increments keys.next_nonce by 1
Types ¶
type BulletproofTxManager ¶ added in v0.10.8
type BulletproofTxManager struct { utils.StartStopOnce // contains filtered or unexported fields }
func NewBulletproofTxManager ¶ added in v0.10.8
func NewBulletproofTxManager(db *gorm.DB, ethClient eth.Client, config Config, keyStore KeyStore, advisoryLocker postgres.AdvisoryLocker, eventBroadcaster postgres.EventBroadcaster) *BulletproofTxManager
func (*BulletproofTxManager) Close ¶ added in v0.10.8
func (b *BulletproofTxManager) Close() (merr error)
func (*BulletproofTxManager) Connect ¶ added in v0.10.8
func (b *BulletproofTxManager) Connect(*models.Head) error
Connect solely exists to conform to HeadTrackable
func (*BulletproofTxManager) CreateEthTransaction ¶ added in v0.10.8
func (b *BulletproofTxManager) CreateEthTransaction(db *gorm.DB, fromAddress, toAddress common.Address, payload []byte, gasLimit uint64, meta interface{}, strategy TxStrategy) (etx EthTx, err error)
CreateEthTransaction inserts a new transaction
func (*BulletproofTxManager) GetGasEstimator ¶ added in v0.10.10
func (b *BulletproofTxManager) GetGasEstimator() gas.Estimator
GetGasEstimator returns the gas estimator, mostly useful for tests
func (*BulletproofTxManager) OnNewLongestChain ¶ added in v0.10.8
func (b *BulletproofTxManager) OnNewLongestChain(ctx context.Context, head models.Head)
OnNewLongestChain conforms to HeadTrackable
func (*BulletproofTxManager) Start ¶ added in v0.10.8
func (b *BulletproofTxManager) Start() (merr error)
func (*BulletproofTxManager) Trigger ¶ added in v0.10.8
func (b *BulletproofTxManager) Trigger(addr common.Address)
Trigger forces the EthBroadcaster to check early for the given address
type Config ¶ added in v0.10.8
type Config interface { BlockHistoryEstimatorBatchSize() uint32 BlockHistoryEstimatorBlockDelay() uint16 BlockHistoryEstimatorBlockHistorySize() uint16 BlockHistoryEstimatorTransactionPercentile() uint16 ChainID() *big.Int EthFinalityDepth() uint EthGasBumpPercent() uint16 EthGasBumpThreshold() uint64 EthGasBumpTxDepth() uint16 EthGasBumpWei() *big.Int EthGasLimitDefault() uint64 EthGasLimitMultiplier() float32 EthGasPriceDefault() *big.Int EthMaxGasPriceWei() *big.Int EthMaxInFlightTransactions() uint32 EthMaxQueuedTransactions() uint64 EthMinGasPriceWei() *big.Int EthNonceAutoSync() bool EthRPCDefaultBatchSize() uint32 EthTxReaperInterval() time.Duration EthTxReaperThreshold() time.Duration EthTxResendAfterThreshold() time.Duration GasEstimatorMode() string TriggerFallbackDBPollInterval() time.Duration }
Config encompasses config used by bulletprooftxmanager package Unless otherwise specified, these should support changing at runtime
type DropOldestStrategy ¶ added in v0.10.9
type DropOldestStrategy struct {
// contains filtered or unexported fields
}
DropOldestStrategy will send the newest N transactions, older ones will be removed from the queue
func NewDropOldestStrategy ¶ added in v0.10.9
func NewDropOldestStrategy(subject uuid.UUID, queueSize uint32) DropOldestStrategy
func (DropOldestStrategy) PruneQueue ¶ added in v0.10.9
func (s DropOldestStrategy) PruneQueue(tx *gorm.DB) (n int64, err error)
func (DropOldestStrategy) Subject ¶ added in v0.10.9
func (s DropOldestStrategy) Subject() uuid.NullUUID
type EthBroadcaster ¶
type EthBroadcaster struct { utils.StartStopOnce // contains filtered or unexported fields }
EthBroadcaster monitors eth_txes for transactions that need to be broadcast, assigns nonces and ensures that at least one eth node somewhere has received the transaction successfully.
This does not guarantee delivery! A whole host of other things can subsequently go wrong such as transactions being evicted from the mempool, eth nodes going offline etc. Responsibility for ensuring eventual inclusion into the chain falls on the shoulders of the ethConfirmer.
What EthBroadcaster does guarantee is: - a monotonic series of increasing nonces for eth_txes that can all eventually be confirmed if you retry enough times - transition of eth_txes out of unstarted into either fatal_error or unconfirmed - existence of a saved eth_tx_attempt
func NewEthBroadcaster ¶
func NewEthBroadcaster(db *gorm.DB, ethClient eth.Client, config Config, keystore KeyStore, advisoryLocker postgres.AdvisoryLocker, eventBroadcaster postgres.EventBroadcaster, allKeys []ethkey.Key, estimator gas.Estimator) *EthBroadcaster
NewEthBroadcaster returns a new concrete EthBroadcaster
func (*EthBroadcaster) Close ¶ added in v0.10.3
func (eb *EthBroadcaster) Close() error
func (*EthBroadcaster) ProcessUnstartedEthTxs ¶
func (eb *EthBroadcaster) ProcessUnstartedEthTxs(key ethkey.Key) error
func (*EthBroadcaster) Start ¶
func (eb *EthBroadcaster) Start() error
func (*EthBroadcaster) Trigger ¶
func (eb *EthBroadcaster) Trigger(addr gethCommon.Address)
Trigger forces the monitor for a particular address to recheck for new eth_txes Logs error and does nothing if address was not registered on startup
type EthConfirmer ¶
type EthConfirmer struct { utils.StartStopOnce // contains filtered or unexported fields }
func NewEthConfirmer ¶
func NewEthConfirmer(db *gorm.DB, ethClient eth.Client, config Config, keystore KeyStore, advisoryLocker postgres.AdvisoryLocker, keys []ethkey.Key, estimator gas.Estimator) *EthConfirmer
NewEthConfirmer instantiates a new eth confirmer
func (*EthConfirmer) CheckForReceipts ¶ added in v0.10.8
func (ec *EthConfirmer) CheckForReceipts(ctx context.Context, blockNum int64) error
func (*EthConfirmer) Close ¶ added in v0.10.8
func (ec *EthConfirmer) Close() error
func (*EthConfirmer) EnsureConfirmedTransactionsInLongestChain ¶ added in v0.10.8
func (ec *EthConfirmer) EnsureConfirmedTransactionsInLongestChain(ctx context.Context, head models.Head) error
EnsureConfirmedTransactionsInLongestChain finds all confirmed eth_txes up to the depth of the given chain and ensures that every one has a receipt with a block hash that is in the given chain.
If any of the confirmed transactions does not have a receipt in the chain, it has been re-org'd out and will be rebroadcast.
func (*EthConfirmer) ForceRebroadcast ¶ added in v0.10.8
func (ec *EthConfirmer) ForceRebroadcast(beginningNonce uint, endingNonce uint, gasPriceWei uint64, address gethCommon.Address, overrideGasLimit uint64) error
ForceRebroadcast sends a transaction for every nonce in the given nonce range at the given gas price. If an eth_tx exists for this nonce, we re-send the existing eth_tx with the supplied parameters. If an eth_tx doesn't exist for this nonce, we send a zero transaction. This operates completely orthogonal to the normal EthConfirmer and can result in untracked attempts! Only for emergency usage. Deliberately does not take the advisory lock (we don't write to the database so this is safe from a data integrity perspective). This is in case of some unforeseen scenario where the node is refusing to release the lock. KISS.
func (*EthConfirmer) ProcessHead ¶ added in v0.10.8
ProcessHead takes all required transactions for the confirmer on a new head
func (*EthConfirmer) RebroadcastWhereNecessary ¶ added in v0.10.8
func (ec *EthConfirmer) RebroadcastWhereNecessary(ctx context.Context, blockHeight int64) error
func (*EthConfirmer) SetBroadcastBeforeBlockNum ¶ added in v0.10.8
func (ec *EthConfirmer) SetBroadcastBeforeBlockNum(blockNum int64) error
SetBroadcastBeforeBlockNum updates already broadcast attempts with the current block number. This is safe no matter how old the head is because if the attempt is already broadcast it _must_ have been before this head.
func (*EthConfirmer) Start ¶ added in v0.10.8
func (ec *EthConfirmer) Start() error
type EthReceipt ¶ added in v0.10.10
type EthResender ¶ added in v0.10.4
type EthResender struct {
// contains filtered or unexported fields
}
EthResender periodically picks up transactions that have been languishing unconfirmed for a configured amount of time without being sent, and sends their highest priced attempt again. This helps to defend against geth/parity silently dropping txes, or txes being ejected from the mempool.
Previously we relied on the bumper to do this for us implicitly but there can occasionally be problems with this (e.g. abnormally long block times, or if gas bumping is disabled)
func NewEthResender ¶ added in v0.10.4
func (*EthResender) Start ¶ added in v0.10.4
func (er *EthResender) Start()
func (*EthResender) Stop ¶ added in v0.10.4
func (er *EthResender) Stop()
type EthTaskRunTx ¶ added in v0.10.10
type EthTx ¶ added in v0.10.10
type EthTx struct { ID int64 Nonce *int64 FromAddress common.Address ToAddress common.Address EncodedPayload []byte Value assets.Eth // GasLimit on the EthTx is always the conceptual gas limit, which is not // necessarily the same as the on-chain encoded value (i.e. Optimism) GasLimit uint64 Error null.String // BroadcastAt is updated every time an attempt for this eth_tx is re-sent // In almost all cases it will be within a second or so of the actual send time. BroadcastAt *time.Time CreatedAt time.Time State EthTxState EthTxAttempts []EthTxAttempt `gorm:"->"` // Marshalled EthTxMeta // Used for additional context around transactions which you want to log // at send time. Meta datatypes.JSON Subject uuid.NullUUID }
func FindEthTxsRequiringGasBump ¶ added in v0.10.0
func FindEthTxsRequiringGasBump(db *gorm.DB, address gethCommon.Address, blockNum, gasBumpThreshold, depth int64) (etxs []EthTx, err error)
FindEthTxsRequiringGasBump returns transactions that have all attempts which are unconfirmed for at least gasBumpThreshold blocks, limited by limit pending transactions
It also returns eth_txes that are unconfirmed with no eth_tx_attempts
func FindEthTxsRequiringRebroadcast ¶ added in v0.10.0
func FindEthTxsRequiringRebroadcast(db *gorm.DB, address gethCommon.Address, blockNum, gasBumpThreshold, bumpDepth int64, maxInFlightTransactions uint32) (etxs []EthTx, err error)
FindEthTxsRequiringRebroadcast returns attempts that hit insufficient eth, and attempts that need bumping, in nonce ASC order
func FindEthTxsRequiringResubmissionDueToInsufficientEth ¶ added in v0.10.0
func FindEthTxsRequiringResubmissionDueToInsufficientEth(db *gorm.DB, address gethCommon.Address) (etxs []EthTx, err error)
FindEthTxsRequiringResubmissionDueToInsufficientEth returns transactions that need to be re-sent because they hit an out-of-eth error on a previous block
type EthTxAttempt ¶ added in v0.10.10
type EthTxAttempt struct { ID int64 EthTxID int64 EthTx EthTx `gorm:"foreignkey:EthTxID;->"` GasPrice utils.Big // ChainSpecificGasLimit on the EthTxAttempt is always the same as the on-chain encoded value for gas limit ChainSpecificGasLimit uint64 SignedRawTx []byte Hash common.Hash CreatedAt time.Time BroadcastBeforeBlockNum *int64 State EthTxAttemptState EthReceipts []EthReceipt `gorm:"foreignKey:TxHash;references:Hash;association_foreignkey:Hash;->"` }
func FindEthTxesRequiringResend ¶ added in v0.10.4
func FindEthTxesRequiringResend(db *gorm.DB, olderThan time.Time, maxInFlightTransactions uint32) (attempts []EthTxAttempt, err error)
FindEthTxesRequiringResend returns the highest priced attempt for each eth_tx that was last sent before or at the given time (up to limit)
func (EthTxAttempt) GetSignedTx ¶ added in v0.10.10
func (a EthTxAttempt) GetSignedTx() (*types.Transaction, error)
GetSignedTx decodes the SignedRawTx into a types.Transaction struct
type EthTxAttemptState ¶ added in v0.10.10
type EthTxAttemptState string
type EthTxState ¶ added in v0.10.10
type EthTxState string
type KeyStore ¶ added in v0.10.8
type KeyStore interface { AllKeys() (keys []ethkey.Key, err error) SignTx(fromAddress common.Address, tx *gethTypes.Transaction, chainID *big.Int) (*gethTypes.Transaction, error) SubscribeToKeyChanges() (ch chan struct{}, unsub func()) }
KeyStore encompasses the subset of keystore used by bulletprooftxmanager
type Log ¶ added in v0.10.0
type Log struct { Address common.Address `json:"address"` Topics []common.Hash `json:"topics"` Data []byte `json:"data"` BlockNumber uint64 `json:"blockNumber"` TxHash common.Hash `json:"transactionHash"` TxIndex uint `json:"transactionIndex"` BlockHash common.Hash `json:"blockHash"` Index uint `json:"logIndex"` Removed bool `json:"removed"` }
Log represents a contract log event.
Copied from go-ethereum: https://github.com/ethereum/go-ethereum/blob/ce9a289fa48e0d2593c4aaa7e207c8a5dd3eaa8a/core/types/log.go
We use our own version because Geth's version specifies various gencodec:"required" fields which cause unhelpful errors when unmarshalling from an empty JSON object which can happen in the batch fetcher.
func FromGethLog ¶ added in v0.10.0
FromGethLog converts a gethTypes.Log to a Log
func (Log) MarshalJSON ¶ added in v0.10.0
MarshalJSON marshals as JSON.
func (*Log) UnmarshalJSON ¶ added in v0.10.0
UnmarshalJSON unmarshals from JSON.
type NSinserttx ¶ added in v0.10.4
type NSinserttx struct { Etx EthTx Attempt EthTxAttempt }
NSinserttx represents an EthTx and Attempt to be inserted together
type NonceSyncer ¶ added in v0.10.4
type NonceSyncer struct {
// contains filtered or unexported fields
}
NonceSyncer manages the delicate task of syncing the local nonce with the chain nonce in case of divergence.
On startup, we check each key for the nonce value on chain and compare it to our local value.
Usually the on-chain nonce will be the same as (or lower than) the next_nonce in the DB, in which case we do nothing.
If we are restoring from a backup however, or another wallet has used the account, the chain nonce might be higher than our local one. In this scenario, we must fastforward the local nonce to match the chain nonce.
The problem with doing this is that now Chainlink does not have any ownership or control over potentially pending transactions with nonces between our local highest nonce and the chain nonce. If one of those transactions is pushed out of the mempool or re-org'd out of the chain, we run the risk of being stuck with a gap in the nonce sequence that will never be filled.
The solution is to query the chain for our own transactions and take ownership of them by writing them to the database and letting the EthConfirmer handle them as it would any other transaction.
This is not quite as straightforward as one might expect. We cannot query transactions from our account to infinite depth (geth does not support this). The best we can do is to query for all transactions sent within the past ETH_FINALITY_DEPTH blocks and find the ones sent by our address(es).
This gives us re-org protection up to ETH_FINALITY_DEPTH deep in the worst case, which is in line with our other guarantees.
func NewNonceSyncer ¶ added in v0.10.4
func NewNonceSyncer(db *gorm.DB, ethClient eth.Client) *NonceSyncer
NewNonceSyncer returns a new syncer
type NullTxManager ¶ added in v0.10.8
type NullTxManager struct {
ErrMsg string
}
func (*NullTxManager) Close ¶ added in v0.10.8
func (n *NullTxManager) Close() error
func (*NullTxManager) Connect ¶ added in v0.10.8
func (n *NullTxManager) Connect(*models.Head) error
func (*NullTxManager) CreateEthTransaction ¶ added in v0.10.8
func (*NullTxManager) GetGasEstimator ¶ added in v0.10.10
func (n *NullTxManager) GetGasEstimator() gas.Estimator
func (*NullTxManager) Healthy ¶ added in v0.10.8
func (n *NullTxManager) Healthy() error
func (*NullTxManager) OnNewLongestChain ¶ added in v0.10.8
func (n *NullTxManager) OnNewLongestChain(context.Context, models.Head)
func (*NullTxManager) Ready ¶ added in v0.10.8
func (n *NullTxManager) Ready() error
func (*NullTxManager) Start ¶ added in v0.10.8
func (n *NullTxManager) Start() error
func (*NullTxManager) Trigger ¶ added in v0.10.8
func (n *NullTxManager) Trigger(common.Address)
type Reaper ¶ added in v0.10.7
type Reaper struct {
// contains filtered or unexported fields
}
Reaper handles periodic database cleanup for BPTXM
func NewReaper ¶ added in v0.10.7
func NewReaper(db *gorm.DB, config ReaperConfig) *Reaper
NewReaper instantiates a new reaper object
func (*Reaper) ReapEthTxes ¶ added in v0.10.7
ReapEthTxes deletes old eth_txes
func (*Reaper) ReapJobRuns ¶ added in v0.10.8
ReapJobRuns removes old job runs HACK: This isn't quite the right place for it, but since we are killing the old pipeline this code is temporary anyway
func (*Reaper) SetLatestBlockNum ¶ added in v0.10.7
SetLatestBlockNum should be called on every new highest block number
type ReaperConfig ¶ added in v0.10.7
type ReaperConfig interface { EthTxReaperInterval() time.Duration EthTxReaperThreshold() time.Duration EthFinalityDepth() uint }
ReaperConfig is the config subset used by the reaper
type Receipt ¶ added in v0.10.0
type Receipt struct { PostState []byte `json:"root"` Status uint64 `json:"status"` CumulativeGasUsed uint64 `json:"cumulativeGasUsed"` Bloom gethTypes.Bloom `json:"logsBloom"` Logs []*Log `json:"logs"` TxHash common.Hash `json:"transactionHash"` ContractAddress common.Address `json:"contractAddress"` GasUsed uint64 `json:"gasUsed"` BlockHash common.Hash `json:"blockHash,omitempty"` BlockNumber *big.Int `json:"blockNumber,omitempty"` TransactionIndex uint `json:"transactionIndex"` }
Receipt represents an ethereum receipt.
Copied from go-ethereum: https://github.com/ethereum/go-ethereum/blob/ce9a289fa48e0d2593c4aaa7e207c8a5dd3eaa8a/core/types/receipt.go#L50
We use our own version because Geth's version specifies various gencodec:"required" fields which cause unhelpful errors when unmarshalling from an empty JSON object which can happen in the batch fetcher.
func FromGethReceipt ¶ added in v0.10.0
FromGethReceipt converts a gethTypes.Receipt to a Receipt
func (Receipt) IsUnmined ¶ added in v0.10.0
IsUnmined returns true if the receipt is for a TX that has not been mined yet. Supposedly according to the spec this should never happen, but Parity does it anyway.
func (Receipt) IsZero ¶ added in v0.10.0
IsZero returns true if receipt is the zero receipt Batch calls to the RPC will return a pointer to an empty Receipt struct Easiest way to check if the receipt was missing is to see if the hash is 0x0 Real receipts will always have the TxHash set
func (Receipt) MarshalJSON ¶ added in v0.10.0
MarshalJSON marshals Receipt as JSON. Copied from: https://github.com/ethereum/go-ethereum/blob/ce9a289fa48e0d2593c4aaa7e207c8a5dd3eaa8a/core/types/gen_receipt_json.go
func (*Receipt) UnmarshalJSON ¶ added in v0.10.0
UnmarshalJSON unmarshals from JSON.
type SendEveryStrategy ¶ added in v0.10.9
type SendEveryStrategy struct{}
SendEveryStrategy will always send the tx
func (SendEveryStrategy) PruneQueue ¶ added in v0.10.9
func (SendEveryStrategy) PruneQueue(*gorm.DB) (int64, error)
func (SendEveryStrategy) Subject ¶ added in v0.10.9
func (SendEveryStrategy) Subject() uuid.NullUUID
type TxStrategy ¶ added in v0.10.9
type TxStrategy interface { // Subject will be saved to eth_txes.subject if not null Subject() uuid.NullUUID // PruneQueue is called after eth_tx insertion PruneQueue(tx *gorm.DB) (n int64, err error) }
TxStrategy controls how txes are queued and sent
func NewQueueingTxStrategy ¶ added in v0.10.9
func NewQueueingTxStrategy(subject uuid.UUID, queueSize uint32) (strategy TxStrategy)