55 "encoding/json"
66 "errors"
77 "fmt"
8+ "math"
89 "math/big"
910 "net/url"
1011 "strconv"
@@ -152,6 +153,7 @@ type rpcClient struct {
152153 latestChainInfo commonclient.ChainInfo
153154}
154155
156+ // NewRPCCLient returns a new *rpcClient as commonclient.RPC
155157// NewRPCCLient returns a new *rpcClient as commonclient.RPC
156158func NewRPCClient (
157159 lggr logger.Logger ,
@@ -167,6 +169,22 @@ func NewRPCClient(
167169 rpcTimeout time.Duration ,
168170 chainType chaintype.ChainType ,
169171) RPCClient {
172+ return newRPCClient (lggr , wsuri , httpuri , name , id , chainID , tier , finalizedBlockPollInterval , newHeadsPollInterval , largePayloadRpcTimeout , rpcTimeout , chainType )
173+ }
174+ func newRPCClient (
175+ lggr logger.Logger ,
176+ wsuri * url.URL ,
177+ httpuri * url.URL ,
178+ name string ,
179+ id int ,
180+ chainID * big.Int ,
181+ tier commonclient.NodeTier ,
182+ finalizedBlockPollInterval time.Duration ,
183+ newHeadsPollInterval time.Duration ,
184+ largePayloadRpcTimeout time.Duration ,
185+ rpcTimeout time.Duration ,
186+ chainType chaintype.ChainType ,
187+ ) * rpcClient {
170188 r := & rpcClient {
171189 largePayloadRpcTimeout : largePayloadRpcTimeout ,
172190 rpcTimeout : rpcTimeout ,
@@ -436,6 +454,10 @@ func (r *rpcClient) BatchCallContext(rootCtx context.Context, b []rpc.BatchElem)
436454 var requestedFinalizedBlock bool
437455 if r .chainType == chaintype .ChainAstar {
438456 for _ , el := range b {
457+ if el .Method == "eth_getLogs" {
458+ r .rpcLog .Critical ("evmclient.BatchCallContext: eth_getLogs is not supported" )
459+ return errors .New ("evmclient.BatchCallContext: eth_getLogs is not supported" )
460+ }
439461 if ! isRequestingFinalizedBlock (el ) {
440462 continue
441463 }
@@ -555,10 +577,10 @@ func (r *rpcClient) SubscribeNewHead(ctx context.Context, channel chan<- *evmtyp
555577 r .logResult (lggr , err , duration , r .getRPCDomain (), "EthSubscribe" )
556578 err = r .wrapWS (err )
557579 }()
558- subForwarder := newSubForwarder (channel , func (head * evmtypes.Head ) * evmtypes.Head {
580+ subForwarder := newSubForwarder (channel , func (head * evmtypes.Head ) ( * evmtypes.Head , error ) {
559581 head .EVMChainID = ubig .New (r .chainID )
560582 r .onNewHead (ctx , chStopInFlight , head )
561- return head
583+ return head , nil
562584 }, r .wrapRPCClientError )
563585 err = subForwarder .start (ws .rpc .EthSubscribe (ctx , subForwarder .srcCh , args ... ))
564586 if err != nil {
@@ -610,10 +632,10 @@ func (r *rpcClient) SubscribeToHeads(ctx context.Context) (ch <-chan *evmtypes.H
610632 }()
611633
612634 channel := make (chan * evmtypes.Head )
613- forwarder := newSubForwarder (channel , func (head * evmtypes.Head ) * evmtypes.Head {
635+ forwarder := newSubForwarder (channel , func (head * evmtypes.Head ) ( * evmtypes.Head , error ) {
614636 head .EVMChainID = ubig .New (r .chainID )
615637 r .onNewHead (ctx , chStopInFlight , head )
616- return head
638+ return head , nil
617639 }, r .wrapRPCClientError )
618640
619641 err = forwarder .start (ws .rpc .EthSubscribe (ctx , forwarder .srcCh , args ... ))
@@ -1291,8 +1313,11 @@ func (r *rpcClient) FilterLogs(ctx context.Context, q ethereum.FilterQuery) (l [
12911313 l , err = ws .geth .FilterLogs (ctx , q )
12921314 err = r .wrapWS (err )
12931315 }
1294- duration := time .Since (start )
12951316
1317+ if err == nil {
1318+ err = r .makeLogsValid (l )
1319+ }
1320+ duration := time .Since (start )
12961321 r .logResult (lggr , err , duration , r .getRPCDomain (), "FilterLogs" ,
12971322 "log" , l ,
12981323 )
@@ -1320,7 +1345,7 @@ func (r *rpcClient) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQu
13201345 r .logResult (lggr , err , duration , r .getRPCDomain (), "SubscribeFilterLogs" )
13211346 err = r .wrapWS (err )
13221347 }()
1323- sub := newSubForwarder (ch , nil , r .wrapRPCClientError )
1348+ sub := newSubForwarder (ch , r . makeLogValid , r .wrapRPCClientError )
13241349 err = sub .start (ws .geth .SubscribeFilterLogs (ctx , q , sub .srcCh ))
13251350 if err != nil {
13261351 return
@@ -1548,3 +1573,38 @@ func ToBlockNumArg(number *big.Int) string {
15481573 }
15491574 return hexutil .EncodeBig (number )
15501575}
1576+
1577+ func (r * rpcClient ) makeLogsValid (logs []types.Log ) error {
1578+ if r .chainType != chaintype .ChainSei {
1579+ return nil
1580+ }
1581+
1582+ for i := range logs {
1583+ var err error
1584+ logs [i ], err = r .makeLogValid (logs [i ])
1585+ if err != nil {
1586+ return err
1587+ }
1588+ }
1589+
1590+ return nil
1591+ }
1592+
1593+ func (r * rpcClient ) makeLogValid (log types.Log ) (types.Log , error ) {
1594+ if r .chainType != chaintype .ChainSei {
1595+ return log , nil
1596+ }
1597+
1598+ if log .TxIndex > math .MaxUint32 {
1599+ return types.Log {}, fmt .Errorf ("TxIndex of tx %s exceeds max supported value of %d" , log .TxHash , math .MaxUint32 )
1600+ }
1601+
1602+ if log .Index > math .MaxUint32 {
1603+ return types.Log {}, fmt .Errorf ("log's index %d of tx %s exceeds max supported value of %d" , log .Index , log .TxHash , math .MaxUint32 )
1604+ }
1605+
1606+ // it's safe as we have a build guard to guarantee 64-bit system
1607+ newIndex := uint64 (log .TxIndex << 32 ) | uint64 (log .Index )
1608+ log .Index = uint (newIndex )
1609+ return log , nil
1610+ }
0 commit comments