Skip to content

Commit

Permalink
fix when contract reader fails on latestRoundData call (#1476)
Browse files Browse the repository at this point in the history
## Motivation

https://github.com/smartcontractkit/ccip/blob/b71329d41b803ca16dc9a1f9d5247c87fd6fbc32/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go#L209
will panic with
```
panic: runtime error: index out of range [1] with length 1

goroutine 3683 [running]:
github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/pricegetter.(*DynamicPriceGetter).performBatchCall(0x8?, {0x46d85c0, 0x67ae360}, 0xa77ab4f8?, 0xc0174776d0, 0xc017475aa0)
	/chainlink/core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go:209 +0x1998
```

This can happen when the contract reader fails on a LatestRoundData call
when only one aggregator contract is requested in the batch call.

## Solution

Use `read.ReadName`
  • Loading branch information
patrickhuie19 authored Oct 2, 2024
1 parent dfa420b commit bd22732
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions core/services/ocr2/plugins/ccip/internal/pricegetter/evm.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,23 +203,23 @@ func (d *DynamicPriceGetter) performBatchCall(ctx context.Context, chainID uint6
contractName := fmt.Sprintf("%v_%v", OFFCHAIN_AGGREGATOR, j)
offchainAggregatorRespSlice := result[contractName]

for i, read := range offchainAggregatorRespSlice {
for _, read := range offchainAggregatorRespSlice {
val, readErr := read.GetResult()
if readErr != nil {
respErr = multierr.Append(respErr, fmt.Errorf("error with method call %v: %w", batchCalls.decimalCalls[i].MethodName(), readErr))
respErr = multierr.Append(respErr, fmt.Errorf("error with contract reader readName %v: %w", read.ReadName, readErr))
continue
}
if read.ReadName == DECIMALS_METHOD_NAME {
decimal, ok := val.(*uint8)
if !ok {
return fmt.Errorf("expected type uint8 for method call %v on contract %v: %w", batchCalls.decimalCalls[i].MethodName(), batchCalls.decimalCalls[i].ContractAddress(), readErr)
return fmt.Errorf("expected type uint8 for method call %v on contract %v: %w", batchCalls.decimalCalls[j].MethodName(), batchCalls.decimalCalls[j].ContractAddress(), readErr)
}

decimalsCR = append(decimalsCR, *decimal)
} else if read.ReadName == LATEST_ROUND_DATA_METHOD_NAME {
latestRoundDataRes, ok := val.(*aggregator_v3_interface.LatestRoundData)
if !ok {
return fmt.Errorf("expected type latestRoundDataConfig for method call %v on contract %v: %w", batchCalls.latestRoundDataCalls[i/2].MethodName(), batchCalls.latestRoundDataCalls[i/2].ContractAddress(), readErr)
return fmt.Errorf("expected type latestRoundDataConfig for method call %v on contract %v: %w", batchCalls.latestRoundDataCalls[j].MethodName(), batchCalls.latestRoundDataCalls[j].ContractAddress(), readErr)
}

latestRoundCR = append(latestRoundCR, *latestRoundDataRes)
Expand Down

0 comments on commit bd22732

Please sign in to comment.