@@ -13,6 +13,17 @@ import (
1313)
1414
1515const (
16+ advancedFlag = "advanced"
17+ sourceRPCFlag = "source-rpc"
18+ targetRPCFlag = "target-rpc"
19+ sourceFaucetFlag = "source-faucet"
20+ targetFaucetFlag = "target-faucet"
21+ sourcePortFlag = "source-port"
22+ sourceVersionFlag = "source-version"
23+ targetPortFlag = "target-port"
24+ targetVersionFlag = "target-version"
25+ orderedFlag = "ordered"
26+
1627 relayerSource = "source"
1728 relayerTarget = "target"
1829
@@ -30,6 +41,17 @@ func NewRelayerConfigure() *cobra.Command {
3041 Aliases : []string {"conf" },
3142 RunE : relayerConfigureHandler ,
3243 }
44+ c .Flags ().BoolP (advancedFlag , "a" , false , "Advanced configuration options for custom IBC modules" )
45+ c .Flags ().String (sourceRPCFlag , "" , "RPC address of the source chain" )
46+ c .Flags ().String (targetRPCFlag , "" , "RPC address of the target chain" )
47+ c .Flags ().String (sourceFaucetFlag , "" , "Faucet address of the source chain" )
48+ c .Flags ().String (targetFaucetFlag , "" , "Faucet address of the target chain" )
49+ c .Flags ().String (sourcePortFlag , "" , "IBC port ID on the source chain" )
50+ c .Flags ().String (sourceVersionFlag , "" , "Module version on the source chain" )
51+ c .Flags ().String (targetPortFlag , "" , "IBC port ID on the target chain" )
52+ c .Flags ().String (targetVersionFlag , "" , "Module version on the target chain" )
53+ c .Flags ().Bool (orderedFlag , false , "Set the channel as ordered" )
54+
3355 return c
3456}
3557
@@ -39,93 +61,183 @@ func relayerConfigureHandler(cmd *cobra.Command, args []string) error {
3961
4062 printSection ("Setting up chains" )
4163
64+ // basic configuration
4265 var (
4366 sourceRPCAddress string
4467 targetRPCAddress string
4568 sourceFaucetAddress string
4669 targetFaucetAddress string
4770 )
4871
49- if err := cliquiz .Ask (
50- cliquiz .NewQuestion ("Source RPC" ,
72+ // advanced configuration for the channel
73+ var (
74+ sourcePort string
75+ sourceVersion string
76+ targetPort string
77+ targetVersion string
78+ )
79+
80+ // questions
81+ var (
82+ questionSourceRPCAddress = cliquiz .NewQuestion (
83+ "Source RPC" ,
5184 & sourceRPCAddress ,
5285 cliquiz .DefaultAnswer (defaultSourceRPCAddress ),
5386 cliquiz .Required (),
54- ),
55- cliquiz .NewQuestion ("Source Faucet" ,
87+ )
88+ questionSourceFaucet = cliquiz .NewQuestion (
89+ "Source Faucet" ,
5690 & sourceFaucetAddress ,
57- ),
58- cliquiz .NewQuestion ("Target RPC" ,
91+ )
92+ questionTargetRPCAddress = cliquiz .NewQuestion (
93+ "Target RPC" ,
5994 & targetRPCAddress ,
6095 cliquiz .DefaultAnswer (defaultTargetRPCAddress ),
6196 cliquiz .Required (),
62- ),
63- cliquiz .NewQuestion ("Target Faucet" ,
97+ )
98+ questionTargetFaucet = cliquiz .NewQuestion (
99+ "Target Faucet" ,
64100 & targetFaucetAddress ,
65- ),
66- ); err != nil {
101+ )
102+ questionSourcePort = cliquiz .NewQuestion (
103+ "Source Port" ,
104+ & sourcePort ,
105+ cliquiz .DefaultAnswer (xrelayer .TransferPort ),
106+ cliquiz .Required (),
107+ )
108+ questionSourceVersion = cliquiz .NewQuestion (
109+ "Source Version" ,
110+ & sourceVersion ,
111+ cliquiz .DefaultAnswer (xrelayer .TransferVersion ),
112+ cliquiz .Required (),
113+ )
114+ questionTargetPort = cliquiz .NewQuestion (
115+ "Target Port" ,
116+ & targetPort ,
117+ cliquiz .DefaultAnswer (xrelayer .TransferPort ),
118+ cliquiz .Required (),
119+ )
120+ questionTargetVersion = cliquiz .NewQuestion (
121+ "Target Version" ,
122+ & targetVersion ,
123+ cliquiz .DefaultAnswer (xrelayer .TransferVersion ),
124+ cliquiz .Required (),
125+ )
126+ )
127+
128+ // Get flags
129+ advanced , err := cmd .Flags ().GetBool (advancedFlag )
130+ if err != nil {
131+ return err
132+ }
133+ sourceRPCAddress , err = cmd .Flags ().GetString (sourceRPCFlag )
134+ if err != nil {
135+ return err
136+ }
137+ sourceFaucetAddress , err = cmd .Flags ().GetString (sourceFaucetFlag )
138+ if err != nil {
139+ return err
140+ }
141+ targetRPCAddress , err = cmd .Flags ().GetString (targetRPCFlag )
142+ if err != nil {
143+ return err
144+ }
145+ targetFaucetAddress , err = cmd .Flags ().GetString (targetFaucetFlag )
146+ if err != nil {
147+ return err
148+ }
149+ sourcePort , err = cmd .Flags ().GetString (sourcePortFlag )
150+ if err != nil {
151+ return err
152+ }
153+ sourceVersion , err = cmd .Flags ().GetString (sourceVersionFlag )
154+ if err != nil {
155+ return err
156+ }
157+ targetPort , err = cmd .Flags ().GetString (targetPortFlag )
158+ if err != nil {
159+ return err
160+ }
161+ targetVersion , err = cmd .Flags ().GetString (targetVersionFlag )
162+ if err != nil {
163+ return err
164+ }
165+ ordered , err := cmd .Flags ().GetBool (orderedFlag )
166+ if err != nil {
67167 return err
68168 }
69169
70- fmt .Println ()
71- s .SetText ("Fetching chain info..." )
170+ var questions []cliquiz.Question
72171
73- init := func (name , rpcAddr , faucetAddr string ) (* xrelayer.Chain , error ) {
74- defer s .Stop ()
75- s .SetText ("Initializing chain..." ).Start ()
172+ // get information from prompt if flag not provided
173+ if sourceRPCAddress == "" {
174+ questions = append (questions , questionSourceRPCAddress )
175+ }
176+ if sourceFaucetAddress == "" {
177+ questions = append (questions , questionSourceFaucet )
178+ }
179+ if targetRPCAddress == "" {
180+ questions = append (questions , questionTargetRPCAddress )
181+ }
182+ if targetFaucetAddress == "" {
183+ questions = append (questions , questionTargetFaucet )
184+ }
76185
77- c , err := xrelayer .NewChain (cmd .Context (), rpcAddr , xrelayer .WithFaucet (faucetAddr ))
78- if err != nil {
79- return nil , errors .Wrapf (err , "cannot resolve %s" , name )
186+ // advanced information
187+ if advanced {
188+ if sourcePort == "" {
189+ questions = append (questions , questionSourcePort )
80190 }
81-
82- account , err := c .Account (cmd .Context ())
83- if err != nil {
84- return nil , err
191+ if sourceVersion == "" {
192+ questions = append (questions , questionSourceVersion )
85193 }
86-
87- s .Stop ()
88-
89- fmt .Printf ("🔐 Account on %q is %q\n \n " , name , account .Address )
90- s .
91- SetCharset (spinner .CharSets [9 ]).
92- SetColor ("white" ).
93- SetPrefix (" |·" ).
94- SetText (color .Yellow .Sprintf ("trying to receive tokens from a faucet..." )).
95- Start ()
96-
97- err = c .TryFaucet (cmd .Context ())
98- s .Stop ()
99-
100- fmt .Print (" |· " )
101- if err != nil {
102- fmt .Println (color .Yellow .Sprintf (err .Error ()))
103- } else {
104- fmt .Println (color .Green .Sprintf ("received coins from a faucet" ))
194+ if targetPort == "" {
195+ questions = append (questions , questionTargetPort )
105196 }
106-
107- coins , err := c .Balance (cmd .Context ())
108- if err != nil {
109- return nil , err
197+ if targetVersion == "" {
198+ questions = append (questions , questionTargetVersion )
110199 }
111- fmt . Printf ( " |· (balance: %s) \n \n " , coins )
200+ }
112201
113- return c , nil
202+ if len (questions ) > 0 {
203+ if err := cliquiz .Ask (questions ... ); err != nil {
204+ return err
205+ }
114206 }
115207
116- sourceChain , err := init (relayerSource , sourceRPCAddress , sourceFaucetAddress )
208+ fmt .Println ()
209+ s .SetText ("Fetching chain info..." )
210+
211+ // initialize the chains
212+ sourceChain , err := initChain (cmd , s , relayerSource , sourceRPCAddress , sourceFaucetAddress )
117213 if err != nil {
118214 return err
119215 }
120216
121- targetChain , err := init ( relayerTarget , targetRPCAddress , targetFaucetAddress )
217+ targetChain , err := initChain ( cmd , s , relayerTarget , targetRPCAddress , targetFaucetAddress )
122218 if err != nil {
123219 return err
124220 }
125221
126222 s .SetText ("Configuring..." ).Start ()
127223
128- connectionID , err := sourceChain .Connect (cmd .Context (), targetChain )
224+ // sets advanced channel options
225+ var channelOptions []xrelayer.ChannelOption
226+ if advanced {
227+ channelOptions = append (channelOptions ,
228+ xrelayer .SourcePort (sourcePort ),
229+ xrelayer .SourceVersion (sourceVersion ),
230+ xrelayer .TargetPort (targetPort ),
231+ xrelayer .TargetVersion (targetVersion ),
232+ )
233+
234+ if ordered {
235+ channelOptions = append (channelOptions , xrelayer .Ordered ())
236+ }
237+ }
238+
239+ // create the connection configuration
240+ connectionID , err := sourceChain .Connect (cmd .Context (), targetChain , channelOptions ... )
129241 if err != nil {
130242 return err
131243 }
@@ -136,3 +248,47 @@ func relayerConfigureHandler(cmd *cobra.Command, args []string) error {
136248
137249 return nil
138250}
251+
252+ // initChain initializes chain information for the relayer connection
253+ func initChain (cmd * cobra.Command , s * clispinner.Spinner , name , rpcAddr , faucetAddr string ) (* xrelayer.Chain , error ) {
254+ defer s .Stop ()
255+ s .SetText ("Initializing chain..." ).Start ()
256+
257+ c , err := xrelayer .NewChain (cmd .Context (), rpcAddr , xrelayer .WithFaucet (faucetAddr ))
258+ if err != nil {
259+ return nil , errors .Wrapf (err , "cannot resolve %s" , name )
260+ }
261+
262+ account , err := c .Account (cmd .Context ())
263+ if err != nil {
264+ return nil , err
265+ }
266+
267+ s .Stop ()
268+
269+ fmt .Printf ("🔐 Account on %q is %q\n \n " , name , account .Address )
270+ s .
271+ SetCharset (spinner .CharSets [9 ]).
272+ SetColor ("white" ).
273+ SetPrefix (" |·" ).
274+ SetText (color .Yellow .Sprintf ("trying to receive tokens from a faucet..." )).
275+ Start ()
276+
277+ err = c .TryFaucet (cmd .Context ())
278+ s .Stop ()
279+
280+ fmt .Print (" |· " )
281+ if err != nil {
282+ fmt .Println (color .Yellow .Sprintf (err .Error ()))
283+ } else {
284+ fmt .Println (color .Green .Sprintf ("received coins from a faucet" ))
285+ }
286+
287+ coins , err := c .Balance (cmd .Context ())
288+ if err != nil {
289+ return nil , err
290+ }
291+ fmt .Printf (" |· (balance: %s)\n \n " , coins )
292+
293+ return c , nil
294+ }
0 commit comments