@aztec/cli 0.7.9 → 0.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dest/unbox.js CHANGED
@@ -5,16 +5,7 @@ import * as path from 'path';
5
5
  const GITHUB_OWNER = 'AztecProtocol';
6
6
  const GITHUB_REPO = 'aztec-packages';
7
7
  const GITHUB_TAG_PREFIX = 'aztec-packages';
8
- const NOIR_CONTRACTS_PATH = 'yarn-project/noir-contracts/src/contracts';
9
8
  const BOXES_PATH = 'yarn-project/boxes';
10
- /**
11
- * Converts a contract name in "upper camel case" to a folder name in snake case or kebab case.
12
- * @param contractName - The contract name.
13
- * @returns The folder name.
14
- * */
15
- function contractNameToFolder(contractName, separator = '-') {
16
- return contractName.replace(/[\w]([A-Z])/g, m => `${m[0]}${separator}${m[1]}`).toLowerCase();
17
- }
18
9
  /**
19
10
  * If the box contains the noir contract source code, we don't need to download it from github.
20
11
  * Otherwise, we download the contract source code from the `noir-contracts` and `noir-libs` subpackages.
@@ -36,7 +27,7 @@ async function isDirectoryNonEmpty(directoryPath) {
36
27
  * @param localOutputPath - local path to copy to
37
28
  */
