diff --git a/yarn-project/aztec-sandbox/src/bin/index.ts b/yarn-project/aztec-sandbox/src/bin/index.ts index d38adcc3c80..340a1286cfe 100644 --- a/yarn-project/aztec-sandbox/src/bin/index.ts +++ b/yarn-project/aztec-sandbox/src/bin/index.ts @@ -3,7 +3,7 @@ import { createAztecNodeRpcServer } from '@aztec/aztec-node'; import { deployInitialSandboxAccounts } from '@aztec/aztec.js'; import { createDebugLogger } from '@aztec/foundation/log'; import { fileURLToPath } from '@aztec/foundation/url'; -import { NoirWasmVersion } from '@aztec/noir-compiler/noir-version'; +import { NoirWasmVersion } from '@aztec/noir-compiler/versions'; import { createPXERpcServer } from '@aztec/pxe'; import { readFileSync } from 'fs'; diff --git a/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json b/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json index 3a8486aa4ed..07acc599ae6 100644 --- a/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json +++ b/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json @@ -695,6 +695,5 @@ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" } ], - "events": [], - "compilerVersion": "0.18.0-6ca33a2.aztec" + "events": [] } diff --git a/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json b/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json index f7cafad7126..567de36fa73 100644 --- a/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json +++ b/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json @@ -683,6 +683,5 @@ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" } ], - "events": [], - "compilerVersion": "0.18.0-6ca33a2.aztec" + "events": [] } diff --git a/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json b/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json index 597b2a257ad..e987e31dfcc 100644 --- a/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json +++ b/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json @@ -618,6 +618,5 @@ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" } ], - "events": [], - "compilerVersion": "0.18.0-6ca33a2.aztec" + "events": [] } diff --git a/yarn-project/cli/src/index.ts b/yarn-project/cli/src/index.ts index 151380f4516..778f2b88031 100644 --- a/yarn-project/cli/src/index.ts +++ b/yarn-project/cli/src/index.ts @@ -32,6 +32,7 @@ import { mnemonicToAccount } from 'viem/accounts'; import { createCompatibleClient } from './client.js'; import { encodeArgs, parseStructString } from './encoding.js'; +import { GITHUB_TAG_PREFIX } from './github.js'; import { unboxContract } from './unbox.js'; import { update } from './update/update.js'; import { @@ -248,9 +249,10 @@ export function getProgram(log: LogFn, debugLogger: DebugLogger): Command { const client = await createCompatibleClient(rpcUrl, debugLogger); const nodeInfo = await client.getNodeInfo(); - if (contractArtifact.compilerVersion && contractArtifact.compilerVersion !== nodeInfo.compatibleNargoVersion) { + const expectedAztecNrVersion = `${GITHUB_TAG_PREFIX}-v${nodeInfo.sandboxVersion}`; + if (contractArtifact.aztecNrVersion && contractArtifact.aztecNrVersion !== expectedAztecNrVersion) { log( - `\nWarning: Contract was compiled with a different version of Noir: ${contractArtifact.compilerVersion}. Consider re-compiling the contract with Noir ${nodeInfo.compatibleNargoVersion}\n`, + `\nWarning: Contract was compiled with a different version of Aztec.nr: ${contractArtifact.aztecNrVersion}. Consider updating Aztec.nr to ${expectedAztecNrVersion}\n`, ); } diff --git a/yarn-project/foundation/src/abi/abi.ts b/yarn-project/foundation/src/abi/abi.ts index 2325d5cc806..9216c9805e9 100644 --- a/yarn-project/foundation/src/abi/abi.ts +++ b/yarn-project/foundation/src/abi/abi.ts @@ -253,7 +253,7 @@ export interface ContractArtifact { /** * The version of compiler used to create this artifact */ - compilerVersion?: string; + aztecNrVersion?: string; /** * The functions of the contract. diff --git a/yarn-project/noir-compiler/package.json b/yarn-project/noir-compiler/package.json index a437f21d033..8c808520b02 100644 --- a/yarn-project/noir-compiler/package.json +++ b/yarn-project/noir-compiler/package.json @@ -5,7 +5,7 @@ "exports": { ".": "./dest/index.js", "./cli": "./dest/cli/index.js", - "./noir-version": "./dest/noir-version.js" + "./versions": "./dest/versions.js" }, "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap b/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap index 9289b916192..1c00e7c76f5 100644 --- a/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap +++ b/yarn-project/noir-compiler/src/__snapshots__/index.test.ts.snap @@ -3,6 +3,7 @@ exports[`noir-compiler using nargo compiles the test contract 1`] = ` [ { + "aztecNrVersion": undefined, "events": [], "functions": [ { @@ -195,6 +196,7 @@ export class TestContractContract extends ContractBase { exports[`noir-compiler using wasm binary compiles the test contract 1`] = ` [ { + "aztecNrVersion": undefined, "events": [], "functions": [ { diff --git a/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-manager.test.ts b/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-manager.test.ts index 1c32916c075..af915d08129 100644 --- a/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-manager.test.ts +++ b/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-manager.test.ts @@ -2,7 +2,7 @@ import { NoirDependencyConfig } from '@aztec/foundation/noir'; import { NoirPackage } from '../package.js'; import { NoirDependencyManager } from './dependency-manager.js'; -import { DependencyResolver } from './dependency-resolver.js'; +import { Dependency, DependencyResolver } from './dependency-resolver.js'; describe('DependencyManager', () => { let manager: NoirDependencyManager; @@ -51,42 +51,51 @@ describe('DependencyManager', () => { class TestDependencyResolver implements DependencyResolver { // eslint-disable-next-line require-await - public async resolveDependency(pkg: NoirPackage, dep: NoirDependencyConfig): Promise { + public async resolveDependency(pkg: NoirPackage, dep: NoirDependencyConfig): Promise { if (!('path' in dep)) { return null; } switch (dep.path) { case '/lib1': - return new NoirPackage('/lib1', '/lib1/src', { - dependencies: {}, - package: { - name: 'lib1', - type: 'lib', - }, - }); + return { + version: '', + package: new NoirPackage('/lib1', '/lib1/src', { + dependencies: {}, + package: { + name: 'lib1', + type: 'lib', + }, + }), + }; case '/lib2': - return new NoirPackage('/lib2', '/lib2/src', { - dependencies: { - lib3: { - path: '/lib3', + return { + version: '', + package: new NoirPackage('/lib2', '/lib2/src', { + dependencies: { + lib3: { + path: '/lib3', + }, }, - }, - package: { - name: 'lib2', - type: 'lib', - }, - }); + package: { + name: 'lib2', + type: 'lib', + }, + }), + }; case '/lib3': - return new NoirPackage('/lib3', '/lib3/src', { - dependencies: {}, - package: { - name: 'lib3', - type: 'lib', - }, - }); + return { + version: '', + package: new NoirPackage('/lib3', '/lib3/src', { + dependencies: {}, + package: { + name: 'lib3', + type: 'lib', + }, + }), + }; default: throw new Error(); diff --git a/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-manager.ts b/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-manager.ts index ac5220e907f..500ff3e04a3 100644 --- a/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-manager.ts +++ b/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-manager.ts @@ -4,14 +4,14 @@ import { NoirDependencyConfig } from '@aztec/foundation/noir'; import { join } from 'node:path'; import { NoirPackage } from '../package.js'; -import { DependencyResolver } from './dependency-resolver.js'; +import { Dependency, DependencyResolver } from './dependency-resolver.js'; /** * Noir Dependency Resolver */ export class NoirDependencyManager { #entryPoint: NoirPackage; - #libraries = new Map(); + #libraries = new Map(); #dependencies = new Map(); #log: LogFn; #resolvers: readonly DependencyResolver[]; @@ -49,6 +49,16 @@ export class NoirDependencyManager { await this.#recursivelyResolveDependencies('', this.#entryPoint); } + /** + * Gets the version of a dependency in the dependency tree + * @param name - Dependency name + * @returns The dependency's version + */ + public getVersionOf(name: string): string | undefined { + const dep = this.#libraries.get(name); + return dep?.version; + } + async #recursivelyResolveDependencies(packageName: string, noirPackage: NoirPackage): Promise { for (const [name, config] of Object.entries(noirPackage.getDependencies())) { // TODO what happens if more than one package has the same name but different versions? @@ -60,7 +70,7 @@ export class NoirDependencyManager { } const dependency = await this.#resolveDependency(noirPackage, config); - if (dependency.getType() !== 'lib') { + if (dependency.package.getType() !== 'lib') { this.#log(`Non-library package ${name}`, config); throw new Error(`Dependency ${name} is not a library`); } @@ -68,12 +78,12 @@ export class NoirDependencyManager { this.#libraries.set(name, dependency); this.#dependencies.set(packageName, [...(this.#dependencies.get(packageName) ?? []), name]); - await this.#recursivelyResolveDependencies(name, dependency); + await this.#recursivelyResolveDependencies(name, dependency.package); } } - async #resolveDependency(pkg: NoirPackage, config: NoirDependencyConfig) { - let dependency: NoirPackage | null = null; + async #resolveDependency(pkg: NoirPackage, config: NoirDependencyConfig): Promise { + let dependency: Dependency | null = null; for (const resolver of this.#resolvers) { dependency = await resolver.resolveDependency(pkg, config); if (dependency) { @@ -102,9 +112,9 @@ export class NoirDependencyManager { */ public findFile(sourceId: string): string | null { const [lib, ...path] = sourceId.split('/').filter(x => x); - const pkg = this.#libraries.get(lib); - if (pkg) { - return join(pkg.getSrcPath(), ...path); + const dep = this.#libraries.get(lib); + if (dep) { + return join(dep.package.getSrcPath(), ...path); } else { return null; } diff --git a/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-resolver.ts b/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-resolver.ts index b4994190ed5..507a323d933 100644 --- a/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-resolver.ts +++ b/yarn-project/noir-compiler/src/compile/noir/dependencies/dependency-resolver.ts @@ -2,6 +2,16 @@ import { NoirDependencyConfig } from '@aztec/foundation/noir'; import { NoirPackage } from '../package.js'; +/** + * A Noir dependency + */ +export type Dependency = { + /** version string as determined by the resolver */ + version?: string; + /** the actual package source code */ + package: NoirPackage; +}; + /** * Resolves a dependency for a package. */ @@ -11,5 +21,5 @@ export interface DependencyResolver { * @param pkg - The package to resolve dependencies for * @param dep - The dependency config to resolve */ - resolveDependency(pkg: NoirPackage, dep: NoirDependencyConfig): Promise; + resolveDependency(pkg: NoirPackage, dep: NoirDependencyConfig): Promise; } diff --git a/yarn-project/noir-compiler/src/compile/noir/dependencies/github-dependency-resolver.test.ts b/yarn-project/noir-compiler/src/compile/noir/dependencies/github-dependency-resolver.test.ts index 4b6703484ab..7b4ea5a0b1b 100644 --- a/yarn-project/noir-compiler/src/compile/noir/dependencies/github-dependency-resolver.test.ts +++ b/yarn-project/noir-compiler/src/compile/noir/dependencies/github-dependency-resolver.test.ts @@ -62,9 +62,10 @@ describe('GithubDependencyResolver', () => { it('resolves Github dependency', async () => { fetchMock.mockResolvedValueOnce(new Response(await readFile(join(fixtures, 'test_lib.zip')), { status: 200 })); - const libPkg = await resolver.resolveDependency(pkg, libDependency); - expect(libPkg).toBeDefined(); - expect(fm.hasFileSync(libPkg!.getEntryPointPath())).toBe(true); + const lib = await resolver.resolveDependency(pkg, libDependency); + expect(lib).toBeDefined(); + expect(lib!.version).toEqual(libDependency.tag); + expect(fm.hasFileSync(lib!.package.getEntryPointPath())).toBe(true); }); it.each<[NoirGitDependencyConfig, 'zip' | 'tar', string]>([ diff --git a/yarn-project/noir-compiler/src/compile/noir/dependencies/github-dependency-resolver.ts b/yarn-project/noir-compiler/src/compile/noir/dependencies/github-dependency-resolver.ts index 36bbcbc3762..4026363012d 100644 --- a/yarn-project/noir-compiler/src/compile/noir/dependencies/github-dependency-resolver.ts +++ b/yarn-project/noir-compiler/src/compile/noir/dependencies/github-dependency-resolver.ts @@ -6,7 +6,7 @@ import { unzip } from 'unzipit'; import { FileManager } from '../file-manager/file-manager.js'; import { NoirPackage } from '../package.js'; -import { DependencyResolver } from './dependency-resolver.js'; +import { Dependency, DependencyResolver } from './dependency-resolver.js'; /** * Downloads dependencies from github @@ -25,7 +25,7 @@ export class GithubDependencyResolver implements DependencyResolver { * @param dependency - The dependency configuration * @returns asd */ - async resolveDependency(_pkg: NoirPackage, dependency: NoirDependencyConfig): Promise { + async resolveDependency(_pkg: NoirPackage, dependency: NoirDependencyConfig): Promise { // TODO accept ssh urls? // TODO github authentication? if (!('git' in dependency) || !dependency.git.startsWith('https://github.com')) { @@ -34,7 +34,10 @@ export class GithubDependencyResolver implements DependencyResolver { const archivePath = await this.#fetchZipFromGithub(dependency); const libPath = await this.#extractZip(dependency, archivePath); - return NoirPackage.open(libPath, this.#fm); + return { + version: dependency.tag, + package: NoirPackage.open(libPath, this.#fm), + }; } async #fetchZipFromGithub(dependency: Pick): Promise { diff --git a/yarn-project/noir-compiler/src/compile/noir/dependencies/local-dependency-resolver.test.ts b/yarn-project/noir-compiler/src/compile/noir/dependencies/local-dependency-resolver.test.ts index 11f75194caa..2b587ca7a14 100644 --- a/yarn-project/noir-compiler/src/compile/noir/dependencies/local-dependency-resolver.test.ts +++ b/yarn-project/noir-compiler/src/compile/noir/dependencies/local-dependency-resolver.test.ts @@ -43,10 +43,11 @@ describe('DependencyResolver', () => { }); it.each(['../test_contract', '/test_contract'])('resolves a known dependency', async path => { - const libPkg = await resolver.resolveDependency(pkg, { + const lib = await resolver.resolveDependency(pkg, { path, }); - expect(libPkg).toBeDefined(); - expect(fm.hasFileSync(libPkg!.getEntryPointPath())).toBe(true); + expect(lib).toBeDefined(); + expect(lib!.version).toBeUndefined(); + expect(fm.hasFileSync(lib!.package.getEntryPointPath())).toBe(true); }); }); diff --git a/yarn-project/noir-compiler/src/compile/noir/dependencies/local-dependency-resolver.ts b/yarn-project/noir-compiler/src/compile/noir/dependencies/local-dependency-resolver.ts index 29862ef2470..16483beb0bc 100644 --- a/yarn-project/noir-compiler/src/compile/noir/dependencies/local-dependency-resolver.ts +++ b/yarn-project/noir-compiler/src/compile/noir/dependencies/local-dependency-resolver.ts @@ -4,7 +4,7 @@ import { resolve } from 'path'; import { FileManager } from '../file-manager/file-manager.js'; import { NoirPackage } from '../package.js'; -import { DependencyResolver } from './dependency-resolver.js'; +import { Dependency, DependencyResolver } from './dependency-resolver.js'; /** * Resolves dependencies on-disk, relative to current package @@ -16,9 +16,13 @@ export class LocalDependencyResolver implements DependencyResolver { this.#fm = fm; } - resolveDependency(pkg: NoirPackage, config: NoirDependencyConfig): Promise { + resolveDependency(pkg: NoirPackage, config: NoirDependencyConfig): Promise { if ('path' in config) { - return Promise.resolve(NoirPackage.open(resolve(pkg.getPackagePath(), config.path), this.#fm)); + return Promise.resolve({ + // unknown version, Nargo.toml doesn't have a version field + version: undefined, + package: NoirPackage.open(resolve(pkg.getPackagePath(), config.path), this.#fm), + }); } else { return Promise.resolve(null); } diff --git a/yarn-project/noir-compiler/src/compile/noir/noir-wasm-compiler.ts b/yarn-project/noir-compiler/src/compile/noir/noir-wasm-compiler.ts index d1762387dbb..395ad4df9f3 100644 --- a/yarn-project/noir-compiler/src/compile/noir/noir-wasm-compiler.ts +++ b/yarn-project/noir-compiler/src/compile/noir/noir-wasm-compiler.ts @@ -70,6 +70,15 @@ export class NoirWasmContractCompiler { return new NoirWasmContractCompiler(noirPackage, dependencyManager, fileManager, opts); } + /** + * Gets the version of Aztec.nr that was used compiling this contract. + */ + public getResolvedAztecNrVersion() { + // TODO eliminate this hardcoded library name! + // see docs/docs/dev_docs/contracts/setup.md + return this.#dependencyManager.getVersionOf('aztec'); + } + /** * Compiles the project. */ diff --git a/yarn-project/noir-compiler/src/compile/noir/package.ts b/yarn-project/noir-compiler/src/compile/noir/package.ts index 9a295c11d8c..730df27b675 100644 --- a/yarn-project/noir-compiler/src/compile/noir/package.ts +++ b/yarn-project/noir-compiler/src/compile/noir/package.ts @@ -14,6 +14,7 @@ export class NoirPackage { #packagePath: string; #srcPath: string; #config: NoirPackageConfig; + #version: string | null = null; public constructor(path: string, srcDir: string, config: NoirPackageConfig) { this.#packagePath = path; diff --git a/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts b/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts index 7df7fcc5f5c..ac8d6899ee5 100644 --- a/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts +++ b/yarn-project/noir-compiler/src/contract-interface-gen/abi.ts @@ -39,7 +39,7 @@ function generateFunctionArtifact(fn: NoirFunctionEntry): FunctionArtifact { */ export function generateContractArtifact( { contract, debug }: NoirCompilationArtifacts, - compilerVersion: string, + aztecNrVersion?: string, ): ContractArtifact { const originalFunctions = contract.functions; // TODO why sort? we should have idempotent compilation so this should not be needed. @@ -61,6 +61,6 @@ export function generateContractArtifact( functions: sortedFunctions.map(generateFunctionArtifact), events: contract.events, debug: parsedDebug, - compilerVersion, + aztecNrVersion, }; } diff --git a/yarn-project/noir-compiler/src/index.ts b/yarn-project/noir-compiler/src/index.ts index 7c11d18eaa2..7aaaa3065e9 100644 --- a/yarn-project/noir-compiler/src/index.ts +++ b/yarn-project/noir-compiler/src/index.ts @@ -7,9 +7,9 @@ import { CompileOpts, NargoContractCompiler } from './compile/nargo.js'; import { FileManager } from './compile/noir/file-manager/file-manager.js'; import { NoirWasmCompileOptions, NoirWasmContractCompiler } from './compile/noir/noir-wasm-compiler.js'; import { generateContractArtifact } from './contract-interface-gen/abi.js'; -import { NoirVersion, NoirWasmVersion } from './noir-version.js'; +import { AztecNrVersion } from './versions.js'; -export * from './noir-version.js'; +export * from './versions.js'; export { generateNoirContractInterface } from './contract-interface-gen/noir.js'; export { generateTypescriptContractInterface } from './contract-interface-gen/typescript.js'; @@ -25,7 +25,7 @@ export * from './noir_artifact.js'; */ export async function compileUsingNargo(projectPath: string, opts: CompileOpts = {}): Promise { return (await new NargoContractCompiler(projectPath, opts).compile()).map(artifact => - generateContractArtifact(artifact, NoirVersion.tag), + generateContractArtifact(artifact), ); } @@ -41,8 +41,13 @@ export async function compileUsingNoirWasm( ): Promise { const cacheRoot = process.env.XDG_CACHE_HOME ?? join(process.env.HOME ?? '', '.cache'); const fileManager = new FileManager(fs, join(cacheRoot, 'aztec-noir-compiler')); + const compiler = NoirWasmContractCompiler.new(fileManager, resolve(projectPath), opts); + const artifacts = await compiler.compile(); + const resolvedAztecNrVersion = compiler.getResolvedAztecNrVersion(); - return (await NoirWasmContractCompiler.new(fileManager, resolve(projectPath), opts).compile()).map(artifact => - generateContractArtifact(artifact, NoirWasmVersion), - ); + if (resolvedAztecNrVersion && AztecNrVersion !== resolvedAztecNrVersion) { + opts.log(`WARNING: Aztec.nr version mismatch: expected "${AztecNrVersion}", got "${resolvedAztecNrVersion}"`); + } + + return artifacts.map(artifact => generateContractArtifact(artifact, resolvedAztecNrVersion)); } diff --git a/yarn-project/noir-compiler/src/noir-version.ts b/yarn-project/noir-compiler/src/versions.ts similarity index 88% rename from yarn-project/noir-compiler/src/noir-version.ts rename to yarn-project/noir-compiler/src/versions.ts index 43f9383e7d4..6adcb486e03 100644 --- a/yarn-project/noir-compiler/src/noir-version.ts +++ b/yarn-project/noir-compiler/src/versions.ts @@ -5,6 +5,7 @@ import NoirVersion from './noir-version.json' assert { type: 'json' }; // read package.json at runtime instead of compile time so that we keep rootDir as-is in tsconfig const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf-8')); +export const AztecNrVersion = `aztec-packages-v${pkg.version}`; export const NoirWasmVersion = pkg.dependencies['@noir-lang/noir_wasm']; export const NoirTag = NoirVersion.tag; export const NoirCommit = NoirVersion.commit; diff --git a/yarn-project/pxe/src/pxe_service/pxe_service.ts b/yarn-project/pxe/src/pxe_service/pxe_service.ts index d1efcd73044..e6771d40018 100644 --- a/yarn-project/pxe/src/pxe_service/pxe_service.ts +++ b/yarn-project/pxe/src/pxe_service/pxe_service.ts @@ -22,7 +22,7 @@ import { encodeArguments } from '@aztec/foundation/abi'; import { padArrayEnd } from '@aztec/foundation/collection'; import { Fr } from '@aztec/foundation/fields'; import { DebugLogger, createDebugLogger } from '@aztec/foundation/log'; -import { NoirWasmVersion } from '@aztec/noir-compiler/noir-version'; +import { NoirWasmVersion } from '@aztec/noir-compiler/versions'; import { AuthWitness, AztecNode,