Skip to content

Commit a4480a4

Browse files
author
Park Juhyung
committed
Build a channel
1 parent fe2ed76 commit a4480a4

File tree

3 files changed

+95
-2
lines changed

3 files changed

+95
-2
lines changed

ibc.ts/src/common/chain.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ export class Chain {
130130
public async queryChannel(
131131
blockNumber?: number
132132
): Promise<IBCQueryResult<ChannelEnd> | null> {
133-
return this.sdk.rpc.sendRpcRequest("", [
133+
return this.sdk.rpc.sendRpcRequest("ibc_query_channel_end", [
134+
"DEFAULT_PORT",
134135
this.counterpartyIdentifiers.channel,
135136
blockNumber
136137
]);

ibc.ts/src/common/datagram/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@ export interface Datagram {
22
rlpBytes(): Buffer;
33
toEncodeObject(): any[];
44
}
5+
6+
export const ChannelOrdered = 0;
7+
export const ChannelUnordered = 1;

ibc.ts/src/relayer/index.ts

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Debug from "debug";
22
import { Chain } from "../common/chain";
3-
import { Datagram } from "../common/datagram/index";
3+
import { Datagram, ChannelOrdered } from "../common/datagram/index";
44
import { delay } from "../common/util";
55
import { getConfig } from "../common/config";
66
import { PlatformAddress } from "codechain-primitives/lib";
@@ -9,6 +9,9 @@ import { strict as assert } from "assert";
99
import { ConnOpenTryDatagram } from "../common/datagram/connOpenTry";
1010
import { ConnOpenAckDatagram } from "../common/datagram/connOpenAck";
1111
import { 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

1316
require("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

Comments
 (0)