Skip to content

Commit 3c4a11c

Browse files
Fix: unlock assets
1 parent e8671b5 commit 3c4a11c

File tree

12 files changed

+181
-52
lines changed

12 files changed

+181
-52
lines changed

internal/storage/bridge.go

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type IBridge interface {
1818
ByAddress(ctx context.Context, addressId uint64) (Bridge, error)
1919
ByRollup(ctx context.Context, rollupId uint64, limit, offset int) ([]Bridge, error)
2020
ByRoles(ctx context.Context, addressId uint64, limit, offset int) ([]Bridge, error)
21+
ListWithAddress(ctx context.Context, limit, offset int) ([]Bridge, error)
2122
}
2223

2324
type Bridge struct {

internal/storage/mock/bridge.go

+39
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/storage/postgres/bridge.go

+18
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/celenium-io/astria-indexer/internal/storage"
1010
"github.com/dipdup-net/go-lib/database"
11+
sdk "github.com/dipdup-net/indexer-sdk/pkg/storage"
1112
"github.com/dipdup-net/indexer-sdk/pkg/storage/postgres"
1213
)
1314

@@ -89,3 +90,20 @@ func (b *Bridge) ByRoles(ctx context.Context, addressId uint64, limit, offset in
8990
Scan(ctx, &result)
9091
return
9192
}
93+
94+
func (b *Bridge) ListWithAddress(ctx context.Context, limit, offset int) (result []storage.Bridge, err error) {
95+
query := b.DB().NewSelect().
96+
Model((*storage.Bridge)(nil)).
97+
Offset(offset)
98+
99+
query = limitScope(query, limit)
100+
query = sortScope(query, "id", sdk.SortOrderAsc)
101+
102+
err = b.DB().NewSelect().
103+
TableExpr("(?) as bridge", query).
104+
ColumnExpr("bridge.*").
105+
ColumnExpr("address.hash as address__hash").
106+
Join("left join address as address on address.id = bridge.address_id").
107+
Scan(ctx, &result)
108+
return
109+
}

internal/storage/postgres/bridge_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,28 @@ func (s *StorageTestSuite) TestBridgeByRoles() {
9898
hash, _ := hex.DecodeString("19ba8abb3e4b56a309df6756c47b97e298e3a72d88449d36a0fadb1ca7366539")
9999
s.Require().Equal(hash, bridge.Rollup.AstriaId)
100100
}
101+
102+
func (s *StorageTestSuite) TestBridgeListWithAddress() {
103+
ctx, ctxCancel := context.WithTimeout(context.Background(), 5*time.Second)
104+
defer ctxCancel()
105+
106+
bridges, err := s.storage.Bridges.ListWithAddress(ctx, 1, 0)
107+
s.Require().NoError(err)
108+
s.Require().Len(bridges, 1)
109+
110+
bridge := bridges[0]
111+
s.Require().EqualValues(7316, bridge.InitHeight)
112+
s.Require().EqualValues(1, bridge.AddressId)
113+
s.Require().EqualValues(1, bridge.SudoId)
114+
s.Require().EqualValues(1, bridge.WithdrawerId)
115+
s.Require().EqualValues(1, bridge.RollupId)
116+
s.Require().EqualValues("nria", bridge.Asset)
117+
s.Require().EqualValues("nria", bridge.FeeAsset)
118+
119+
s.Require().NotNil(bridge.Address)
120+
s.Require().Equal("astria1lm45urgugesyhaymn68xww0m6g49zreqa32w7p", bridge.Address.Hash)
121+
122+
s.Require().Nil(bridge.Sudo)
123+
s.Require().Nil(bridge.Withdrawer)
124+
s.Require().Nil(bridge.Rollup)
125+
}

pkg/indexer/decode/actions.go

+19-8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"time"
1010

1111
astria "buf.build/gen/go/astria/protocol-apis/protocolbuffers/go/astria/protocol/transactions/v1alpha1"
12+
"github.com/celenium-io/astria-indexer/internal/currency"
1213
"github.com/celenium-io/astria-indexer/internal/storage"
1314
storageTypes "github.com/celenium-io/astria-indexer/internal/storage/types"
1415
"github.com/celenium-io/astria-indexer/pkg/types"
@@ -513,6 +514,7 @@ func parseInitBridgeAccount(body *astria.Action_InitBridgeAccountAction, from st
513514
ActionType: action.Type,
514515
}
515516
ctx.AddBridge(&bridge)
517+
ctx.AddBridgeAsset(from, bridge.Asset)
516518
}
517519
return nil
518520
}
@@ -651,7 +653,6 @@ func parseBridgeLock(body *astria.Action_BridgeLockAction, from string, height t
651653
Update: decAmount.Neg(),
652654
},
653655
)
654-
655656
}
656657
}
657658
return nil
@@ -676,16 +677,26 @@ func parseBridgeUnlock(body *astria.Action_BridgeUnlockAction, from string, heig
676677
action.Data["bridge"] = bridge
677678
}
678679

679-
decAmount := decimal.RequireFromString(amount)
680-
toAddr := ctx.Addresses.Set(toAddress, height, decAmount, feeAsset, 1, 0)
680+
var (
681+
decAmount = decimal.RequireFromString(amount)
682+
fromAddr *storage.Address
683+
unlockAsset string
684+
)
681685

682-
var fromAddr *storage.Address
683686
if bridge == "" {
684-
fromAddr = ctx.Addresses.Set(from, height, decAmount.Neg(), feeAsset, 1, 0)
687+
fromAddr = ctx.Addresses.Set(from, height, decAmount.Neg(), "", 1, 0)
688+
unlockAsset = currency.DefaultCurrency
685689
} else {
686-
fromAddr = ctx.Addresses.Set(bridge, height, decAmount.Neg(), feeAsset, 1, 0)
690+
asset, ok := ctx.bridgeAssets[bridge]
691+
if !ok {
692+
return errors.Errorf("unknown bridge asset: %s", bridge)
693+
}
694+
fromAddr = ctx.Addresses.Set(bridge, height, decAmount.Neg(), asset, 1, 0)
695+
unlockAsset = asset
687696
}
688697

698+
toAddr := ctx.Addresses.Set(toAddress, height, decAmount, unlockAsset, 1, 0)
699+
689700
action.Addresses = append(action.Addresses,
690701
&storage.AddressAction{
691702
Address: toAddr,
@@ -707,13 +718,13 @@ func parseBridgeUnlock(body *astria.Action_BridgeUnlockAction, from string, heig
707718
storage.BalanceUpdate{
708719
Address: toAddr,
709720
Height: action.Height,
710-
Currency: feeAsset,
721+
Currency: unlockAsset,
711722
Update: decAmount,
712723
},
713724
storage.BalanceUpdate{
714725
Address: fromAddr,
715726
Height: action.Height,
716-
Currency: feeAsset,
727+
Currency: unlockAsset,
717728
Update: decAmount.Neg(),
718729
},
719730
)

0 commit comments

Comments
 (0)