forked from watsonwanda/oracle-suite
-
Notifications
You must be signed in to change notification settings - Fork 0
/
registry.go
107 lines (100 loc) · 3.33 KB
/
registry.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright (C) 2021-2023 Chronicle Labs, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package chronicle
import (
"bytes"
"context"
"fmt"
"sort"
"github.com/defiweb/go-eth/types"
)
type Deployment struct {
Address types.Address
ChainID uint64
Feeds []types.Address
Wat string
Bar int
}
// Registry is a wrapper around the FeedRegistry and WatRegistry contracts.
//
// It provides a single interface for querying on-chain registries.
type Registry struct {
feedRegistry *FeedRegistry
watRegistry *WatRegistry
}
func NewRegistry(feedRegistry *FeedRegistry, watRegistry *WatRegistry) (*Registry, error) {
if feedRegistry == nil {
return nil, fmt.Errorf("feed registry is nil")
}
if watRegistry == nil {
return nil, fmt.Errorf("wat registry is nil")
}
if feedRegistry.Client() != watRegistry.Client() {
return nil, fmt.Errorf("feed registry and wat registry must use the same client")
}
return &Registry{
feedRegistry: feedRegistry,
watRegistry: watRegistry,
}, nil
}
// Deployments returns a list of all deployed contracts from the WatRegistry.
func (r *Registry) Deployments(ctx context.Context) ([]Deployment, error) {
blockNumber, err := r.feedRegistry.Client().BlockNumber(ctx)
if err != nil {
return nil, fmt.Errorf("on-chain registry: %w", err)
}
feeds, err := r.feedRegistry.Feeds().Call(ctx, types.BlockNumberFromBigInt(blockNumber))
if err != nil {
return nil, fmt.Errorf("on-chain registry: %w", err)
}
wats, err := r.watRegistry.Wats().Call(ctx, types.BlockNumberFromBigInt(blockNumber))
if err != nil {
return nil, fmt.Errorf("on-chain registry: %w", err)
}
var deployments []Deployment
for _, wat := range wats {
config, err := r.watRegistry.Config(wat).Call(ctx, types.BlockNumberFromBigInt(blockNumber))
if err != nil {
return nil, fmt.Errorf("on-chain registry: %w", err)
}
chainIDs, err := r.watRegistry.Chains(wat).Call(ctx, types.BlockNumberFromBigInt(blockNumber))
if err != nil {
return nil, fmt.Errorf("on-chain registry: %w", err)
}
for _, chainID := range chainIDs {
address, err := r.watRegistry.Deployment(wat, chainID).Call(ctx, types.BlockNumberFromBigInt(blockNumber))
if err != nil {
return nil, fmt.Errorf("on-chain registry: %w", err)
}
var liftedFeeds []types.Address
for _, feed := range feeds {
if config.Bloom.Has(feed) {
liftedFeeds = append(liftedFeeds, feed)
}
}
deployments = append(deployments, Deployment{
Address: address,
ChainID: chainID,
Feeds: liftedFeeds,
Wat: wat,
Bar: config.Bar,
})
}
}
sort.Slice(deployments, func(i, j int) bool {
return bytes.Compare(deployments[i].Address.Bytes(), deployments[j].Address.Bytes()) < 0
})
return deployments, nil
}