Commit 454613f9 authored by mergify[bot]'s avatar mergify[bot] Committed by GitHub

Merge branch 'develop' into jg/fix_url_dial

parents 3bd089b8 234351c3
...@@ -23,17 +23,17 @@ type BlockHeader struct { ...@@ -23,17 +23,17 @@ type BlockHeader struct {
Number U256 Number U256
Timestamp uint64 Timestamp uint64
GethHeader *GethHeader `gorm:"serializer:rlp;column:rlp_bytes"` RLPHeader *RLPHeader `gorm:"serializer:rlp;column:rlp_bytes"`
} }
func BlockHeaderFromGethHeader(header *types.Header) BlockHeader { func BlockHeaderFromHeader(header *types.Header) BlockHeader {
return BlockHeader{ return BlockHeader{
Hash: header.Hash(), Hash: header.Hash(),
ParentHash: header.ParentHash, ParentHash: header.ParentHash,
Number: U256{Int: header.Number}, Number: U256{Int: header.Number},
Timestamp: header.Time, Timestamp: header.Time,
GethHeader: (*GethHeader)(header), RLPHeader: (*RLPHeader)(header),
} }
} }
......
...@@ -2,6 +2,7 @@ package database ...@@ -2,6 +2,7 @@ package database
import ( import (
"errors" "errors"
"math/big"
"gorm.io/gorm" "gorm.io/gorm"
...@@ -16,19 +17,23 @@ import ( ...@@ -16,19 +17,23 @@ import (
*/ */
type ContractEvent struct { type ContractEvent struct {
GUID uuid.UUID `gorm:"primaryKey"` GUID uuid.UUID `gorm:"primaryKey"`
// Some useful derived fields
BlockHash common.Hash `gorm:"serializer:json"` BlockHash common.Hash `gorm:"serializer:json"`
ContractAddress common.Address `gorm:"serializer:json"` ContractAddress common.Address `gorm:"serializer:json"`
TransactionHash common.Hash `gorm:"serializer:json"` TransactionHash common.Hash `gorm:"serializer:json"`
LogIndex uint64
EventSignature common.Hash `gorm:"serializer:json"` EventSignature common.Hash `gorm:"serializer:json"`
LogIndex uint64
Timestamp uint64 Timestamp uint64
GethLog *types.Log `gorm:"serializer:rlp;column:rlp_bytes"` // NOTE: NOT ALL THE DERIVED FIELDS ON `types.Log` ARE
// AVAILABLE. FIELDS LISTED ABOVE ARE FILLED IN
RLPLog *types.Log `gorm:"serializer:rlp;column:rlp_bytes"`
} }
func ContractEventFromGethLog(log *types.Log, timestamp uint64) ContractEvent { func ContractEventFromLog(log *types.Log, timestamp uint64) ContractEvent {
eventSig := common.Hash{} eventSig := common.Hash{}
if len(log.Topics) > 0 { if len(log.Topics) > 0 {
eventSig = log.Topics[0] eventSig = log.Topics[0]
...@@ -38,18 +43,27 @@ func ContractEventFromGethLog(log *types.Log, timestamp uint64) ContractEvent { ...@@ -38,18 +43,27 @@ func ContractEventFromGethLog(log *types.Log, timestamp uint64) ContractEvent {
GUID: uuid.New(), GUID: uuid.New(),
BlockHash: log.BlockHash, BlockHash: log.BlockHash,
ContractAddress: log.Address,
TransactionHash: log.TxHash, TransactionHash: log.TxHash,
ContractAddress: log.Address,
EventSignature: eventSig, EventSignature: eventSig,
LogIndex: uint64(log.Index), LogIndex: uint64(log.Index),
Timestamp: timestamp, Timestamp: timestamp,
GethLog: log, RLPLog: log,
} }
} }
func (c *ContractEvent) AfterFind(tx *gorm.DB) error {
// Fill in some of the derived fields that are not
// populated when decoding the RLPLog from RLP
c.RLPLog.BlockHash = c.BlockHash
c.RLPLog.TxHash = c.TransactionHash
c.RLPLog.Index = uint(c.LogIndex)
return nil
}
type L1ContractEvent struct { type L1ContractEvent struct {
ContractEvent `gorm:"embedded"` ContractEvent `gorm:"embedded"`
} }
...@@ -61,9 +75,11 @@ type L2ContractEvent struct { ...@@ -61,9 +75,11 @@ type L2ContractEvent struct {
type ContractEventsView interface { type ContractEventsView interface {
L1ContractEvent(uuid.UUID) (*L1ContractEvent, error) L1ContractEvent(uuid.UUID) (*L1ContractEvent, error)
L1ContractEventByTxLogIndex(common.Hash, uint64) (*L1ContractEvent, error) L1ContractEventByTxLogIndex(common.Hash, uint64) (*L1ContractEvent, error)
L1ContractEventsWithFilter(ContractEvent, *big.Int, *big.Int) ([]L1ContractEvent, error)
L2ContractEvent(uuid.UUID) (*L2ContractEvent, error) L2ContractEvent(uuid.UUID) (*L2ContractEvent, error)
L2ContractEventByTxLogIndex(common.Hash, uint64) (*L2ContractEvent, error) L2ContractEventByTxLogIndex(common.Hash, uint64) (*L2ContractEvent, error)
L2ContractEventsWithFilter(ContractEvent, *big.Int, *big.Int) ([]L2ContractEvent, error)
} }
type ContractEventsDB interface { type ContractEventsDB interface {
...@@ -120,6 +136,30 @@ func (db *contractEventsDB) L1ContractEventByTxLogIndex(txHash common.Hash, logI ...@@ -120,6 +136,30 @@ func (db *contractEventsDB) L1ContractEventByTxLogIndex(txHash common.Hash, logI
return &l1ContractEvent, nil return &l1ContractEvent, nil
} }
func (db *contractEventsDB) L1ContractEventsWithFilter(filter ContractEvent, fromHeight, toHeight *big.Int) ([]L1ContractEvent, error) {
if fromHeight == nil {
fromHeight = big.NewInt(0)
}
query := db.gorm.Table("l1_contract_events").Where(&filter)
query = query.Joins("INNER JOIN l1_block_headers ON l1_contract_events.block_hash = l1_block_headers.hash")
query = query.Where("l1_block_headers.number >= ? AND l1_block_headers.number <= ?", fromHeight, toHeight)
query = query.Order("l1_block_headers.number ASC").Select("l1_contract_events.*")
// NOTE: We use `Find` here instead of `Scan` since `Scan` doesn't not support
// model hooks like `ContractEvent#AfterFind`. Functionally they are the same
var events []L1ContractEvent
result := query.Find(&events)
if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, result.Error
}
return events, nil
}
// L2 // L2
func (db *contractEventsDB) StoreL2ContractEvents(events []*L2ContractEvent) error { func (db *contractEventsDB) StoreL2ContractEvents(events []*L2ContractEvent) error {
...@@ -154,3 +194,27 @@ func (db *contractEventsDB) L2ContractEventByTxLogIndex(txHash common.Hash, logI ...@@ -154,3 +194,27 @@ func (db *contractEventsDB) L2ContractEventByTxLogIndex(txHash common.Hash, logI
return &l2ContractEvent, nil return &l2ContractEvent, nil
} }
func (db *contractEventsDB) L2ContractEventsWithFilter(filter ContractEvent, fromHeight, toHeight *big.Int) ([]L2ContractEvent, error) {
if fromHeight == nil {
fromHeight = big.NewInt(0)
}
query := db.gorm.Table("l2_contract_events").Where(&filter)
query = query.Joins("INNER JOIN l2_block_headers ON l2_contract_events.block_hash = l2_block_headers.hash")
query = query.Where("l2_block_headers.number >= ? AND l2_block_headers.number <= ?", fromHeight, toHeight)
query = query.Order("l2_block_headers.number ASC").Select("l2_contract_events.*")
// NOTE: We use `Find` here instead of `Scan` since `Scan` doesn't not support
// model hooks like `ContractEvent#AfterFind`. Functionally they are the same
var events []L2ContractEvent
result := query.Find(&events)
if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, result.Error
}
return events, nil
}
...@@ -68,13 +68,13 @@ func (u256 U256) Value() (driver.Value, error) { ...@@ -68,13 +68,13 @@ func (u256 U256) Value() (driver.Value, error) {
return numeric.Value() return numeric.Value()
} }
type GethHeader types.Header type RLPHeader types.Header
func (h *GethHeader) EncodeRLP(w io.Writer) error { func (h *RLPHeader) EncodeRLP(w io.Writer) error {
return types.NewBlockWithHeader((*types.Header)(h)).EncodeRLP(w) return types.NewBlockWithHeader((*types.Header)(h)).EncodeRLP(w)
} }
func (h *GethHeader) DecodeRLP(s *rlp.Stream) error { func (h *RLPHeader) DecodeRLP(s *rlp.Stream) error {
block := new(types.Block) block := new(types.Block)
err := block.DecodeRLP(s) err := block.DecodeRLP(s)
if err != nil { if err != nil {
...@@ -82,14 +82,14 @@ func (h *GethHeader) DecodeRLP(s *rlp.Stream) error { ...@@ -82,14 +82,14 @@ func (h *GethHeader) DecodeRLP(s *rlp.Stream) error {
} }
header := block.Header() header := block.Header()
*h = (GethHeader)(*header) *h = (RLPHeader)(*header)
return nil return nil
} }
func (h *GethHeader) Header() *types.Header { func (h *RLPHeader) Header() *types.Header {
return (*types.Header)(h) return (*types.Header)(h)
} }
func (h *GethHeader) Hash() common.Hash { func (h *RLPHeader) Hash() common.Hash {
return h.Header().Hash() return h.Header().Hash()
} }
...@@ -65,7 +65,7 @@ func TestE2EBlockHeaders(t *testing.T) { ...@@ -65,7 +65,7 @@ func TestE2EBlockHeaders(t *testing.T) {
require.Equal(t, header.Time, indexedHeader.Timestamp) require.Equal(t, header.Time, indexedHeader.Timestamp)
// ensure the right rlp encoding is stored. checking the hashes sufficies // ensure the right rlp encoding is stored. checking the hashes sufficies
require.Equal(t, header.Hash(), indexedHeader.GethHeader.Hash()) require.Equal(t, header.Hash(), indexedHeader.RLPHeader.Hash())
} }
}) })
...@@ -127,7 +127,7 @@ func TestE2EBlockHeaders(t *testing.T) { ...@@ -127,7 +127,7 @@ func TestE2EBlockHeaders(t *testing.T) {
// ensure the right rlp encoding of the contract log is stored // ensure the right rlp encoding of the contract log is stored
logRlp, err := rlp.EncodeToBytes(&log) logRlp, err := rlp.EncodeToBytes(&log)
require.NoError(t, err) require.NoError(t, err)
contractEventRlp, err := rlp.EncodeToBytes(contractEvent.GethLog) contractEventRlp, err := rlp.EncodeToBytes(contractEvent.RLPLog)
require.NoError(t, err) require.NoError(t, err)
require.ElementsMatch(t, logRlp, contractEventRlp) require.ElementsMatch(t, logRlp, contractEventRlp)
...@@ -146,7 +146,7 @@ func TestE2EBlockHeaders(t *testing.T) { ...@@ -146,7 +146,7 @@ func TestE2EBlockHeaders(t *testing.T) {
// ensure the right rlp encoding is stored. checking the hashes // ensure the right rlp encoding is stored. checking the hashes
// suffices as it is based on the rlp bytes of the header // suffices as it is based on the rlp bytes of the header
require.Equal(t, block.Hash(), l1BlockHeader.GethHeader.Hash()) require.Equal(t, block.Hash(), l1BlockHeader.RLPHeader.Hash())
} }
}) })
} }
...@@ -31,16 +31,16 @@ func NewProcessedContractEvents() *ProcessedContractEvents { ...@@ -31,16 +31,16 @@ func NewProcessedContractEvents() *ProcessedContractEvents {
} }
func (p *ProcessedContractEvents) AddLog(log *types.Log, time uint64) *database.ContractEvent { func (p *ProcessedContractEvents) AddLog(log *types.Log, time uint64) *database.ContractEvent {
contractEvent := database.ContractEventFromGethLog(log, time) event := database.ContractEventFromLog(log, time)
emptyHash := common.Hash{} emptyHash := common.Hash{}
p.events = append(p.events, &contractEvent) p.events = append(p.events, &event)
p.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index}] = &contractEvent p.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index}] = &event
if contractEvent.EventSignature != emptyHash { // ignore anon events if event.EventSignature != emptyHash {
p.eventsBySignature[contractEvent.EventSignature] = append(p.eventsBySignature[contractEvent.EventSignature], &contractEvent) p.eventsBySignature[event.EventSignature] = append(p.eventsBySignature[event.EventSignature], &event)
} }
return &contractEvent return &event
} }
func UnpackLog(out interface{}, log *types.Log, name string, contractAbi *abi.ABI) error { func UnpackLog(out interface{}, log *types.Log, name string, contractAbi *abi.ABI) error {
......
...@@ -40,12 +40,12 @@ type CrossDomainMessengerSentMessageEvent struct { ...@@ -40,12 +40,12 @@ type CrossDomainMessengerSentMessageEvent struct {
Value *big.Int Value *big.Int
MessageHash common.Hash MessageHash common.Hash
RawEvent *database.ContractEvent Event *database.ContractEvent
} }
type CrossDomainMessengerRelayedMessageEvent struct { type CrossDomainMessengerRelayedMessageEvent struct {
*bindings.CrossDomainMessengerRelayedMessage *bindings.CrossDomainMessengerRelayedMessage
RawEvent *database.ContractEvent Event *database.ContractEvent
} }
func CrossDomainMessengerSentMessageEvents(events *ProcessedContractEvents) ([]CrossDomainMessengerSentMessageEvent, error) { func CrossDomainMessengerSentMessageEvents(events *ProcessedContractEvents) ([]CrossDomainMessengerSentMessageEvent, error) {
...@@ -60,7 +60,7 @@ func CrossDomainMessengerSentMessageEvents(events *ProcessedContractEvents) ([]C ...@@ -60,7 +60,7 @@ func CrossDomainMessengerSentMessageEvents(events *ProcessedContractEvents) ([]C
processedSentMessageEvents := events.eventsBySignature[sentMessageEventAbi.ID] processedSentMessageEvents := events.eventsBySignature[sentMessageEventAbi.ID]
crossDomainMessageEvents := make([]CrossDomainMessengerSentMessageEvent, len(processedSentMessageEvents)) crossDomainMessageEvents := make([]CrossDomainMessengerSentMessageEvent, len(processedSentMessageEvents))
for i, sentMessageEvent := range processedSentMessageEvents { for i, sentMessageEvent := range processedSentMessageEvents {
log := sentMessageEvent.GethLog log := sentMessageEvent.RLPLog
var sentMsgData bindings.CrossDomainMessengerSentMessage var sentMsgData bindings.CrossDomainMessengerSentMessage
sentMsgData.Raw = *log sentMsgData.Raw = *log
...@@ -70,7 +70,7 @@ func CrossDomainMessengerSentMessageEvents(events *ProcessedContractEvents) ([]C ...@@ -70,7 +70,7 @@ func CrossDomainMessengerSentMessageEvents(events *ProcessedContractEvents) ([]C
} }
var sentMsgExtensionData bindings.CrossDomainMessengerSentMessageExtension1 var sentMsgExtensionData bindings.CrossDomainMessengerSentMessageExtension1
extensionLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index + 1}].GethLog extensionLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index + 1}].RLPLog
sentMsgExtensionData.Raw = *extensionLog sentMsgExtensionData.Raw = *extensionLog
err = UnpackLog(&sentMsgExtensionData, extensionLog, sentMessageEventExtensionAbi.Name, crossDomainMessengerABI) err = UnpackLog(&sentMsgExtensionData, extensionLog, sentMessageEventExtensionAbi.Name, crossDomainMessengerABI)
if err != nil { if err != nil {
...@@ -86,7 +86,7 @@ func CrossDomainMessengerSentMessageEvents(events *ProcessedContractEvents) ([]C ...@@ -86,7 +86,7 @@ func CrossDomainMessengerSentMessageEvents(events *ProcessedContractEvents) ([]C
CrossDomainMessengerSentMessage: &sentMsgData, CrossDomainMessengerSentMessage: &sentMsgData,
Value: sentMsgExtensionData.Value, Value: sentMsgExtensionData.Value,
MessageHash: msgHash, MessageHash: msgHash,
RawEvent: sentMessageEvent, Event: sentMessageEvent,
} }
} }
...@@ -103,7 +103,7 @@ func CrossDomainMessengerRelayedMessageEvents(events *ProcessedContractEvents) ( ...@@ -103,7 +103,7 @@ func CrossDomainMessengerRelayedMessageEvents(events *ProcessedContractEvents) (
processedRelayedMessageEvents := events.eventsBySignature[relayedMessageEventAbi.ID] processedRelayedMessageEvents := events.eventsBySignature[relayedMessageEventAbi.ID]
crossDomainMessageEvents := make([]CrossDomainMessengerRelayedMessageEvent, len(processedRelayedMessageEvents)) crossDomainMessageEvents := make([]CrossDomainMessengerRelayedMessageEvent, len(processedRelayedMessageEvents))
for i, relayedMessageEvent := range processedRelayedMessageEvents { for i, relayedMessageEvent := range processedRelayedMessageEvents {
log := relayedMessageEvent.GethLog log := relayedMessageEvent.RLPLog
var relayedMsgData bindings.CrossDomainMessengerRelayedMessage var relayedMsgData bindings.CrossDomainMessengerRelayedMessage
relayedMsgData.Raw = *log relayedMsgData.Raw = *log
...@@ -114,7 +114,7 @@ func CrossDomainMessengerRelayedMessageEvents(events *ProcessedContractEvents) ( ...@@ -114,7 +114,7 @@ func CrossDomainMessengerRelayedMessageEvents(events *ProcessedContractEvents) (
crossDomainMessageEvents[i] = CrossDomainMessengerRelayedMessageEvent{ crossDomainMessageEvents[i] = CrossDomainMessengerRelayedMessageEvent{
CrossDomainMessengerRelayedMessage: &relayedMsgData, CrossDomainMessengerRelayedMessage: &relayedMsgData,
RawEvent: relayedMessageEvent, Event: relayedMessageEvent,
} }
} }
......
...@@ -197,7 +197,7 @@ func l1ProcessFn(processLog log.Logger, ethClient node.EthClient, l1Contracts L1 ...@@ -197,7 +197,7 @@ func l1ProcessFn(processLog log.Logger, ethClient node.EthClient, l1Contracts L1
continue continue
} }
indexedL1Headers = append(indexedL1Headers, &database.L1BlockHeader{BlockHeader: database.BlockHeaderFromGethHeader(header)}) indexedL1Headers = append(indexedL1Headers, &database.L1BlockHeader{BlockHeader: database.BlockHeaderFromHeader(header)})
} }
/** Update Database **/ /** Update Database **/
...@@ -275,7 +275,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa ...@@ -275,7 +275,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
transactionDeposits[i] = &database.L1TransactionDeposit{ transactionDeposits[i] = &database.L1TransactionDeposit{
SourceHash: depositTx.SourceHash, SourceHash: depositTx.SourceHash,
L2TransactionHash: types.NewTx(depositTx).Hash(), L2TransactionHash: types.NewTx(depositTx).Hash(),
InitiatedL1EventGUID: depositEvent.RawEvent.GUID, InitiatedL1EventGUID: depositEvent.Event.GUID,
Version: database.U256{Int: depositEvent.Version}, Version: database.U256{Int: depositEvent.Version},
OpaqueData: depositEvent.OpaqueData, OpaqueData: depositEvent.OpaqueData,
GasLimit: database.U256{Int: new(big.Int).SetUint64(depositTx.Gas)}, GasLimit: database.U256{Int: new(big.Int).SetUint64(depositTx.Gas)},
...@@ -284,7 +284,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa ...@@ -284,7 +284,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
ToAddress: depositTx.From, ToAddress: depositTx.From,
Amount: database.U256{Int: depositTx.Value}, Amount: database.U256{Int: depositTx.Value},
Data: depositTx.Data, Data: depositTx.Data,
Timestamp: depositEvent.RawEvent.Timestamp, Timestamp: depositEvent.Event.Timestamp,
}, },
} }
...@@ -340,7 +340,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa ...@@ -340,7 +340,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
if withdrawal == nil { if withdrawal == nil {
// We need to ensure we are in a caught up state before claiming a missing event. Since L2 timestamps // We need to ensure we are in a caught up state before claiming a missing event. Since L2 timestamps
// are derived from L1, we can simply compare the timestamp of this event with the latest L2 header. // are derived from L1, we can simply compare the timestamp of this event with the latest L2 header.
if provenWithdrawal.RawEvent.Timestamp > latestL2Header.Timestamp { if provenWithdrawal.Event.Timestamp > latestL2Header.Timestamp {
processLog.Warn("behind on indexed L2 withdrawals") processLog.Warn("behind on indexed L2 withdrawals")
return errors.New("waiting for L2Processor to catch up") return errors.New("waiting for L2Processor to catch up")
} else { } else {
...@@ -349,7 +349,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa ...@@ -349,7 +349,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
} }
} }
err = db.BridgeTransactions.MarkL2TransactionWithdrawalProvenEvent(withdrawalHash, provenWithdrawal.RawEvent.GUID) err = db.BridgeTransactions.MarkL2TransactionWithdrawalProvenEvent(withdrawalHash, provenWithdrawal.Event.GUID)
if err != nil { if err != nil {
return err return err
} }
...@@ -376,7 +376,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa ...@@ -376,7 +376,7 @@ func l1ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
return errors.New("withdrawal missing!") return errors.New("withdrawal missing!")
} }
err = db.BridgeTransactions.MarkL2TransactionWithdrawalFinalizedEvent(withdrawalHash, finalizedWithdrawal.RawEvent.GUID, finalizedWithdrawal.Success) err = db.BridgeTransactions.MarkL2TransactionWithdrawalFinalizedEvent(withdrawalHash, finalizedWithdrawal.Event.GUID, finalizedWithdrawal.Success)
if err != nil { if err != nil {
return err return err
} }
...@@ -399,10 +399,10 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db ...@@ -399,10 +399,10 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
sentMessages := make([]*database.L1BridgeMessage, len(sentMessageEvents)) sentMessages := make([]*database.L1BridgeMessage, len(sentMessageEvents))
for i, sentMessageEvent := range sentMessageEvents { for i, sentMessageEvent := range sentMessageEvents {
log := sentMessageEvent.RawEvent.GethLog log := sentMessageEvent.Event.RLPLog
// extract the deposit hash from the previous TransactionDepositedEvent // extract the deposit hash from the previous TransactionDepositedEvent
transactionDepositedLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index - 1}].GethLog transactionDepositedLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index - 1}].RLPLog
depositTx, err := derive.UnmarshalDepositLogEvent(transactionDepositedLog) depositTx, err := derive.UnmarshalDepositLogEvent(transactionDepositedLog)
if err != nil { if err != nil {
return err return err
...@@ -413,14 +413,14 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db ...@@ -413,14 +413,14 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
BridgeMessage: database.BridgeMessage{ BridgeMessage: database.BridgeMessage{
Nonce: database.U256{Int: sentMessageEvent.MessageNonce}, Nonce: database.U256{Int: sentMessageEvent.MessageNonce},
MessageHash: sentMessageEvent.MessageHash, MessageHash: sentMessageEvent.MessageHash,
SentMessageEventGUID: sentMessageEvent.RawEvent.GUID, SentMessageEventGUID: sentMessageEvent.Event.GUID,
GasLimit: database.U256{Int: sentMessageEvent.GasLimit}, GasLimit: database.U256{Int: sentMessageEvent.GasLimit},
Tx: database.Transaction{ Tx: database.Transaction{
FromAddress: sentMessageEvent.Sender, FromAddress: sentMessageEvent.Sender,
ToAddress: sentMessageEvent.Target, ToAddress: sentMessageEvent.Target,
Amount: database.U256{Int: sentMessageEvent.Value}, Amount: database.U256{Int: sentMessageEvent.Value},
Data: sentMessageEvent.Message, Data: sentMessageEvent.Message,
Timestamp: sentMessageEvent.RawEvent.Timestamp, Timestamp: sentMessageEvent.Event.Timestamp,
}, },
}, },
} }
...@@ -454,7 +454,7 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db ...@@ -454,7 +454,7 @@ func l1ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
return fmt.Errorf("missing indexed L2CrossDomainMessager mesesage: 0x%x", relayedMessage.MsgHash) return fmt.Errorf("missing indexed L2CrossDomainMessager mesesage: 0x%x", relayedMessage.MsgHash)
} }
err = db.BridgeMessages.MarkRelayedL2BridgeMessage(relayedMessage.MsgHash, relayedMessage.RawEvent.GUID) err = db.BridgeMessages.MarkRelayedL2BridgeMessage(relayedMessage.MsgHash, relayedMessage.Event.GUID)
if err != nil { if err != nil {
return err return err
} }
...@@ -479,11 +479,12 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D ...@@ -479,11 +479,12 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
deposits := make([]*database.L1BridgeDeposit, len(initiatedDepositEvents)) deposits := make([]*database.L1BridgeDeposit, len(initiatedDepositEvents))
for i, initiatedBridgeEvent := range initiatedDepositEvents { for i, initiatedBridgeEvent := range initiatedDepositEvents {
log := initiatedBridgeEvent.RawEvent.GethLog log := initiatedBridgeEvent.Event.RLPLog
// extract the deposit hash from the following TransactionDeposited event // extract the deposit hash from the following TransactionDeposited event. The `BlockHash` and `LogIndex`
transactionDepositedLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index + 1}].GethLog // fields are filled in for `RLPLog` which is required for `DepositTx#SourceHash` to be computed correctly
depositTx, err := derive.UnmarshalDepositLogEvent(transactionDepositedLog) transactionDepositedRLPLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index + 1}].RLPLog
depositTx, err := derive.UnmarshalDepositLogEvent(transactionDepositedRLPLog)
if err != nil { if err != nil {
return err return err
} }
...@@ -497,7 +498,7 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D ...@@ -497,7 +498,7 @@ func l1ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
ToAddress: initiatedBridgeEvent.To, ToAddress: initiatedBridgeEvent.To,
Amount: database.U256{Int: initiatedBridgeEvent.Amount}, Amount: database.U256{Int: initiatedBridgeEvent.Amount},
Data: initiatedBridgeEvent.ExtraData, Data: initiatedBridgeEvent.ExtraData,
Timestamp: initiatedBridgeEvent.RawEvent.Timestamp, Timestamp: initiatedBridgeEvent.Event.Timestamp,
}, },
} }
} }
......
...@@ -106,7 +106,7 @@ func l2ProcessFn(processLog log.Logger, ethClient node.EthClient, l2Contracts L2 ...@@ -106,7 +106,7 @@ func l2ProcessFn(processLog log.Logger, ethClient node.EthClient, l2Contracts L2
l2Headers := make([]*database.L2BlockHeader, len(headers)) l2Headers := make([]*database.L2BlockHeader, len(headers))
l2HeaderMap := make(map[common.Hash]*types.Header) l2HeaderMap := make(map[common.Hash]*types.Header)
for i, header := range headers { for i, header := range headers {
l2Headers[i] = &database.L2BlockHeader{BlockHeader: database.BlockHeaderFromGethHeader(header)} l2Headers[i] = &database.L2BlockHeader{BlockHeader: database.BlockHeaderFromHeader(header)}
l2HeaderMap[l2Headers[i].Hash] = header l2HeaderMap[l2Headers[i].Hash] = header
} }
...@@ -183,7 +183,7 @@ func l2ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa ...@@ -183,7 +183,7 @@ func l2ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
for i, withdrawalEvent := range messagesPassed { for i, withdrawalEvent := range messagesPassed {
transactionWithdrawals[i] = &database.L2TransactionWithdrawal{ transactionWithdrawals[i] = &database.L2TransactionWithdrawal{
WithdrawalHash: withdrawalEvent.WithdrawalHash, WithdrawalHash: withdrawalEvent.WithdrawalHash,
InitiatedL2EventGUID: withdrawalEvent.RawEvent.GUID, InitiatedL2EventGUID: withdrawalEvent.Event.GUID,
Nonce: database.U256{Int: withdrawalEvent.Nonce}, Nonce: database.U256{Int: withdrawalEvent.Nonce},
GasLimit: database.U256{Int: withdrawalEvent.GasLimit}, GasLimit: database.U256{Int: withdrawalEvent.GasLimit},
Tx: database.Transaction{ Tx: database.Transaction{
...@@ -191,7 +191,7 @@ func l2ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa ...@@ -191,7 +191,7 @@ func l2ProcessContractEventsBridgeTransactions(processLog log.Logger, db *databa
ToAddress: withdrawalEvent.Target, ToAddress: withdrawalEvent.Target,
Amount: database.U256{Int: withdrawalEvent.Value}, Amount: database.U256{Int: withdrawalEvent.Value},
Data: withdrawalEvent.Data, Data: withdrawalEvent.Data,
Timestamp: withdrawalEvent.RawEvent.Timestamp, Timestamp: withdrawalEvent.Event.Timestamp,
}, },
} }
...@@ -246,10 +246,10 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db ...@@ -246,10 +246,10 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
sentMessages := make([]*database.L2BridgeMessage, len(sentMessageEvents)) sentMessages := make([]*database.L2BridgeMessage, len(sentMessageEvents))
for i, sentMessageEvent := range sentMessageEvents { for i, sentMessageEvent := range sentMessageEvents {
log := sentMessageEvent.RawEvent.GethLog log := sentMessageEvent.Event.RLPLog
// extract the withdrawal hash from the previous MessagePassed event // extract the withdrawal hash from the previous MessagePassed event
msgPassedLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index - 1}].GethLog msgPassedLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index - 1}].RLPLog
msgPassedEvent, err := l2ToL1MessagePasserABI.ParseMessagePassed(*msgPassedLog) msgPassedEvent, err := l2ToL1MessagePasserABI.ParseMessagePassed(*msgPassedLog)
if err != nil { if err != nil {
return err return err
...@@ -260,14 +260,14 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db ...@@ -260,14 +260,14 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
BridgeMessage: database.BridgeMessage{ BridgeMessage: database.BridgeMessage{
Nonce: database.U256{Int: sentMessageEvent.MessageNonce}, Nonce: database.U256{Int: sentMessageEvent.MessageNonce},
MessageHash: sentMessageEvent.MessageHash, MessageHash: sentMessageEvent.MessageHash,
SentMessageEventGUID: sentMessageEvent.RawEvent.GUID, SentMessageEventGUID: sentMessageEvent.Event.GUID,
GasLimit: database.U256{Int: sentMessageEvent.GasLimit}, GasLimit: database.U256{Int: sentMessageEvent.GasLimit},
Tx: database.Transaction{ Tx: database.Transaction{
FromAddress: sentMessageEvent.Sender, FromAddress: sentMessageEvent.Sender,
ToAddress: sentMessageEvent.Target, ToAddress: sentMessageEvent.Target,
Amount: database.U256{Int: sentMessageEvent.Value}, Amount: database.U256{Int: sentMessageEvent.Value},
Data: sentMessageEvent.Message, Data: sentMessageEvent.Message,
Timestamp: sentMessageEvent.RawEvent.Timestamp, Timestamp: sentMessageEvent.Event.Timestamp,
}, },
}, },
} }
...@@ -307,7 +307,7 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db ...@@ -307,7 +307,7 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
// Since the transaction processor running prior does not ensure the deposit inclusion, we need to // Since the transaction processor running prior does not ensure the deposit inclusion, we need to
// ensure we are in a caught up state before claiming a missing event. Since L2 timestamps are derived // ensure we are in a caught up state before claiming a missing event. Since L2 timestamps are derived
// from L1, we can simply compare the timestamp of this event with the latest L1 header. // from L1, we can simply compare the timestamp of this event with the latest L1 header.
if latestL1Header == nil || relayedMessage.RawEvent.Timestamp > latestL1Header.Timestamp { if latestL1Header == nil || relayedMessage.Event.Timestamp > latestL1Header.Timestamp {
processLog.Warn("waiting for L1Processor to catch up on L1CrossDomainMessages") processLog.Warn("waiting for L1Processor to catch up on L1CrossDomainMessages")
return errors.New("waiting for L1Processor to catch up") return errors.New("waiting for L1Processor to catch up")
} else { } else {
...@@ -316,7 +316,7 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db ...@@ -316,7 +316,7 @@ func l2ProcessContractEventsBridgeCrossDomainMessages(processLog log.Logger, db
} }
} }
err = db.BridgeMessages.MarkRelayedL1BridgeMessage(relayedMessage.MsgHash, relayedMessage.RawEvent.GUID) err = db.BridgeMessages.MarkRelayedL1BridgeMessage(relayedMessage.MsgHash, relayedMessage.Event.GUID)
if err != nil { if err != nil {
return err return err
} }
...@@ -346,10 +346,10 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D ...@@ -346,10 +346,10 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
withdrawals := make([]*database.L2BridgeWithdrawal, len(initiatedWithdrawalEvents)) withdrawals := make([]*database.L2BridgeWithdrawal, len(initiatedWithdrawalEvents))
for i, initiatedBridgeEvent := range initiatedWithdrawalEvents { for i, initiatedBridgeEvent := range initiatedWithdrawalEvents {
log := initiatedBridgeEvent.RawEvent.GethLog log := initiatedBridgeEvent.Event.RLPLog
// extract the withdrawal hash from the following MessagePassed event // extract the withdrawal hash from the following MessagePassed event
msgPassedLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index + 1}].GethLog msgPassedLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index + 1}].RLPLog
msgPassedEvent, err := l2ToL1MessagePasserABI.ParseMessagePassed(*msgPassedLog) msgPassedEvent, err := l2ToL1MessagePasserABI.ParseMessagePassed(*msgPassedLog)
if err != nil { if err != nil {
return err return err
...@@ -364,7 +364,7 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D ...@@ -364,7 +364,7 @@ func l2ProcessContractEventsStandardBridge(processLog log.Logger, db *database.D
ToAddress: initiatedBridgeEvent.To, ToAddress: initiatedBridgeEvent.To,
Amount: database.U256{Int: initiatedBridgeEvent.Amount}, Amount: database.U256{Int: initiatedBridgeEvent.Amount},
Data: initiatedBridgeEvent.ExtraData, Data: initiatedBridgeEvent.ExtraData,
Timestamp: initiatedBridgeEvent.RawEvent.Timestamp, Timestamp: initiatedBridgeEvent.Event.Timestamp,
}, },
} }
} }
......
...@@ -7,7 +7,7 @@ import ( ...@@ -7,7 +7,7 @@ import (
type L2ToL1MessagePasserMessagePassed struct { type L2ToL1MessagePasserMessagePassed struct {
*bindings.L2ToL1MessagePasserMessagePassed *bindings.L2ToL1MessagePasserMessagePassed
RawEvent *database.ContractEvent Event *database.ContractEvent
} }
func L2ToL1MessagePasserMessagesPassed(events *ProcessedContractEvents) ([]L2ToL1MessagePasserMessagePassed, error) { func L2ToL1MessagePasserMessagesPassed(events *ProcessedContractEvents) ([]L2ToL1MessagePasserMessagePassed, error) {
...@@ -20,7 +20,7 @@ func L2ToL1MessagePasserMessagesPassed(events *ProcessedContractEvents) ([]L2ToL ...@@ -20,7 +20,7 @@ func L2ToL1MessagePasserMessagesPassed(events *ProcessedContractEvents) ([]L2ToL
processedMessagePassedEvents := events.eventsBySignature[l2ToL1MessagePasserAbi.Events[eventName].ID] processedMessagePassedEvents := events.eventsBySignature[l2ToL1MessagePasserAbi.Events[eventName].ID]
messagesPassed := make([]L2ToL1MessagePasserMessagePassed, len(processedMessagePassedEvents)) messagesPassed := make([]L2ToL1MessagePasserMessagePassed, len(processedMessagePassedEvents))
for i, messagePassedEvent := range processedMessagePassedEvents { for i, messagePassedEvent := range processedMessagePassedEvents {
log := messagePassedEvent.GethLog log := messagePassedEvent.RLPLog
var messagePassed bindings.L2ToL1MessagePasserMessagePassed var messagePassed bindings.L2ToL1MessagePasserMessagePassed
messagePassed.Raw = *log messagePassed.Raw = *log
...@@ -31,7 +31,7 @@ func L2ToL1MessagePasserMessagesPassed(events *ProcessedContractEvents) ([]L2ToL ...@@ -31,7 +31,7 @@ func L2ToL1MessagePasserMessagesPassed(events *ProcessedContractEvents) ([]L2ToL
messagesPassed[i] = L2ToL1MessagePasserMessagePassed{ messagesPassed[i] = L2ToL1MessagePasserMessagePassed{
L2ToL1MessagePasserMessagePassed: &messagePassed, L2ToL1MessagePasserMessagePassed: &messagePassed,
RawEvent: messagePassedEvent, Event: messagePassedEvent,
} }
} }
......
...@@ -14,17 +14,17 @@ import ( ...@@ -14,17 +14,17 @@ import (
type OptimismPortalTransactionDepositEvent struct { type OptimismPortalTransactionDepositEvent struct {
*bindings.OptimismPortalTransactionDeposited *bindings.OptimismPortalTransactionDeposited
DepositTx *types.DepositTx DepositTx *types.DepositTx
RawEvent *database.ContractEvent Event *database.ContractEvent
} }
type OptimismPortalWithdrawalProvenEvent struct { type OptimismPortalWithdrawalProvenEvent struct {
*bindings.OptimismPortalWithdrawalProven *bindings.OptimismPortalWithdrawalProven
RawEvent *database.ContractEvent Event *database.ContractEvent
} }
type OptimismPortalWithdrawalFinalizedEvent struct { type OptimismPortalWithdrawalFinalizedEvent struct {
*bindings.OptimismPortalWithdrawalFinalized *bindings.OptimismPortalWithdrawalFinalized
RawEvent *database.ContractEvent Event *database.ContractEvent
} }
type OptimismPortalProvenWithdrawal struct { type OptimismPortalProvenWithdrawal struct {
...@@ -47,7 +47,7 @@ func OptimismPortalTransactionDepositEvents(events *ProcessedContractEvents) ([] ...@@ -47,7 +47,7 @@ func OptimismPortalTransactionDepositEvents(events *ProcessedContractEvents) ([]
processedTxDepositedEvents := events.eventsBySignature[derive.DepositEventABIHash] processedTxDepositedEvents := events.eventsBySignature[derive.DepositEventABIHash]
txDeposits := make([]OptimismPortalTransactionDepositEvent, len(processedTxDepositedEvents)) txDeposits := make([]OptimismPortalTransactionDepositEvent, len(processedTxDepositedEvents))
for i, txDepositEvent := range processedTxDepositedEvents { for i, txDepositEvent := range processedTxDepositedEvents {
log := txDepositEvent.GethLog log := txDepositEvent.RLPLog
depositTx, err := derive.UnmarshalDepositLogEvent(log) depositTx, err := derive.UnmarshalDepositLogEvent(log)
if err != nil { if err != nil {
...@@ -64,7 +64,7 @@ func OptimismPortalTransactionDepositEvents(events *ProcessedContractEvents) ([] ...@@ -64,7 +64,7 @@ func OptimismPortalTransactionDepositEvents(events *ProcessedContractEvents) ([]
txDeposits[i] = OptimismPortalTransactionDepositEvent{ txDeposits[i] = OptimismPortalTransactionDepositEvent{
OptimismPortalTransactionDeposited: &txDeposit, OptimismPortalTransactionDeposited: &txDeposit,
DepositTx: depositTx, DepositTx: depositTx,
RawEvent: txDepositEvent, Event: txDepositEvent,
} }
} }
...@@ -81,7 +81,7 @@ func OptimismPortalWithdrawalProvenEvents(events *ProcessedContractEvents) ([]Op ...@@ -81,7 +81,7 @@ func OptimismPortalWithdrawalProvenEvents(events *ProcessedContractEvents) ([]Op
processedWithdrawalProvenEvents := events.eventsBySignature[optimismPortalAbi.Events[eventName].ID] processedWithdrawalProvenEvents := events.eventsBySignature[optimismPortalAbi.Events[eventName].ID]
provenEvents := make([]OptimismPortalWithdrawalProvenEvent, len(processedWithdrawalProvenEvents)) provenEvents := make([]OptimismPortalWithdrawalProvenEvent, len(processedWithdrawalProvenEvents))
for i, provenEvent := range processedWithdrawalProvenEvents { for i, provenEvent := range processedWithdrawalProvenEvents {
log := provenEvent.GethLog log := provenEvent.RLPLog
var withdrawalProven bindings.OptimismPortalWithdrawalProven var withdrawalProven bindings.OptimismPortalWithdrawalProven
withdrawalProven.Raw = *log withdrawalProven.Raw = *log
...@@ -92,7 +92,7 @@ func OptimismPortalWithdrawalProvenEvents(events *ProcessedContractEvents) ([]Op ...@@ -92,7 +92,7 @@ func OptimismPortalWithdrawalProvenEvents(events *ProcessedContractEvents) ([]Op
provenEvents[i] = OptimismPortalWithdrawalProvenEvent{ provenEvents[i] = OptimismPortalWithdrawalProvenEvent{
OptimismPortalWithdrawalProven: &withdrawalProven, OptimismPortalWithdrawalProven: &withdrawalProven,
RawEvent: provenEvent, Event: provenEvent,
} }
} }
...@@ -109,7 +109,7 @@ func OptimismPortalWithdrawalFinalizedEvents(events *ProcessedContractEvents) ([ ...@@ -109,7 +109,7 @@ func OptimismPortalWithdrawalFinalizedEvents(events *ProcessedContractEvents) ([
processedWithdrawalFinalizedEvents := events.eventsBySignature[optimismPortalAbi.Events[eventName].ID] processedWithdrawalFinalizedEvents := events.eventsBySignature[optimismPortalAbi.Events[eventName].ID]
finalizedEvents := make([]OptimismPortalWithdrawalFinalizedEvent, len(processedWithdrawalFinalizedEvents)) finalizedEvents := make([]OptimismPortalWithdrawalFinalizedEvent, len(processedWithdrawalFinalizedEvents))
for i, finalizedEvent := range processedWithdrawalFinalizedEvents { for i, finalizedEvent := range processedWithdrawalFinalizedEvents {
log := finalizedEvent.GethLog log := finalizedEvent.RLPLog
var withdrawalFinalized bindings.OptimismPortalWithdrawalFinalized var withdrawalFinalized bindings.OptimismPortalWithdrawalFinalized
err := UnpackLog(&withdrawalFinalized, log, eventName, optimismPortalAbi) err := UnpackLog(&withdrawalFinalized, log, eventName, optimismPortalAbi)
...@@ -119,7 +119,7 @@ func OptimismPortalWithdrawalFinalizedEvents(events *ProcessedContractEvents) ([ ...@@ -119,7 +119,7 @@ func OptimismPortalWithdrawalFinalizedEvents(events *ProcessedContractEvents) ([
finalizedEvents[i] = OptimismPortalWithdrawalFinalizedEvent{ finalizedEvents[i] = OptimismPortalWithdrawalFinalizedEvent{
OptimismPortalWithdrawalFinalized: &withdrawalFinalized, OptimismPortalWithdrawalFinalized: &withdrawalFinalized,
RawEvent: finalizedEvent, Event: finalizedEvent,
} }
} }
......
...@@ -20,7 +20,7 @@ type StandardBridgeInitiatedEvent struct { ...@@ -20,7 +20,7 @@ type StandardBridgeInitiatedEvent struct {
*bindings.StandardBridgeERC20BridgeInitiated *bindings.StandardBridgeERC20BridgeInitiated
CrossDomainMessengerNonce *big.Int CrossDomainMessengerNonce *big.Int
RawEvent *database.ContractEvent Event *database.ContractEvent
} }
type StandardBridgeFinalizedEvent struct { type StandardBridgeFinalizedEvent struct {
...@@ -29,7 +29,7 @@ type StandardBridgeFinalizedEvent struct { ...@@ -29,7 +29,7 @@ type StandardBridgeFinalizedEvent struct {
*bindings.StandardBridgeERC20BridgeFinalized *bindings.StandardBridgeERC20BridgeFinalized
CrossDomainMessengerNonce *big.Int CrossDomainMessengerNonce *big.Int
RawEvent *database.ContractEvent Event *database.ContractEvent
} }
// StandardBridgeInitiatedEvents extracts all initiated bridge events from the contracts that follow the StandardBridge ABI. The // StandardBridgeInitiatedEvents extracts all initiated bridge events from the contracts that follow the StandardBridge ABI. The
...@@ -97,7 +97,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge ...@@ -97,7 +97,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
processedInitiatedBridgeEvents := events.eventsBySignature[StandardBridgeABI.Events[eventName].ID] processedInitiatedBridgeEvents := events.eventsBySignature[StandardBridgeABI.Events[eventName].ID]
initiatedBridgeEvents := make([]StandardBridgeInitiatedEvent, len(processedInitiatedBridgeEvents)) initiatedBridgeEvents := make([]StandardBridgeInitiatedEvent, len(processedInitiatedBridgeEvents))
for i, bridgeInitiatedEvent := range processedInitiatedBridgeEvents { for i, bridgeInitiatedEvent := range processedInitiatedBridgeEvents {
log := bridgeInitiatedEvent.GethLog log := bridgeInitiatedEvent.RLPLog
var bridgeData BridgeEvent var bridgeData BridgeEvent
err := UnpackLog(&bridgeData, log, eventName, StandardBridgeABI) err := UnpackLog(&bridgeData, log, eventName, StandardBridgeABI)
...@@ -109,7 +109,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge ...@@ -109,7 +109,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
// - L1: BridgeInitiated -> Portal#DepositTransaction -> SentMessage ... // - L1: BridgeInitiated -> Portal#DepositTransaction -> SentMessage ...
// - L1: BridgeInitiated -> L2ToL1MessagePasser#MessagePassed -> SentMessage ... // - L1: BridgeInitiated -> L2ToL1MessagePasser#MessagePassed -> SentMessage ...
var sentMsgData bindings.L1CrossDomainMessengerSentMessage var sentMsgData bindings.L1CrossDomainMessengerSentMessage
sentMsgLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index + 2}].GethLog sentMsgLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index + 2}].RLPLog
sentMsgData.Raw = *sentMsgLog sentMsgData.Raw = *sentMsgLog
err = UnpackLog(&sentMsgData, sentMsgLog, sentMessageEventAbi.Name, l1CrossDomainMessengerABI) err = UnpackLog(&sentMsgData, sentMsgLog, sentMessageEventAbi.Name, l1CrossDomainMessengerABI)
if err != nil { if err != nil {
...@@ -152,7 +152,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge ...@@ -152,7 +152,7 @@ func _standardBridgeInitiatedEvents[BridgeEvent bindings.StandardBridgeETHBridge
initiatedBridgeEvents[i] = StandardBridgeInitiatedEvent{ initiatedBridgeEvents[i] = StandardBridgeInitiatedEvent{
StandardBridgeERC20BridgeInitiated: erc20BridgeData, StandardBridgeERC20BridgeInitiated: erc20BridgeData,
CrossDomainMessengerNonce: sentMsgData.MessageNonce, CrossDomainMessengerNonce: sentMsgData.MessageNonce,
RawEvent: bridgeInitiatedEvent, Event: bridgeInitiatedEvent,
} }
} }
...@@ -197,7 +197,7 @@ func _standardBridgeFinalizedEvents[BridgeEvent bindings.StandardBridgeETHBridge ...@@ -197,7 +197,7 @@ func _standardBridgeFinalizedEvents[BridgeEvent bindings.StandardBridgeETHBridge
processedFinalizedBridgeEvents := events.eventsBySignature[StandardBridgeABI.Events[eventName].ID] processedFinalizedBridgeEvents := events.eventsBySignature[StandardBridgeABI.Events[eventName].ID]
finalizedBridgeEvents := make([]StandardBridgeFinalizedEvent, len(processedFinalizedBridgeEvents)) finalizedBridgeEvents := make([]StandardBridgeFinalizedEvent, len(processedFinalizedBridgeEvents))
for i, bridgeFinalizedEvent := range processedFinalizedBridgeEvents { for i, bridgeFinalizedEvent := range processedFinalizedBridgeEvents {
log := bridgeFinalizedEvent.GethLog log := bridgeFinalizedEvent.RLPLog
var bridgeData BridgeEvent var bridgeData BridgeEvent
err := UnpackLog(&bridgeData, log, eventName, StandardBridgeABI) err := UnpackLog(&bridgeData, log, eventName, StandardBridgeABI)
...@@ -206,7 +206,7 @@ func _standardBridgeFinalizedEvents[BridgeEvent bindings.StandardBridgeETHBridge ...@@ -206,7 +206,7 @@ func _standardBridgeFinalizedEvents[BridgeEvent bindings.StandardBridgeETHBridge
} }
// Look for the RelayedMessage event that follows right after the BridgeFinalized Event // Look for the RelayedMessage event that follows right after the BridgeFinalized Event
relayedMsgLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index + 1}].GethLog relayedMsgLog := events.eventByLogIndex[ProcessedContractEventLogIndexKey{log.BlockHash, log.Index + 1}].RLPLog
if relayedMsgLog.Topics[0] != relayedMessageEventAbi.ID { if relayedMsgLog.Topics[0] != relayedMessageEventAbi.ID {
return nil, errors.New("unexpected bridge event ordering") return nil, errors.New("unexpected bridge event ordering")
} }
...@@ -280,7 +280,7 @@ func _standardBridgeFinalizedEvents[BridgeEvent bindings.StandardBridgeETHBridge ...@@ -280,7 +280,7 @@ func _standardBridgeFinalizedEvents[BridgeEvent bindings.StandardBridgeETHBridge
finalizedBridgeEvents[i] = StandardBridgeFinalizedEvent{ finalizedBridgeEvents[i] = StandardBridgeFinalizedEvent{
StandardBridgeERC20BridgeFinalized: erc20BridgeData, StandardBridgeERC20BridgeFinalized: erc20BridgeData,
CrossDomainMessengerNonce: nonce, CrossDomainMessengerNonce: nonce,
RawEvent: bridgeFinalizedEvent, Event: bridgeFinalizedEvent,
} }
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
// Package safe contains types for working with Safe smart contract wallets. These are used to
// build batch transactions for the tx-builder app. The types are based on
// https://github.com/safe-global/safe-react-apps/blob/development/apps/tx-builder/src/typings/models.ts.
package safe
import (
"encoding/json"
"fmt"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
)
// BatchFile represents a Safe tx-builder transaction.
type BatchFile struct {
Version string `json:"version"`
ChainID *big.Int `json:"chainId"`
CreatedAt uint64 `json:"createdAt"`
Meta BatchFileMeta `json:"meta"`
Transactions []BatchTransaction `json:"transactions"`
}
// bathcFileMarshaling is a helper type used for JSON marshaling.
type batchFileMarshaling struct {
Version string `json:"version"`
ChainID string `json:"chainId"`
CreatedAt uint64 `json:"createdAt"`
Meta BatchFileMeta `json:"meta"`
Transactions []BatchTransaction `json:"transactions"`
}
// MarshalJSON will marshal a BatchFile to JSON.
func (b *BatchFile) MarshalJSON() ([]byte, error) {
return json.Marshal(batchFileMarshaling{
Version: b.Version,
ChainID: b.ChainID.String(),
CreatedAt: b.CreatedAt,
Meta: b.Meta,
Transactions: b.Transactions,
})
}
// UnmarshalJSON will unmarshal a BatchFile from JSON.
func (b *BatchFile) UnmarshalJSON(data []byte) error {
var bf batchFileMarshaling
if err := json.Unmarshal(data, &bf); err != nil {
return err
}
b.Version = bf.Version
chainId, ok := new(big.Int).SetString(bf.ChainID, 10)
if !ok {
return fmt.Errorf("cannot set chainId to %s", bf.ChainID)
}
b.ChainID = chainId
b.CreatedAt = bf.CreatedAt
b.Meta = bf.Meta
b.Transactions = bf.Transactions
return nil
}
// BatchFileMeta contains metadata about a BatchFile. Not all
// of the fields are required.
type BatchFileMeta struct {
TxBuilderVersion string `json:"txBuilderVersion,omitempty"`
Checksum string `json:"checksum,omitempty"`
CreatedFromSafeAddress string `json:"createdFromSafeAddress"`
CreatedFromOwnerAddress string `json:"createdFromOwnerAddress"`
Name string `json:"name"`
Description string `json:"description"`
}
// BatchTransaction represents a single call in a tx-builder transaction.
type BatchTransaction struct {
To common.Address `json:"to"`
Value *big.Int `json:"value"`
Data []byte `json:"data"`
Method ContractMethod `json:"contractMethod"`
InputValues map[string]string `json:"contractInputsValues"`
}
// UnmarshalJSON will unmarshal a BatchTransaction from JSON.
func (b *BatchTransaction) UnmarshalJSON(data []byte) error {
var bt batchTransactionMarshaling
if err := json.Unmarshal(data, &bt); err != nil {
return err
}
b.To = common.HexToAddress(bt.To)
b.Value = new(big.Int).SetUint64(bt.Value)
b.Method = bt.Method
b.InputValues = bt.InputValues
return nil
}
// MarshalJSON will marshal a BatchTransaction to JSON.
func (b *BatchTransaction) MarshalJSON() ([]byte, error) {
batch := batchTransactionMarshaling{
To: b.To.Hex(),
Value: b.Value.Uint64(),
Method: b.Method,
InputValues: b.InputValues,
}
if len(b.Data) != 0 {
hex := hexutil.Encode(b.Data)
batch.Data = &hex
}
return json.Marshal(batch)
}
// batchTransactionMarshaling is a helper type used for JSON marshaling.
type batchTransactionMarshaling struct {
To string `json:"to"`
Value uint64 `json:"value,string"`
Data *string `json:"data"`
Method ContractMethod `json:"contractMethod"`
InputValues map[string]string `json:"contractInputsValues"`
}
// ContractMethod represents a method call in a tx-builder transaction.
type ContractMethod struct {
Inputs []ContractInput `json:"inputs"`
Name string `json:"name"`
Payable bool `json:"payable"`
}
// ContractInput represents an input to a contract method.
type ContractInput struct {
InternalType string `json:"internalType"`
Name string `json:"name"`
Type string `json:"type"`
Components []ContractInput `json:"components,omitempty"`
}
package safe
import (
"bytes"
"encoding/json"
"os"
"testing"
"github.com/stretchr/testify/require"
)
func TestBatchFileJSONPrepareBedrock(t *testing.T) {
testBatchFileJSON(t, "testdata/batch-prepare-bedrock.json")
}
func TestBatchFileJSONL2OO(t *testing.T) {
testBatchFileJSON(t, "testdata/l2-output-oracle.json")
}
func testBatchFileJSON(t *testing.T, path string) {
b, err := os.ReadFile(path)
require.NoError(t, err)
dec := json.NewDecoder(bytes.NewReader(b))
decoded := new(BatchFile)
require.NoError(t, dec.Decode(decoded))
data, err := json.Marshal(decoded)
require.NoError(t, err)
require.JSONEq(t, string(b), string(data))
}
{"version":"1.0","chainId":"1","createdAt":1683299982633,"meta":{"name":"Transactions Batch","description":"","txBuilderVersion":"1.13.3","createdFromSafeAddress":"0xAB23dE0DbE0aedF356af3F815c8B47D88575D82d","createdFromOwnerAddress":"","checksum":"0x3be12fb2a12e07f516c3895194f8418c6640f27fb3324e4dc06dce337b7ae7c3"},"transactions":[{"to":"0x09AA72510eE2e1c705Dc4e2114b025a12E116bb8","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","payable":false},"contractInputsValues":{"newOwner":"0x3C0dD22068a69433938097ad335Cb44a9DBf5c1A"}},{"to":"0x20835fbB5Dcb9B9c3074C0780bB07790a7525f41","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","payable":false},"contractInputsValues":{"newOwner":"0x3C0dD22068a69433938097ad335Cb44a9DBf5c1A"}},{"to":"0xcAC4CDD0C2D87e65710C87dE3955974d6a0b6940","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","payable":false},"contractInputsValues":{"_owner":"0x3C0dD22068a69433938097ad335Cb44a9DBf5c1A"}},{"to":"0xE1229AbA7DC7e74C9995254bbaa40bedDB0B8B4d","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"changeAdmin","payable":false},"contractInputsValues":{"_admin":"0x3C0dD22068a69433938097ad335Cb44a9DBf5c1A"}}]}
\ No newline at end of file
{"version":"1.0","chainId":"1","createdAt":1691808995527,"meta":{"name":"Transactions Batch","description":"","txBuilderVersion":"1.16.1","createdFromSafeAddress":"0xc9D26D376dD75573E0C3247C141881F053d27Ae8","createdFromOwnerAddress":"","checksum":"0x2a88db9ce20d2eb5a80910842e9e94d5870497af45986a6c1c7e2c91d15e34f0"},"transactions":[{"to":"0xE5FF3b57695079f808a24256734483CD3889fA9E","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"bytes32","name":"_outputRoot","type":"bytes32"},{"internalType":"uint256","name":"_l2BlockNumber","type":"uint256"},{"internalType":"bytes32","name":"_l1BlockHash","type":"bytes32"},{"internalType":"uint256","name":"_l1BlockNumber","type":"uint256"}],"name":"proposeL2Output","payable":true},"contractInputsValues":{"_outputRoot":"0x5398552529cbd710f485e297bcf15233b8475bdad43280c99334f65a1d4278ff","_l2BlockNumber":"0","_l1BlockHash":"0x01f814a4547c01c18c0eb8b96cff19bc5dc83b1d2d8a8bbb03206587f594c80a","_l1BlockNumber":"1"}},{"to":"0xE5FF3b57695079f808a24256734483CD3889fA9E","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"uint256","name":"_l2OutputIndex","type":"uint256"}],"name":"deleteL2Outputs","payable":false},"contractInputsValues":{"_l2OutputIndex":"2"}}]}
\ No newline at end of file
...@@ -73,16 +73,16 @@ var Goerli = rollup.Config{ ...@@ -73,16 +73,16 @@ var Goerli = rollup.Config{
var Sepolia = rollup.Config{ var Sepolia = rollup.Config{
Genesis: rollup.Genesis{ Genesis: rollup.Genesis{
L1: eth.BlockID{ L1: eth.BlockID{
Hash: common.HexToHash("0x70e5634d09793b1cfaa7d0a2a5d3289a3b2308de1e82f682b4f817fc670f9797"), Hash: common.HexToHash("0x48f520cf4ddaf34c8336e6e490632ea3cf1e5e93b0b2bc6e917557e31845371b"),
Number: 3976708, Number: 4071408,
}, },
L2: eth.BlockID{ L2: eth.BlockID{
Hash: common.HexToHash("0xfbfc64b34d705b0eb83ab8b2206c0da90a76e1ae54ae657c8cfbee0e802a9120"), Hash: common.HexToHash("0x102de6ffb001480cc9b8b548fd05c34cd4f46ae4aa91759393db90ea0409887d"),
Number: 0, Number: 0,
}, },
L2Time: 1690493568, L2Time: 1691802540,
SystemConfig: eth.SystemConfig{ SystemConfig: eth.SystemConfig{
BatcherAddr: common.HexToAddress("0x7431310e026b69bfc676c0013e12a1a11411eec9"), BatcherAddr: common.HexToAddress("0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c"),
Overhead: eth.Bytes32(common.HexToHash("0x00000000000000000000000000000000000000000000000000000000000000bc")), Overhead: eth.Bytes32(common.HexToHash("0x00000000000000000000000000000000000000000000000000000000000000bc")),
Scalar: eth.Bytes32(common.HexToHash("0x00000000000000000000000000000000000000000000000000000000000a6fe0")), Scalar: eth.Bytes32(common.HexToHash("0x00000000000000000000000000000000000000000000000000000000000a6fe0")),
GasLimit: 30000000, GasLimit: 30000000,
...@@ -95,8 +95,8 @@ var Sepolia = rollup.Config{ ...@@ -95,8 +95,8 @@ var Sepolia = rollup.Config{
L1ChainID: big.NewInt(11155111), L1ChainID: big.NewInt(11155111),
L2ChainID: big.NewInt(11155420), L2ChainID: big.NewInt(11155420),
BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000011155420"), BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000011155420"),
DepositContractAddress: common.HexToAddress("0x8f6452d842438c4e22ba18baa21652ff65530df4"), DepositContractAddress: common.HexToAddress("0x16fc5058f25648194471939df75cf27a2fdc48bc"),
L1SystemConfigAddress: common.HexToAddress("0xf425ed544d2e1f1b7a8650d5897a7ccf43020791"), L1SystemConfigAddress: common.HexToAddress("0x034edd2a225f7f429a63e0f1d2084b9e0a93b538"),
RegolithTime: u64Ptr(0), RegolithTime: u64Ptr(0),
} }
......
...@@ -410,7 +410,8 @@ OptimismMintableERC20_Test:test_mint_notBridge_reverts() (gas: 11165) ...@@ -410,7 +410,8 @@ OptimismMintableERC20_Test:test_mint_notBridge_reverts() (gas: 11165)
OptimismMintableERC20_Test:test_mint_succeeds() (gas: 63544) OptimismMintableERC20_Test:test_mint_succeeds() (gas: 63544)
OptimismMintableERC20_Test:test_remoteToken_succeeds() (gas: 7667) OptimismMintableERC20_Test:test_remoteToken_succeeds() (gas: 7667)
OptimismMintableERC721Factory_Test:test_constructor_succeeds() (gas: 8351) OptimismMintableERC721Factory_Test:test_constructor_succeeds() (gas: 8351)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_succeeds() (gas: 2321820) OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_sameTwice_reverts() (gas: 8937393460516801476)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_succeeds() (gas: 2363100)
OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_zeroRemoteToken_reverts() (gas: 9418) OptimismMintableERC721Factory_Test:test_createOptimismMintableERC721_zeroRemoteToken_reverts() (gas: 9418)
OptimismMintableERC721_Test:test_burn_notBridge_reverts() (gas: 136966) OptimismMintableERC721_Test:test_burn_notBridge_reverts() (gas: 136966)
OptimismMintableERC721_Test:test_burn_succeeds() (gas: 118832) OptimismMintableERC721_Test:test_burn_succeeds() (gas: 118832)
...@@ -419,10 +420,10 @@ OptimismMintableERC721_Test:test_safeMint_notBridge_reverts() (gas: 11121) ...@@ -419,10 +420,10 @@ OptimismMintableERC721_Test:test_safeMint_notBridge_reverts() (gas: 11121)
OptimismMintableERC721_Test:test_safeMint_succeeds() (gas: 140547) OptimismMintableERC721_Test:test_safeMint_succeeds() (gas: 140547)
OptimismMintableERC721_Test:test_supportsInterfaces_succeeds() (gas: 9005) OptimismMintableERC721_Test:test_supportsInterfaces_succeeds() (gas: 9005)
OptimismMintableERC721_Test:test_tokenURI_succeeds() (gas: 163441) OptimismMintableERC721_Test:test_tokenURI_succeeds() (gas: 163441)
OptimismMintableTokenFactory_Test:test_bridge_succeeds() (gas: 7580) OptimismMintableTokenFactory_Test:test_bridge_succeeds() (gas: 7646)
OptimismMintableTokenFactory_Test:test_createStandardL2Token_remoteIsZero_succeeds() (gas: 9390) OptimismMintableTokenFactory_Test:test_createStandardL2Token_remoteIsZero_reverts() (gas: 9401)
OptimismMintableTokenFactory_Test:test_createStandardL2Token_sameTwice_succeeds() (gas: 2523203) OptimismMintableTokenFactory_Test:test_createStandardL2Token_sameTwice_reverts() (gas: 8937393460516769032)
OptimismMintableTokenFactory_Test:test_createStandardL2Token_succeeds() (gas: 1268564) OptimismMintableTokenFactory_Test:test_createStandardL2Token_succeeds() (gas: 1293594)
OptimismPortalUpgradeable_Test:test_initialize_cannotInitImpl_reverts() (gas: 11178) OptimismPortalUpgradeable_Test:test_initialize_cannotInitImpl_reverts() (gas: 11178)
OptimismPortalUpgradeable_Test:test_initialize_cannotInitProxy_reverts() (gas: 16111) OptimismPortalUpgradeable_Test:test_initialize_cannotInitProxy_reverts() (gas: 16111)
OptimismPortalUpgradeable_Test:test_params_initValuesOnProxy_succeeds() (gas: 26781) OptimismPortalUpgradeable_Test:test_params_initValuesOnProxy_succeeds() (gas: 26781)
......
{ {
"finalSystemOwner": "0xfd1D2e729aE8eEe2E146c033bf4400fE75284301", "finalSystemOwner": "0xfd1D2e729aE8eEe2E146c033bf4400fE75284301",
"portalGuardian": "0xfd1D2e729aE8eEe2E146c033bf4400fE75284301", "portalGuardian": "0xfd1D2e729aE8eEe2E146c033bf4400fE75284301",
"l1StartingBlockTag": "0x70e5634d09793b1cfaa7d0a2a5d3289a3b2308de1e82f682b4f817fc670f9797", "l1StartingBlockTag": "0x48f520cf4ddaf34c8336e6e490632ea3cf1e5e93b0b2bc6e917557e31845371b",
"l1ChainID": 11155111, "l1ChainID": 11155111,
"l2ChainID": 11155420, "l2ChainID": 11155420,
"l2BlockTime": 2, "l2BlockTime": 2,
"l1BlockTime": 12,
"maxSequencerDrift": 600, "maxSequencerDrift": 600,
"sequencerWindowSize": 3600, "sequencerWindowSize": 3600,
"channelTimeout": 300, "channelTimeout": 300,
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -24,8 +24,8 @@ ...@@ -24,8 +24,8 @@
"src/periphery/op-nft/Optimist.sol": "0x38407f766aa9d394403e9da388dd0265b48901789f3e8a28af50014f9f5251d9", "src/periphery/op-nft/Optimist.sol": "0x38407f766aa9d394403e9da388dd0265b48901789f3e8a28af50014f9f5251d9",
"src/periphery/op-nft/OptimistAllowlist.sol": "0x53e9a9dfecbae036fd468e8f34c80c7d9c35bd8908c8a6483db44dbc5128ad69", "src/periphery/op-nft/OptimistAllowlist.sol": "0x53e9a9dfecbae036fd468e8f34c80c7d9c35bd8908c8a6483db44dbc5128ad69",
"src/periphery/op-nft/OptimistInviter.sol": "0xfdd5b9d45205ef9372ba37f7a6394724695e676d27a47cb154ee6e4148490013", "src/periphery/op-nft/OptimistInviter.sol": "0xfdd5b9d45205ef9372ba37f7a6394724695e676d27a47cb154ee6e4148490013",
"src/universal/OptimismMintableERC20.sol": "0xddb1f0047ee90db724405ad6a775fd2b26882cbc31d464c3def2c20c88aaf750", "src/universal/OptimismMintableERC20.sol": "0xa0b4f168802d0f9eca9ddc54347ca66c34ad7aa0fd84b01e0d7e99a9f86f46d6",
"src/universal/OptimismMintableERC20Factory.sol": "0x1c77e31f624d0a7306dec8ffc3947a72f8e1e93a01cd911b4561c038732ab7fe", "src/universal/OptimismMintableERC20Factory.sol": "0x8afb6b634f40e8ac8c60ec7e2ca3bcd610b020d09b3cae70a3d4995722cab3ce",
"src/universal/OptimismMintableERC721.sol": "0x4eaa5ea0d923ce967f299c2ded84c2a53431159c47c0a344a9b8f534a25b7e1f", "src/universal/OptimismMintableERC721.sol": "0x49dc863caf3e002bf0c90b3af3873990fb282771f4c63735fd61a885b7873983",
"src/universal/OptimismMintableERC721Factory.sol": "0x6c19bc51bf9184aafad46f292bf9c23cc87c3406f31cccf57d4e3e096b887a8d" "src/universal/OptimismMintableERC721Factory.sol": "0x502438b009bfaf0ab187914662468261f10446fd85d44a79b29cdaef7b4982ba"
} }
\ No newline at end of file
...@@ -35,7 +35,7 @@ contract OptimismMintableERC20 is IOptimismMintableERC20, ILegacyMintableERC20, ...@@ -35,7 +35,7 @@ contract OptimismMintableERC20 is IOptimismMintableERC20, ILegacyMintableERC20,
_; _;
} }
/// @custom:semver 1.0.3 /// @custom:semver 1.1.0
/// @param _bridge Address of the L2 standard bridge. /// @param _bridge Address of the L2 standard bridge.
/// @param _remoteToken Address of the corresponding L1 token. /// @param _remoteToken Address of the corresponding L1 token.
/// @param _name ERC20 name. /// @param _name ERC20 name.
...@@ -47,7 +47,7 @@ contract OptimismMintableERC20 is IOptimismMintableERC20, ILegacyMintableERC20, ...@@ -47,7 +47,7 @@ contract OptimismMintableERC20 is IOptimismMintableERC20, ILegacyMintableERC20,
string memory _symbol string memory _symbol
) )
ERC20(_name, _symbol) ERC20(_name, _symbol)
Semver(1, 0, 3) Semver(1, 1, 0)
{ {
REMOTE_TOKEN = _remoteToken; REMOTE_TOKEN = _remoteToken;
BRIDGE = _bridge; BRIDGE = _bridge;
......
...@@ -31,7 +31,7 @@ contract OptimismMintableERC721 is ERC721Enumerable, IOptimismMintableERC721, Se ...@@ -31,7 +31,7 @@ contract OptimismMintableERC721 is ERC721Enumerable, IOptimismMintableERC721, Se
_; _;
} }
/// @custom:semver 1.1.2 /// @custom:semver 1.2.0
/// @param _bridge Address of the bridge on this network. /// @param _bridge Address of the bridge on this network.
/// @param _remoteChainId Chain ID where the remote token is deployed. /// @param _remoteChainId Chain ID where the remote token is deployed.
/// @param _remoteToken Address of the corresponding token on the other network. /// @param _remoteToken Address of the corresponding token on the other network.
...@@ -45,7 +45,7 @@ contract OptimismMintableERC721 is ERC721Enumerable, IOptimismMintableERC721, Se ...@@ -45,7 +45,7 @@ contract OptimismMintableERC721 is ERC721Enumerable, IOptimismMintableERC721, Se
string memory _symbol string memory _symbol
) )
ERC721(_name, _symbol) ERC721(_name, _symbol)
Semver(1, 1, 2) Semver(1, 2, 0)
{ {
require(_bridge != address(0), "OptimismMintableERC721: bridge cannot be address(0)"); require(_bridge != address(0), "OptimismMintableERC721: bridge cannot be address(0)");
require(_remoteChainId != 0, "OptimismMintableERC721: remote chain id cannot be zero"); require(_remoteChainId != 0, "OptimismMintableERC721: remote chain id cannot be zero");
......
...@@ -68,8 +68,7 @@ The input and return types here are as defined by the [engine API specs][engine- ...@@ -68,8 +68,7 @@ The input and return types here are as defined by the [engine API specs][engine-
- method: `optimism_outputAtBlock` - method: `optimism_outputAtBlock`
- params: - params:
1. `blockNumber`: `QUANTITY`, 64 bits - L2 integer block number </br> 1. `blockNumber`: `QUANTITY`, 64 bits - L2 integer block number.
OR `String` - one of `"safe"`, `"latest"`, or `"pending"`.
- returns: - returns:
1. `version`: `DATA`, 32 Bytes - the output root version number, beginning with 0. 1. `version`: `DATA`, 32 Bytes - the output root version number, beginning with 0.
1. `l2OutputRoot`: `DATA`, 32 Bytes - the output root. 1. `l2OutputRoot`: `DATA`, 32 Bytes - the output root.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment