@@ -6,6 +6,9 @@ import { getConfig } from "../common/config";
66import { PlatformAddress } from "codechain-primitives/lib" ;
77import { UpdateClientDatagram } from "../common/datagram/updateClient" ;
88import { strict as assert } from "assert" ;
9+ import { ConnOpenTryDatagram } from "../common/datagram/connOpenTry" ;
10+ import { ConnOpenAckDatagram } from "../common/datagram/connOpenAck" ;
11+ import { ConnOpenConfirmDatagram } from "../common/datagram/connOpenConfirm" ;
912
1013require ( "dotenv" ) . config ( ) ;
1114
@@ -97,6 +100,21 @@ async function pendingDatagrams({
97100 } )
98101 ) ;
99102
103+ const {
104+ localDatagrams : localDatagramsForConnection ,
105+ counterpartyDatagrams : counterpartyDatagramsForConnection
106+ } = await buildConnection ( {
107+ chain,
108+ counterpartyChain,
109+ height,
110+ counterpartyChainHeight
111+ } ) ;
112+
113+ localDatagrams = localDatagrams . concat ( localDatagramsForConnection ) ;
114+ counterpartyDatagrams = counterpartyDatagrams . concat (
115+ counterpartyDatagramsForConnection
116+ ) ;
117+
100118 return { localDatagrams, counterpartyDatagrams } ;
101119}
102120
@@ -136,3 +154,94 @@ async function updateLightClient({
136154
137155 return datagrams ;
138156}
157+
158+ async function buildConnection ( {
159+ chain,
160+ counterpartyChain,
161+ height,
162+ counterpartyChainHeight
163+ } : {
164+ chain : Chain ;
165+ counterpartyChain : Chain ;
166+ height : number ;
167+ counterpartyChainHeight : number ;
168+ } ) {
169+ const localDatagrams : Datagram [ ] = [ ] ;
170+ const counterpartyDatagrams = [ ] ;
171+ const connectionIdentifiers = await chain . queryClientConnections ( height ) ;
172+
173+ assert . notEqual ( connectionIdentifiers , null , "Client should be exist" ) ;
174+ for ( const connectionIdentifier of connectionIdentifiers ! . data || [ ] ) {
175+ const client = await chain . queryClient ( height ) ;
176+ const counterpartyClient = await counterpartyChain . queryClient (
177+ counterpartyChainHeight
178+ ) ;
179+
180+ assert . strictEqual (
181+ connectionIdentifier ,
182+ chain . counterpartyIdentifiers . connection ,
183+ "PoC supports only one connection"
184+ ) ;
185+ const connectionEnd = await chain . queryConnection ( height ) ;
186+ const counterpartyConnectionEnd = await counterpartyChain . queryConnection (
187+ counterpartyChainHeight
188+ ) ;
189+ assert . notEqual (
190+ connectionEnd ! . data ,
191+ null ,
192+ "Connection exists because we acquired the identifier from RPC"
193+ ) ;
194+ if (
195+ connectionEnd ! . data ! . state === "INIT" &&
196+ counterpartyConnectionEnd ! . data == null
197+ ) {
198+ counterpartyDatagrams . push (
199+ new ConnOpenTryDatagram ( {
200+ desiredIdentifier :
201+ counterpartyChain . counterpartyIdentifiers . connection ,
202+ counterpartyConnectionIdentifier :
203+ chain . counterpartyIdentifiers . connection ,
204+ counterpartyClientIdentifier :
205+ chain . counterpartyIdentifiers . client ,
206+ clientIdentifier :
207+ counterpartyChain . counterpartyIdentifiers . client ,
208+ proofInit : Buffer . from ( connectionEnd ! . proof , "hex" ) ,
209+ proofConsensus : Buffer . alloc ( 0 ) ,
210+ proofHeight : height ,
211+ consensusHeight : client ! . data ! . number ,
212+ counterpartyPrefix : ""
213+ } )
214+ ) ;
215+ } else if (
216+ connectionEnd ! . data ! . state === "INIT" &&
217+ counterpartyConnectionEnd ! . data ! . state === "TRYOPEN"
218+ ) {
219+ localDatagrams . push (
220+ new ConnOpenAckDatagram ( {
221+ identifier : chain . counterpartyIdentifiers . connection ,
222+ proofTry : Buffer . from (
223+ counterpartyConnectionEnd ! . proof ,
224+ "hex"
225+ ) ,
226+ proofConsensus : Buffer . alloc ( 0 ) ,
227+ proofHeight : counterpartyChainHeight ,
228+ consensusHeight : counterpartyClient ! . data ! . number
229+ } )
230+ ) ;
231+ } else if (
232+ connectionEnd ! . data ! . state === "OPEN" &&
233+ counterpartyConnectionEnd ! . data ! . state === "TRYOPEN"
234+ ) {
235+ counterpartyDatagrams . push (
236+ new ConnOpenConfirmDatagram ( {
237+ identifier :
238+ counterpartyChain . counterpartyIdentifiers . connection ,
239+ proofAck : Buffer . from ( connectionEnd ! . proof , "hex" ) ,
240+ proofHeight : height
241+ } )
242+ ) ;
243+ }
244+ }
245+
246+ return { localDatagrams, counterpartyDatagrams } ;
247+ }
0 commit comments