Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"@layerzerolabs/io-devtools": "~0.3.0"
},
"patchedDependencies": {
"@layerzerolabs/protocol-devtools-evm@5.0.1": "patches/@layerzerolabs__protocol-devtools-evm@5.0.1.patch",
"@matterlabs/hardhat-zksync-deploy@0.9.0": "patches/@matterlabs__hardhat-zksync-deploy@0.9.0.patch",
"hardhat-contract-sizer@2.10.0": "patches/hardhat-contract-sizer@2.10.0.patch"
}
Expand Down
8 changes: 4 additions & 4 deletions packages/stg-devtools-evm-hardhat-v2/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@
},
"devDependencies": {
"@layerzerolabs/devtools": "~1.0.1",
"@layerzerolabs/devtools-evm": "~3.0.2",
"@layerzerolabs/devtools-evm": "3.0.0",
"@layerzerolabs/devtools-evm-hardhat": "^4.0.0",
"@layerzerolabs/io-devtools": "~0.1.13",
"@layerzerolabs/lz-definitions": "~3.0.18",
"@layerzerolabs/lz-v2-utilities": "~3.0.18",
"@layerzerolabs/protocol-devtools": "~3.0.2",
"@layerzerolabs/protocol-devtools-evm": "~5.0.3",
"@layerzerolabs/protocol-devtools-evm": "5.0.1",
"@layerzerolabs/typescript-config-next": "~3.0.7",
"@layerzerolabs/ua-devtools": "~1.0.5",
"@layerzerolabs/ua-devtools-evm": "~3.0.1",
Expand All @@ -48,13 +48,13 @@
},
"peerDependencies": {
"@layerzerolabs/devtools": "~1.0.1",
"@layerzerolabs/devtools-evm": "~3.0.2",
"@layerzerolabs/devtools-evm": "~3.0.0",
"@layerzerolabs/devtools-evm-hardhat": "^4.0.0",
"@layerzerolabs/io-devtools": "^0.1.11",
"@layerzerolabs/lz-definitions": "~3.0.18",
"@layerzerolabs/lz-v2-utilities": "~3.0.18",
"@layerzerolabs/protocol-devtools": "~3.0.2",
"@layerzerolabs/protocol-devtools-evm": "~5.0.3",
"@layerzerolabs/protocol-devtools-evm": "~5.0.1",
"@layerzerolabs/ua-devtools": "^0.3.20",
"@layerzerolabs/ua-devtools-evm": "^0.3.15",
"@layerzerolabs/ua-devtools-evm-hardhat": "^0.3.19",
Expand Down
2 changes: 2 additions & 0 deletions packages/stg-evm-v2/devtools/tasks/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,5 @@ export const TASK_STG_CHECK_REWARDER = `stg:check::rewarder`
export const TASK_STG_CHECK_OFT_WRAPPER = `stg:check::oft-wrapper`

export const TASK_STG_PROPOSE_WITHDRAW_TREASURY_FEE = `stg:propose:withdraw-treasury-fee`

export const TASK_STG_PROPOSE_TRANSACTIONS = `stg:propose:transactions`
1 change: 1 addition & 0 deletions packages/stg-evm-v2/devtools/tasks/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ import {
TASK_STG_WIRE_TOKEN_MESSAGING_INITIALIZE_STORAGE,
TASK_STG_WIRE_TREASURER,
} from './constants'
import './proposeTransactions'
import './treasuryFee/proposeWithdrawTreasuryFee'
import { checkResult } from './utils'

Expand Down
105 changes: 105 additions & 0 deletions packages/stg-evm-v2/devtools/tasks/proposeTransactions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import { readFileSync } from 'fs'
import { join } from 'path'

import { task } from 'hardhat/config'

import { SUBTASK_LZ_SIGN_AND_SEND, createGnosisSignerFactory } from '@layerzerolabs/devtools-evm-hardhat'

import { createOneSigSignerFactory } from '../onesig'

import { TASK_STG_PROPOSE_TRANSACTIONS } from './constants'

import type { OmniTransaction, SignAndSendResult } from '@layerzerolabs/devtools'
import type { SignerDefinition } from '@layerzerolabs/devtools-evm'
import type { SignAndSendTaskArgs } from '@layerzerolabs/devtools-evm-hardhat/tasks'

const DEFAULT_TRANSACTIONS_PATH = join(process.cwd(), 'transactions.json')

const DEPLOYER_SIGNER: SignerDefinition = { type: 'named', name: 'deployer' }

interface RawOmniTransaction {
point: {
eid: number
address: string
}
data: string
value?: string
description?: string
}

function loadTransactions(filePath: string): OmniTransaction[] {
const raw = readFileSync(filePath, 'utf8')
const parsed: unknown = JSON.parse(raw)

if (!Array.isArray(parsed)) {
throw new Error(`Invalid JSON: expected top-level array of transactions (file: ${filePath})`)
}

return parsed.map((entry: RawOmniTransaction, i: number) => {
const label = `transactions[${i}]`

if (typeof entry.point?.eid !== 'number') {
throw new Error(`${label}: point.eid must be a number`)
}
if (typeof entry.point?.address !== 'string' || !entry.point.address) {
Comment on lines +38 to +44
throw new Error(`${label}: point.address must be a non-empty string`)
}
Comment on lines +44 to +46
if (typeof entry.data !== 'string') {
throw new Error(`${label}: data must be a hex string`)
}
Comment on lines +47 to +49

const tx: OmniTransaction = {
point: { eid: entry.point.eid, address: entry.point.address },
data: entry.data,
}

if (entry.value !== undefined) {
tx.value = BigInt(entry.value)
}
Comment on lines +56 to +58

if (entry.description !== undefined) {
tx.description = entry.description
}

return tx
})
}

interface TaskArgs {
transactionsPath: string
safe: boolean
onesig: boolean
}

task(TASK_STG_PROPOSE_TRANSACTIONS, 'Propose transactions from a JSON file via Safe or OneSig')
.addOptionalParam('transactionsPath', 'Path to the transactions JSON file', DEFAULT_TRANSACTIONS_PATH)
.addFlag('safe', 'Sign with Gnosis Safe')
.addFlag('onesig', 'Sign with OneSig')
.setAction(async (args: TaskArgs, hre) => {
if (args.safe === args.onesig) {
throw new Error('Specify exactly one of --safe or --onesig')
}

const transactions = loadTransactions(args.transactionsPath)

if (transactions.length === 0) {
throw new Error(`No transactions found in ${args.transactionsPath}`)
}

const createSigner: SignAndSendTaskArgs['createSigner'] = args.safe
? createGnosisSignerFactory(DEPLOYER_SIGNER)
: createOneSigSignerFactory(DEPLOYER_SIGNER)

const signAndSendResult: SignAndSendResult = await hre.run(SUBTASK_LZ_SIGN_AND_SEND, {
transactions,
ci: process.env.CI === 'true',
createSigner,
} satisfies SignAndSendTaskArgs)

const [, failed] = signAndSendResult
if (failed.length !== 0) {
process.exitCode = process.exitCode || 1
}

return signAndSendResult
})
4 changes: 2 additions & 2 deletions packages/stg-evm-v2/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,13 @@
"@ethersproject/hash": "~5.7.0",
"@ethersproject/providers": "~5.7.2",
"@layerzerolabs/devtools": "~2.0.1",
"@layerzerolabs/devtools-evm": "~3.0.2",
"@layerzerolabs/devtools-evm": "3.0.0",
"@layerzerolabs/devtools-evm-hardhat": "^4.0.0",
"@layerzerolabs/export-deployments": "~0.0.14",
"@layerzerolabs/io-devtools": "~0.1.13",
"@layerzerolabs/lz-evm-sdk-v1": "~3.0.18",
"@layerzerolabs/protocol-devtools": "~3.0.2",
"@layerzerolabs/protocol-devtools-evm": "~5.0.3",
"@layerzerolabs/protocol-devtools-evm": "5.0.1",
"@layerzerolabs/solidity-examples": "^1.1.0",
"@layerzerolabs/test-devtools": "~0.2.9",
"@layerzerolabs/toolbox-foundry": "~0.1.7",
Expand Down
58 changes: 58 additions & 0 deletions patches/@layerzerolabs__protocol-devtools-evm@5.0.1.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
diff --git a/dist/index.js b/dist/index.js
index b981c536631542a1bb86d3dbb4f96e3a04509581..c4d748a372ad331fe39e09606b657c5f67d2796a 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -6988,13 +6988,18 @@ var EndpointV2 = class extends devtoolsEvm.OmniSDK {
}
async setConfig(oapp, uln, setConfigParam) {
this.logger.debug(`Setting config for OApp ${oapp} to ULN ${uln} with config ${ioDevtools.printJson(setConfigParam)}`);
- const data = this.contract.contract.interface.encodeFunctionData("setConfig", [oapp, uln, setConfigParam]);
- return [
- {
+ const CONFIG_BATCH_SIZE = 10;
+ const chunks = [];
+ for (let i = 0; i < setConfigParam.length; i += CONFIG_BATCH_SIZE) {
+ chunks.push(setConfigParam.slice(i, i + CONFIG_BATCH_SIZE));
+ }
+ return chunks.map((chunk) => {
+ const data = this.contract.contract.interface.encodeFunctionData("setConfig", [oapp, uln, chunk]);
+ return {
...this.createTransaction(data),
- description: `Setting config for ULN ${uln} to ${ioDevtools.printJson(setConfigParam)}`
- }
- ];
+ description: `Setting config for ULN ${uln} to ${ioDevtools.printJson(chunk)}`
+ };
+ });
}
async setUlnConfig(oapp, uln, setUlnConfig) {
this.logger.debug(`Setting ULN config for OApp ${oapp} to ULN ${uln} with config ${ioDevtools.printJson(setUlnConfig)}`);
diff --git a/dist/index.mjs b/dist/index.mjs
index ab36c7c3acbc2591ba9e0e0402dc0aba643a4bfa..0996c8ce02b89c8721c768222a726f529ec9e1c4 100644
--- a/dist/index.mjs
+++ b/dist/index.mjs
@@ -6981,13 +6981,18 @@ var EndpointV2 = class extends OmniSDK {
}
async setConfig(oapp, uln, setConfigParam) {
this.logger.debug(`Setting config for OApp ${oapp} to ULN ${uln} with config ${printJson(setConfigParam)}`);
- const data = this.contract.contract.interface.encodeFunctionData("setConfig", [oapp, uln, setConfigParam]);
- return [
- {
+ const CONFIG_BATCH_SIZE = 10;
+ const chunks = [];
+ for (let i = 0; i < setConfigParam.length; i += CONFIG_BATCH_SIZE) {
+ chunks.push(setConfigParam.slice(i, i + CONFIG_BATCH_SIZE));
+ }
+ return chunks.map((chunk) => {
+ const data = this.contract.contract.interface.encodeFunctionData("setConfig", [oapp, uln, chunk]);
+ return {
...this.createTransaction(data),
- description: `Setting config for ULN ${uln} to ${printJson(setConfigParam)}`
- }
- ];
+ description: `Setting config for ULN ${uln} to ${printJson(chunk)}`
+ };
+ });
}
async setUlnConfig(oapp, uln, setUlnConfig) {
this.logger.debug(`Setting ULN config for OApp ${oapp} to ULN ${uln} with config ${printJson(setUlnConfig)}`);
Loading
Loading