99
1010 "github.com/xssnick/tonutils-go/address"
1111 "github.com/xssnick/tonutils-go/ton"
12+ "github.com/xssnick/tonutils-go/tvm/cell"
1213
14+ "github.com/smartcontractkit/chainlink-ton/pkg/bindings/mcms/mcms"
1315 "github.com/smartcontractkit/mcms/sdk"
1416 "github.com/smartcontractkit/mcms/types"
1517)
@@ -24,15 +26,67 @@ type Inspector struct {
2426}
2527
2628// NewInspector creates a new Inspector for EVM chains
27- func NewInspector (client ton.APIClientWrapped , configTransformer ConfigTransformer ) * Inspector {
29+ func NewInspector (client ton.APIClientWrapped , configTransformer ConfigTransformer ) sdk. Inspector {
2830 return & Inspector {
2931 client : client ,
3032 configTransformer : configTransformer ,
3133 }
3234}
3335
34- func (i * Inspector ) GetConfig (ctx context.Context , address string ) (* types.Config , error ) {
35- return nil , fmt .Errorf ("not implemented" )
36+ func (i * Inspector ) GetConfig (ctx context.Context , _address string ) (* types.Config , error ) {
37+ // Map to Ton Address type (mcms.address)
38+ addr , err := address .ParseAddr (_address )
39+ if err != nil {
40+ return nil , fmt .Errorf ("invalid mcms address: %w" , err )
41+ }
42+
43+ // TODO: mv and import from github.com/smartcontractkit/chainlink-ton/bindings/mcms/mcms
44+ block , err := i .client .CurrentMasterchainInfo (ctx )
45+ if err != nil {
46+ return nil , fmt .Errorf ("failed to get current masterchain info: %w" , err )
47+ }
48+
49+ r , err := i .client .RunGetMethod (ctx , block , addr , "getConfig" )
50+ if err != nil {
51+ return nil , fmt .Errorf ("error getting getConfig: %w" , err )
52+ }
53+
54+ rc0 , err := r .Cell (0 )
55+ if err != nil {
56+ return nil , fmt .Errorf ("error getting Config.Signers cell(0): %w" , err )
57+ }
58+
59+ keySz := uint (8 )
60+ signers := cell .NewDict (keySz )
61+ if rc0 != nil {
62+ signers = rc0 .AsDict (keySz )
63+ }
64+
65+ rc1 , err := r .Cell (1 )
66+ if err != nil {
67+ return nil , fmt .Errorf ("error getting Config.GroupQuorums cell(1): %w" , err )
68+ }
69+
70+ groupQuorums := cell .NewDict (keySz )
71+ if rc0 != nil {
72+ groupQuorums = rc1 .AsDict (keySz )
73+ }
74+
75+ rc2 , err := r .Cell (2 )
76+ if err != nil {
77+ return nil , fmt .Errorf ("error getting Config.GroupParents cell(2): %w" , err )
78+ }
79+
80+ groupParents := cell .NewDict (keySz )
81+ if rc0 != nil {
82+ groupParents = rc2 .AsDict (keySz )
83+ }
84+
85+ return i .configTransformer .ToConfig (mcms.Config {
86+ Signers : signers ,
87+ GroupQuorums : groupQuorums ,
88+ GroupParents : groupParents ,
89+ })
3690}
3791
3892func (i * Inspector ) GetOpCount (ctx context.Context , _address string ) (uint64 , error ) {
@@ -48,21 +102,48 @@ func (i *Inspector) GetOpCount(ctx context.Context, _address string) (uint64, er
48102 return 0 , fmt .Errorf ("failed to get current masterchain info: %w" , err )
49103 }
50104
51- result , err := i .client .RunGetMethod (ctx , block , addr , "getOpCount" )
105+ r , err := i .client .RunGetMethod (ctx , block , addr , "getOpCount" )
52106 if err != nil {
53107 return 0 , fmt .Errorf ("error getting getOpCount: %w" , err )
54108 }
55109
56- rs , err := result . Slice (0 )
110+ ri , err := r . Int (0 )
57111 if err != nil {
58112 return 0 , fmt .Errorf ("error getting opCount slice: %w" , err )
59113 }
60114
61- return rs . LoadUInt ( 64 )
115+ return ri . Uint64 (), nil
62116}
63117
64- func (i * Inspector ) GetRoot (ctx context.Context , address string ) (common.Hash , uint32 , error ) {
65- return common.Hash {}, 0 , fmt .Errorf ("not implemented" )
118+ func (i * Inspector ) GetRoot (ctx context.Context , _address string ) (common.Hash , uint32 , error ) {
119+ // Map to Ton Address type (mcms.address)
120+ addr , err := address .ParseAddr (_address )
121+ if err != nil {
122+ return [32 ]byte {}, 0 , fmt .Errorf ("invalid mcms address: %w" , err )
123+ }
124+
125+ // TODO: mv and import from github.com/smartcontractkit/chainlink-ton/bindings/mcms/mcms
126+ block , err := i .client .CurrentMasterchainInfo (ctx )
127+ if err != nil {
128+ return [32 ]byte {}, 0 , fmt .Errorf ("failed to get current masterchain info: %w" , err )
129+ }
130+
131+ r , err := i .client .RunGetMethod (ctx , block , addr , "getRoot" )
132+ if err != nil {
133+ return [32 ]byte {}, 0 , fmt .Errorf ("error getting getRoot: %w" , err )
134+ }
135+
136+ root , err := r .Int (0 )
137+ if err != nil {
138+ return [32 ]byte {}, 0 , fmt .Errorf ("error getting Int(0) - root: %w" , err )
139+ }
140+
141+ validUntil , err := r .Int (1 )
142+ if err != nil {
143+ return [32 ]byte {}, 0 , fmt .Errorf ("error getting Int(1) - validUntil: %w" , err )
144+ }
145+
146+ return common .Hash (root .Bytes ()), uint32 (validUntil .Uint64 ()), nil
66147}
67148
68149func (i * Inspector ) GetRootMetadata (ctx context.Context , _address string ) (types.ChainMetadata , error ) {
@@ -94,7 +175,7 @@ func (i *Inspector) GetRootMetadata(ctx context.Context, _address string) (types
94175 rs .LoadBigInt (256 )
95176 rs .LoadAddr ()
96177
97- preOpCount , err = rs .LoadBigUInt (64 )
178+ preOpCount , err = rs .LoadBigUInt (40 )
98179 if err != nil {
99180 return types.ChainMetadata {}, fmt .Errorf ("error getting preOpCount: %w" , err )
100181 }
0 commit comments