Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add verify feature #194

Merged
merged 13 commits into from
Feb 12, 2024
29 changes: 12 additions & 17 deletions src/commands/check/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,12 @@ export default class Check extends SwankyCommand<typeof Check> {
const cargoToml = TOML.parse(cargoTomlString);

const inkDependencies = Object.entries(cargoToml.dependencies)
.filter((dependency) => dependency[0].includes("ink"))
.filter(([depName]) => /^ink($|_)/.test(depName))
.map(([depName, depInfo]) => {
const dependency = depInfo as Dependency;
return [depName, dependency.version ?? dependency.tag];
});
ctx.versions.contracts[contract] = Object.fromEntries(inkDependencies);
ctx.versions.contracts[contract] = {
...ctx.versions.contracts[contract],
verified: swankyConfig.contracts[contract].build?.verified ?? false,
};
}
},
},
Expand All @@ -98,20 +94,19 @@ export default class Check extends SwankyCommand<typeof Check> {
const supportedInk = ctx.swankyConfig?.node.supportedInk;

const mismatched: Record<string, string> = {};
Object.entries(ctx.versions.contracts).forEach(([contract, inkPackages]) => {
Object.entries(inkPackages).forEach(([inkPackage, version]) => {
if (inkPackage != "verified") {
if (semver.gt(version, supportedInk!)) {
mismatched[
`${contract}-${inkPackage}`
] = `Version of ${inkPackage} (${version}) in ${contract} is higher than supported ink version (${supportedInk})`;
}
Object.entries(ctx.versions.contracts).forEach(([contract, contractData]) => {
if (Object.prototype.hasOwnProperty.call(contractData, "ink")) {
const version = contractData.ink;
if (version && semver.gt(version, supportedInk!)) {
mismatched[
`${contract}-ink`
] = `Version of ink (${version}) in ${contract} is higher than supported ink version (${supportedInk})`;
}

if (!(version.startsWith("=") || version.startsWith("v"))) {
ctx.looseDefinitionDetected = true;
}
if (!(version.startsWith("=") || version.startsWith("v"))) {
ctx.looseDefinitionDetected = true;
}
});
}
});

ctx.mismatchedVersions = mismatched;
Expand Down
5 changes: 3 additions & 2 deletions src/commands/contract/compile.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Args, Flags } from "@oclif/core";
import path from "node:path";
import { storeArtifacts, Spinner, generateTypes } from "../../lib/index.js";
import { storeArtifacts, Spinner, generateTypes, checkCargoVersion } from "../../lib/index.js";
import { spawn } from "node:child_process";
import { pathExists } from "fs-extra/esm";
import { SwankyCommand } from "../../lib/swankyCommand.js";
Expand Down Expand Up @@ -77,6 +77,7 @@ export class CompileContract extends SwankyCommand<typeof CompileContract> {
compileArgs.push("--release");
}
if (flags.verifiable) {
checkCargoVersion("4.0.0", ["4.0.0-alpha"]);
pmikolajczyk41 marked this conversation as resolved.
Show resolved Hide resolved
compileArgs.push("--verifiable");
ipapandinas marked this conversation as resolved.
Show resolved Hide resolved
}
const compile = spawn("cargo", compileArgs);
Expand Down Expand Up @@ -127,7 +128,7 @@ export class CompileContract extends SwankyCommand<typeof CompileContract> {
this.swankyConfig.contracts[contractName].build = {
timestamp: Date.now(),
artifactsPath,
verified: false,
isVerified: false,
};

await this.storeConfig();
Expand Down
10 changes: 8 additions & 2 deletions src/commands/contract/verify.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Args, Flags } from "@oclif/core";
import path from "node:path";
import { Spinner } from "../../lib/index.js";
import { checkCargoVersion, Spinner } from "../../lib/index.js";
import { pathExists } from "fs-extra/esm";
import { SwankyCommand } from "../../lib/swankyCommand.js";
import { ConfigError, InputError, ProcessError } from "../../lib/errors.js";
Expand Down Expand Up @@ -29,6 +29,8 @@ export class VerifyContract extends SwankyCommand<typeof VerifyContract> {
async run(): Promise<void> {
const { args, flags } = await this.parse(VerifyContract);

ipapandinas marked this conversation as resolved.
Show resolved Hide resolved
checkCargoVersion("4.0.0", ["4.0.0-alpha"]);

if (args.contractName === undefined && !flags.all) {
ipapandinas marked this conversation as resolved.
Show resolved Hide resolved
throw new InputError("No contracts were selected to verify", { winston: { stack: true } });
}
Expand All @@ -53,6 +55,10 @@ export class VerifyContract extends SwankyCommand<typeof VerifyContract> {
throw new InputError(`Contract folder not found at expected path`);
}

if(!contractInfo.build) {
throw new InputError(`Contract ${contractName} is not compiled. Please compile it first`);
}

pmikolajczyk41 marked this conversation as resolved.
Show resolved Hide resolved
await spinner.runCommand(
async () => {
return new Promise<boolean>((resolve, reject) => {
Expand Down Expand Up @@ -94,7 +100,7 @@ export class VerifyContract extends SwankyCommand<typeof VerifyContract> {
`Verifying ${contractName} contract`,
`${contractName} Contract verified successfully`
);
contractInfo.build!.verified = true;
contractInfo.build.isVerified = true;

this.swankyConfig.contracts[contractName] = contractInfo;

Expand Down
29 changes: 27 additions & 2 deletions src/lib/tasks.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { execaCommand } from "execa";
import { execaCommand, execaCommandSync } from "execa";
import { ensureDir, copy, remove } from "fs-extra/esm";
import { rename, readFile, rm, writeFile } from "fs/promises";
import path from "node:path";
Expand All @@ -10,7 +10,8 @@ import { nodeInfo } from "./nodeInfo.js";
import decompress from "decompress";
import { Spinner } from "./spinner.js";
import { SupportedPlatforms, SupportedArch } from "../types/index.js";
import { ConfigError, NetworkError } from "./errors.js";
import { ConfigError, InputError, NetworkError } from "./errors.js";
import semver from "semver";

export async function checkCliDependencies(spinner: Spinner) {
const dependencyList = [
Expand Down Expand Up @@ -136,3 +137,27 @@ export async function installDeps(projectPath: string) {
await execaCommand(installCommand, { cwd: projectPath });
}
}

export function checkCargoVersion(minimalVersion: string, invalidVersionsList: string[]) {
pmikolajczyk41 marked this conversation as resolved.
Show resolved Hide resolved
const regex = /cargo-contract-contract (.*)-unknown-x86_64-unknown-linux-gnu/;
ipapandinas marked this conversation as resolved.
Show resolved Hide resolved
let cargoVersion;
try {
const result = execaCommandSync("cargo contract -V");
cargoVersion = result.stdout;
} catch {
cargoVersion = null;
}
if (cargoVersion) {
const match = cargoVersion.match(regex);
if (match) {
cargoVersion = match[1];
}
} else {
throw new InputError("Verifiable mode requires cargo-contract version >= 4.0.0-rc");
ipapandinas marked this conversation as resolved.
Show resolved Hide resolved
}
if (!cargoVersion || semver.lt(cargoVersion, "4.0.0-rc") || invalidVersionsList.includes(cargoVersion)) {
throw new InputError(
"Verifiable mode requires cargo-contract version >= 4.0.0-rc"
);
}
}
2 changes: 1 addition & 1 deletion src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export interface ContractData {
export interface BuildData {
timestamp: number;
artifactsPath: string;
verified: boolean;
isVerified: boolean;
}

export interface DeploymentData {
Expand Down