diff --git a/config.yml b/config.yml index 839a9aa..06bacbb 100644 --- a/config.yml +++ b/config.yml @@ -1,12 +1,20 @@ chains: mainnet: rpc: - host: https://mainnet.blockscout.com + host: https://mainnet.infura.io/v3/5d7bd94c50ed43fab1cb8e74f58678b0 timeout: 30s rps: 10 chain_id: 1 block_time: 15s - block_index_interval: 10s + block_index_interval: 60s + kovan: + rpc: + host: https://kovan.poa.network + timeout: 30s + rps: 10 + chain_id: 42 + block_time: 5s + block_index_interval: 60s xdai: rpc: host: https://dai.poa.network @@ -14,7 +22,15 @@ chains: rps: 10 chain_id: 100 block_time: 5s - block_index_interval: 5s + block_index_interval: 30s + sokol: + rpc: + host: https://sokol.poa.network + timeout: 20s + rps: 10 + chain_id: 77 + block_time: 5s + block_index_interval: 30s bridges: xdai-amb: home: @@ -22,16 +38,29 @@ bridges: address: 0x75Df5AF045d91108662D8080fD1FEFAd6aA0bb59 start_block: 7408640 required_block_confirmations: 12 - max_block_range_size: 10000 + max_block_range_size: 2000 foreign: chain: mainnet address: 0x4C36d2919e407f0Cc2Ee3c993ccF8ac26d9CE64e start_block: 9130277 required_block_confirmations: 12 - max_block_range_size: 5000 + max_block_range_size: 1000 + test-amb: + home: + chain: sokol + address: 0xFe446bEF1DbF7AFE24E81e05BC8B271C1BA9a560 + start_block: 9849619 + required_block_confirmations: 12 + max_block_range_size: 10000 + foreign: + chain: kovan + address: 0xFe446bEF1DbF7AFE24E81e05BC8B271C1BA9a560 + start_block: 12372929 + required_block_confirmations: 12 + max_block_range_size: 10000 postgres: user: postgres password: pass - host: postgres + host: localhost port: 5432 database: db diff --git a/contract/constants/amb.json b/contract/constants/amb.json index 648083a..39670aa 100644 --- a/contract/constants/amb.json +++ b/contract/constants/amb.json @@ -1112,5 +1112,32 @@ ], "name": "RelayedMessage", "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "name": "executor", + "type": "address" + }, + { + "indexed": false, + "name": "messageId", + "type": "bytes32" + }, + { + "indexed": false, + "name": "status", + "type": "bool" + } + ], + "name": "RelayedMessage", + "type": "event" } ] \ No newline at end of file diff --git a/contract/contract.go b/contract/contract.go index cf9913d..105397b 100644 --- a/contract/contract.go +++ b/contract/contract.go @@ -3,6 +3,7 @@ package contract import ( "amb-monitor/entity" "amb-monitor/ethclient" + "bytes" "fmt" "github.com/ethereum/go-ethereum/accounts/abi" @@ -28,15 +29,6 @@ func (c *Contract) ParseLog(log *entity.Log) (string, map[string]interface{}, er if log.Topic0 == nil { return "", nil, fmt.Errorf("cannot process event without topics") } - event, err := c.abi.EventByID(*log.Topic0) - if err != nil { - return "", nil, nil - } - m := make(map[string]interface{}) - err = event.Inputs.UnpackIntoMap(m, log.Data) - if err != nil { - return "", nil, err - } topics := make([]common.Hash, 0, 3) if log.Topic1 != nil { topics = append(topics, *log.Topic1) @@ -47,7 +39,26 @@ func (c *Contract) ParseLog(log *entity.Log) (string, map[string]interface{}, er } } } - err = abi.ParseTopicsIntoMap(m, Indexed(event.Inputs), topics) + var event *abi.Event + var indexed abi.Arguments + for _, e := range c.abi.Events { + if bytes.Equal(e.ID.Bytes(), log.Topic0.Bytes()) { + indexed = Indexed(e.Inputs) + if len(indexed) == len(topics) { + event = &e + break + } + } + } + if event == nil { + return "", nil, nil + } + m := make(map[string]interface{}) + err := event.Inputs.UnpackIntoMap(m, log.Data) + if err != nil { + return "", nil, err + } + err = abi.ParseTopicsIntoMap(m, indexed, topics) if err != nil { return "", nil, err } diff --git a/monitor/monitor.go b/monitor/monitor.go index 5144eae..8cfb7cc 100644 --- a/monitor/monitor.go +++ b/monitor/monitor.go @@ -81,11 +81,11 @@ func newContractMonitor(ctx context.Context, logger logging.Logger, repo *reposi } func NewMonitor(ctx context.Context, logger logging.Logger, repo *repository.Repo, cfg *config.BridgeConfig) (*Monitor, error) { - homeMonitor, err := newContractMonitor(ctx, logger.WithField("side", "home"), repo, cfg.Home) + homeMonitor, err := newContractMonitor(ctx, logger.WithField("contract", "home"), repo, cfg.Home) if err != nil { return nil, fmt.Errorf("failed to initialize home side monitor: %w", err) } - foreignMonitor, err := newContractMonitor(ctx, logger.WithField("side", "foreign"), repo, cfg.Foreign) + foreignMonitor, err := newContractMonitor(ctx, logger.WithField("contract", "foreign"), repo, cfg.Foreign) if err != nil { return nil, fmt.Errorf("failed to initialize foreign side monitor: %w", err) } @@ -99,6 +99,7 @@ func NewMonitor(ctx context.Context, logger logging.Logger, repo *repository.Rep foreignMonitor.eventHandlers["UserRequestForAffirmation"] = handlers.HandleUserRequestForAffirmation foreignMonitor.eventHandlers["UserRequestForAffirmation0"] = handlers.HandleLegacyUserRequestForAffirmation foreignMonitor.eventHandlers["RelayedMessage"] = handlers.HandleRelayedMessage + foreignMonitor.eventHandlers["RelayedMessage0"] = handlers.HandleRelayedMessage return &Monitor{ cfg: cfg, logger: logger,