38
29
  async function copyFolderFromGithub(data, repositoryFolderPath, localOutputPath, log) {
39
- log(`Downloading from github: ${repositoryFolderPath}`);
30
+ log(`Downloading folder from github: ${repositoryFolderPath}`);
40
31
  const repositoryDirectories = Object.values(data.files).filter(file => {
41
32
  return file.dir && file.name.startsWith(repositoryFolderPath);
42
33
  });
@@ -45,16 +36,32 @@ async function copyFolderFromGithub(data, repositoryFolderPath, localOutputPath,
45
36
  const targetPath = `${localOutputPath}/${relativePath}`;
46
37
  await fs.mkdir(targetPath, { recursive: true });
47
38
  }
48
- const starterFiles = Object.values(data.files).filter(file => {
39
+ const folderFiles = Object.values(data.files).filter(file => {
49
40
  return !file.dir && file.name.startsWith(repositoryFolderPath);
50
41
  });
51
- for (const file of starterFiles) {
42
+ for (const file of folderFiles) {
52
43
  const relativePath = file.name.replace(repositoryFolderPath, '');
53
44
  const targetPath = `${localOutputPath}/${relativePath}`;
54
45
  const content = await file.async('nodebuffer');
55
46
  await fs.writeFile(targetPath, content);
56
47
  }
57
48
  }
49
+ /**
50
+ * @param data - in memory unzipped clone of a github repo
51
+ * @param repositoryFile - path of the file to copy from github repo
52
+ * @param localOutputPath - local path to copy the file to
53
+ */
54
+ async function copyFileFromGithub(data, repositoryFile, localOutputPath, log) {
55
+ log(`Downloading file from github: ${repositoryFile}`);
56
+ const file = data.files[repositoryFile];
57
+ if (!file || file.dir) {
58
+ throw new Error(`File not found or it's a directory: ${repositoryFile}`);
59
+ }
60
+ const filename = path.basename(repositoryFile);
61
+ const targetPath = `${localOutputPath}/${filename}`;
62
+ const content = await file.async('nodebuffer');
63
+ await fs.writeFile(targetPath, content);
64
+ }
58
65
  /**
59
66
  * Not flexible at at all, but quick fix to download a noir smart contract from our
60
67
  * monorepo on github. this will copy over the `yarn-projects/boxes/{contract_name}` folder
@@ -68,8 +75,7 @@ async function copyFolderFromGithub(data, repositoryFolderPath, localOutputPath,
68
75
  async function downloadContractAndBoxFromGithub(tag, contractName, outputPath, log) {
69
76
  // small string conversion, in the ABI the contract name looks like PrivateToken
70
77
  // but in the repostory it looks like private_token
71
- const kebabCaseContractName = contractNameToFolder(contractName, '-');
72
- log(`Downloading @aztex/boxes/${kebabCaseContractName} to ${outputPath}...`);
78
+ log(`Downloading @aztex/boxes/${contractName} to ${outputPath}...`);
73
79
  // Step 1: Fetch the monorepo ZIP from GitHub, matching the CLI version
74
80
  const url = `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}/archive/refs/tags/${tag}.zip`;
75
81
  const response = await fetch(url);
@@ -77,35 +83,24 @@ async function downloadContractAndBoxFromGithub(tag, contractName, outputPath, l
77
83
  const zip = new JSZip();
78
84
  const data = await zip.loadAsync(buffer);
79
85
  // Step 2: copy the '@aztec/boxes/{contract-name}' subpackage to the output directory
80
- // this is currently only implemented for PrivateToken under 'boxes/private-token/'
86
+ // this is currently only implemented for `blank` and `private-token` under 'boxes/{box-name}/'
81
87
  const repoDirectoryPrefix = `${GITHUB_REPO}-${tag}`;
82
- const boxPath = `${repoDirectoryPrefix}/${BOXES_PATH}/${kebabCaseContractName}`;
88
+ const boxPath = `${repoDirectoryPrefix}/${BOXES_PATH}/${contractName}`;
83
89
  await copyFolderFromGithub(data, boxPath, outputPath, log);
90
+ // the expected noir version is contained in
91
+ // aztec-packages/yarn-project/noir-compiler/src/noir-version.json
92
+ // copy it in and use to update the package.json script to install that version of noir
93
+ const noirVersionPath = `${repoDirectoryPrefix}/yarn-project/noir-compiler/src/noir-version.json`;
94
+ await copyFileFromGithub(data, noirVersionPath, outputPath, log);
84
95
  const contractTargetDirectory = path.join(outputPath, 'src', 'contracts');
85
96
  const boxContainsNoirSource = await isDirectoryNonEmpty(contractTargetDirectory);
86
97
  if (boxContainsNoirSource) {
87
98
  return;
88
99
  }
89
- // this remaining logic only kicks in if the box doesn't already have a src/contracts folder
90
- // in which case we optimistically grab the noir source files from the
91
- // noir-contracts and noir-libs subpackages and pray that the versions are compatible
92
- log('Copying noir contracts...');
93
- // source noir files for the contract are in this folder
94
- const snakeCaseContractName = contractNameToFolder(contractName, '_');
95
- const contractDirectoryPath = `${repoDirectoryPrefix}/${NOIR_CONTRACTS_PATH}/${snakeCaseContractName}_contract`;
96
- // copy the noir contracts to the output directory under subdir /src/contracts/
97
- const contractFiles = Object.values(data.files).filter(file => {
98
- return !file.dir && file.name.startsWith(contractDirectoryPath);
99
- });
100
- // Nargo.toml file needs to be in the root of the contracts directory,
101
- // and noir files in the src/ subdirectory
102
- await fs.mkdir(path.join(contractTargetDirectory, 'src'), { recursive: true });
103
- for (const file of contractFiles) {
104
- const filename = file.name.replace(`${contractDirectoryPath}/`, '');
105
- const targetPath = path.join(contractTargetDirectory, filename);
106
- const content = await file.async('nodebuffer');
107
- await fs.writeFile(targetPath, content);
108
- log(` ✓ ${filename}`);
100
+ else {
101
+ // we used to support downloading from the noir contracts monorepo but now force box to contain source code
102
+ // This should never happen, because of the check we do initially on the box name.
103
+ throw Error(`Box ${contractName} does not contain noir source code.`);
109
104
  }
110
105
  }
111
106
  /**
@@ -189,11 +184,18 @@ async function updatePackageJsonVersions(packageVersion, outputPath, log) {
189
184
  }
190
185
  }
191
186
  }
187
+ // read the `noir-version.json`, grab the expected noir version, and patch the noir install script
188
+ const noirVersionPath = path.join(outputPath, 'noir-version.json');
189
+ const noirVersionContent = await fs.readFile(noirVersionPath, 'utf-8');
190
+ const noirVersionJSON = JSON.parse(noirVersionContent);
191
+ const noirTag = noirVersionJSON.tag;
192
+ packageData.scripts['install:noir'] = packageData.scripts['install:noir'].replace('NOIR_VERSION', `${noirTag}`);
193
+ log(`Updated Noir version to: ${noirTag}`);
192
194
  // modify the version of the sandbox to pull - it's set to "latest" version in the monorepo,
193
195
  // but we need to replace with the same tagVersion as the cli and the other aztec npm packages
194
196
  // similarly, make sure we spinup the sandbox with the same version.
195
- packageData.scripts['install:sandbox'] = packageData.scripts['install:sandbox'].replace('latest', `v${packageVersion}`);
196
- packageData.scripts['start:sandbox'] = packageData.scripts['start:sandbox'].replace('latest', `v${packageVersion}`);
197
+ packageData.scripts['install:sandbox'] = packageData.scripts['install:sandbox'].replace('latest', `${packageVersion}`);
198
+ packageData.scripts['start:sandbox'] = packageData.scripts['start:sandbox'].replace('latest', `${packageVersion}`);
197
199
  // Convert back to a string and write back to the package.json file
198
200
  const updatedContent = JSON.stringify(packageData, null, 2);
199
201
  await fs.writeFile(packageJsonPath, updatedContent);
@@ -237,27 +239,27 @@ async function createDirectory(outputDirectoryName, log) {
237
239
  * @param log - Logger instance that will output to the CLI
238
240
  */
239
241
  export async function unboxContract(contractName, outputDirectoryName, packageVersion, log) {
240
- const contractNames = ['PrivateToken'];
242
+ const contractNames = ['private-token', 'blank', 'blank-react'];
241
243
  if (!contractNames.includes(contractName)) {
242
244
  log(`The noir contract named "${contractName}" was not found in "@aztec/boxes" package. Valid options are:
243
245
  ${contractNames.join('\n\t')}
244
- We recommend "PrivateToken" as a default.`);
246
+ We recommend "private-token" as a default.`);
245
247
  return;
246
248
  }
247
249
  const outputPath = await createDirectory(outputDirectoryName, log);
248
250
  const tag = `${GITHUB_TAG_PREFIX}-v${packageVersion}`;
249
251
  // downloads the selected contract's relevant folder in @aztec/boxes/{contract_name}
250
- // and the noir source code from `noir-contracts` into `${outputDirectoryName}/src/contracts`
251
- // if not present in the box
252
252
  await downloadContractAndBoxFromGithub(tag, contractName, outputPath, log);
253
253
  // make adjustments for packaging to work as a standalone, as opposed to part of yarn workspace
254
- // as in the monorepo source files
254
+ // as in the monorepo source files. replace things like "workspace^" with the actual version number
255
255
  await updatePackagingConfigurations(packageVersion, tag, outputPath, log);
256
256
  log('');
257
- log(`${contractName} has been successfully initialised!`);
257
+ log(`${contractName} has been successfully initialized!`);
258
258
  log('To get started, simply run the following commands:');
259
259
  log(` cd ${outputDirectoryName}`);
260
260
  log(' yarn');
261
+ log(' yarn start:sandbox');
262
+ log('And in another terminal in the same directory,');
261
263
  log(' yarn start:dev');
262
264
  }
263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5ib3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdW5ib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3QixNQUFNLFlBQVksR0FBRyxlQUFlLENBQUM7QUFDckMsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7QUFDckMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUMzQyxNQUFNLG1CQUFtQixHQUFHLDJDQUEyQyxDQUFDO0FBQ3hFLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDO0FBRXhDOzs7O0tBSUs7QUFDTCxTQUFTLG9CQUFvQixDQUFDLFlBQW9CLEVBQUUsU0FBUyxHQUFHLEdBQUc7SUFDakUsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQy9GLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsbUJBQW1CLENBQUMsYUFBcUI7SUFDdEQsSUFBSTtRQUNGLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0tBQ3pCO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDViw0QkFBNEI7UUFDNUIsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxv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
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5ib3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdW5ib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3QixNQUFNLFlBQVksR0FBRyxlQUFlLENBQUM7QUFDckMsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7QUFDckMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUMzQyxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQztBQUV4Qzs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsbUJBQW1CLENBQUMsYUFBcUI7SUFDdEQsSUFBSTtRQUNGLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0tBQ3pCO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDViw0QkFBNEI7UUFDNUIsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxJQUFXLEVBQUUsb0JBQTRCLEVBQUUsZUFBdUIsRUFBRSxHQUFVO0lBQ2hILEdBQUcsQ0FBQyxtQ0FBbUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FB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
package/dest/utils.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { AztecAddress, AztecRPC } from '@aztec/aztec.js';
1
+ import { AztecAddress, Fr, GrumpkinScalar, PXE, Point, TxHash } from '@aztec/aztec.js';
2
2
  import { ContractAbi } from '@aztec/foundation/abi';
3
3
  import { DebugLogger, LogFn } from '@aztec/foundation/log';
4
- export { createClient } from './client.js';
5
4
  /**
6
5
  * Helper type to dynamically import contracts.
7
6
  */
@@ -36,24 +35,78 @@ export declare function getExampleContractArtifacts(): Promise<ArtifactsType>;
36
35
  export declare function getContractAbi(fileDir: string, log: LogFn): Promise<ContractAbi>;
37
36
  /**
38
37
  * Utility to select a TX sender either from user input
39
- * or from the first account that is found in an Aztec RPC instance.
40
- * @param client - The Aztec RPC instance that will be checked for an account.
38
+ * or from the first account that is found in a PXE instance.
39
+ * @param pxe - The PXE instance that will be checked for an account.
41
40
  * @param _from - The user input.
42
41
  * @returns An Aztec address. Will throw if one can't be found in either options.
43
42
  */
44
- export declare function getTxSender(client: AztecRPC, _from?: string): Promise<AztecAddress>;
43
+ export declare function getTxSender(pxe: PXE, _from?: string): Promise<AztecAddress>;
45
44
  /**
46
45
  * Performs necessary checks, conversions & operations to call a contract fn from the CLI.
47
46
  * @param contractFile - Directory of the compiled contract ABI.
48
- * @param _contractAddress - Aztec Address of the contract.
47
+ * @param contractAddress - Aztec Address of the contract.
49
48
  * @param functionName - Name of the function to be called.
50
49
  * @param _functionArgs - Arguments to call the function with.
51
50
  * @param log - Logger instance that will output to the CLI
52
51
  * @returns Formatted contract address, function arguments and caller's aztec address.
53
52
  */
54
- export declare function prepTx(contractFile: string, _contractAddress: string, functionName: string, _functionArgs: string[], log: LogFn): Promise<{
55
- contractAddress: AztecAddress;
53
+ export declare function prepTx(contractFile: string, functionName: string, _functionArgs: string[], log: LogFn): Promise<{
56
54
  functionArgs: any[];
57
55
  contractAbi: ContractAbi;
58
56
  }>;
57
+ /**
58
+ * Removes the leading 0x from a hex string. If no leading 0x is found the string is returned unchanged.
59
+ * @param hex - A hex string
60
+ * @returns A new string with leading 0x removed
61
+ */
62
+ export declare const stripLeadingHex: (hex: string) => string;
63
+ /**
64
+ * Parses a hex encoded string to an Fr integer to be used as salt
65
+ * @param str - Hex encoded string
66
+ * @returns A integer to be used as salt
67
+ */
68
+ export declare function parseSaltFromHexString(str: string): Fr;
69
+ /**
70
+ * Parses an AztecAddress from a string. Throws InvalidArgumentError if the string is not a valid.
71
+ * @param address - A serialised Aztec address
72
+ * @returns An Aztec address
73
+ */
74
+ export declare function parseAztecAddress(address: string): AztecAddress;
75
+ /**
76
+ * Parses a TxHash from a string. Throws InvalidArgumentError if the string is not a valid.
77
+ * @param txHash - A transaction hash
78
+ * @returns A TxHash instance
79
+ */
80
+ export declare function parseTxHash(txHash: string): TxHash;
81
+ /**
82
+ * Parses a public key from a string. Throws InvalidArgumentError if the string is not a valid.
83
+ * @param publicKey - A public key
84
+ * @returns A Point instance
85
+ */
86
+ export declare function parsePublicKey(publicKey: string): Point;
87
+ /**
88
+ * Parses a partial address from a string. Throws InvalidArgumentError if the string is not a valid.
89
+ * @param address - A partial address
90
+ * @returns A Fr instance
91
+ */
92
+ export declare function parsePartialAddress(address: string): Fr;
93
+ /**
94
+ * Parses a private key from a string. Throws InvalidArgumentError if the string is not a valid.
95
+ * @param privateKey - A string
96
+ * @returns A private key
97
+ */
98
+ export declare function parsePrivateKey(privateKey: string): GrumpkinScalar;
99
+ /**
100
+ * Parses a field from a string. Throws InvalidArgumentError if the string is not a valid field value.
101
+ * @param field - A string representing the field.
102
+ * @returns A field.
103
+ */
104
+ export declare function parseField(field: string): Fr;
105
+ /**
106
+ * Parses an array of strings to Frs.
107
+ * @param fields - An array of strings representing the fields.
108
+ * @returns An array of Frs.
109
+ */
110
+ export declare function parseFields(fields: string[]): Fr[];
111
+ export {};
59
112
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAO3D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C;;GAEG;AACH,UAAU,aAAa;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,+CAM9D;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,wDAKzB;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,2BAGhD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,wBAuB/D;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,yBAgBjE;AAED;;;;;;;;GAQG;AACH,wBAAsB,MAAM,CAC1B,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EAAE,EACvB,GAAG,EAAE,KAAK;;;;GAaX"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEvF,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAoB3D;;GAEG;AACH,UAAU,aAAa;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,+CAM9D;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,wDA2BzB;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,2BAGhD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,wBAuB/D;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,yBAgBzD;AAED;;;;;;;;GAQG;AACH,wBAAsB,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK;;;GAM3G;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAS,MAAM,WAK1C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,CActD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAM/D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAMvD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,EAAE,CAMvD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAYlE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,CAyB5C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAElD"}
package/dest/utils.js CHANGED
@@ -1,9 +1,10 @@
1
- import { AztecAddress } from '@aztec/aztec.js';
1
+ import { AztecAddress, Fr, GrumpkinScalar, Point, TxHash } from '@aztec/aztec.js';
2
2
  import { createEthereumChain, deployL1Contracts } from '@aztec/ethereum';
3
+ import { ContractDeploymentEmitterAbi, ContractDeploymentEmitterBytecode, InboxAbi, InboxBytecode, OutboxAbi, OutboxBytecode, RegistryAbi, RegistryBytecode, RollupAbi, RollupBytecode, } from '@aztec/l1-artifacts';
4
+ import { InvalidArgumentError } from 'commander';
3
5
  import fs from 'fs';
4
6
  import { mnemonicToAccount, privateKeyToAccount } from 'viem/accounts';
5
7
  import { encodeArgs } from './encoding.js';
6
- export { createClient } from './client.js';
7
8
  /**
8
9
  * Helper to get an ABI function or throw error if it doesn't exist.
9
10
  * @param abi - Contract's ABI in JSON format.
@@ -27,7 +28,29 @@ export function getAbiFunction(abi, fnName) {
27
28
  export async function deployAztecContracts(rpcUrl, apiKey, privateKey, mnemonic, debugLogger) {
28
29
  const account = !privateKey ? mnemonicToAccount(mnemonic) : privateKeyToAccount(`0x${privateKey}`);
29
30
  const chain = createEthereumChain(rpcUrl, apiKey);
30
- return await deployL1Contracts(chain.rpcUrl, account, chain.chainInfo, debugLogger);
31
+ const l1Artifacts = {
32
+ contractDeploymentEmitter: {
33
+ contractAbi: ContractDeploymentEmitterAbi,
34
+ contractBytecode: ContractDeploymentEmitterBytecode,
35
+ },
36
+ registry: {
37
+ contractAbi: RegistryAbi,
38
+ contractBytecode: RegistryBytecode,
39
+ },
40
+ inbox: {
41
+ contractAbi: InboxAbi,
42
+ contractBytecode: InboxBytecode,
43
+ },
44
+ outbox: {
45
+ contractAbi: OutboxAbi,
46
+ contractBytecode: OutboxBytecode,
47
+ },
48
+ rollup: {
49
+ contractAbi: RollupAbi,
50
+ contractBytecode: RollupBytecode,
51
+ },
52
+ };
53
+ return await deployL1Contracts(chain.rpcUrl, account, chain.chainInfo, debugLogger, l1Artifacts);
31
54
  }
32
55
  /**
33
56
  * Gets all contracts available in \@aztec/noir-contracts.
@@ -68,25 +91,25 @@ export async function getContractAbi(fileDir, log) {
68
91
  }
69
92
  /**
70
93
  * Utility to select a TX sender either from user input
71
- * or from the first account that is found in an Aztec RPC instance.
72
- * @param client - The Aztec RPC instance that will be checked for an account.
94
+ * or from the first account that is found in a PXE instance.
95
+ * @param pxe - The PXE instance that will be checked for an account.
73
96
  * @param _from - The user input.
74
97
  * @returns An Aztec address. Will throw if one can't be found in either options.
75
98
  */
76
- export async function getTxSender(client, _from) {
99
+ export async function getTxSender(pxe, _from) {
77
100
  let from;
78
101
  if (_from) {
79
102
  try {
80
103
  from = AztecAddress.fromString(_from);
81
104
  }
82
105
  catch {
83
- throw new Error(`Invalid option 'from' passed: ${_from}`);
106
+ throw new InvalidArgumentError(`Invalid option 'from' passed: ${_from}`);
84
107
  }
85
108
  }
86
109
  else {
87
- const accounts = await client.getRegisteredAccounts();
110
+ const accounts = await pxe.getRegisteredAccounts();
88
111
  if (!accounts.length) {
89
- throw new Error('No accounts found in Aztec RPC instance.');
112
+ throw new Error('No accounts found in PXE instance.');
90
113
  }
91
114
  from = accounts[0].address;
92
115
  }
@@ -95,23 +118,150 @@ export async function getTxSender(client, _from) {
95
118
  /**
96
119
  * Performs necessary checks, conversions & operations to call a contract fn from the CLI.
97
120
  * @param contractFile - Directory of the compiled contract ABI.
98
- * @param _contractAddress - Aztec Address of the contract.
121
+ * @param contractAddress - Aztec Address of the contract.
99
122
  * @param functionName - Name of the function to be called.
100
123
  * @param _functionArgs - Arguments to call the function with.
101
124
  * @param log - Logger instance that will output to the CLI
102
125
  * @returns Formatted contract address, function arguments and caller's aztec address.
103
126
  */
104
- export async function prepTx(contractFile, _contractAddress, functionName, _functionArgs, log) {
105
- let contractAddress;
127
+ export async function prepTx(contractFile, functionName, _functionArgs, log) {
128
+ const contractAbi = await getContractAbi(contractFile, log);
129
+ const functionAbi = getAbiFunction(contractAbi, functionName);
130
+ const functionArgs = encodeArgs(_functionArgs, functionAbi.parameters);
131
+ return { functionArgs, contractAbi };
132
+ }
133
+ /**
134
+ * Removes the leading 0x from a hex string. If no leading 0x is found the string is returned unchanged.
135
+ * @param hex - A hex string
136
+ * @returns A new string with leading 0x removed
137
+ */
138
+ export const stripLeadingHex = (hex) => {
139
+ if (hex.length > 2 && hex.startsWith('0x')) {
140
+ return hex.substring(2);
141
+ }
142
+ return hex;
143
+ };
144
+ /**
145
+ * Parses a hex encoded string to an Fr integer to be used as salt
146
+ * @param str - Hex encoded string
147
+ * @returns A integer to be used as salt
148
+ */
149
+ export function parseSaltFromHexString(str) {
150
+ const hex = stripLeadingHex(str);
151
+ // ensure it's a hex string
152
+ if (!hex.match(/^[0-9a-f]+$/i)) {
153
+ throw new InvalidArgumentError('Invalid hex string');
154
+ }
155
+ // pad it so that we may read it as a buffer.
156
+ // Buffer needs _exactly_ two hex characters per byte
157
+ const padded = hex.length % 2 === 1 ? '0' + hex : hex;
158
+ // finally, turn it into an integer
159
+ return Fr.fromBuffer(Buffer.from(padded, 'hex'));
160
+ }
161
+ /**
162
+ * Parses an AztecAddress from a string. Throws InvalidArgumentError if the string is not a valid.
163
+ * @param address - A serialised Aztec address
164
+ * @returns An Aztec address
165
+ */
166
+ export function parseAztecAddress(address) {
106
167
  try {
107
- contractAddress = AztecAddress.fromString(_contractAddress);
168
+ return AztecAddress.fromString(address);
108
169
  }
109
170
  catch {
110
- throw new Error(`Unable to parse contract address ${_contractAddress}.`);
171
+ throw new InvalidArgumentError(`Invalid address: ${address}`);
111
172
  }
112
- const contractAbi = await getContractAbi(contractFile, log);
113
- const functionAbi = getAbiFunction(contractAbi, functionName);
114
- const functionArgs = encodeArgs(_functionArgs, functionAbi.parameters);
115
- return { contractAddress, functionArgs, contractAbi };
116
173
  }
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSXpFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBUTNDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFnQixFQUFFLE1BQWM7SUFDN0QsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDN0QsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNQLE1BQU0sS0FBSyxDQUFDLFlBQVksTUFBTSw2QkFBNkIsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsTUFBYyxFQUNkLE1BQWMsRUFDZCxVQUFrQixFQUNsQixRQUFnQixFQUNoQixXQUF3QjtJQUV4QixNQUFNLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsUUFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEtBQUssVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNwRyxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxN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
174
+ /**
175
+ * Parses a TxHash from a string. Throws InvalidArgumentError if the string is not a valid.
176
+ * @param txHash - A transaction hash
177
+ * @returns A TxHash instance
178
+ */
179
+ export function parseTxHash(txHash) {
180
+ try {
181
+ return TxHash.fromString(txHash);
182
+ }
183
+ catch {
184
+ throw new InvalidArgumentError(`Invalid transaction hash: ${txHash}`);
185
+ }
186
+ }
187
+ /**
188
+ * Parses a public key from a string. Throws InvalidArgumentError if the string is not a valid.
189
+ * @param publicKey - A public key
190
+ * @returns A Point instance
191
+ */
192
+ export function parsePublicKey(publicKey) {
193
+ try {
194
+ return Point.fromString(publicKey);
195
+ }
196
+ catch (err) {
197
+ throw new InvalidArgumentError(`Invalid public key: ${publicKey}`);
198
+ }
199
+ }
200
+ /**
201
+ * Parses a partial address from a string. Throws InvalidArgumentError if the string is not a valid.
202
+ * @param address - A partial address
203
+ * @returns A Fr instance
204
+ */
205
+ export function parsePartialAddress(address) {
206
+ try {
207
+ return Fr.fromString(address);
208
+ }
209
+ catch (err) {
210
+ throw new InvalidArgumentError(`Invalid partial address: ${address}`);
211
+ }
212
+ }
213
+ /**
214
+ * Parses a private key from a string. Throws InvalidArgumentError if the string is not a valid.
215
+ * @param privateKey - A string
216
+ * @returns A private key
217
+ */
218
+ export function parsePrivateKey(privateKey) {
219
+ try {
220
+ const value = GrumpkinScalar.fromString(privateKey);
221
+ // most likely a badly formatted key was passed
222
+ if (value.isZero()) {
223
+ throw new Error('Private key must not be zero');
224
+ }
225
+ return value;
226
+ }
227
+ catch (err) {
228
+ throw new InvalidArgumentError(`Invalid private key: ${privateKey}`);
229
+ }
230
+ }
231
+ /**
232
+ * Parses a field from a string. Throws InvalidArgumentError if the string is not a valid field value.
233
+ * @param field - A string representing the field.
234
+ * @returns A field.
235
+ */
236
+ export function parseField(field) {
237
+ try {
238
+ const isHex = field.startsWith('0x') || field.match(new RegExp(`^[0-9a-f]{${Fr.SIZE_IN_BYTES * 2}}$`, 'i'));
239
+ if (isHex) {
240
+ return Fr.fromString(field);
241
+ }
242
+ if (['true', 'false'].includes(field)) {
243
+ return new Fr(field === 'true');
244
+ }
245
+ const isNumber = +field || field === '0';
246
+ if (isNumber) {
247
+ return new Fr(BigInt(field));
248
+ }
249
+ const isBigInt = field.endsWith('n');
250
+ if (isBigInt) {
251
+ return new Fr(BigInt(field.replace(/n$/, '')));
252
+ }
253
+ return new Fr(BigInt(field));
254
+ }
255
+ catch (err) {
256
+ throw new InvalidArgumentError(`Invalid field: ${field}`);
257
+ }
258
+ }
259
+ /**
260
+ * Parses an array of strings to Frs.
261
+ * @param fields - An array of strings representing the fields.
262
+ * @returns An array of Frs.
263
+ */
264
+ export function parseFields(fields) {
265
+ return fields.map(parseField);
266
+ }
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RixPQUFPLEVBQW9DLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0csT0FBTyxFQUNMLDRCQUE0QixFQUM1QixpQ0FBaUMsRUFDakMsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsY0FBYyxFQUNkLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULGNBQWMsR0FDZixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFTM0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQWdCLEVBQUUsTUFBYztJQUM3RCxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ1AsTUFBTSxLQUFLLENBQUMsWUFBWSxNQUFNLDZCQUE2QixDQUFDLENBQUM7S0FDOUQ7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxNQUFjLEVBQ2QsTUFBYyxFQUNkLFVBQWtCLEVBQ2xCLFFBQWdCLEVBQ2hCLFdBQXdCO0lBRXhCLE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3BHLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRCxNQUFNLFdBQVcsR0FBcUM7UUFDcEQseUJBQXlCLEVBQUU7WUFDekIsV0FBVyxFQUFFLDRCQUE0QjtZQUN6QyxnQkFBZ0IsRUFBRSxpQ0FBaUM7U0FDcEQ7UUFDRCxRQUFRLEVBQUU7WUFDUixXQUFXLEVBQUUsV0FBVztZQUN4QixnQkFBZ0IsRUFBRSxnQkFBZ0I7U0FDbkM7UUFDRCxLQUFLLEVBQUU7WUFDTCxXQUFXLEVBQUUsUUFBUTtZQUNyQixnQkFBZ0IsRUFBRSxhQUFhO1NBQ2hDO1FBQ0QsTUFBTSxFQUFFO1lBQ04sV0FBVyxFQUFFLFNBQVM7WUFDdEIsZ0JBQWdCLEVBQUUsY0FBYztTQUNqQztRQUNELE1BQU0sRUFBRTtZQUNOLFdBQVcsRUFBRSxTQUFTO1lBQ3RCLGdCQUFnQixFQUFFLGNBQWM7U0FDakM7S0FDRixDQUFDO0lBQ0YsT0FBTyxNQUFNLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ25HLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDJCQUEyQjtJQUMvQyxNQUFNLFNBQVMsR0FBa0IsTUFBTSxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNqRixPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUFDLE9BQWUsRUFBRSxHQUFVO0lBQzlELCtDQUErQztJQUMvQyxJQUFJLFFBQWdCLENBQUM7SUFDckIsTUFBTSxTQUFTLEdBQUcsTUFBTSwyQkFBMkIsRUFBRSxDQUFDO0lBQ3RELElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBZ0IsQ0FBQztLQUMxQztJQUVELElBQUk7UUFDRixRQUFRLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDN0M7SUFBQyxNQUFNO1FBQ04sTUFBTSxLQUFLLENBQUMsWUFBWSxPQUFPLFlBQVksQ0FBQyxDQUFDO0tBQzlDO0lBRUQsNkNBQTZDO0lBQzdDLElBQUksV0FBd0IsQ0FBQztJQUM3QixJQUFJO1FBQ0YsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFnQixDQUFDO0tBQ25EO0lBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWixHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUM1QyxNQUFNLEdBQUcsQ0FBQztLQUNYO0lBQ0QsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLEdBQVEsRUFBRSxLQUFjO0lBQ3hELElBQUksSUFBa0IsQ0FBQztJQUN2QixJQUFJLEtBQUssRUFBRTtRQUNULElBQUk7WUFDRixJQUFJLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2QztRQUFDLE1BQU07WUFDTixNQUFNLElBQUksb0JBQW9CLENBQUMsaUNBQWlDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDMUU7S0FDRjtTQUFNO1FBQ0wsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7UUFDRCxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztLQUM1QjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBQUMsWUFBb0IsRUFBRSxZQUFvQixFQUFFLGFBQXVCLEVBQUUsR0FBVTtJQUMxRyxNQUFNLFdBQVcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUQsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM5RCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBQ3ZDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDN0MsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzFDLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6QjtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxHQUFXO0lBQ2hELE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVqQywyQkFBMkI7SUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUM7S0FDdEQ7SUFFRCw2Q0FBNkM7SUFDN0MscURBQXFEO0lBQ3JELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRXRELG1DQUFtQztJQUNuQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxPQUFlO0lBQy9DLElBQUk7UUFDRixPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDekM7SUFBQyxNQUFNO1FBQ04sTUFBTSxJQUFJLG9CQUFvQixDQUFDLG9CQUFvQixPQUFPLEVBQUUsQ0FBQyxDQUFDO0tBQy9EO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQWM7SUFDeEMsSUFBSTtRQUNGLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNsQztJQUFDLE1BQU07UUFDTixNQUFNLElBQUksb0JBQW9CLENBQUMsNkJBQTZCLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDdkU7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsU0FBaUI7SUFDOUMsSUFBSTtRQUNGLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNwQztJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osTUFBTSxJQUFJLG9CQUFvQixDQUFDLHVCQUF1QixTQUFTLEVBQUUsQ0FBQyxDQUFDO0tBQ3BFO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBZTtJQUNqRCxJQUFJO1FBQ0YsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQy9CO0lBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWixNQUFNLElBQUksb0JBQW9CLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUM7S0FDdkU7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0I7SUFDaEQsSUFBSTtRQUNGLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEQsK0NBQStDO1FBQy9DLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUNqRDtRQUVELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFBQyxPQUFPLEdBQUcsRUFBRTtRQUNaLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyx3QkFBd0IsVUFBVSxFQUFFLENBQUMsQ0FBQztLQUN0RTtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFhO0lBQ3RDLElBQUk7UUFDRixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUcsSUFBSSxLQUFLLEVBQUU7WUFDVCxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0I7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQyxPQUFPLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQztTQUNqQztRQUVELE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBSyxJQUFJLEtBQUssS0FBSyxHQUFHLENBQUM7UUFDekMsSUFBSSxRQUFRLEVBQUU7WUFDWixPQUFPLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQzlCO1FBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLFFBQVEsRUFBRTtZQUNaLE9BQU8sSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRDtRQUVELE9BQU8sSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDOUI7SUFBQyxPQUFPLEdBQUcsRUFBRTtRQUNaLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxrQkFBa0IsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMzRDtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUFnQjtJQUMxQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDaEMsQ0FBQyJ9