Skip to content

Commit 782a6f7

Browse files
github-actions[bot]tkernelldanflo27CJPotter10
authored
Bridge patch (#992) (#994)
* set bridgev2 upgrade addresses * allow pre-upgrade deposits to be claimed * upgrade handler * removed upgrade to allow for a straight binary switch to upgrade to include this fix --------- (cherry picked from commit 4ba4972) Co-authored-by: tkernell <tpkernell@gmail.com> Co-authored-by: danflo27 <florentinodc@outlook.com> Co-authored-by: Cjpotter10 <caleb10joseph@gmail.com>
1 parent 0e2520f commit 782a6f7

2 files changed

Lines changed: 91 additions & 10 deletions

File tree

x/bridge/keeper/claim_deposit.go

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
layer "github.com/tellor-io/layer/types"
1616
"github.com/tellor-io/layer/x/bridge/types"
1717
oraclemodule "github.com/tellor-io/layer/x/oracle/keeper"
18+
oracletypes "github.com/tellor-io/layer/x/oracle/types"
1819
registrytypes "github.com/tellor-io/layer/x/registry/types"
1920

2021
"cosmossdk.io/collections"
@@ -25,11 +26,7 @@ import (
2526

2627
func (k Keeper) ClaimDeposit(ctx context.Context, depositId, timestamp uint64) error {
2728
cosmosCtx := sdk.UnwrapSDKContext(ctx)
28-
queryId, err := k.GetDepositQueryId(depositId)
29-
if err != nil {
30-
return err
31-
}
32-
aggregate, err := k.oracleKeeper.GetAggregateByTimestamp(ctx, queryId, timestamp)
29+
_, aggregate, err := k.ResolveDepositAggregateByTimestamp(ctx, depositId, timestamp)
3330
if err != nil {
3431
return err
3532
}
@@ -98,8 +95,29 @@ func (k Keeper) ClaimDeposit(ctx context.Context, depositId, timestamp uint64) e
9895
return nil
9996
}
10097

101-
// replicate solidity encoding, keccak256(abi.encode(string "TRBBridgeV2", abi.encode(bool true, uint256 depositId)))
102-
func (k Keeper) GetDepositQueryId(depositId uint64) ([]byte, error) {
98+
func (k Keeper) ResolveDepositAggregateByTimestamp(ctx context.Context, depositId, timestamp uint64) ([]byte, oracletypes.Aggregate, error) {
99+
// Prefer V2, but allow legacy V1 query IDs so pre-upgrade deposits remain claimable.
100+
candidateQueryTypes := []string{oraclemodule.TRBBridgeV2QueryType, oraclemodule.TRBBridgeQueryType}
101+
var lastErr error
102+
for _, queryType := range candidateQueryTypes {
103+
queryId, err := k.GetDepositQueryIdByType(depositId, queryType)
104+
if err != nil {
105+
return nil, oracletypes.Aggregate{}, err
106+
}
107+
aggregate, err := k.oracleKeeper.GetAggregateByTimestamp(ctx, queryId, timestamp)
108+
if err == nil {
109+
return queryId, aggregate, nil
110+
}
111+
lastErr = err
112+
}
113+
if lastErr != nil {
114+
return nil, oracletypes.Aggregate{}, lastErr
115+
}
116+
return nil, oracletypes.Aggregate{}, fmt.Errorf("aggregate not found for deposit id %d at timestamp %d", depositId, timestamp)
117+
}
118+
119+
// replicate solidity encoding, keccak256(abi.encode(string queryType, abi.encode(bool true, uint256 depositId)))
120+
func (k Keeper) GetDepositQueryIdByType(depositId uint64, queryType string) ([]byte, error) {
103121
toLayerBool := true
104122
depositIdUint64 := new(big.Int).SetUint64(depositId)
105123

@@ -136,7 +154,7 @@ func (k Keeper) GetDepositQueryId(depositId uint64) ([]byte, error) {
136154
{Type: StringType},
137155
{Type: BytesType},
138156
}
139-
queryDataEncoded, err := finalArgs.Pack(oraclemodule.TRBBridgeV2QueryType, queryDataArgsEncoded)
157+
queryDataEncoded, err := finalArgs.Pack(queryType, queryDataArgsEncoded)
140158
if err != nil {
141159
return nil, err
142160
}
@@ -146,6 +164,11 @@ func (k Keeper) GetDepositQueryId(depositId uint64) ([]byte, error) {
146164
return queryId, nil
147165
}
148166

167+
// GetDepositQueryId returns the TRBBridgeV2 query ID for a deposit id.
168+
func (k Keeper) GetDepositQueryId(depositId uint64) ([]byte, error) {
169+
return k.GetDepositQueryIdByType(depositId, oraclemodule.TRBBridgeV2QueryType)
170+
}
171+
149172
// replicate solidity decoding, abi.decode(reportValue, (address ethSender, string layerRecipient, uint256 amount, uint256 tip))
150173
func (k Keeper) DecodeDepositReportValue(ctx context.Context, reportValue string) (recipient sdk.AccAddress, amount, tip sdk.Coins, err error) {
151174
// prepare decoding

x/bridge/keeper/claim_deposit_test.go

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,71 @@ func TestClaimDepositNilAggregate(t *testing.T) {
262262
sdkCtx := sdk.UnwrapSDKContext(ctx)
263263
k.SetValsetCheckpointDomainSeparator(sdkCtx)
264264

265-
queryId, _ := k.GetDepositQueryId(0)
265+
queryIdV2, _ := k.GetDepositQueryId(0)
266+
queryIdV1, _ := k.GetDepositQueryIdByType(0, "TRBBridge")
266267
currentTime := time.Now()
267-
ok.On("GetAggregateByTimestamp", sdkCtx, queryId, uint64(currentTime.UnixMilli())).Return(oracletypes.Aggregate{}, collections.ErrNotFound)
268+
ok.On("GetAggregateByTimestamp", sdkCtx, queryIdV2, uint64(currentTime.UnixMilli())).Return(oracletypes.Aggregate{}, collections.ErrNotFound)
269+
ok.On("GetAggregateByTimestamp", sdkCtx, queryIdV1, uint64(currentTime.UnixMilli())).Return(oracletypes.Aggregate{}, collections.ErrNotFound)
268270
err := k.ClaimDeposit(ctx, 0, uint64(currentTime.UnixMilli()))
269271
require.ErrorContains(t, err, "not found")
270272
}
271273

274+
func TestClaimDepositFallsBackToLegacyTRBBridgeQueryId(t *testing.T) {
275+
k, _, bk, ok, _, _, _, ctx := setupKeeper(t)
276+
require.NotNil(t, k)
277+
require.NotNil(t, ctx)
278+
sdkCtx := sdk.UnwrapSDKContext(ctx)
279+
k.SetValsetCheckpointDomainSeparator(sdkCtx)
280+
281+
aggregateTimestamp := sdkCtx.BlockTime()
282+
AddressType, err := abi.NewType("address", "", nil)
283+
require.NoError(t, err)
284+
Uint256Type, err := abi.NewType("uint256", "", nil)
285+
require.NoError(t, err)
286+
StringType, err := abi.NewType("string", "", nil)
287+
require.NoError(t, err)
288+
reportValueArgs := abi.Arguments{
289+
{Type: AddressType},
290+
{Type: StringType},
291+
{Type: Uint256Type},
292+
}
293+
ethAddress := common.HexToAddress("0x3386518F7ab3eb51591571adBE62CF94540EAd29")
294+
layerAddressString := simtestutil.CreateIncrementalAccounts(1)[0].String()
295+
amountUint64 := big.NewInt(100 * 1e12)
296+
reportValueArgsEncoded, err := reportValueArgs.Pack(ethAddress, layerAddressString, amountUint64)
297+
require.NoError(t, err)
298+
reportValueString := hex.EncodeToString(reportValueArgsEncoded)
299+
300+
queryIdV2, err := k.GetDepositQueryId(0)
301+
require.NoError(t, err)
302+
queryIdV1, err := k.GetDepositQueryIdByType(0, "TRBBridge")
303+
require.NoError(t, err)
304+
305+
aggregate := oracletypes.Aggregate{
306+
QueryId: queryIdV1,
307+
AggregateValue: reportValueString,
308+
AggregatePower: uint64(68),
309+
}
310+
powerThreshold := uint64(67)
311+
validatorTimestamp := uint64(aggregateTimestamp.UnixMilli() - 1)
312+
valSetHash := []byte("valSetHash")
313+
_, err = k.CalculateValidatorSetCheckpoint(ctx, powerThreshold, validatorTimestamp, valSetHash)
314+
require.NoError(t, err)
315+
316+
sdkCtx = sdkCtx.WithBlockTime(sdkCtx.BlockTime().Add(13 * time.Hour))
317+
recipient, amount, _, err := k.DecodeDepositReportValue(ctx, reportValueString)
318+
require.NoError(t, err)
319+
320+
// First lookup (V2) misses, second lookup (legacy V1) succeeds.
321+
ok.On("GetAggregateByTimestamp", sdkCtx, queryIdV2, uint64(aggregateTimestamp.UnixMilli())).Return(oracletypes.Aggregate{}, collections.ErrNotFound)
322+
ok.On("GetAggregateByTimestamp", sdkCtx, queryIdV1, uint64(aggregateTimestamp.UnixMilli())).Return(aggregate, nil)
323+
bk.On("MintCoins", sdkCtx, bridgetypes.ModuleName, amount).Return(nil)
324+
bk.On("SendCoinsFromModuleToAccount", sdkCtx, bridgetypes.ModuleName, recipient, amount).Return(nil)
325+
326+
err = k.ClaimDeposit(sdkCtx, 0, uint64(aggregateTimestamp.UnixMilli()))
327+
require.NoError(t, err)
328+
}
329+
272330
func TestClaimDepositFlaggedAggregate(t *testing.T) {
273331
k, _, bk, ok, rk, _, _, ctx := setupKeeper(t)
274332
require.NotNil(t, k)

0 commit comments

Comments
 (0)