11import Debug from "debug" ;
22import { Chain } from "../common/chain" ;
3- import { Datagram } from "../common/datagram/index" ;
3+ import { Datagram , ChannelOrdered } from "../common/datagram/index" ;
44import { delay } from "../common/util" ;
55import { getConfig } from "../common/config" ;
66import { PlatformAddress } from "codechain-primitives/lib" ;
@@ -9,6 +9,9 @@ import { strict as assert } from "assert";
99import { ConnOpenTryDatagram } from "../common/datagram/connOpenTry" ;
1010import { ConnOpenAckDatagram } from "../common/datagram/connOpenAck" ;
1111import { ConnOpenConfirmDatagram } from "../common/datagram/connOpenConfirm" ;
12+ import { ChanOpenTryDatagram } from "../common/datagram/chanOpenTry" ;
13+ import { ChanOpenAckDatagram } from "../common/datagram/chanOpenAck" ;
14+ import { ChanOpenConfirmDatagram } from "../common/datagram/chanOpenConfirm" ;
1215
1316require ( "dotenv" ) . config ( ) ;
1417
@@ -127,6 +130,21 @@ async function pendingDatagrams({
127130 counterpartyDatagramsForConnection
128131 ) ;
129132
133+ const {
134+ localDatagrams : localDatagramsForChannel ,
135+ counterpartyDatagrams : counterpartyDatagramsForChannel
136+ } = await buildChannel ( {
137+ chain,
138+ counterpartyChain,
139+ height,
140+ counterpartyChainHeight
141+ } ) ;
142+
143+ localDatagrams = localDatagrams . concat ( localDatagramsForChannel ) ;
144+ counterpartyDatagrams = counterpartyDatagrams . concat (
145+ counterpartyDatagramsForChannel
146+ ) ;
147+
130148 return { localDatagrams, counterpartyDatagrams } ;
131149}
132150
@@ -256,3 +274,74 @@ async function buildConnection({
256274
257275 return { localDatagrams, counterpartyDatagrams } ;
258276}
277+
278+ async function buildChannel ( {
279+ chain,
280+ counterpartyChain,
281+ height,
282+ counterpartyChainHeight
283+ } : {
284+ chain : Chain ;
285+ counterpartyChain : Chain ;
286+ height : number ;
287+ counterpartyChainHeight : number ;
288+ } ) {
289+ const localDatagrams : Datagram [ ] = [ ] ;
290+ const counterpartyDatagrams = [ ] ;
291+
292+ const channel = await chain . queryChannel ( height ) ;
293+ assert . notEqual ( channel , null , "Block at height exists" ) ;
294+
295+ const counterpartyChannel = await counterpartyChain . queryChannel (
296+ counterpartyChainHeight
297+ ) ;
298+ assert . notEqual ( counterpartyChannel , null , "Block at height exists" ) ;
299+
300+ if ( channel ! . data ?. state === "INIT" && counterpartyChannel ! . data == null ) {
301+ counterpartyDatagrams . push (
302+ new ChanOpenTryDatagram ( {
303+ order : ChannelOrdered ,
304+ connection :
305+ counterpartyChain . counterpartyIdentifiers . connection ,
306+ channelIdentifier :
307+ counterpartyChain . counterpartyIdentifiers . channel ,
308+ counterpartyChannelIdentifier :
309+ chain . counterpartyIdentifiers . channel ,
310+ version : "" ,
311+ counterpartyVersion : "" ,
312+ proofInit : Buffer . from ( channel ! . proof , "hex" ) ,
313+ proofHeight : height
314+ } )
315+ ) ;
316+ }
317+ if (
318+ channel ! . data ?. state === "INIT" &&
319+ counterpartyChannel ! . data ?. state === "TRYOPEN"
320+ ) {
321+ localDatagrams . push (
322+ new ChanOpenAckDatagram ( {
323+ channelIdentifier : chain . counterpartyIdentifiers . channel ,
324+ counterpartyVersion : "" ,
325+ proofTry : Buffer . from ( counterpartyChannel ! . proof , "hex" ) ,
326+ proofHeight : counterpartyChainHeight
327+ } )
328+ ) ;
329+ }
330+ if (
331+ channel ! . data ?. state === "OPEN" &&
332+ counterpartyChannel ! . data ?. state === "TRYOPEN"
333+ ) {
334+ counterpartyDatagrams . push (
335+ new ChanOpenConfirmDatagram ( {
336+ channelIdentifier :
337+ counterpartyChain . counterpartyIdentifiers . channel ,
338+ proofAck : Buffer . from ( channel ! . proof , "hex" ) ,
339+ proofHeight : height
340+ } )
341+ ) ;
342+ }
343+ return {
344+ localDatagrams,
345+ counterpartyDatagrams
346+ } ;
347+ }
0 commit comments