diff --git a/.changeset/wet-colts-peel.md b/.changeset/wet-colts-peel.md new file mode 100644 index 0000000000..12fe8b3123 --- /dev/null +++ b/.changeset/wet-colts-peel.md @@ -0,0 +1,5 @@ +--- +"@layerzerolabs/devtools-move": patch +--- + +fix move CLI version checks diff --git a/packages/devtools-move/jest/config.test.ts b/packages/devtools-move/jest/config.test.ts new file mode 100644 index 0000000000..e6edf09072 --- /dev/null +++ b/packages/devtools-move/jest/config.test.ts @@ -0,0 +1,36 @@ +import { expect } from 'chai' +import { isVersionGreaterOrEqualTo, isVersionLessThanOrEqualTo } from '../tasks/move/utils/config' + +describe('tasks/move/utils/config', () => { + describe('isVersionGreaterOrEqualTo', () => { + it('works', () => { + expect(isVersionGreaterOrEqualTo('6.0.1', '6.0.1')).to.equal(true) + expect(isVersionGreaterOrEqualTo('6.0.1', '6.0.0')).to.equal(true) + expect(isVersionGreaterOrEqualTo('6.0.1', '5.0.0')).to.equal(true) + expect(isVersionGreaterOrEqualTo('7.5.0', '6.0.1')).to.equal(true) + expect(isVersionGreaterOrEqualTo('6.0.1', '7.0.0')).to.equal(false) + expect(isVersionGreaterOrEqualTo('5.0.0', '6.0.1')).to.equal(false) + expect(isVersionGreaterOrEqualTo('5.0.0', '7.0.0')).to.equal(false) + expect(isVersionGreaterOrEqualTo('7.0.0', '6.0.1')).to.equal(true) + expect(isVersionGreaterOrEqualTo('7.0.0', '5.0.0')).to.equal(true) + expect(isVersionGreaterOrEqualTo('7.0.0', '7.0.0')).to.equal(true) + expect(isVersionGreaterOrEqualTo('7.0.0', '8.0.0')).to.equal(false) + }) + }) + + describe('isVersionLessThanOrEqualTo', () => { + it('works', () => { + expect(isVersionLessThanOrEqualTo('6.0.1', '6.0.1')).to.equal(true) + expect(isVersionLessThanOrEqualTo('6.0.1', '6.0.0')).to.equal(false) + expect(isVersionLessThanOrEqualTo('6.0.1', '5.0.0')).to.equal(false) + expect(isVersionLessThanOrEqualTo('7.5.0', '6.0.1')).to.equal(false) + expect(isVersionLessThanOrEqualTo('6.0.1', '7.0.0')).to.equal(true) + expect(isVersionLessThanOrEqualTo('5.0.0', '6.0.1')).to.equal(true) + expect(isVersionLessThanOrEqualTo('5.0.0', '7.0.0')).to.equal(true) + expect(isVersionLessThanOrEqualTo('7.0.0', '6.0.1')).to.equal(false) + expect(isVersionLessThanOrEqualTo('7.0.0', '5.0.0')).to.equal(false) + expect(isVersionLessThanOrEqualTo('7.0.0', '7.0.0')).to.equal(true) + expect(isVersionLessThanOrEqualTo('7.0.0', '8.0.0')).to.equal(true) + }) + }) +}) diff --git a/packages/devtools-move/package.json b/packages/devtools-move/package.json index aeed6b9abd..6e78258953 100644 --- a/packages/devtools-move/package.json +++ b/packages/devtools-move/package.json @@ -30,7 +30,8 @@ "clean": "rm -rf dist", "dev": "$npm_execpath tsup --watch", "lint": "$npm_execpath eslint '**/*.{js,ts,json}'", - "lint:fix": "eslint --fix '**/*.{js,ts,json}'" + "lint:fix": "eslint --fix '**/*.{js,ts,json}'", + "test": "INITIA_CHAIN_ID=\"initiation-2\" jest" }, "dependencies": { "@types/chai": "^4.3.11", diff --git a/packages/devtools-move/tasks/move/utils/config.ts b/packages/devtools-move/tasks/move/utils/config.ts index aa37714413..7777f4e82d 100644 --- a/packages/devtools-move/tasks/move/utils/config.ts +++ b/packages/devtools-move/tasks/move/utils/config.ts @@ -314,6 +314,22 @@ async function getInitiaVersion(): Promise { }) } +async function promptVersionWarningConfirmation(): Promise { + const { shouldContinue } = await inquirer.prompt([ + { + type: 'confirm', + name: 'shouldContinue', + message: 'Are you sure you want to continue?', + default: false, + }, + ]) + + if (!shouldContinue) { + console.log('❌ Operation cancelled.') + process.exit(1) + } +} + export async function getAptosCLICommand(chain: string, stage: string): Promise { const aptosCommand = 'aptos' const version = await getAptosVersion(aptosCommand) @@ -321,16 +337,28 @@ export async function getAptosCLICommand(chain: string, stage: string): Promise< console.log('Aptos chain detected') const MIN_VERSION = '6.0.1' - if (greaterThanOrEqualTo(version, MIN_VERSION)) { + if (isVersionGreaterOrEqualTo(version, MIN_VERSION)) { console.log(`🚀 Aptos CLI version ${version} is compatible.`) + if (version !== MIN_VERSION) { + console.log( + `\x1b[33m⚠️ Warning: You are deploying to Aptos chain but your Aptos CLI version is set to "${version}".\n\n\tOur recommended and tested version is ${MIN_VERSION}. Using other versions is at your own risk and may result in unexpected behavior.\x1b[0m` + ) + await promptVersionWarningConfirmation() + } } else { throw new Error(`❌ Aptos CLI version too old. Required: ${MIN_VERSION} or newer, Found: ${version}`) } } else if (chain === 'movement') { const MAX_VERSION = '3.5.0' - if (lessThanOrEqualTo(version, MAX_VERSION)) { + if (isVersionLessThanOrEqualTo(version, MAX_VERSION)) { console.log(`🚀 Aptos CLI version ${version} is compatible.`) + if (version !== '3.5.0') { + console.log( + `\x1b[33m⚠️ Warning: You are deploying to Movement chain but your Aptos CLI version is set to "${version}".\n\n\tOur recommended and tested version is 3.5.0. Using other versions is at your own risk and may result in unexpected behavior.\x1b[0m` + ) + await promptVersionWarningConfirmation() + } } else { throw new Error(`❌ Aptos CLI version too new. Required: ${MAX_VERSION} or older, Found: ${version}`) } @@ -351,28 +379,34 @@ export async function checkInitiaCLIVersion(): Promise { } } -function greaterThanOrEqualTo(installed: string, required: string): boolean { +export function isVersionGreaterOrEqualTo(installed: string, required: string): boolean { const installedParts = installed.split('.').map(Number) const requiredParts = required.split('.').map(Number) for (let i = 0; i < 3; i++) { - if (installedParts[i] < requiredParts[i]) { + if (installedParts[i] > requiredParts[i]) { + return true + } else if (installedParts[i] < requiredParts[i]) { return false } } - // all parts are greater than or equal to the required version + + // all parts are equal to the required version return true } -function lessThanOrEqualTo(installed: string, required: string): boolean { +export function isVersionLessThanOrEqualTo(installed: string, required: string): boolean { const installedParts = installed.split('.').map(Number) const requiredParts = required.split('.').map(Number) for (let i = 0; i < 3; i++) { if (installedParts[i] > requiredParts[i]) { return false + } else if (installedParts[i] < requiredParts[i]) { + return true } } - // all parts are less than or equal to the required version + + // all parts are equal to the required version return true }