-
Notifications
You must be signed in to change notification settings - Fork 36
/
band_ibc.go
129 lines (102 loc) · 2.82 KB
/
band_ibc.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package types
import (
"fmt"
bandobi "github.com/bandprotocol/bandchain-packet/obi"
bandPacket "github.com/bandprotocol/bandchain-packet/packet"
bandprice "github.com/InjectiveLabs/sdk-go/chain/oracle/bandchain/hooks/price"
)
func NewOracleRequestPacketData(clientID string, calldata []byte, r *BandOracleRequest) bandPacket.OracleRequestPacketData {
return bandPacket.OracleRequestPacketData{
ClientID: clientID,
OracleScriptID: uint64(r.OracleScriptId),
Calldata: calldata,
AskCount: r.AskCount,
MinCount: r.MinCount,
FeeLimit: r.FeeLimit,
PrepareGas: r.PrepareGas,
ExecuteGas: r.ExecuteGas,
}
}
// GetCalldata gets the Band IBC request call data based on the symbols and multiplier.
func (r *BandOracleRequest) GetCalldata(legacyScheme bool) []byte {
if legacyScheme {
return bandobi.MustEncode(bandprice.Input{
Symbols: r.Symbols,
Multiplier: BandPriceMultiplier,
})
}
return bandobi.MustEncode(bandprice.SymbolInput{
Symbols: r.Symbols,
MinimumSourceCount: uint8(r.MinSourceCount),
})
}
func DecodeOracleInput(data []byte) (OracleInput, error) {
var (
legacyInput LegacyBandInput
newInput BandInput
err error
)
if err = bandobi.Decode(data, &legacyInput); err == nil {
return legacyInput, nil
}
if err = bandobi.Decode(data, &newInput); err == nil {
return newInput, nil
}
return nil, fmt.Errorf("failed to decode oracle input: %w", err)
}
func DecodeOracleOutput(data []byte) (OracleOutput, error) {
var (
legacyOutput LegacyBandOutput
newOutput BandOutput
err error
)
if err = bandobi.Decode(data, &legacyOutput); err == nil {
return legacyOutput, nil
}
if err = bandobi.Decode(data, &newOutput); err == nil {
return newOutput, nil
}
return nil, fmt.Errorf("failed to decode oracle output: %w", err)
}
// it is assumed that the id of a symbol
// within OracleInput exists within OracleOutput
type OracleInput interface {
PriceSymbols() []string
PriceMultiplier() uint64
}
type (
LegacyBandInput bandprice.Input
BandInput bandprice.SymbolInput
)
func (in LegacyBandInput) PriceSymbols() []string {
return in.Symbols
}
func (in LegacyBandInput) PriceMultiplier() uint64 {
return in.Multiplier
}
func (in BandInput) PriceSymbols() []string {
return in.Symbols
}
func (in BandInput) PriceMultiplier() uint64 {
return BandPriceMultiplier
}
type OracleOutput interface {
Rate(id int) uint64
Valid(id int) bool
}
type (
LegacyBandOutput bandprice.Output
BandOutput bandprice.SymbolOutput
)
func (out LegacyBandOutput) Rate(id int) uint64 {
return out.Pxs[id]
}
func (out LegacyBandOutput) Valid(id int) bool {
return true
}
func (out BandOutput) Rate(id int) uint64 {
return out.Responses[id].Rate
}
func (out BandOutput) Valid(id int) bool {
return out.Responses[id].ResponseCode == 0
}