From 3dc39698ae6c7232cc4b6469ba0cb3b85e73f013 Mon Sep 17 00:00:00 2001 From: fewensa <37804932+fewensa@users.noreply.github.com> Date: Thu, 2 Nov 2023 15:06:32 +0800 Subject: [PATCH] Fix relay and update to new contract (#21) * clean fixed gas limit * fix relayer relay * helpful log * fix index 100 records limit * fix syntax * fix ci * fix index query * fix relay --- packages/indexer/src/thegraph/oracle.ts | 16 +- packages/indexer/src/thegraph/ormp.ts | 98 +++- packages/indexer/src/thegraph/relayer.ts | 38 +- packages/indexer/src/thegraph/subapi.ts | 10 +- packages/indexer/src/toolkit/collection.ts | 35 ++ packages/indexer/src/types/graph.ts | 1 + packages/integration/src/abis/Ormp.json | 477 ++---------------- packages/integration/src/index.ts | 20 +- packages/relay/src/abis/OrmpRelayer.json | 9 +- packages/relay/src/client/contract_relayer.ts | 10 +- packages/relay/src/relay/oracle.ts | 2 +- packages/relay/src/relay/relayer.ts | 123 +++-- 12 files changed, 303 insertions(+), 536 deletions(-) create mode 100644 packages/indexer/src/toolkit/collection.ts diff --git a/packages/indexer/src/thegraph/oracle.ts b/packages/indexer/src/thegraph/oracle.ts index f7dcf4a..7b9d539 100644 --- a/packages/indexer/src/thegraph/oracle.ts +++ b/packages/indexer/src/thegraph/oracle.ts @@ -6,8 +6,9 @@ export class ThegraphIndexerOracle extends GraphCommon { public async allAssignedList(): Promise { const query = ` - query QueryNextOracleAssignedList { + query QueryNextOracleAssignedList($skip: Int!) { ormpOracleAssigneds( + skip: $skip orderBy: seq orderDirection: asc ) { @@ -21,7 +22,18 @@ export class ThegraphIndexerOracle extends GraphCommon { } } `; - return await super.list({query, schema: 'ormpOracleAssigneds'}); + const assignedList: OrmpOracleAssigned[] = []; + let skip = 0; + while (true) { + const variables = {skip}; + const parts: OrmpOracleAssigned[] = await super.list({query, variables, schema: 'ormpOracleAssigneds'}); + const length = parts.length; + if (length == 0) { + return assignedList; + } + assignedList.push(...parts); + skip += length; + } } public async inspectAssigned(variables: QueryNextOracleAssigned): Promise { diff --git a/packages/indexer/src/thegraph/ormp.ts b/packages/indexer/src/thegraph/ormp.ts index 15cd5ab..9e9928a 100644 --- a/packages/indexer/src/thegraph/ormp.ts +++ b/packages/indexer/src/thegraph/ormp.ts @@ -2,12 +2,14 @@ import { OrmpMessageAccepted, OrmpMessageDispatched, QueryChannelMessageAccepted, - QueryInspectMessageDispatched, QueryMessageAcceptedListByHashes, + QueryInspectMessageDispatched, + QueryMessageAcceptedListByHashes, QueryMessageHashes, QueryNextMessageAccepted, QueryPreparedMessages } from "../types/graph"; import {GraphCommon} from "./_common"; +import {CollectionKit} from "../toolkit/collection"; export class ThegraphIndexOrmp extends GraphCommon { @@ -41,6 +43,7 @@ export class ThegraphIndexOrmp extends GraphCommon { message_from message_toChainId message_to + message_gasLimit message_encoded } } @@ -49,6 +52,7 @@ export class ThegraphIndexOrmp extends GraphCommon { } public async queryMessageAcceptedListByHashes(variables: QueryMessageAcceptedListByHashes): Promise { + const msgHashesParts: string[][] = CollectionKit.split(variables.msgHashes, 100); const query = ` query QueryMessageAcceptedList($msgHashes: [String!]!) { ormpProtocolMessageAccepteds( @@ -71,17 +75,29 @@ export class ThegraphIndexOrmp extends GraphCommon { message_from message_toChainId message_to + message_gasLimit message_encoded } } `; - return await super.list({query, variables, schema: 'ormpProtocolMessageAccepteds'}); + const rets: OrmpMessageAccepted[] = []; + for (const parts of msgHashesParts) { + const _variables = {msgHashes: parts}; + const pickedAssignedMessages: OrmpMessageAccepted[] = await super.list({ + query, + variables: _variables, + schema: 'ormpProtocolMessageAccepteds', + }); + rets.push(...pickedAssignedMessages); + } + return rets; } public async messageHashes(variables: QueryMessageHashes): Promise { const query = ` - query QueryMessageAcceptedHashes($messageIndex: BigInt!) { + query QueryMessageAcceptedHashes($skip: Int!, $messageIndex: BigInt!) { ormpProtocolMessageAccepteds( + skip: $skip orderBy: message_index orderDirection: asc where: { @@ -93,12 +109,26 @@ export class ThegraphIndexOrmp extends GraphCommon { } } `; - const resp: OrmpMessageAccepted[] = await super.list({ - query, - variables, - schema: 'ormpProtocolMessageAccepteds', - }); - return resp.map(item => item.msgHash) + let skip = 0; + const rets: string[] = []; + while (true) { + const _variables = { + ...variables, + skip, + }; + const parts: OrmpMessageAccepted[] = await super.list({ + query, + variables: _variables, + schema: 'ormpProtocolMessageAccepteds', + }); + const length = parts.length; + if (length == 0) { + return rets; + } + const hashes = parts.map(item => item.msgHash); + rets.push(...hashes); + skip += length; + } } public async nextMessageAccepted(variables: QueryNextMessageAccepted): Promise { @@ -125,6 +155,7 @@ export class ThegraphIndexOrmp extends GraphCommon { message_from message_toChainId message_to + message_gasLimit message_encoded } } @@ -158,8 +189,9 @@ export class ThegraphIndexOrmp extends GraphCommon { public async queryPreparedMessageAcceptedHashes(variables: QueryPreparedMessages): Promise { const query = ` - query QueryNextMessageAccepted($messageIndex: BigInt!) { + query QueryNextMessageAccepted($skip: Int!, $messageIndex: BigInt!) { ormpProtocolMessageAccepteds( + skip: $skip orderBy: message_index orderDirection: asc where: { @@ -170,18 +202,34 @@ export class ThegraphIndexOrmp extends GraphCommon { } } `; - const preparedMessageAcceptedHashes: OrmpMessageAccepted[] = await super.list({ - query, - variables, - schema: 'ormpProtocolMessageAccepteds', - }); - return preparedMessageAcceptedHashes.map(item => item.msgHash); + + const rets: string[] = []; + let skip = 0; + while (true) { + const _variable = { + ...variables, + skip, + }; + const parts: OrmpMessageAccepted[] = await super.list({ + query, + variables: _variable, + schema: 'ormpProtocolMessageAccepteds', + }); + const length = parts.length; + if (length == 0) { + return rets; + } + const hashes = parts.map(item => item.msgHash); + rets.push(...hashes); + skip += length; + } } public async pickUnRelayedMessageHashes(msgHashes: string[]): Promise { if (!msgHashes.length) { return []; } + const msgHashesParts: string[][] = CollectionKit.split(msgHashes, 100); const query = ` query QueryLastMessageDispatched($msgHashes: [String!]!) { ormpProtocolMessageDispatcheds( @@ -195,13 +243,17 @@ export class ThegraphIndexOrmp extends GraphCommon { } } `; - const variables = {msgHashes}; - const unRelayMessages: OrmpMessageDispatched[] = await super.list({ - query, - variables, - schema: 'ormpProtocolMessageDispatcheds', - }); - const unRelayMessageHashes = unRelayMessages.map(item => item.msgHash); + const unRelayMessageHashes: string[] = []; + for (const parts of msgHashesParts) { + const variables = {msgHashes: parts}; + const unRelayMessages: OrmpMessageDispatched[] = await super.list({ + query, + variables, + schema: 'ormpProtocolMessageDispatcheds', + }); + const hashes = unRelayMessages.map(item => item.msgHash); + unRelayMessageHashes.push(...hashes); + } return msgHashes.filter(item => unRelayMessageHashes.indexOf(item) == -1); } diff --git a/packages/indexer/src/thegraph/relayer.ts b/packages/indexer/src/thegraph/relayer.ts index 6503bf9..aa9f5f7 100644 --- a/packages/indexer/src/thegraph/relayer.ts +++ b/packages/indexer/src/thegraph/relayer.ts @@ -3,13 +3,15 @@ import { QueryNextRelayerAssigned, } from "../types/graph"; import {GraphCommon} from "./_common"; +import {CollectionKit} from "../toolkit/collection"; export class ThegraphIndexerRelayer extends GraphCommon { public async allAssignedList(): Promise { const query = ` - query QueryRelayerAssignedList { + query QueryRelayerAssignedList($skip: Int!) { ormpRelayerAssigneds( + skip: $skip orderBy: seq orderDirection: asc ) { @@ -24,7 +26,18 @@ export class ThegraphIndexerRelayer extends GraphCommon { } } `; - return await super.list({query, schema: 'ormpRelayerAssigneds'}); + const assignedList: OrmpRelayerAssigned[] = []; + let skip = 0; + while (true) { + const variables = {skip}; + const parts: OrmpRelayerAssigned[] = await super.list({query, variables, schema: 'ormpRelayerAssigneds'}); + const length = parts.length; + if (length == 0) { + return assignedList; + } + assignedList.push(...parts); + skip += length; + } } public async lastAssignedMessage(): Promise { @@ -78,6 +91,8 @@ export class ThegraphIndexerRelayer extends GraphCommon { if (!msgHashes.length) { return []; } + + const msgHashesParts: string[][] = CollectionKit.split(msgHashes, 100); const query = ` query QueryRelayerAssigned($msgHashes: [String!]!) { ormpRelayerAssigneds( @@ -91,13 +106,18 @@ export class ThegraphIndexerRelayer extends GraphCommon { } } `; - const variables = {msgHashes}; - const pickedAssignedMessages: OrmpRelayerAssigned[] = await super.list({ - query, - variables, - schema: 'ormpRelayerAssigneds', - }); - return pickedAssignedMessages.map(item => item.msgHash); + const rets: string[] = []; + for (const parts of msgHashesParts) { + const variables = {msgHashes: parts}; + const pickedAssignedMessages: OrmpRelayerAssigned[] = await super.list({ + query, + variables, + schema: 'ormpRelayerAssigneds', + }); + const pamhashes: string[] = pickedAssignedMessages.map(item => item.msgHash); + rets.push(...pamhashes); + } + return rets; } } diff --git a/packages/indexer/src/thegraph/subapi.ts b/packages/indexer/src/thegraph/subapi.ts index 81e9f80..963bf61 100644 --- a/packages/indexer/src/thegraph/subapi.ts +++ b/packages/indexer/src/thegraph/subapi.ts @@ -117,11 +117,11 @@ export class ThegraphIndexerSubapi extends GraphCommon { const completeds = [] as AirnodeBeaconCompletedDistruibution[]; for (const beaconId of beacons) { const c = await this.lastAirnodeCompleted({beaconId}); - // logger.debug( - // 'queried completed events %s by %s', - // JSON.stringify(c), - // beaconId, - // ); + logger.debug( + 'queried completed events %s by %s', + JSON.stringify(c), + beaconId, + ); if (!c) continue; completeds.push(c); } diff --git a/packages/indexer/src/toolkit/collection.ts b/packages/indexer/src/toolkit/collection.ts new file mode 100644 index 0000000..10e4d2c --- /dev/null +++ b/packages/indexer/src/toolkit/collection.ts @@ -0,0 +1,35 @@ +export class CollectionKit { + public static parts(array: T[], part = 1): T[][] { + const rets = []; + const length = array.length; + const size = Math.floor(length / part); + let start = 0, end = size; + let times = 0; + for (; start < length;) { + times += 1; + const items = array.slice(start, end); + if (times === part && start < length) { + items.push(...array.slice(end, length)); + rets.push(items); + break; + } + rets.push(items); + start = end; + end += size; + } + return rets; + } + + public static split(array: T[], size = 10): T[][] { + const rets = []; + const length = array.length; + let start = 0, end = size; + for (; start < length;) { + rets.push(array.slice(start, end)); + start = end; + end += size; + } + return rets; + } + +} diff --git a/packages/indexer/src/types/graph.ts b/packages/indexer/src/types/graph.ts index 4d80ade..fbe24e4 100644 --- a/packages/indexer/src/types/graph.ts +++ b/packages/indexer/src/types/graph.ts @@ -77,6 +77,7 @@ export interface OrmpMessageAccepted extends BaseGraphEntity { message_toChainId: string message_to: string message_encoded: string + message_gasLimit: string } export interface OrmpMessageDispatched extends BaseGraphEntity { diff --git a/packages/integration/src/abis/Ormp.json b/packages/integration/src/abis/Ormp.json index e42158b..3fcb764 100644 --- a/packages/integration/src/abis/Ormp.json +++ b/packages/integration/src/abis/Ormp.json @@ -1,12 +1,6 @@ [ { - "inputs": [ - { - "internalType": "address", - "name": "dao", - "type": "address" - } - ], + "inputs": [{ "internalType": "address", "name": "dao", "type": "address" }], "stateMutability": "nonpayable", "type": "constructor" }, @@ -35,19 +29,6 @@ "name": "AppConfigUpdated", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "msgHash", - "type": "bytes32" - } - ], - "name": "ClearFailedMessage", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -65,41 +46,18 @@ }, { "components": [ - { - "internalType": "address", - "name": "channel", - "type": "address" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, + { "internalType": "address", "name": "channel", "type": "address" }, + { "internalType": "uint256", "name": "index", "type": "uint256" }, { "internalType": "uint256", "name": "fromChainId", "type": "uint256" }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "toChainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "uint256", "name": "toChainId", "type": "uint256" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }, + { "internalType": "bytes", "name": "encoded", "type": "bytes" } ], "indexed": false, "internalType": "struct Message", @@ -129,25 +87,6 @@ "name": "MessageDispatched", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "msgHash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "bool", - "name": "dispatchResult", - "type": "bool" - } - ], - "name": "RetryFailedMessage", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -171,214 +110,68 @@ "inputs": [], "name": "LOCAL_CHAINID", "outputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } + { "internalType": "uint256", "name": "chainId", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], "name": "appConfig", "outputs": [ - { - "internalType": "address", - "name": "oracle", - "type": "address" - }, - { - "internalType": "address", - "name": "relayer", - "type": "address" - } + { "internalType": "address", "name": "oracle", "type": "address" }, + { "internalType": "address", "name": "relayer", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "setter_", - "type": "address" - } + { "internalType": "address", "name": "setter_", "type": "address" } ], "name": "changeSetter", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "channel", - "type": "address" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "fromChainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "toChainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "internalType": "struct Message", - "name": "message", - "type": "tuple" - } - ], - "name": "clearFailedMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "defaultConfig", "outputs": [ - { - "internalType": "address", - "name": "oracle", - "type": "address" - }, - { - "internalType": "address", - "name": "relayer", - "type": "address" - } + { "internalType": "address", "name": "oracle", "type": "address" }, + { "internalType": "address", "name": "relayer", "type": "address" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], + "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "name": "dones", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "fails", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "toChainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" - } + { "internalType": "uint256", "name": "toChainId", "type": "uint256" }, + { "internalType": "address", "name": "ua", "type": "address" }, + { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }, + { "internalType": "bytes", "name": "encoded", "type": "bytes" }, + { "internalType": "bytes", "name": "params", "type": "bytes" } ], "name": "fee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "ua", - "type": "address" - } - ], + "inputs": [{ "internalType": "address", "name": "ua", "type": "address" }], "name": "getAppConfig", "outputs": [ { "components": [ - { - "internalType": "address", - "name": "oracle", - "type": "address" - }, - { - "internalType": "address", - "name": "relayer", - "type": "address" - } + { "internalType": "address", "name": "oracle", "type": "address" }, + { "internalType": "address", "name": "relayer", "type": "address" } ], "internalType": "struct Config", "name": "", @@ -394,16 +187,8 @@ "outputs": [ { "components": [ - { - "internalType": "address", - "name": "oracle", - "type": "address" - }, - { - "internalType": "address", - "name": "relayer", - "type": "address" - } + { "internalType": "address", "name": "oracle", "type": "address" }, + { "internalType": "address", "name": "relayer", "type": "address" } ], "internalType": "struct Config", "name": "", @@ -417,11 +202,7 @@ "inputs": [], "name": "imtBranch", "outputs": [ - { - "internalType": "bytes32[32]", - "name": "", - "type": "bytes32[32]" - } + { "internalType": "bytes32[32]", "name": "", "type": "bytes32[32]" } ], "stateMutability": "view", "type": "function" @@ -429,13 +210,7 @@ { "inputs": [], "name": "messageCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, @@ -443,11 +218,7 @@ "inputs": [], "name": "prove", "outputs": [ - { - "internalType": "bytes32[32]", - "name": "", - "type": "bytes32[32]" - } + { "internalType": "bytes32[32]", "name": "", "type": "bytes32[32]" } ], "stateMutability": "view", "type": "function" @@ -456,183 +227,57 @@ "inputs": [ { "components": [ - { - "internalType": "address", - "name": "channel", - "type": "address" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, + { "internalType": "address", "name": "channel", "type": "address" }, + { "internalType": "uint256", "name": "index", "type": "uint256" }, { "internalType": "uint256", "name": "fromChainId", "type": "uint256" }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "toChainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "uint256", "name": "toChainId", "type": "uint256" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }, + { "internalType": "bytes", "name": "encoded", "type": "bytes" } ], "internalType": "struct Message", "name": "message", "type": "tuple" }, - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" - } + { "internalType": "bytes", "name": "proof", "type": "bytes" } ], "name": "recv", "outputs": [ - { - "internalType": "bool", - "name": "dispatchResult", - "type": "bool" - } + { "internalType": "bool", "name": "dispatchResult", "type": "bool" } ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "channel", - "type": "address" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "fromChainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "toChainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - } - ], - "internalType": "struct Message", - "name": "message", - "type": "tuple" - } - ], - "name": "retryFailedMessage", - "outputs": [ - { - "internalType": "bool", - "name": "dispatchResult", - "type": "bool" - } - ], - "stateMutability": "nonpayable", + "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "root", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "uint256", - "name": "toChainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encoded", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" - } + { "internalType": "uint256", "name": "toChainId", "type": "uint256" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }, + { "internalType": "bytes", "name": "encoded", "type": "bytes" }, + { "internalType": "address", "name": "refund", "type": "address" }, + { "internalType": "bytes", "name": "params", "type": "bytes" } ], "name": "send", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "stateMutability": "payable", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "oracle", - "type": "address" - }, - { - "internalType": "address", - "name": "relayer", - "type": "address" - } + { "internalType": "address", "name": "oracle", "type": "address" }, + { "internalType": "address", "name": "relayer", "type": "address" } ], "name": "setAppConfig", "outputs": [], @@ -641,16 +286,8 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "oracle", - "type": "address" - }, - { - "internalType": "address", - "name": "relayer", - "type": "address" - } + { "internalType": "address", "name": "oracle", "type": "address" }, + { "internalType": "address", "name": "relayer", "type": "address" } ], "name": "setDefaultConfig", "outputs": [], @@ -660,13 +297,7 @@ { "inputs": [], "name": "setter", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], "stateMutability": "view", "type": "function" } diff --git a/packages/integration/src/index.ts b/packages/integration/src/index.ts index 38a043e..693825c 100644 --- a/packages/integration/src/index.ts +++ b/packages/integration/src/index.ts @@ -41,17 +41,21 @@ export class OrmpIntegrationTestProgram { const { wallet, contractOrmp } = this.lifecycle; const message = this._randomMessage(); const params = '0x0000000000000000000000000000000000000000000000000000000000000001'; + const gasLimit = 10000; const fee = await contractOrmp['fee']( - this.config.targetChainId, - wallet.getAddress(), - message, - params, + this.config.targetChainId, // toChainId + wallet.getAddress(), // ua + gasLimit, // gasLimit + message, // encoded + params, // params ); const tx = await contractOrmp['send']( - this.config.targetChainId, - wallet.getAddress(), - message, - params, + this.config.targetChainId, // toChainId + wallet.getAddress(), // to + gasLimit, // gasLimit + message, // encoded + wallet.getAddress(), // refund + params, // params {value: fee}, ); const resp = await tx.wait(); diff --git a/packages/relay/src/abis/OrmpRelayer.json b/packages/relay/src/abis/OrmpRelayer.json index 04e703a..34f7f26 100644 --- a/packages/relay/src/abis/OrmpRelayer.json +++ b/packages/relay/src/abis/OrmpRelayer.json @@ -154,8 +154,9 @@ "inputs": [ { "internalType": "uint256", "name": "toChainId", "type": "uint256" }, { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "uint256", "name": "size", "type": "uint256" }, - { "internalType": "bytes", "name": "params", "type": "bytes" } + { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }, + { "internalType": "bytes", "name": "encoded", "type": "bytes" }, + { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "fee", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], @@ -206,14 +207,14 @@ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "uint256", "name": "toChainId", "type": "uint256" }, { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "gasLimit", "type": "uint256" }, { "internalType": "bytes", "name": "encoded", "type": "bytes" } ], "internalType": "struct Message", "name": "message", "type": "tuple" }, - { "internalType": "bytes", "name": "proof", "type": "bytes" }, - { "internalType": "uint256", "name": "gasLimit", "type": "uint256" } + { "internalType": "bytes", "name": "proof", "type": "bytes" } ], "name": "relay", "outputs": [], diff --git a/packages/relay/src/client/contract_relayer.ts b/packages/relay/src/client/contract_relayer.ts index 2c2572d..41567c5 100644 --- a/packages/relay/src/client/contract_relayer.ts +++ b/packages/relay/src/client/contract_relayer.ts @@ -11,6 +11,7 @@ export interface OrmpProtocolMessage { from: string toChainId: number to: string + gasLimit: bigint encoded: string } @@ -25,25 +26,20 @@ export class RelayerContractClient { this.contract = new ethers.Contract(config.address, abi, wallet); } - public async relay(message: OrmpProtocolMessage, proof: string, gasLimit: bigint): Promise { + public async relay(message: OrmpProtocolMessage, proof: string): Promise { logger.debug( 'call %s -> relayer.relay', this.config.chainName, {target: 'ormpipe-relay', breads: ['contract', this.config.chainName]} ); - await this.contract['relay'].estimateGas( + const estimatedGas = await this.contract['relay'].estimateGas( message, proof, - gasLimit, ); const tx = await this.contract['relay']( message, proof, - gasLimit, - { - gasLimit: gasLimit + 400000n, - } ); return await tx.wait(); } diff --git a/packages/relay/src/relay/oracle.ts b/packages/relay/src/relay/oracle.ts index d7a20fe..4a7743b 100644 --- a/packages/relay/src/relay/oracle.ts +++ b/packages/relay/src/relay/oracle.ts @@ -72,7 +72,7 @@ export class OracleRelay extends CommonRelay { private async _lastAssignedMessageAccepted(): Promise { const cachedLastDeliveriedIndex = await super.storage.get(OracleRelay.CK_ORACLE_DELIVERIED); - if (cachedLastDeliveriedIndex) { + if (cachedLastDeliveriedIndex != undefined) { // query cached message count, start from last deliverd index + message count const cachedMarkAggregatedMessageCount = await super.storage.get( OracleRelay.CK_ORACLE_MARK_AGGREGATED_MESSAGE_COUNT diff --git a/packages/relay/src/relay/relayer.ts b/packages/relay/src/relay/relayer.ts index 8e9487f..2807eac 100644 --- a/packages/relay/src/relay/relayer.ts +++ b/packages/relay/src/relay/relayer.ts @@ -92,7 +92,6 @@ export class RelayerRelay extends CommonRelay { ); return undefined; } - const nextUnRelayMessageAccepted = unRelayMessageAcceptedList[0]; const sourceLastAssignedMessage = await this.sourceIndexerRelayer.lastAssignedMessage(); const sourceLastMessageAssignedAccepted = sourceLastAssignedMessage @@ -100,47 +99,62 @@ export class RelayerRelay extends CommonRelay { msgHash: sourceLastAssignedMessage.msgHash, }) : null; - const currentMessageIndex = nextUnRelayMessageAccepted.message_index; - logger.info( - 'sync status [%s,%s] (%s)', - currentMessageIndex, - sourceLastMessageAssignedAccepted?.message_index ?? -1, - super.sourceName, - super.meta('ormpipe-relay', ['relayer:relay']), - ); - const cachedLastDeliveriedIndex = await super.storage.get(RelayerRelay.CK_RELAYER_RELAIED); - if (currentMessageIndex == cachedLastDeliveriedIndex) { - logger.debug( - `the message %s already relayed to %s (queried by cache)`, + let unRelayedIndex = -1; + while (true) { + unRelayedIndex += 1; + if (unRelayMessageAcceptedList.length - 1 < unRelayedIndex) { + logger.debug( + 'not have more unrelayed message acceipte list from %s', + super.sourceName, + super.meta('ormpipe-relay', ['relayer:relay']), + ); + return; + } + const nextUnRelayMessageAccepted = unRelayMessageAcceptedList[unRelayedIndex]; + + const currentMessageIndex = nextUnRelayMessageAccepted.message_index; + logger.info( + 'sync status [%s,%s] (%s)', currentMessageIndex, - super.targetName, - super.meta('ormpipe-relay', ['relayer:relay']) + sourceLastMessageAssignedAccepted?.message_index ?? -1, + super.sourceName, + super.meta('ormpipe-relay', ['relayer:relay']), ); - return; - } - // const queriedDispatched = await this.targetIndexerOrmp.inspectMessageDispatched({ - // msgHash: nextUnRelayMessageAccepted.msgHash, - // }); - // if (queriedDispatched) { - // logger.debug( - // `the message %s already relayed to %s (queried by indexer dispatched event)`, - // currentMessageIndex, - // super.targetName, - // super.meta('ormpipe-relay', ['relayer:relay']) - // ); - // return; - // } - logger.info( - `new message accepted %s in %s(%s) prepared`, - nextUnRelayMessageAccepted.msgHash, - nextUnRelayMessageAccepted.blockNumber, - super.sourceName, - super.meta('ormpipe-relay', ['relayer:relay']) - ); + const cachedLastDeliveriedIndex = await super.storage.get(RelayerRelay.CK_RELAYER_RELAIED); + if (currentMessageIndex == cachedLastDeliveriedIndex) { + logger.debug( + `the message %s already relayed to %s (queried by cache)`, + currentMessageIndex, + super.targetName, + super.meta('ormpipe-relay', ['relayer:relay']) + ); + continue; + } + // const queriedDispatched = await this.targetIndexerOrmp.inspectMessageDispatched({ + // msgHash: nextUnRelayMessageAccepted.msgHash, + // }); + // if (queriedDispatched) { + // logger.debug( + // `the message %s already relayed to %s (queried by indexer dispatched event)`, + // currentMessageIndex, + // super.targetName, + // super.meta('ormpipe-relay', ['relayer:relay']) + // ); + // return; + // } - return nextUnRelayMessageAccepted; + logger.info( + `new message accepted %s in %s(%s) prepared`, + nextUnRelayMessageAccepted.msgHash, + nextUnRelayMessageAccepted.blockNumber, + super.sourceName, + super.meta('ormpipe-relay', ['relayer:relay']) + ); + + return nextUnRelayMessageAccepted; + } } private async run() { @@ -180,19 +194,19 @@ export class RelayerRelay extends CommonRelay { return; } - const sourceNextRelayerAssigned = await this.sourceIndexerRelayer.inspectAssigned({ - msgHash: sourceNextMessageAccepted.msgHash, - }); - if (!sourceNextRelayerAssigned) { - logger.debug( - `found new message %s(%s), but not assigned to myself, skip this message`, - sourceNextMessageAccepted.msgHash, - sourceNextMessageAccepted.message_index, - super.meta('ormpipe-relay', ['relayer:relay']) - ); - await super.storage.put(RelayerRelay.CK_RELAYER_RELAIED, sourceNextMessageAccepted.message_index); - return; - } + // const sourceNextRelayerAssigned = await this.sourceIndexerRelayer.inspectAssigned({ + // msgHash: sourceNextMessageAccepted.msgHash, + // }); + // if (!sourceNextRelayerAssigned) { + // logger.debug( + // `found new message %s(%s), but not assigned to myself, skip this message`, + // sourceNextMessageAccepted.msgHash, + // sourceNextMessageAccepted.message_index, + // super.meta('ormpipe-relay', ['relayer:relay']) + // ); + // await super.storage.put(RelayerRelay.CK_RELAYER_RELAIED, sourceNextMessageAccepted.message_index); + // return; + // } const message: OrmpProtocolMessage = { @@ -202,6 +216,7 @@ export class RelayerRelay extends CommonRelay { from: sourceNextMessageAccepted.message_from, toChainId: +sourceNextMessageAccepted.message_toChainId, to: sourceNextMessageAccepted.message_to, + gasLimit: BigInt(sourceNextMessageAccepted.message_gasLimit) + BigInt('0'), encoded: sourceNextMessageAccepted.message_encoded, }; @@ -218,9 +233,9 @@ export class RelayerRelay extends CommonRelay { const messageProof = imt.getSingleHexProof(message.index); const abiCoder = AbiCoder.defaultAbiCoder(); - const params = sourceNextRelayerAssigned.params; - const decodedGasLimit = abiCoder.decode(['uint'], params); - const gasLimit = decodedGasLimit[0]; + // const params = sourceNextRelayerAssigned.params; + // const decodedGasLimit = abiCoder.decode(['uint'], params); + // const gasLimit = decodedGasLimit[0]; const encodedProof = abiCoder.encode([ 'tuple(uint blockNumber, uint messageIndex, bytes32[32] messageProof)' @@ -240,7 +255,7 @@ export class RelayerRelay extends CommonRelay { // console.log(messageProof); // // console.log('------ relay'); - const targetTxRelayMessage = await this.targetRelayerClient.relay(message, encodedProof, gasLimit); + const targetTxRelayMessage = await this.targetRelayerClient.relay(message, encodedProof); logger.info( 'message relayed to %s {tx: %s, block: %s}', super.targetName,