Skip to content

Commit c41ca12

Browse files
committed
feat: support v310
1 parent dcd0c01 commit c41ca12

File tree

12 files changed

+146
-125
lines changed

12 files changed

+146
-125
lines changed

debts/price.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func (eng *PriceHandler) GetLastPriceFeed(cm string, token string, version core.
9999
addrs := eng.repo.GetAdapterAddressByName(ds.AddressProvider)
100100
adapter := eng.repo.GetAdapter(addrs[0])
101101
obj := adapter.(*address_provider.AddressProvider)
102-
priceOracle = obj.GetPriceOracleByVersion(version)
102+
priceOracle = obj.GetPriceOracleLegacy(version)
103103
}
104104
feed := eng.poTotokenOracle[priceOracle][token]
105105
if feed != nil && eng.feedLastPrice[feed.Feed] != nil { // has feed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.23
55
// toolchain go1.23.2
66

77
require (
8-
github.com/Gearbox-protocol/sdk-go v0.0.0-20250402045914-bdea7c8cbd51
8+
github.com/Gearbox-protocol/sdk-go v0.0.0-20250402073851-44589b7f10df
99
github.com/ethereum/go-ethereum v1.13.14
1010
github.com/go-playground/validator/v10 v10.4.1
1111
github.com/google/go-cmp v0.6.0
@@ -84,6 +84,6 @@ require (
8484

8585
replace github.com/btcsuite/btcd => github.com/btcsuite/btcd v0.22.1
8686

87-
replace github.com/Gearbox-protocol/sdk-go v0.0.0-20241030045531-ad52913a6d01 => ../sdk-go
87+
replace github.com/Gearbox-protocol/sdk-go v0.0.0-20250402070712-3f6d98a522ee => ../sdk-go
8888

8989
replace github.com/ethereum/go-ethereum v1.13.14 => github.com/OffchainLabs/go-ethereum v1.13.4-0.20240313010929-e5d8587e7227

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
66
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
77
github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
88
github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
9-
github.com/Gearbox-protocol/sdk-go v0.0.0-20250402045914-bdea7c8cbd51 h1:pDuje/3LQFsGDf+1mM5SU51pthStsYUSSDr6iWveOZs=
10-
github.com/Gearbox-protocol/sdk-go v0.0.0-20250402045914-bdea7c8cbd51/go.mod h1:MZsiiSAwDdnHY6GEILYtHEqhb9wmbUUE34UBQgNlUyM=
9+
github.com/Gearbox-protocol/sdk-go v0.0.0-20250402073851-44589b7f10df h1:5El7QxuRDMNLy0uAbjICMA1Mzax/hTL8ffLM7HuF7K0=
10+
github.com/Gearbox-protocol/sdk-go v0.0.0-20250402073851-44589b7f10df/go.mod h1:MZsiiSAwDdnHY6GEILYtHEqhb9wmbUUE34UBQgNlUyM=
1111
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
1212
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
1313
github.com/OffchainLabs/go-ethereum v1.13.4-0.20240313010929-e5d8587e7227 h1:+/3TrD+q+BP36jGj2Bycdmrc/joKLNbc5ImePQzKRLM=

models/address_provider/model.go

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package address_provider
22

33
import (
4-
"fmt"
54
"sort"
65
"strconv"
76
"strings"
87

98
"github.com/Gearbox-protocol/sdk-go/core"
109
"github.com/Gearbox-protocol/sdk-go/core/schemas"
11-
"github.com/Gearbox-protocol/sdk-go/log"
1210
"github.com/Gearbox-protocol/sdk-go/utils"
1311
"github.com/Gearbox-protocol/third-eye/ds"
1412
"github.com/ethereum/go-ethereum/common"
@@ -87,23 +85,6 @@ func (mdl *AddressProvider) GetAllAddrsForLogs() []common.Address {
8785
return all
8886
}
8987

90-
func (mdl *AddressProvider) setPriceOracle() {
91-
priceOracles := mdl.getPriceOracleMap()
92-
if mdl.priceOracles == nil {
93-
for _strBlockNum, oracle := range priceOracles {
94-
oracleBlockNum, err := strconv.ParseInt(_strBlockNum, 10, 64)
95-
log.CheckFatal(err)
96-
mdl.priceOracles = append(mdl.priceOracles, blockAndOracle{
97-
blockNum: oracleBlockNum,
98-
priceOracle: schemas.PriceOracleT(oracle.(string)),
99-
})
100-
}
101-
sort.SliceStable(mdl.priceOracles, func(i, j int) bool {
102-
return mdl.priceOracles[i].blockNum < mdl.priceOracles[j].blockNum
103-
})
104-
}
105-
}
106-
10788
func (mdl *AddressProvider) GetDetailsByKey(strBlockNum string) string {
10889
blockNum, err := strconv.ParseInt(strBlockNum, 10, 64)
10990
if err != nil { // if input is not number make call on the embedded struct
@@ -117,31 +98,6 @@ func (mdl *AddressProvider) GetDetailsByKey(strBlockNum string) string {
11798
return string(mdl.priceOracles[ind-1].priceOracle)
11899
}
119100

120-
// only valid for 1,2 version , can implement for v3 but not required . After 310 , each pool has different priceoracle
121-
// and the address provider no longer register the priceoracle.
122-
func (mdl *AddressProvider) GetPriceOracleByVersion(version core.VersionType) schemas.PriceOracleT {
123-
mdl.setPriceOracle()
124-
if version.Eq(1) {
125-
return mdl.priceOracles[0].priceOracle
126-
} else if version.Eq(2) {
127-
return mdl.priceOracles[1].priceOracle
128-
}
129-
log.Fatal("only valid for 1 and 2 version")
130-
return ""
131-
}
132-
133-
func (mdl *AddressProvider) addPriceOracle(blockNum int64, priceOracle schemas.PriceOracleT) {
134-
priceOraclesMap := mdl.getPriceOracleMap()
135-
priceOraclesMap[fmt.Sprintf("%d", blockNum)] = string(priceOracle)
136-
mdl.Details["priceOracles"] = priceOraclesMap
137-
//
138-
mdl.setPriceOracle()
139-
mdl.priceOracles = append(mdl.priceOracles, blockAndOracle{
140-
blockNum: blockNum,
141-
priceOracle: priceOracle,
142-
})
143-
}
144-
145101
func (mdl *AddressProvider) getPriceOracleMap() map[string]interface{} {
146102
if mdl.Details == nil {
147103
mdl.Details = make(map[string]interface{})

models/address_provider/on_log.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (mdl *AddressProvider) v2LogParse(txLog types.Log) {
7272
switch contract {
7373
case "PRICE_ORACLE":
7474
//
75-
mdl.addPriceOracle(blockNum, schemas.PriceOracleT(address))
75+
mdl.addPriceOracleLegacy(blockNum, schemas.PriceOracleT(address))
7676
po := po_v2.NewPriceOracle(address, blockNum, mdl.SyncAdapter.Client, mdl.Repo)
7777
mdl.Repo.AddSyncAdapter(po)
7878
case "DATA_COMPRESSOR":
@@ -110,19 +110,22 @@ func (mdl *AddressProvider) OnLog(txLog types.Log) {
110110
// mdl.Details["MARKET_FACTORY"] = address // only allow authorized market configurator
111111
// }
112112
mdl.v3LogParse(txLog, contractName, address.Hex(), getRealVersion(txLog.Topics[2]))
113-
case core.Topic("CreateMarketConfigurator(address,string)"):
114-
market := common.BytesToAddress(txLog.Topics[1][:])
115-
mdl.addMarketConfig(int64(txLog.BlockNumber), market)
113+
// case core.Topic("CreateMarketConfigurator(address,string)"): // only from MARKET_CONFIGURATORS env
114+
// market := common.BytesToAddress(txLog.Topics[1][:])
115+
// mdl.addMarketConfig(int64(txLog.BlockNumber), market)
116116
}
117117
}
118118

119119
func (mdl *AddressProvider) addMarketConfig(blockNum int64, market common.Address) {
120-
conRegisterBytes, err := core.CallFuncGetSingleValue(mdl.Client, "7a0c7b21", market, 0, nil)
120+
conRegisterBytes, err := core.CallFuncGetSingleValue(mdl.Client, "7a0c7b21", market, 0, nil) // contractRegister is also set on legacy marketConfigurator//
121+
// https://etherscan.io/address/0x354fe9f450F60b8547f88BE042E4A45b46128a06#code has contractRegister, contractRegisterLegacy
121122
log.CheckFatal(err)
122123
crAddr := common.BytesToAddress(conRegisterBytes).Hex()
123124
log.Infof("Add market %s, with cr: %s", market, crAddr)
124125
// mdl.
125-
mdl.commonLogParse(blockNum, "CONTRACT_REGISTER", crAddr)
126+
cr := contract_register.NewContractRegister(crAddr, blockNum, mdl.SyncAdapter.Client, mdl.Repo)
127+
cr.Details["MARKET"] = market.Hex()
128+
mdl.Repo.AddSyncAdapter(cr)
126129
}
127130

128131
func (mdl *AddressProvider) v3LogParse(txLog types.Log, contract string, address string, realversion int16) {
@@ -159,7 +162,7 @@ func (mdl *AddressProvider) v3LogParse(txLog types.Log, contract string, address
159162
if realversion < 300 { // don't except v2,v2.10 or v1 priceOracle , why are already know from v1 addressProvider
160163
return
161164
}
162-
mdl.addPriceOracle(blockNum, schemas.PriceOracleT(address))
165+
mdl.addPriceOracleLegacy(blockNum, schemas.PriceOracleT(address))
163166
po := po_v3.NewPriceOracle(address, blockNum, mdl.SyncAdapter.Client, mdl.Repo)
164167
mdl.Repo.AddSyncAdapter(po)
165168
default:
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package address_provider
2+
3+
import (
4+
"fmt"
5+
"sort"
6+
"strconv"
7+
8+
"github.com/Gearbox-protocol/sdk-go/core"
9+
"github.com/Gearbox-protocol/sdk-go/core/schemas"
10+
"github.com/Gearbox-protocol/sdk-go/log"
11+
)
12+
13+
func (mdl *AddressProvider) setPriceOracle() {
14+
priceOracles := mdl.getPriceOracleMap()
15+
if mdl.priceOracles == nil {
16+
for _strBlockNum, oracle := range priceOracles {
17+
oracleBlockNum, err := strconv.ParseInt(_strBlockNum, 10, 64)
18+
log.CheckFatal(err)
19+
mdl.priceOracles = append(mdl.priceOracles, blockAndOracle{
20+
blockNum: oracleBlockNum,
21+
priceOracle: schemas.PriceOracleT(oracle.(string)),
22+
})
23+
}
24+
sort.SliceStable(mdl.priceOracles, func(i, j int) bool {
25+
return mdl.priceOracles[i].blockNum < mdl.priceOracles[j].blockNum
26+
})
27+
}
28+
}
29+
30+
func (mdl *AddressProvider) addPriceOracleLegacy(blockNum int64, priceOracle schemas.PriceOracleT) {
31+
priceOraclesMap := mdl.getPriceOracleMap()
32+
priceOraclesMap[fmt.Sprintf("%d", blockNum)] = string(priceOracle)
33+
mdl.Details["priceOracles"] = priceOraclesMap
34+
//
35+
mdl.setPriceOracle()
36+
mdl.priceOracles = append(mdl.priceOracles, blockAndOracle{
37+
blockNum: blockNum,
38+
priceOracle: priceOracle,
39+
})
40+
}
41+
42+
// only valid for 1,2 version , can implement for v3 but not required . After 310 , each pool has different priceoracle
43+
// and the address provider no longer register the priceoracle.
44+
func (mdl *AddressProvider) GetPriceOracleLegacy(version core.VersionType) schemas.PriceOracleT {
45+
mdl.setPriceOracle()
46+
if version.Eq(1) {
47+
return mdl.priceOracles[0].priceOracle
48+
} else if version.Eq(2) {
49+
return mdl.priceOracles[1].priceOracle
50+
}
51+
log.Fatal("only valid for 1 and 2 version")
52+
return ""
53+
}

models/contract_register/on_log.go

Lines changed: 71 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -17,59 +17,65 @@ import (
1717
"github.com/Gearbox-protocol/third-eye/models/price_oracle/po_v3"
1818
)
1919

20+
func (mdl *ContractRegister) addCM(blockNum int64, cmAddr string) {
21+
cmAdapter := mdl.Repo.GetAdapter(cmAddr)
22+
if cmAdapter == nil {
23+
cm := NewCM(cmAddr, mdl.Client, mdl.Repo, blockNum)
24+
mdl.Repo.AddSyncAdapter(cm)
25+
}
26+
}
27+
func (mdl *ContractRegister) poolToMarketAndPriceOracleRelation(blockNum int64, poolAddr, priceOracleAddr string) {
28+
marketAddr := mdl.GetDetailsByKey("MARKET")
29+
mdl.Repo.AddRelation(&schemas.Relation{
30+
Type: "MarketPool",
31+
Owner: marketAddr, //
32+
Dependent: poolAddr,
33+
BlockNum: blockNum,
34+
})
35+
mdl.Repo.AddRelation(&schemas.Relation{
36+
Type: "PoolOracle",
37+
Owner: poolAddr,
38+
Dependent: priceOracleAddr,
39+
BlockNum: blockNum,
40+
})
41+
poolAdapter := mdl.Repo.GetAdapter(poolAddr)
42+
if poolv3, ok := poolAdapter.(*pool_v3.Poolv3); ok {
43+
poolv3.State.Market = mdl.Address
44+
poolv3.State.PriceOracle = schemas.PriceOracleT(priceOracleAddr)
45+
} else {
46+
log.Fatalf("the pool by the address(%s) is not poolv3", poolAddr)
47+
}
48+
if priceOracle := mdl.Repo.GetAdapter(priceOracleAddr); priceOracle == nil {
49+
po := po_v3.NewPriceOracle(priceOracleAddr, blockNum, mdl.Client, mdl.Repo)
50+
mdl.Repo.AddSyncAdapter(po)
51+
}
52+
}
2053
func (mdl *ContractRegister) OnLog(txLog types.Log) {
2154
blockNum := int64(txLog.BlockNumber)
2255
switch txLog.Topics[0] {
2356
case core.Topic("NewPoolAdded(address)"):
2457
address := common.HexToAddress(txLog.Topics[1].Hex()).Hex()
25-
// log.Info("new pool", address)
26-
obj := NewPool(address, mdl.SyncAdapter.Client, mdl.Repo, blockNum)
27-
mdl.Repo.AddSyncAdapter(obj)
58+
mdl.addNewPool(address, blockNum, core.NULL_ADDR.Hex(), core.NULL_ADDR)
59+
//
2860
case core.Topic("NewCreditManagerAdded(address)"):
2961
address := common.HexToAddress(txLog.Topics[1].Hex()).Hex()
30-
// log.Info("new cm", address)
31-
cm := NewCM(address, mdl.SyncAdapter.Client, mdl.Repo, blockNum)
32-
mdl.Repo.AddSyncAdapter(cm)
62+
mdl.addCM(blockNum, address)
3363
// for v310
34-
case core.Topic("CreateMarket(address,address,string,string)"):
64+
case core.Topic("RegisterMarket(address,address,address)"):
3565
// create marketpool and pooloracle relations
3666
// add priceoracle adapter and add pool is not present
3767
poolAddr := common.BytesToAddress(txLog.Topics[1][:]).Hex()
38-
39-
priceOracleAddr := mdl.GetPriceOracle(poolAddr, blockNum)
40-
mdl.Repo.AddRelation(&schemas.Relation{
41-
Type: "MarketPool",
42-
Owner: mdl.Address,
43-
Dependent: poolAddr,
44-
BlockNum: blockNum,
45-
})
46-
mdl.Repo.AddRelation(&schemas.Relation{
47-
Type: "PoolOracle",
48-
Owner: poolAddr,
49-
Dependent: priceOracleAddr,
50-
BlockNum: blockNum,
51-
})
68+
priceOracleAddr := common.BytesToAddress(txLog.Topics[2][:])
69+
mdl.addNewPool(poolAddr, blockNum, mdl.GetDetailsByKey("MARKET"), priceOracleAddr)
5270
//
53-
if priceOracle := mdl.Repo.GetAdapter(priceOracleAddr); priceOracle == nil {
54-
po := po_v3.NewPriceOracle(priceOracleAddr, blockNum, mdl.Client, mdl.Repo)
55-
mdl.Repo.AddSyncAdapter(po)
56-
}
57-
//
58-
poolAdapter := mdl.Repo.GetAdapter(poolAddr)
59-
if poolAdapter == nil {
60-
pool := pool_v3.NewPool(poolAddr, mdl.Client, mdl.Repo, blockNum, mdl.Address, schemas.PriceOracleT(priceOracleAddr), 310)
61-
mdl.Repo.AddSyncAdapter(pool)
62-
} else {
63-
if poolv3, ok := poolAdapter.(*pool_v3.Poolv3); ok {
64-
poolv3.State.Market = mdl.Address
65-
poolv3.State.PriceOracle = schemas.PriceOracleT(priceOracleAddr)
66-
} else {
67-
log.Fatalf("the pool by the address(%s) is not poolv3", poolAddr)
68-
}
69-
}
70-
case core.Topic("RegisterCreditSuite(address,address)"):
71-
cm := cm_v3.NewCMv3(common.BytesToAddress(txLog.Topics[1][:]).Hex(), mdl.Client, mdl.Repo, blockNum)
72-
mdl.Repo.AddSyncAdapter(cm)
71+
mdl.poolToMarketAndPriceOracleRelation(blockNum, poolAddr, priceOracleAddr.Hex())
72+
case core.Topic("RegisterCreditSuite(address,address)"): // pool, cm
73+
cmAddr := common.BytesToAddress(txLog.Topics[2][:])
74+
mdl.addCM(blockNum, cmAddr.Hex())
75+
case core.Topic("SetPriceOracle(address,address)"): // pool, priceoracle
76+
poolAddr := common.BytesToAddress(txLog.Topics[1][:]).Hex()
77+
priceOracle := common.BytesToAddress(txLog.Topics[2][:]).Hex()
78+
mdl.poolToMarketAndPriceOracleRelation(blockNum, poolAddr, priceOracle)
7379
}
7480
}
7581

@@ -89,28 +95,33 @@ func NewCM(addr string, client core.ClientI, repo ds.RepositoryI, blockNum int64
8995
return nil
9096
}
9197

92-
func NewPool(addr string, client core.ClientI, repo ds.RepositoryI, blockNum int64) ds.SyncAdapterI {
93-
version := core.FetchVersion(addr, blockNum, client)
98+
// if already present doesn't add.
99+
func (mdl *ContractRegister) addNewPool(addr string, blockNum int64, market string, pOracle common.Address) {
100+
version := core.FetchVersion(addr, blockNum, mdl.Client)
94101
switch version {
95102
case core.NewVersion(1), core.NewVersion(2):
96-
return pool_v2.NewPool(addr, client, repo, blockNum)
103+
obj := pool_v2.NewPool(addr, mdl.Client, mdl.Repo, blockNum)
104+
mdl.Repo.AddSyncAdapter(obj)
97105
default:
98-
if version.MoreThanEq(core.NewVersion(300)) {
99-
// add pool to the lmrewards so that farm_v3 table entry can be created.
100-
adapters := repo.GetAdapterAddressByName(ds.LMRewardsv3)
101-
lmRewards := repo.GetAdapter(adapters[0])
102-
lmRewards.(*v3.LMRewardsv3).AddPoolv3(blockNum, addr)
103-
// add pool
104-
return pool_v3.NewPool(addr, client, repo, blockNum, core.NULL_ADDR.Hex(), schemas.PriceOracleT(core.NULL_ADDR.Hex()), 300)
106+
// add pool to the lmrewards so that farm_v3 table entry can be created.
107+
if mdl.Repo.GetAdapter(addr) != nil {
108+
return
105109
}
110+
adapters := mdl.Repo.GetAdapterAddressByName(ds.LMRewardsv3)
111+
lmRewards := mdl.Repo.GetAdapter(adapters[0])
112+
lmRewards.(*v3.LMRewardsv3).AddPoolv3(blockNum, addr)
113+
// add pool
114+
if pOracle == core.NULL_ADDR {
115+
po, version, err := mdl.Repo.GetActivePriceOracleByBlockNum(blockNum)
116+
if version == core.NewVersion(300) {
117+
log.Fatal()
118+
}
119+
log.CheckFatal(err)
120+
pOracle = common.HexToAddress(string(po))
121+
}
122+
obj := pool_v3.NewPool(addr, mdl.Client, mdl.Repo, blockNum, market, schemas.PriceOracleT(pOracle.Hex())) // can be 310, 300, 2, 1
123+
mdl.Repo.AddSyncAdapter(obj)
124+
//
125+
mdl.poolToMarketAndPriceOracleRelation(blockNum, addr, pOracle.Hex())
106126
}
107-
log.Fatalf("Version(%d) of pool can't be created.", version)
108-
return nil
109-
}
110-
111-
func (mdl *ContractRegister) GetPriceOracle(pool string, blockNum int64) string {
112-
hash := common.HexToHash(pool)
113-
data, err := core.CallFuncGetSingleValue(mdl.Client, "01374518", common.HexToAddress(mdl.Address), blockNum, hash[:])
114-
log.CheckFatal(err)
115-
return common.BytesToAddress(data).Hex()
116127
}

models/market_configurator/on_log.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func (mdl *MarketConfigurator) OnLog(txLog types.Log) {
4040
//
4141
poolAdapter := mdl.Repo.GetAdapter(poolAddr)
4242
if poolAdapter == nil {
43-
pool := pool_v3.NewPool(poolAddr, mdl.Client, mdl.Repo, blockNum, mdl.Address, schemas.PriceOracleT(priceOracleAddr), 310)
43+
pool := pool_v3.NewPool(poolAddr, mdl.Client, mdl.Repo, blockNum, mdl.Address, schemas.PriceOracleT(priceOracleAddr))
4444
mdl.Repo.AddSyncAdapter(pool)
4545
} else {
4646
if poolv3, ok := poolAdapter.(*pool_v3.Poolv3); ok {

0 commit comments

Comments
 (0)