Skip to content

Commit

Permalink
Merge branch 'ccip-develop' of github.com:smartcontractkit/ccip into …
Browse files Browse the repository at this point in the history
…ccip-4408
  • Loading branch information
b-gopalswami committed Dec 5, 2024
2 parents ab0f391 + 6c62128 commit dd22875
Showing 1 changed file with 18 additions and 31 deletions.
49 changes: 18 additions & 31 deletions core/services/ocr2/plugins/ccip/tokendata/lbtc/lbtc.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package lbtc
import (
"bytes"
"context"
"crypto/sha256"
"encoding/json"
"fmt"
"net/url"
Expand All @@ -22,7 +21,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/tokendata/http"
)

// TODO: double check the validty of default values for lombard's API after checking docs
const (
apiVersion = "v1"
attestationPath = "deposits/getByHash"
Expand All @@ -36,8 +34,8 @@ const (
maxCoolDownDuration = 10 * time.Minute

// defaultRequestInterval defines the rate in requests per second that the attestation API can be called.
// this is set according to the APIs documentated 10 requests per second rate limit.
defaultRequestInterval = 100 * time.Millisecond
// this is set according to the APIs recommended 5 requests per second rate limit.
defaultRequestInterval = 200 * time.Millisecond

// APIIntervalRateLimitDisabled is a special value to disable the rate limiting.
APIIntervalRateLimitDisabled = -1
Expand Down Expand Up @@ -75,10 +73,9 @@ type TokenDataReader struct {
type messageAttestationResponse struct {
MessageHash string `json:"message_hash"`
Status attestationStatus `json:"status"`
Attestation string `json:"attestation"` // Attestation represented by abi.encode(payload, proof)
Attestation string `json:"attestation,omitempty"` // Attestation represented by abi.encode(payload, proof)
}

// TODO: Adjust after checking API docs
type attestationRequest struct {
PayloadHashes []string `json:"messageHash"`
}
Expand All @@ -87,8 +84,6 @@ type attestationResponse struct {
Attestations []messageAttestationResponse `json:"attestations"`
}

// TODO: Implement encoding/decoding

type sourceTokenData struct {
SourcePoolAddress []byte
DestTokenAddress []byte
Expand Down Expand Up @@ -188,10 +183,20 @@ func (s *TokenDataReader) ReadTokenData(ctx context.Context, msg cciptypes.EVM2E
}
}

payloadHash, err := s.getLBTCPayloadHash(msg, tokenIndex)
decodedSourceTokenData, err := abihelpers.DecodeAbiStruct[sourceTokenData](msg.SourceTokenData[tokenIndex])
if err != nil {
return []byte{}, errors.Wrap(err, "failed getting the LBTC message body")
return []byte{}, err
}
destTokenData := decodedSourceTokenData.ExtraData
// We don't have better way to determine if the extraData is a payload or sha256(payload)
// Last parameter of the payload struct is 32-bytes nonce (see Lombard's Bridge._deposit(...) method),
// so we can assume that payload always exceeds 32 bytes
if len(destTokenData) != 32 {
s.lggr.Infow("SourceTokenData.extraData size is not 32. This is deposit payload, not sha256(payload). Attestation is disabled onchain",
"destTokenData", hexutil.Encode(destTokenData))
return destTokenData, nil
}
payloadHash := [32]byte(destTokenData)

msgID := hexutil.Encode(msg.MessageID[:])
payloadHashHex := hexutil.Encode(payloadHash[:])
Expand All @@ -213,6 +218,9 @@ func (s *TokenDataReader) ReadTokenData(ctx context.Context, msg cciptypes.EVM2E
attestation = attestationCandidate
}
}
if attestation == (messageAttestationResponse{}) {
return nil, fmt.Errorf("requested attestation %s not found in response", payloadHashHex)
}
s.lggr.Infow("Got response from attestation API", "messageID", msgID,
"attestationStatus", attestation.Status, "attestation", attestation)
switch attestation.Status {
Expand All @@ -232,27 +240,6 @@ func (s *TokenDataReader) ReadTokenData(ctx context.Context, msg cciptypes.EVM2E
}
}

func (s *TokenDataReader) getLBTCPayloadHash(msg cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta, tokenIndex int) ([32]byte, error) {
decodedSourceTokenData, err := abihelpers.DecodeAbiStruct[sourceTokenData](msg.SourceTokenData[tokenIndex])
if err != nil {
return [32]byte{}, err
}
destTokenData := decodedSourceTokenData.ExtraData
var payloadHash [32]byte
// We don't have better way to determine if the extraData is a payload or sha256(payload)
// Last parameter of the payload struct is 32-bytes nonce (see Lombard's Bridge._deposit(...) method),
// so we can assume that payload always exceeds 32 bytes
if len(destTokenData) != 32 {
payloadHash = sha256.Sum256(destTokenData)
s.lggr.Warnw("SourceTokenData.extraData size is not 32. Probably this is deposit payload, not sha256(payload). "+
"This message was sent when LBTC attestation was disabled onchain. Will use sha256 from this value",
"destTokenData", destTokenData, "newPayloadHash", payloadHash)
} else {
payloadHash = [32]byte(destTokenData)
}
return payloadHash, nil
}

func (s *TokenDataReader) callAttestationApi(ctx context.Context, lbtcMessageHash [32]byte) (attestationResponse, error) {
attestationUrl := fmt.Sprintf("%s/bridge/%s/%s", s.attestationApi.String(), apiVersion, attestationPath)
request := attestationRequest{PayloadHashes: []string{hexutil.Encode(lbtcMessageHash[:])}}
Expand Down

0 comments on commit dd22875

Please sign in to comment.