Skip to content

Commit 05f8a32

Browse files
sh-chabeer-1
andauthored
Feat/withdrawal api by address (#41)
* save withdrawals by address * change query params * db iteration bug fix * fix db iteration bug * change cmd name * go mod tidy * cleanup go.mod * change offset to real index * add next --------- Co-authored-by: beer-1 <[email protected]>
1 parent e03e229 commit 05f8a32

File tree

19 files changed

+366
-118
lines changed

19 files changed

+366
-118
lines changed

challenger/db.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func (c *Challenger) deletePendingChallenge(challenge challengertypes.Challenge)
3939
}
4040

4141
func (c *Challenger) loadPendingChallenges() (challenges []challengertypes.Challenge, err error) {
42-
iterErr := c.db.PrefixedIterate(challengertypes.PendingChallengeKey, func(_, value []byte) (stop bool, err error) {
42+
iterErr := c.db.PrefixedIterate(challengertypes.PendingChallengeKey, nil, func(_, value []byte) (stop bool, err error) {
4343
challenge := challengertypes.Challenge{}
4444
err = challenge.Unmarshal(value)
4545
if err != nil {
@@ -66,7 +66,7 @@ func (c *Challenger) saveChallenge(challenge challengertypes.Challenge) (types.R
6666
}
6767

6868
func (c *Challenger) loadChallenges() (challenges []challengertypes.Challenge, err error) {
69-
iterErr := c.db.PrefixedReverseIterate(challengertypes.ChallengeKey, func(_, value []byte) (stop bool, err error) {
69+
iterErr := c.db.PrefixedReverseIterate(challengertypes.ChallengeKey, nil, func(_, value []byte) (stop bool, err error) {
7070
challenge := challengertypes.Challenge{}
7171
err = challenge.Unmarshal(value)
7272
if err != nil {
@@ -87,7 +87,7 @@ func (c *Challenger) loadChallenges() (challenges []challengertypes.Challenge, e
8787

8888
func (c *Challenger) DeleteFutureChallenges(initialBlockTime time.Time) error {
8989
deletingKeys := make([][]byte, 0)
90-
iterErr := c.db.PrefixedReverseIterate(challengertypes.ChallengeKey, func(key []byte, _ []byte) (stop bool, err error) {
90+
iterErr := c.db.PrefixedReverseIterate(challengertypes.ChallengeKey, nil, func(key []byte, _ []byte) (stop bool, err error) {
9191
ts, _, err := challengertypes.ParseChallenge(key)
9292
if err != nil {
9393
return true, err
@@ -150,7 +150,7 @@ func ResetHeight(db types.DB, nodeName string) error {
150150

151151
func DeletePendingEvents(db types.DB) error {
152152
deletingKeys := make([][]byte, 0)
153-
iterErr := db.PrefixedIterate(challengertypes.PendingEventKey, func(key []byte, _ []byte) (stop bool, err error) {
153+
iterErr := db.PrefixedIterate(challengertypes.PendingEventKey, nil, func(key []byte, _ []byte) (stop bool, err error) {
154154
deletingKeys = append(deletingKeys, key)
155155
return false, nil
156156
})
@@ -169,7 +169,7 @@ func DeletePendingEvents(db types.DB) error {
169169

170170
func DeletePendingChallenges(db types.DB) error {
171171
deletingKeys := make([][]byte, 0)
172-
iterErr := db.PrefixedIterate(challengertypes.PendingChallengeKey, func(key []byte, _ []byte) (stop bool, err error) {
172+
iterErr := db.PrefixedIterate(challengertypes.PendingChallengeKey, nil, func(key []byte, _ []byte) (stop bool, err error) {
173173
deletingKeys = append(deletingKeys, key)
174174
return false, nil
175175
})

challenger/eventhandler/pending_events.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (ch *ChallengeEventHandler) SetPendingEvents(events []challengertypes.Chall
9696
}
9797

9898
func (ch *ChallengeEventHandler) loadPendingEvents() (events []challengertypes.ChallengeEvent, err error) {
99-
iterErr := ch.db.PrefixedIterate(challengertypes.PendingEventKey, func(key, value []byte) (stop bool, err error) {
99+
iterErr := ch.db.PrefixedIterate(challengertypes.PendingEventKey, nil, func(key, value []byte) (stop bool, err error) {
100100
id, err := challengertypes.ParsePendingEvent(key)
101101
if err != nil {
102102
return true, err

challenger/query.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import challengertypes "github.com/initia-labs/opinit-bots/challenger/types"
44

55
func (c *Challenger) QueryChallenges(page uint64) (challenges []challengertypes.Challenge, err error) {
66
i := uint64(0)
7-
iterErr := c.db.PrefixedIterate(challengertypes.ChallengeKey, func(_, value []byte) (stop bool, err error) {
7+
iterErr := c.db.PrefixedIterate(challengertypes.ChallengeKey, nil, func(_, value []byte) (stop bool, err error) {
88
i++
99
if i >= (page+1)*100 {
1010
return true, nil

cmd/opinitd/db.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/initia-labs/opinit-bots/bot"
7+
bottypes "github.com/initia-labs/opinit-bots/bot/types"
8+
"github.com/initia-labs/opinit-bots/db"
9+
"github.com/initia-labs/opinit-bots/executor"
10+
"github.com/spf13/cobra"
11+
)
12+
13+
// migration015Cmd handles the one-time migration of withdrawal data for v0.1.5
14+
// TODO: Remove this command in the future
15+
func migration015Cmd(ctx *cmdContext) *cobra.Command {
16+
cmd := &cobra.Command{
17+
Use: "migrate",
18+
Args: cobra.ExactArgs(1),
19+
Short: "Run database migrations",
20+
Long: `Run database migrations
21+
v0.1.5: Store the sequence number so that it can be accessed by address
22+
`,
23+
RunE: func(cmd *cobra.Command, args []string) error {
24+
version := args[0]
25+
switch version {
26+
case "v0.1.5":
27+
// Run migration for v0.1.5
28+
db, err := db.NewDB(bot.GetDBPath(ctx.homePath, bottypes.BotTypeExecutor))
29+
if err != nil {
30+
return err
31+
}
32+
return executor.Migration015(db)
33+
default:
34+
return fmt.Errorf("unknown migration version: %s", version)
35+
}
36+
},
37+
}
38+
return cmd
39+
}

cmd/opinitd/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func NewRootCmd() *cobra.Command {
4848
resetDBCmd(ctx),
4949
resetHeightsCmd(ctx),
5050
resetHeightCmd(ctx),
51+
migration015Cmd(ctx),
5152
version.NewVersionCommand(),
5253
)
5354
return rootCmd

db/db.go

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -87,36 +87,45 @@ func (db *LevelDB) Close() error {
8787
// PrefixedIterate iterates over the key-value pairs in the database with prefixing the keys.
8888
//
8989
// @dev: `LevelDB.prefix + prefix` is used as the prefix for the iteration.
90-
func (db *LevelDB) PrefixedIterate(prefix []byte, cb func(key, value []byte) (stop bool, err error)) error {
90+
func (db *LevelDB) PrefixedIterate(prefix []byte, start []byte, cb func(key, value []byte) (stop bool, err error)) error {
9191
iter := db.db.NewIterator(util.BytesPrefix(db.PrefixedKey(prefix)), nil)
9292
defer iter.Release()
93-
for iter.Next() {
93+
if start != nil {
94+
iter.Seek(db.PrefixedKey(start))
95+
} else {
96+
iter.First()
97+
}
98+
99+
for iter.Valid() {
94100
key := db.UnprefixedKey(bytes.Clone(iter.Key()))
95101
if stop, err := cb(key, bytes.Clone(iter.Value())); err != nil {
96102
return err
97103
} else if stop {
98104
break
99105
}
106+
iter.Next()
100107
}
101108
return iter.Error()
102109
}
103110

104-
func (db *LevelDB) PrefixedReverseIterate(prefix []byte, cb func(key, value []byte) (stop bool, err error)) error {
111+
func (db *LevelDB) PrefixedReverseIterate(prefix []byte, start []byte, cb func(key, value []byte) (stop bool, err error)) error {
105112
iter := db.db.NewIterator(util.BytesPrefix(db.PrefixedKey(prefix)), nil)
106113
defer iter.Release()
107-
if iter.Last() {
108-
for {
109-
key := db.UnprefixedKey(bytes.Clone(iter.Key()))
110-
if stop, err := cb(key, bytes.Clone(iter.Value())); err != nil {
111-
return err
112-
} else if stop {
113-
break
114-
}
115-
116-
if !iter.Prev() {
117-
break
118-
}
114+
if start != nil {
115+
iter.Seek(db.PrefixedKey(start))
116+
} else {
117+
iter.Last()
118+
}
119+
120+
for iter.Valid() {
121+
key := db.UnprefixedKey(bytes.Clone(iter.Key()))
122+
if stop, err := cb(key, bytes.Clone(iter.Value())); err != nil {
123+
return err
124+
} else if stop {
125+
break
119126
}
127+
128+
iter.Prev()
120129
}
121130
return iter.Error()
122131
}
@@ -127,7 +136,13 @@ func (db *LevelDB) PrefixedReverseIterate(prefix []byte, cb func(key, value []by
127136
func (db *LevelDB) SeekPrevInclusiveKey(prefix []byte, key []byte) (k []byte, v []byte, err error) {
128137
iter := db.db.NewIterator(util.BytesPrefix(db.PrefixedKey(prefix)), nil)
129138
defer iter.Release()
130-
if iter.Seek(db.PrefixedKey(key)) || iter.Valid() && iter.Prev() || iter.Last() && iter.Valid() {
139+
if ok := iter.Seek(db.PrefixedKey(key)); ok || iter.Last() {
140+
// if the valid key is not found, the iterator will be at the last key
141+
// if the key is found, the iterator will be at the key
142+
// or the previous key if the key is not found
143+
if ok && !bytes.Equal(db.PrefixedKey(key), iter.Key()) {
144+
iter.Prev()
145+
}
131146
k = db.UnprefixedKey(bytes.Clone(iter.Key()))
132147
v = bytes.Clone(iter.Value())
133148
} else {

executor/child/child.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,19 @@ type Child struct {
4242
lastFinalizedDepositL1BlockHeight int64
4343
lastFinalizedDepositL1Sequence uint64
4444
lastOutputTime time.Time
45+
46+
batchKVs []types.RawKV
47+
addressIndexMap map[string]uint64
4548
}
4649

4750
func NewChildV1(
4851
cfg nodetypes.NodeConfig,
4952
db types.DB, logger *zap.Logger,
5053
) *Child {
5154
return &Child{
52-
BaseChild: childprovider.NewBaseChildV1(cfg, db, logger),
55+
BaseChild: childprovider.NewBaseChildV1(cfg, db, logger),
56+
batchKVs: make([]types.RawKV, 0),
57+
addressIndexMap: make(map[string]uint64),
5358
}
5459
}
5560

executor/child/handler.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ import (
88

99
btypes "github.com/initia-labs/opinit-bots/node/broadcaster/types"
1010
nodetypes "github.com/initia-labs/opinit-bots/node/types"
11-
"github.com/initia-labs/opinit-bots/types"
11+
"golang.org/x/exp/maps"
1212
)
1313

1414
func (ch *Child) beginBlockHandler(ctx context.Context, args nodetypes.BeginBlockArgs) (err error) {
1515
blockHeight := args.Block.Header.Height
1616
ch.EmptyMsgQueue()
1717
ch.EmptyProcessedMsgs()
18+
ch.batchKVs = ch.batchKVs[:0]
19+
maps.Clear(ch.addressIndexMap)
1820

1921
if ch.Merkle() == nil {
2022
return errors.New("merkle is not initialized")
@@ -34,13 +36,12 @@ func (ch *Child) beginBlockHandler(ctx context.Context, args nodetypes.BeginBloc
3436

3537
func (ch *Child) endBlockHandler(_ context.Context, args nodetypes.EndBlockArgs) error {
3638
blockHeight := args.Block.Header.Height
37-
batchKVs := make([]types.RawKV, 0)
3839
treeKVs, storageRoot, err := ch.handleTree(blockHeight, args.LatestHeight, args.BlockID, args.Block.Header)
3940
if err != nil {
4041
return err
4142
}
4243

43-
batchKVs = append(batchKVs, treeKVs...)
44+
ch.batchKVs = append(ch.batchKVs, treeKVs...)
4445
if storageRoot != nil {
4546
workingTreeIndex, err := ch.GetWorkingTreeIndex()
4647
if err != nil {
@@ -53,7 +54,7 @@ func (ch *Child) endBlockHandler(_ context.Context, args nodetypes.EndBlockArgs)
5354
}
5455

5556
// update the sync info
56-
batchKVs = append(batchKVs, ch.Node().SyncInfoToRawKV(blockHeight))
57+
ch.batchKVs = append(ch.batchKVs, ch.Node().SyncInfoToRawKV(blockHeight))
5758

5859
// if has key, then process the messages
5960
if ch.host.HasKey() {
@@ -76,10 +77,10 @@ func (ch *Child) endBlockHandler(_ context.Context, args nodetypes.EndBlockArgs)
7677
if err != nil {
7778
return err
7879
}
79-
batchKVs = append(batchKVs, msgKVs...)
80+
ch.batchKVs = append(ch.batchKVs, msgKVs...)
8081
}
8182

82-
err = ch.DB().RawBatchSet(batchKVs...)
83+
err = ch.DB().RawBatchSet(ch.batchKVs...)
8384
if err != nil {
8485
return err
8586
}

executor/child/query.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,36 @@ func (ch Child) QueryWithdrawal(sequence uint64) (executortypes.QueryWithdrawalR
3333
BridgeId: ch.BridgeId(),
3434
OutputIndex: outputIndex,
3535
WithdrawalProofs: proofs,
36-
Sender: withdrawal.From,
36+
From: withdrawal.From,
37+
To: withdrawal.To,
3738
Sequence: sequence,
38-
Amount: amount.String(),
39+
Amount: amount,
3940
Version: []byte{ch.Version()},
4041
StorageRoot: outputRoot,
41-
LatestBlockHash: treeExtraData.BlockHash,
42-
BlockNumber: treeExtraData.BlockNumber,
43-
Receiver: withdrawal.To,
44-
WithdrawalHash: withdrawal.WithdrawalHash,
42+
LastBlockHash: treeExtraData.BlockHash,
43+
// BlockNumber: treeExtraData.BlockNumber,
44+
// WithdrawalHash: withdrawal.WithdrawalHash,
4545
}, nil
4646
}
47+
48+
func (ch Child) QueryWithdrawals(address string, offset uint64, limit uint64, descOrder bool) (executortypes.QueryWithdrawalsResponse, error) {
49+
sequences, next, total, err := ch.GetSequencesByAddress(address, offset, limit, descOrder)
50+
if err != nil {
51+
return executortypes.QueryWithdrawalsResponse{}, err
52+
}
53+
withdrawals := make([]executortypes.QueryWithdrawalResponse, 0)
54+
for _, sequence := range sequences {
55+
withdrawal, err := ch.QueryWithdrawal(sequence)
56+
if err != nil {
57+
return executortypes.QueryWithdrawalsResponse{}, err
58+
}
59+
withdrawals = append(withdrawals, withdrawal)
60+
}
61+
62+
res := executortypes.QueryWithdrawalsResponse{
63+
Withdrawals: withdrawals,
64+
Next: next,
65+
Total: total,
66+
}
67+
return res, nil
68+
}

0 commit comments

Comments
 (0)