@latticexyz/common 2.2.22-ca7a36a114ba65468662dbeef343129fa60f04eb → 2.2.22-d2c77c206d94a00082a25939b786df04d8249fcb
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/dist/codegen.d.ts +12 -9
- package/dist/codegen.js +83 -44
- package/dist/codegen.js.map +1 -1
- package/dist/internal.js +3 -0
- package/dist/internal.js.map +1 -1
- package/package.json +2 -2
package/dist/codegen.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Hex } from 'viem';
|
|
2
2
|
import { Abi } from 'abitype';
|
|
3
3
|
import { SchemaType } from '@latticexyz/schema-type/deprecated';
|
|
4
|
-
import { SourceUnit, ContractDefinition } from '@solidity-parser/parser/dist/src/ast-types';
|
|
5
4
|
|
|
6
5
|
declare module "prettier-plugin-solidity" {}
|
|
7
6
|
|
|
@@ -168,6 +167,11 @@ declare function renderTypeHelpers(options: {
|
|
|
168
167
|
|
|
169
168
|
declare const schemaTypesToRecsTypeStrings: Record<SchemaType, string>;
|
|
170
169
|
|
|
170
|
+
interface SymbolImport {
|
|
171
|
+
symbol: string;
|
|
172
|
+
path: string;
|
|
173
|
+
}
|
|
174
|
+
|
|
171
175
|
interface ContractInterfaceFunction {
|
|
172
176
|
name: string;
|
|
173
177
|
parameters: string[];
|
|
@@ -178,10 +182,6 @@ interface ContractInterfaceError {
|
|
|
178
182
|
name: string;
|
|
179
183
|
parameters: string[];
|
|
180
184
|
}
|
|
181
|
-
interface SymbolImport {
|
|
182
|
-
symbol: string;
|
|
183
|
-
path: string;
|
|
184
|
-
}
|
|
185
185
|
/**
|
|
186
186
|
* Parse the contract data to get the functions necessary to generate an interface,
|
|
187
187
|
* and symbols to import from the original contract.
|
|
@@ -194,7 +194,6 @@ declare function contractToInterface(source: string, contractName: string): {
|
|
|
194
194
|
errors: ContractInterfaceError[];
|
|
195
195
|
symbolImports: SymbolImport[];
|
|
196
196
|
};
|
|
197
|
-
declare function findContractNode(ast: SourceUnit, contractName: string): ContractDefinition | undefined;
|
|
198
197
|
|
|
199
198
|
/**
|
|
200
199
|
* Formats solidity code using prettier
|
|
@@ -212,11 +211,11 @@ declare function formatTypescript(content: string): Promise<string>;
|
|
|
212
211
|
|
|
213
212
|
/**
|
|
214
213
|
* Formats solidity code using prettier and write it to a file
|
|
215
|
-
* @param
|
|
214
|
+
* @param content solidity code
|
|
216
215
|
* @param fullOutputPath full path to the output file
|
|
217
216
|
* @param logPrefix prefix for debug logs
|
|
218
217
|
*/
|
|
219
|
-
declare function formatAndWriteSolidity(
|
|
218
|
+
declare function formatAndWriteSolidity(content: string, fullOutputPath: string, logPrefix: string): Promise<void>;
|
|
220
219
|
/**
|
|
221
220
|
* Formats typescript code using prettier and write it to a file
|
|
222
221
|
* @param output typescript code
|
|
@@ -225,4 +224,8 @@ declare function formatAndWriteSolidity(output: string, fullOutputPath: string,
|
|
|
225
224
|
*/
|
|
226
225
|
declare function formatAndWriteTypescript(output: string, fullOutputPath: string, logPrefix: string): Promise<void>;
|
|
227
226
|
|
|
228
|
-
|
|
227
|
+
declare function parseSystem(source: string, contractName: string): undefined | {
|
|
228
|
+
contractType: "contract" | "abstract";
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
export { type AbiToInterfaceOptions, type ContractInterfaceError, type ContractInterfaceFunction, type ImportDatum, type RenderDynamicField, type RenderEnum, type RenderField, type RenderFieldTypeWrappingData, type RenderKeyTuple, type RenderStaticField, type RenderType, type StaticResourceData, abiToInterface, contractToInterface, formatAndWriteSolidity, formatAndWriteTypescript, formatSolidity, formatTypescript, getLeftPaddingBits, isLeftAligned, parseSystem, renderArguments, renderCommonData, renderEnums, renderImportPath, renderImports, renderList, renderTableId, renderTypeHelpers, renderValueTypeToBytes32, renderWithFieldSuffix, renderWithStore, renderedSolidityHeader, schemaTypesToRecsTypeStrings };
|
package/dist/codegen.js
CHANGED
|
@@ -520,7 +520,47 @@ var schemaTypesToRecsTypeStrings = {
|
|
|
520
520
|
};
|
|
521
521
|
|
|
522
522
|
// src/codegen/utils/contractToInterface.ts
|
|
523
|
-
import { parse, visit } from "@solidity-parser/parser";
|
|
523
|
+
import { parse, visit as visit3 } from "@solidity-parser/parser";
|
|
524
|
+
|
|
525
|
+
// src/codegen/utils/findContractNode.ts
|
|
526
|
+
import { visit } from "@solidity-parser/parser";
|
|
527
|
+
function findContractNode(ast, contractName) {
|
|
528
|
+
let contract = void 0;
|
|
529
|
+
visit(ast, {
|
|
530
|
+
ContractDefinition(node) {
|
|
531
|
+
if (node.name === contractName) {
|
|
532
|
+
contract = node;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
return contract;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// src/codegen/utils/findSymbolImport.ts
|
|
540
|
+
import { visit as visit2 } from "@solidity-parser/parser";
|
|
541
|
+
function findSymbolImport(ast, symbol) {
|
|
542
|
+
let symbolImport;
|
|
543
|
+
visit2(ast, {
|
|
544
|
+
ImportDirective({ path: path3, symbolAliases }) {
|
|
545
|
+
if (symbolAliases) {
|
|
546
|
+
for (const symbolAndAlias of symbolAliases) {
|
|
547
|
+
const symbolAlias = symbolAndAlias[1] ?? symbolAndAlias[0];
|
|
548
|
+
if (symbol === symbolAlias) {
|
|
549
|
+
symbolImport = {
|
|
550
|
+
// always use the original symbol for interface imports
|
|
551
|
+
symbol: symbolAndAlias[0],
|
|
552
|
+
path: path3
|
|
553
|
+
};
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
});
|
|
560
|
+
return symbolImport;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// src/codegen/utils/contractToInterface.ts
|
|
524
564
|
function contractToInterface(source, contractName) {
|
|
525
565
|
const ast = parse(source);
|
|
526
566
|
const contractNode = findContractNode(ast, contractName);
|
|
@@ -530,7 +570,7 @@ function contractToInterface(source, contractName) {
|
|
|
530
570
|
if (!contractNode) {
|
|
531
571
|
throw new MUDError(`Contract not found: ${contractName}`);
|
|
532
572
|
}
|
|
533
|
-
|
|
573
|
+
visit3(contractNode, {
|
|
534
574
|
FunctionDefinition({
|
|
535
575
|
name,
|
|
536
576
|
visibility,
|
|
@@ -580,17 +620,6 @@ function contractToInterface(source, contractName) {
|
|
|
580
620
|
symbolImports
|
|
581
621
|
};
|
|
582
622
|
}
|
|
583
|
-
function findContractNode(ast, contractName) {
|
|
584
|
-
let contract = void 0;
|
|
585
|
-
visit(ast, {
|
|
586
|
-
ContractDefinition(node) {
|
|
587
|
-
if (node.name === contractName) {
|
|
588
|
-
contract = node;
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
});
|
|
592
|
-
return contract;
|
|
593
|
-
}
|
|
594
623
|
function parseParameter({ name, typeName, storageLocation }) {
|
|
595
624
|
let typedNameWithLocation = "";
|
|
596
625
|
const { name: flattenedTypeName, stateMutability } = flattenTypeName(typeName);
|
|
@@ -655,33 +684,11 @@ function typeNameToSymbols(typeName) {
|
|
|
655
684
|
}
|
|
656
685
|
}
|
|
657
686
|
function symbolsToImports(ast, symbols) {
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
if (symbolAliases) {
|
|
664
|
-
for (const symbolAndAlias of symbolAliases) {
|
|
665
|
-
const symbolAlias = symbolAndAlias[1] || symbolAndAlias[0];
|
|
666
|
-
if (symbol === symbolAlias) {
|
|
667
|
-
symbolImport = {
|
|
668
|
-
// always use the original symbol for interface imports
|
|
669
|
-
symbol: symbolAndAlias[0],
|
|
670
|
-
path: path3
|
|
671
|
-
};
|
|
672
|
-
return;
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
});
|
|
678
|
-
if (symbolImport) {
|
|
679
|
-
imports.push(symbolImport);
|
|
680
|
-
} else {
|
|
681
|
-
throw new MUDError(`Symbol "${symbol}" has no explicit import`);
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
return imports;
|
|
687
|
+
return symbols.map((symbol) => {
|
|
688
|
+
const symbolImport = findSymbolImport(ast, symbol);
|
|
689
|
+
if (!symbolImport) throw new MUDError(`Symbol "${symbol}" has no explicit import`);
|
|
690
|
+
return symbolImport;
|
|
691
|
+
});
|
|
685
692
|
}
|
|
686
693
|
|
|
687
694
|
// src/codegen/utils/format.ts
|
|
@@ -731,10 +738,15 @@ debug2.log = console.debug.bind(console);
|
|
|
731
738
|
error.log = console.error.bind(console);
|
|
732
739
|
|
|
733
740
|
// src/codegen/utils/formatAndWrite.ts
|
|
734
|
-
async function formatAndWriteSolidity(
|
|
735
|
-
|
|
741
|
+
async function formatAndWriteSolidity(content, fullOutputPath, logPrefix) {
|
|
742
|
+
let output = content;
|
|
743
|
+
try {
|
|
744
|
+
output = await formatSolidity(output);
|
|
745
|
+
} catch (e) {
|
|
746
|
+
error(`Error while attempting to format ${fullOutputPath}`, e);
|
|
747
|
+
}
|
|
736
748
|
await fs.mkdir(path2.dirname(fullOutputPath), { recursive: true });
|
|
737
|
-
await fs.writeFile(fullOutputPath,
|
|
749
|
+
await fs.writeFile(fullOutputPath, output);
|
|
738
750
|
debug2(`${logPrefix}: ${fullOutputPath}`);
|
|
739
751
|
}
|
|
740
752
|
async function formatAndWriteTypescript(output, fullOutputPath, logPrefix) {
|
|
@@ -743,16 +755,43 @@ async function formatAndWriteTypescript(output, fullOutputPath, logPrefix) {
|
|
|
743
755
|
await fs.writeFile(fullOutputPath, formattedOutput);
|
|
744
756
|
debug2(`${logPrefix}: ${fullOutputPath}`);
|
|
745
757
|
}
|
|
758
|
+
|
|
759
|
+
// src/codegen/utils/parseSystem.ts
|
|
760
|
+
import { parse as parse2, visit as visit4 } from "@solidity-parser/parser";
|
|
761
|
+
var baseSystemName = "System";
|
|
762
|
+
var baseSystemPath = "@latticexyz/world/src/System.sol";
|
|
763
|
+
function parseSystem(source, contractName) {
|
|
764
|
+
const ast = parse2(source);
|
|
765
|
+
const contractNode = findContractNode(ast, contractName);
|
|
766
|
+
if (!contractNode) return;
|
|
767
|
+
const contractType = contractNode.kind;
|
|
768
|
+
if (contractType !== "contract" && contractType !== "abstract") return;
|
|
769
|
+
const isSystem = (() => {
|
|
770
|
+
if (contractName.endsWith("System") && contractName !== baseSystemName) return true;
|
|
771
|
+
let extendsBaseSystem = false;
|
|
772
|
+
visit4(contractNode, {
|
|
773
|
+
InheritanceSpecifier(node) {
|
|
774
|
+
if (node.baseName.namePath === baseSystemName) {
|
|
775
|
+
extendsBaseSystem = true;
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
});
|
|
779
|
+
return extendsBaseSystem && findSymbolImport(ast, baseSystemName)?.path === baseSystemPath;
|
|
780
|
+
})();
|
|
781
|
+
if (isSystem) {
|
|
782
|
+
return { contractType };
|
|
783
|
+
}
|
|
784
|
+
}
|
|
746
785
|
export {
|
|
747
786
|
abiToInterface,
|
|
748
787
|
contractToInterface,
|
|
749
|
-
findContractNode,
|
|
750
788
|
formatAndWriteSolidity,
|
|
751
789
|
formatAndWriteTypescript,
|
|
752
790
|
formatSolidity,
|
|
753
791
|
formatTypescript,
|
|
754
792
|
getLeftPaddingBits,
|
|
755
793
|
isLeftAligned,
|
|
794
|
+
parseSystem,
|
|
756
795
|
renderArguments,
|
|
757
796
|
renderCommonData,
|
|
758
797
|
renderEnums,
|
package/dist/codegen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/codegen/render-solidity/abiToInterface.ts","../src/codegen/render-solidity/renderImportPath.ts","../src/codegen/render-solidity/common.ts","../src/codegen/render-solidity/renderEnums.ts","../src/codegen/render-solidity/renderTypeHelpers.ts","../src/codegen/render-typescript/schemaTypesToRecsTypeStrings.ts","../src/codegen/utils/contractToInterface.ts","../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/codegen/debug.ts"],"sourcesContent":["import { AbiParameter, Hex } from \"viem\";\nimport { Abi, AbiError, AbiFunction, formatAbiItem, formatAbiParameter } from \"abitype\";\nimport { renderedSolidityHeader } from \"./common\";\nimport { hexToResource } from \"../../hexToResource\";\n\nfunction formatParam(param: AbiParameter): string {\n // return param.type === \"string\" || param.type === \"bytes\" || param.type === \"tuple\" || param.type.endsWith(\"]\")\n // ? `${formatAbiParameter(param)} memory`\n // : formatAbiParameter(param);\n return formatAbiParameter(param);\n}\n\nfunction formatFunction(item: AbiFunction): string {\n const params = item.inputs.map(formatParam).join(\", \");\n const returns = item.outputs.map(formatParam).join(\", \");\n return `function ${item.name}(${params}) external${returns.length ? ` returns (${returns})` : \"\"}`;\n}\n\nfunction formatSystemId(systemId: Hex): string {\n const resource = hexToResource(systemId);\n return `\n // equivalent to \\`WorldResourceIdLib.encode({ namespace: ${JSON.stringify(\n resource.namespace,\n )}, name: ${JSON.stringify(resource.name)}, typeId: RESOURCE_SYSTEM });\\`\n ResourceId constant systemId = ResourceId.wrap(${systemId});\n `;\n}\n\nexport type AbiToInterfaceOptions = {\n name: string;\n systemId?: Hex;\n abi: Abi;\n};\n\nexport function abiToInterface({ name, systemId, abi }: AbiToInterfaceOptions): string {\n const imports = systemId ? [`{ ResourceId } from \"@latticexyz/store/src/ResourceId.sol\"`] : [];\n const errors = abi.filter((item): item is AbiError => item.type === \"error\");\n const functions = abi.filter((item): item is AbiFunction => item.type === \"function\");\n\n return `\n ${renderedSolidityHeader}\n\n ${imports.map((item) => `import ${item};`).join(\"\\n\")}\n\n ${systemId ? formatSystemId(systemId) : \"\"}\n\n interface ${name} {\n ${errors.map((item) => `${formatAbiItem(item)};`).join(\"\\n\")}\n\n ${functions\n .map((item) => {\n if ([...item.inputs, ...item.outputs].some((param) => param.type.startsWith(\"tuple\"))) {\n return `// TODO: replace tuple with struct\\n// ${formatFunction(item)};`;\n }\n return `${formatFunction(item)};`;\n })\n .join(\"\\n\")}\n }\n `;\n}\n","import path from \"node:path\";\n\n// This will probably break for backslash-escaped POSIX paths,\n// but we'll worry about that later.\nfunction winToPosix(segment: string): string {\n return segment.replaceAll(path.win32.sep, path.posix.sep);\n}\n\nexport function renderImportPath(basePath: string, ...segments: readonly string[]): string {\n // Solidity compiler expects POSIX paths\n const fullPath = path.posix\n .join(winToPosix(basePath), ...segments.map(winToPosix))\n // remove trailing slash\n .replace(/\\/$/, \"\");\n\n // `path.join` strips the leading `./`\n // so if we started with a relative path, make it relative again\n if (basePath.startsWith(\".\")) {\n const relativePath = \"./\" + fullPath;\n return relativePath.replace(/^(\\.\\/)+\\./, \".\");\n }\n\n return fullPath;\n}\n","import { ImportDatum, StaticResourceData, RenderKeyTuple, RenderType } from \"./types\";\nimport { resourceToHex } from \"../../resourceToHex\";\nimport { hexToResource } from \"../../hexToResource\";\nimport { renderImportPath } from \"./renderImportPath\";\nimport { isDefined } from \"../../utils\";\n\n/**\n * Common header for all codegenerated solidity files\n */\nexport const renderedSolidityHeader = `// SPDX-License-Identifier: MIT\npragma solidity >=0.8.24;\n\n/* Autogenerated file. Do not edit manually. */`;\n\n/**\n * Renders a list of lines\n */\nexport function renderList<T>(list: T[], renderItem: (item: T, index: number) => string): string {\n return internalRenderList(\"\", list, renderItem);\n}\n\n/**\n * Renders a comma-separated list of arguments for solidity functions, ignoring empty and undefined ones\n */\nexport function renderArguments(args: (string | undefined)[]): string {\n return args\n .filter(isDefined)\n .filter((arg) => arg !== \"\")\n .join(\", \");\n}\n\ninterface RenderedCommonData {\n /** `_tableId` variable prefixed with its type (empty string if absent) */\n _typedTableId: string;\n /** Comma-separated table key names prefixed with their types (empty string if 0 keys) */\n _typedKeyArgs: string;\n /** Definition and initialization of the dynamic `_keyTuple` bytes32 array */\n _keyTupleDefinition: string;\n}\n\n/**\n * Renders some solidity statements commonly used within table libraries\n * @param param0.staticResourceData static data about the table library\n * @param param0.keyTuple key tuple of the table library\n * @returns Rendered statement strings\n */\nexport function renderCommonData({\n staticResourceData,\n keyTuple,\n}: {\n staticResourceData?: StaticResourceData;\n keyTuple: RenderKeyTuple[];\n}): RenderedCommonData {\n // static resource means static tableId as well, and no tableId arguments\n const _typedTableId = staticResourceData ? \"\" : \"ResourceId _tableId\";\n const _typedKeyArgs = renderArguments(keyTuple.map(({ name, typeWithLocation }) => `${typeWithLocation} ${name}`));\n\n const _keyTupleDefinition = `\n bytes32[] memory _keyTuple = new bytes32[](${keyTuple.length});\n ${renderList(keyTuple, (key, index) => `_keyTuple[${index}] = ${renderValueTypeToBytes32(key.name, key)};`)}\n `;\n\n return {\n _typedTableId,\n _typedKeyArgs,\n _keyTupleDefinition,\n };\n}\n\n/**\n * Aggregates, deduplicates and renders imports for symbols per path.\n * Identical symbols from different paths are NOT handled, they should be checked before rendering.\n */\nexport function renderImports(imports: ImportDatum[]): string {\n // Aggregate symbols by import path, also deduplicating them\n const aggregatedImports = new Map<string, Set<string>>();\n for (const { symbol, path } of imports) {\n if (!aggregatedImports.has(path)) {\n aggregatedImports.set(path, new Set());\n }\n aggregatedImports.get(path)?.add(symbol);\n }\n // Render imports\n const renderedImports = [];\n for (const [path, symbols] of aggregatedImports) {\n const renderedSymbols = [...symbols].join(\", \");\n renderedImports.push(`import { ${renderedSymbols} } from \"${renderImportPath(path)}\";`);\n }\n return renderedImports.join(\"\\n\");\n}\n\ninterface RenderWithStoreCallbackData {\n /** `_store` variable prefixed with its type (undefined if library name) */\n _typedStore: string | undefined;\n /** `_store` variable (undefined if library name) */\n _store: string;\n /** Empty string if storeArgument is false, otherwise `\" (using the specified store)\"` */\n _commentSuffix: string;\n /** Prefix to differentiate different kinds of store usage within methods */\n _methodNamePrefix: string;\n /** Whether FieldLayout variable should be passed to store methods */\n _useExplicitFieldLayout?: boolean;\n}\n\n/**\n * Renders several versions of the callback's result, which access Store in different ways\n * @param storeArgument whether to render a version with `IStore _store` as an argument\n * @param callback renderer for a method which uses store\n * @returns Concatenated results of all callback calls\n */\nexport function renderWithStore(\n storeArgument: boolean,\n callback: (data: RenderWithStoreCallbackData) => string,\n): string {\n let result = \"\";\n result += callback({ _typedStore: undefined, _store: \"StoreSwitch\", _commentSuffix: \"\", _methodNamePrefix: \"\" });\n result += callback({\n _typedStore: undefined,\n _store: \"StoreCore\",\n _commentSuffix: \"\",\n _methodNamePrefix: \"_\",\n _useExplicitFieldLayout: true,\n });\n\n if (storeArgument) {\n result +=\n \"\\n\" +\n callback({\n _typedStore: \"IStore _store\",\n _store: \"_store\",\n _commentSuffix: \" (using the specified store)\",\n _methodNamePrefix: \"\",\n });\n }\n\n return result;\n}\n\n/**\n * Renders several versions of the callback's result, which have different method name suffixes\n * @param withSuffixlessFieldMethods whether to render methods with an empty suffix\n * @param fieldName name of the field which the methods access, used for a suffix\n * @param callback renderer for a method to be suffixed\n * @returns Concatenated results of all callback calls\n */\nexport function renderWithFieldSuffix(\n withSuffixlessFieldMethods: boolean,\n fieldName: string,\n callback: (_methodNameSuffix: string) => string,\n): string {\n const methodNameSuffix = `${fieldName[0].toUpperCase()}${fieldName.slice(1)}`;\n let result = \"\";\n result += callback(methodNameSuffix);\n\n if (withSuffixlessFieldMethods) {\n result += \"\\n\" + callback(\"\");\n }\n\n return result;\n}\n\n/**\n * Renders `_tableId` definition of the given table.\n * @param param0 static resource data needed to construct the table ID\n */\nexport function renderTableId({\n namespace,\n name,\n offchainOnly,\n}: Pick<StaticResourceData, \"namespace\" | \"name\" | \"offchainOnly\">): string {\n const tableId = resourceToHex({\n type: offchainOnly ? \"offchainTable\" : \"table\",\n namespace,\n name,\n });\n // turn table ID back into arguments that would be valid in `WorldResourceIdLib.encode` (like truncated names)\n const resource = hexToResource(tableId);\n return `\n // Hex below is the result of \\`WorldResourceIdLib.encode({ namespace: ${JSON.stringify(\n resource.namespace,\n )}, name: ${JSON.stringify(resource.name)}, typeId: ${offchainOnly ? \"RESOURCE_OFFCHAIN_TABLE\" : \"RESOURCE_TABLE\"} });\\`\n ResourceId constant _tableId = ResourceId.wrap(${tableId});\n `;\n}\n\n/**\n * Renders solidity typecasts to get from the given type to `bytes32`\n * @param name variable name to be typecasted\n * @param param1 type data\n */\nexport function renderValueTypeToBytes32(\n name: string,\n { typeUnwrap, internalTypeId }: Pick<RenderType, \"typeUnwrap\" | \"internalTypeId\">,\n): string {\n const innerText = typeUnwrap.length ? `${typeUnwrap}(${name})` : name;\n\n if (internalTypeId === \"bytes32\") {\n return innerText;\n } else if (/^bytes\\d{1,2}$/.test(internalTypeId)) {\n return `bytes32(${innerText})`;\n } else if (/^uint\\d{1,3}$/.test(internalTypeId)) {\n return `bytes32(uint256(${innerText}))`;\n } else if (/^int\\d{1,3}$/.test(internalTypeId)) {\n return `bytes32(uint256(int256(${innerText})))`;\n } else if (internalTypeId === \"address\") {\n return `bytes32(uint256(uint160(${innerText})))`;\n } else if (internalTypeId === \"bool\") {\n return `_boolToBytes32(${innerText})`;\n } else {\n throw new Error(`Unknown value type id ${internalTypeId}`);\n }\n}\n\n/**\n * Whether the storage representation of the given solidity type is left aligned\n */\nexport function isLeftAligned(field: Pick<RenderType, \"internalTypeId\">): boolean {\n return /^bytes\\d{1,2}$/.test(field.internalTypeId);\n}\n\n/**\n * The number of padding bits in the storage representation of a right-aligned solidity type\n */\nexport function getLeftPaddingBits(field: Pick<RenderType, \"internalTypeId\" | \"staticByteLength\">): number {\n if (isLeftAligned(field)) {\n return 0;\n } else {\n return 256 - field.staticByteLength * 8;\n }\n}\n\n/**\n * Internal helper to render `lineTerminator`-separated list of items mapped by `renderItem`\n */\nfunction internalRenderList<T>(\n lineTerminator: string,\n list: T[],\n renderItem: (item: T, index: number) => string,\n): string {\n return list\n .map((item, index) => renderItem(item, index) + (index === list.length - 1 ? \"\" : lineTerminator))\n .join(\"\\n\");\n}\n","import { renderedSolidityHeader } from \"./common\";\n\n// importing this from config or store would be a cyclic dependency :(\ntype Enums = {\n readonly [name: string]: readonly [string, ...string[]];\n};\n\n/**\n * Render a list of enum data as solidity enum definitions\n */\nexport function renderEnums(enums: Enums): string {\n const enumDefinitions = Object.entries(enums).map(\n ([name, values]) => `\n enum ${name} {\n ${values.join(\", \")}\n }\n `,\n );\n\n return `\n ${renderedSolidityHeader}\n ${enumDefinitions.join(\"\")}\n `;\n}\n","import { RenderField, RenderKeyTuple, RenderType } from \"./types\";\n\n/**\n * Renders the necessary helper functions to typecast to/from the types of given fields and keys\n */\nexport function renderTypeHelpers(options: { fields: RenderField[]; keyTuple: RenderKeyTuple[] }): string {\n const { fields, keyTuple } = options;\n\n let result = \"\";\n\n for (const wrappingHelper of getWrappingHelpers([...fields, ...keyTuple])) {\n result += wrappingHelper;\n }\n\n // bool is special - it's the only primitive value type that can't be typecasted to/from\n if (fields.some(({ internalTypeId }) => internalTypeId.match(\"bool\"))) {\n result += `\n /**\n * @notice Cast a value to a bool.\n * @dev Boolean values are encoded as uint8 (1 = true, 0 = false), but Solidity doesn't allow casting between uint8 and bool.\n * @param value The uint8 value to convert.\n * @return result The boolean value.\n */\n function _toBool(uint8 value) pure returns (bool result) {\n assembly {\n result := value\n }\n }\n `;\n }\n if (keyTuple.some(({ internalTypeId }) => internalTypeId.match(\"bool\"))) {\n result += `\n /**\n * @notice Cast a bool to a bytes32.\n * @dev The boolean value is casted to a bytes32 value with 0 or 1 at the least significant bit.\n */\n function _boolToBytes32(bool value) pure returns (bytes32 result) {\n assembly {\n result := value\n }\n }\n `;\n }\n\n return result;\n}\n\nfunction getWrappingHelpers(array: RenderType[]): string[] {\n const wrappers = new Map<string, string>();\n const unwrappers = new Map<string, string>();\n for (const { typeWrappingData, typeWrap, typeUnwrap, internalTypeId } of array) {\n if (!typeWrappingData) continue;\n const { kind } = typeWrappingData;\n\n if (kind === \"staticArray\") {\n const { elementType, staticLength } = typeWrappingData;\n wrappers.set(typeWrap, renderWrapperStaticArray(typeWrap, elementType, staticLength, internalTypeId));\n unwrappers.set(typeUnwrap, renderUnwrapperStaticArray(typeUnwrap, elementType, staticLength, internalTypeId));\n }\n }\n\n return [...wrappers.values(), ...unwrappers.values()];\n}\n\n/**\n * Renders a function to cast a dynamic array to a static array.\n * @param functionName name of the function to be rendered\n * @param elementType type of the array's element\n * @param staticLength length of the static array\n * @param internalTypeId solidity type name of the dynamic array\n * @returns\n */\nfunction renderWrapperStaticArray(\n functionName: string,\n elementType: string,\n staticLength: number,\n internalTypeId: string,\n): string {\n // WARNING: ensure this still works if changing major solidity versions!\n // (the memory layout for static arrays may change)\n return `\n /**\n * @notice Cast a dynamic array to a static array.\n * @dev In memory static arrays are just dynamic arrays without the 32 length bytes,\n * so this function moves the pointer to the first element of the dynamic array.\n * If the length of the dynamic array is smaller than the static length,\n * the function returns an uninitialized array to avoid memory corruption.\n * @param _value The dynamic array to cast.\n * @return _result The static array.\n */\n function ${functionName}(\n ${internalTypeId} memory _value\n ) pure returns (\n ${elementType}[${staticLength}] memory _result\n ) {\n if (_value.length < ${staticLength}) {\n // return an uninitialized array if the length is smaller than the fixed length to avoid memory corruption\n return _result;\n } else {\n // in memory static arrays are just dynamic arrays without the 32 length bytes\n // (without the length check this could lead to memory corruption)\n assembly {\n _result := add(_value, 0x20)\n }\n }\n }\n `;\n}\n\n/**\n * Renders a function to cast a static array to a dynamic array.\n * @param functionName name of the function to be rendered\n * @param elementType type of the array's element\n * @param staticLength length of the static array\n * @param internalTypeId solidity type name of the dynamic array\n * @returns\n */\nfunction renderUnwrapperStaticArray(\n functionName: string,\n elementType: string,\n staticLength: number,\n internalTypeId: string,\n): string {\n // byte length for memory copying (more efficient than a loop)\n const byteLength = staticLength * 32;\n // TODO to optimize memory usage consider generalizing TightEncoder to a render-time utility\n return `\n /**\n * @notice Copy a static array to a dynamic array.\n * @dev Static arrays don't have a length prefix, so this function copies the memory from the static array to a new dynamic array.\n * @param _value The static array to copy.\n * @return _result The dynamic array.\n */ \n function ${functionName}(\n ${elementType}[${staticLength}] memory _value\n ) pure returns (\n ${internalTypeId} memory _result\n ) {\n _result = new ${internalTypeId}(${staticLength});\n uint256 fromPointer;\n uint256 toPointer;\n assembly {\n fromPointer := _value\n toPointer := add(_result, 0x20)\n }\n Memory.copy(fromPointer, toPointer, ${byteLength});\n }\n `;\n}\n","import { SchemaType } from \"@latticexyz/schema-type/deprecated\";\n\nexport const schemaTypesToRecsTypeStrings: Record<SchemaType, string> = {\n [SchemaType.UINT8]: \"RecsType.Number\",\n [SchemaType.UINT16]: \"RecsType.Number\",\n [SchemaType.UINT24]: \"RecsType.Number\",\n [SchemaType.UINT32]: \"RecsType.Number\",\n [SchemaType.UINT40]: \"RecsType.Number\",\n [SchemaType.UINT48]: \"RecsType.Number\",\n [SchemaType.UINT56]: \"RecsType.BigInt\",\n [SchemaType.UINT64]: \"RecsType.BigInt\",\n [SchemaType.UINT72]: \"RecsType.BigInt\",\n [SchemaType.UINT80]: \"RecsType.BigInt\",\n [SchemaType.UINT88]: \"RecsType.BigInt\",\n [SchemaType.UINT96]: \"RecsType.BigInt\",\n [SchemaType.UINT104]: \"RecsType.BigInt\",\n [SchemaType.UINT112]: \"RecsType.BigInt\",\n [SchemaType.UINT120]: \"RecsType.BigInt\",\n [SchemaType.UINT128]: \"RecsType.BigInt\",\n [SchemaType.UINT136]: \"RecsType.BigInt\",\n [SchemaType.UINT144]: \"RecsType.BigInt\",\n [SchemaType.UINT152]: \"RecsType.BigInt\",\n [SchemaType.UINT160]: \"RecsType.BigInt\",\n [SchemaType.UINT168]: \"RecsType.BigInt\",\n [SchemaType.UINT176]: \"RecsType.BigInt\",\n [SchemaType.UINT184]: \"RecsType.BigInt\",\n [SchemaType.UINT192]: \"RecsType.BigInt\",\n [SchemaType.UINT200]: \"RecsType.BigInt\",\n [SchemaType.UINT208]: \"RecsType.BigInt\",\n [SchemaType.UINT216]: \"RecsType.BigInt\",\n [SchemaType.UINT224]: \"RecsType.BigInt\",\n [SchemaType.UINT232]: \"RecsType.BigInt\",\n [SchemaType.UINT240]: \"RecsType.BigInt\",\n [SchemaType.UINT248]: \"RecsType.BigInt\",\n [SchemaType.UINT256]: \"RecsType.BigInt\",\n [SchemaType.INT8]: \"RecsType.Number\",\n [SchemaType.INT16]: \"RecsType.Number\",\n [SchemaType.INT24]: \"RecsType.Number\",\n [SchemaType.INT32]: \"RecsType.Number\",\n [SchemaType.INT40]: \"RecsType.Number\",\n [SchemaType.INT48]: \"RecsType.Number\",\n [SchemaType.INT56]: \"RecsType.BigInt\",\n [SchemaType.INT64]: \"RecsType.BigInt\",\n [SchemaType.INT72]: \"RecsType.BigInt\",\n [SchemaType.INT80]: \"RecsType.BigInt\",\n [SchemaType.INT88]: \"RecsType.BigInt\",\n [SchemaType.INT96]: \"RecsType.BigInt\",\n [SchemaType.INT104]: \"RecsType.BigInt\",\n [SchemaType.INT112]: \"RecsType.BigInt\",\n [SchemaType.INT120]: \"RecsType.BigInt\",\n [SchemaType.INT128]: \"RecsType.BigInt\",\n [SchemaType.INT136]: \"RecsType.BigInt\",\n [SchemaType.INT144]: \"RecsType.BigInt\",\n [SchemaType.INT152]: \"RecsType.BigInt\",\n [SchemaType.INT160]: \"RecsType.BigInt\",\n [SchemaType.INT168]: \"RecsType.BigInt\",\n [SchemaType.INT176]: \"RecsType.BigInt\",\n [SchemaType.INT184]: \"RecsType.BigInt\",\n [SchemaType.INT192]: \"RecsType.BigInt\",\n [SchemaType.INT200]: \"RecsType.BigInt\",\n [SchemaType.INT208]: \"RecsType.BigInt\",\n [SchemaType.INT216]: \"RecsType.BigInt\",\n [SchemaType.INT224]: \"RecsType.BigInt\",\n [SchemaType.INT232]: \"RecsType.BigInt\",\n [SchemaType.INT240]: \"RecsType.BigInt\",\n [SchemaType.INT248]: \"RecsType.BigInt\",\n [SchemaType.INT256]: \"RecsType.BigInt\",\n [SchemaType.BYTES1]: \"RecsType.String\",\n [SchemaType.BYTES2]: \"RecsType.String\",\n [SchemaType.BYTES3]: \"RecsType.String\",\n [SchemaType.BYTES4]: \"RecsType.String\",\n [SchemaType.BYTES5]: \"RecsType.String\",\n [SchemaType.BYTES6]: \"RecsType.String\",\n [SchemaType.BYTES7]: \"RecsType.String\",\n [SchemaType.BYTES8]: \"RecsType.String\",\n [SchemaType.BYTES9]: \"RecsType.String\",\n [SchemaType.BYTES10]: \"RecsType.String\",\n [SchemaType.BYTES11]: \"RecsType.String\",\n [SchemaType.BYTES12]: \"RecsType.String\",\n [SchemaType.BYTES13]: \"RecsType.String\",\n [SchemaType.BYTES14]: \"RecsType.String\",\n [SchemaType.BYTES15]: \"RecsType.String\",\n [SchemaType.BYTES16]: \"RecsType.String\",\n [SchemaType.BYTES17]: \"RecsType.String\",\n [SchemaType.BYTES18]: \"RecsType.String\",\n [SchemaType.BYTES19]: \"RecsType.String\",\n [SchemaType.BYTES20]: \"RecsType.String\",\n [SchemaType.BYTES21]: \"RecsType.String\",\n [SchemaType.BYTES22]: \"RecsType.String\",\n [SchemaType.BYTES23]: \"RecsType.String\",\n [SchemaType.BYTES24]: \"RecsType.String\",\n [SchemaType.BYTES25]: \"RecsType.String\",\n [SchemaType.BYTES26]: \"RecsType.String\",\n [SchemaType.BYTES27]: \"RecsType.String\",\n [SchemaType.BYTES28]: \"RecsType.String\",\n [SchemaType.BYTES29]: \"RecsType.String\",\n [SchemaType.BYTES30]: \"RecsType.String\",\n [SchemaType.BYTES31]: \"RecsType.String\",\n [SchemaType.BYTES32]: \"RecsType.String\",\n [SchemaType.BOOL]: \"RecsType.Boolean\",\n [SchemaType.ADDRESS]: \"RecsType.String\",\n [SchemaType.UINT8_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT16_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT24_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT32_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT40_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT48_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT56_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT64_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT72_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT80_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT88_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT96_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT104_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT112_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT120_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT128_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT136_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT144_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT152_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT160_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT168_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT176_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT184_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT192_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT200_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT208_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT216_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT224_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT232_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT240_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT248_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT256_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT8_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT16_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT24_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT32_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT40_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT48_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT56_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT64_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT72_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT80_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT88_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT96_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT104_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT112_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT120_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT128_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT136_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT144_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT152_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT160_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT168_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT176_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT184_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT192_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT200_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT208_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT216_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT224_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT232_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT240_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT248_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT256_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES1_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES2_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES3_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES4_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES5_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES6_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES7_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES8_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES9_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES10_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES11_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES12_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES13_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES14_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES15_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES16_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES17_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES18_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES19_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES20_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES21_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES22_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES23_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES24_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES25_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES26_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES27_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES28_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES29_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES30_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES31_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES32_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BOOL_ARRAY]: \"RecsType.T\", // no boolean array\n [SchemaType.ADDRESS_ARRAY]: \"RecsType.StringArray\",\n [SchemaType.BYTES]: \"RecsType.String\",\n [SchemaType.STRING]: \"RecsType.String\",\n};\n","import { parse, visit } from \"@solidity-parser/parser\";\nimport type {\n ContractDefinition,\n SourceUnit,\n TypeName,\n VariableDeclaration,\n} from \"@solidity-parser/parser/dist/src/ast-types\";\nimport { MUDError } from \"../../errors\";\n\nexport interface ContractInterfaceFunction {\n name: string;\n parameters: string[];\n stateMutability: string;\n returnParameters: string[];\n}\n\nexport interface ContractInterfaceError {\n name: string;\n parameters: string[];\n}\n\ninterface SymbolImport {\n symbol: string;\n path: string;\n}\n\n/**\n * Parse the contract data to get the functions necessary to generate an interface,\n * and symbols to import from the original contract.\n * @param source contents of a file with the solidity contract\n * @param contractName name of the contract\n * @returns interface data\n */\nexport function contractToInterface(\n source: string,\n contractName: string,\n): {\n functions: ContractInterfaceFunction[];\n errors: ContractInterfaceError[];\n symbolImports: SymbolImport[];\n} {\n const ast = parse(source);\n const contractNode = findContractNode(ast, contractName);\n let symbolImports: SymbolImport[] = [];\n const functions: ContractInterfaceFunction[] = [];\n const errors: ContractInterfaceError[] = [];\n\n if (!contractNode) {\n throw new MUDError(`Contract not found: ${contractName}`);\n }\n\n visit(contractNode, {\n FunctionDefinition({\n name,\n visibility,\n parameters,\n stateMutability,\n returnParameters,\n isConstructor,\n isFallback,\n isReceiveEther,\n }) {\n try {\n // skip constructor and fallbacks\n if (isConstructor || isFallback || isReceiveEther) return;\n // forbid default visibility (this check might be unnecessary, modern solidity already disallows this)\n if (visibility === \"default\") throw new MUDError(`Visibility is not specified`);\n\n if (visibility === \"external\" || visibility === \"public\") {\n functions.push({\n name: name === null ? \"\" : name,\n parameters: parameters.map(parseParameter),\n stateMutability: stateMutability || \"\",\n returnParameters: returnParameters === null ? [] : returnParameters.map(parseParameter),\n });\n\n for (const { typeName } of parameters.concat(returnParameters ?? [])) {\n const symbols = typeNameToSymbols(typeName);\n symbolImports = symbolImports.concat(symbolsToImports(ast, symbols));\n }\n }\n } catch (error: unknown) {\n if (error instanceof MUDError) {\n error.message = `Function \"${name}\" in contract \"${contractName}\": ${error.message}`;\n }\n throw error;\n }\n },\n CustomErrorDefinition({ name, parameters }) {\n errors.push({\n name,\n parameters: parameters.map(parseParameter),\n });\n\n for (const parameter of parameters) {\n const symbols = typeNameToSymbols(parameter.typeName);\n symbolImports = symbolImports.concat(symbolsToImports(ast, symbols));\n }\n },\n });\n\n return {\n functions,\n errors,\n symbolImports,\n };\n}\n\nexport function findContractNode(ast: SourceUnit, contractName: string): ContractDefinition | undefined {\n let contract: ContractDefinition | undefined = undefined;\n\n visit(ast, {\n ContractDefinition(node) {\n if (node.name === contractName) {\n contract = node;\n }\n },\n });\n\n return contract;\n}\n\nfunction parseParameter({ name, typeName, storageLocation }: VariableDeclaration): string {\n let typedNameWithLocation = \"\";\n\n const { name: flattenedTypeName, stateMutability } = flattenTypeName(typeName);\n // type name (e.g. uint256)\n typedNameWithLocation += flattenedTypeName;\n // optional mutability (e.g. address payable)\n if (stateMutability !== null) {\n typedNameWithLocation += ` ${stateMutability}`;\n }\n // location, when relevant (e.g. string memory)\n if (storageLocation !== null) {\n typedNameWithLocation += ` ${storageLocation}`;\n }\n // optional variable name\n if (name !== null) {\n typedNameWithLocation += ` ${name}`;\n }\n\n return typedNameWithLocation;\n}\n\nfunction flattenTypeName(typeName: TypeName | null): { name: string; stateMutability: string | null } {\n if (typeName === null) {\n return {\n name: \"\",\n stateMutability: null,\n };\n }\n if (typeName.type === \"ElementaryTypeName\") {\n return {\n name: typeName.name,\n stateMutability: typeName.stateMutability,\n };\n } else if (typeName.type === \"UserDefinedTypeName\") {\n return {\n name: typeName.namePath,\n stateMutability: null,\n };\n } else if (typeName.type === \"ArrayTypeName\") {\n let length = \"\";\n if (typeName.length?.type === \"NumberLiteral\") {\n length = typeName.length.number;\n } else if (typeName.length?.type === \"Identifier\") {\n length = typeName.length.name;\n }\n\n const { name, stateMutability } = flattenTypeName(typeName.baseTypeName);\n return {\n name: `${name}[${length}]`,\n stateMutability,\n };\n } else {\n // TODO function types are unsupported but could be useful\n throw new MUDError(`Invalid typeName.type ${typeName.type}`);\n }\n}\n\n// Get symbols that need to be imported for given typeName\nfunction typeNameToSymbols(typeName: TypeName | null): string[] {\n if (typeName?.type === \"UserDefinedTypeName\") {\n // split is needed to get a library, if types are internal to it\n const symbol = typeName.namePath.split(\".\")[0];\n return [symbol];\n } else if (typeName?.type === \"ArrayTypeName\") {\n const symbols = typeNameToSymbols(typeName.baseTypeName);\n // array types can also use symbols (constants) for length\n if (typeName.length?.type === \"Identifier\") {\n const innerTypeName = typeName.length.name;\n symbols.push(innerTypeName.split(\".\")[0]);\n }\n return symbols;\n } else {\n return [];\n }\n}\n\n// Get imports for given symbols.\n// To avoid circular dependencies of interfaces on their implementations,\n// symbols used for args/returns must always be imported from an auxiliary file.\n// To avoid parsing the entire project to build dependencies,\n// symbols must be imported with an explicit `import { symbol } from ...`\nfunction symbolsToImports(ast: SourceUnit, symbols: string[]): SymbolImport[] {\n const imports: SymbolImport[] = [];\n\n for (const symbol of symbols) {\n let symbolImport: SymbolImport | undefined;\n\n visit(ast, {\n ImportDirective({ path, symbolAliases }) {\n if (symbolAliases) {\n for (const symbolAndAlias of symbolAliases) {\n // either check the alias, or the original symbol if there's no alias\n const symbolAlias = symbolAndAlias[1] || symbolAndAlias[0];\n if (symbol === symbolAlias) {\n symbolImport = {\n // always use the original symbol for interface imports\n symbol: symbolAndAlias[0],\n path,\n };\n return;\n }\n }\n }\n },\n });\n\n if (symbolImport) {\n imports.push(symbolImport);\n } else {\n throw new MUDError(`Symbol \"${symbol}\" has no explicit import`);\n }\n }\n\n return imports;\n}\n","import prettier from \"prettier\";\nimport prettierPluginSolidity from \"prettier-plugin-solidity\";\n\n/**\n * Formats solidity code using prettier\n * @param content solidity code\n * @param prettierConfigPath optional path to a prettier config\n * @returns formatted solidity code\n */\nexport async function formatSolidity(content: string, prettierConfigPath?: string): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [prettierPluginSolidity],\n parser: \"solidity-parse\",\n\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n\n ...config,\n });\n } catch (error) {\n let message;\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = error;\n }\n console.log(`Error during output formatting: ${message}`);\n return content;\n }\n}\n\n/**\n * Formats typescript code using prettier\n * @param content typescript code\n * @returns formatted typescript code\n */\nexport async function formatTypescript(content: string): Promise<string> {\n return prettier.format(content, {\n parser: \"typescript\",\n });\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { formatSolidity, formatTypescript } from \"./format\";\nimport { debug } from \"../debug\";\n\n/**\n * Formats solidity code using prettier and write it to a file\n * @param output solidity code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteSolidity(output: string, fullOutputPath: string, logPrefix: string): Promise<void> {\n const formattedOutput = await formatSolidity(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string,\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"codegen\");\nexport const error = parentDebug.extend(\"codegen\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n"],"mappings":"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AM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,IAAI,GAAG;AAAA,EACnB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,UAAU,GAAG;AAAA,EACzB,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,WAAW,GAAG;AAAA,EAC1B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,YAAY,GAAG;AAAA,EAC3B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,UAAU,GAAG;AAAA;AAAA,EACzB,CAAC,WAAW,aAAa,GAAG;AAAA,EAC5B,CAAC,WAAW,KAAK,GAAG;AAAA,EACpB,CAAC,WAAW,MAAM,GAAG;AACvB;;;ACzMA,SAAS,OAAO,aAAa;AAiCtB,SAAS,oBACd,QACA,cAKA;AACA,QAAM,MAAM,MAAM,MAAM;AACxB,QAAM,eAAe,iBAAiB,KAAK,YAAY;AACvD,MAAI,gBAAgC,CAAC;AACrC,QAAM,YAAyC,CAAC;AAChD,QAAM,SAAmC,CAAC;AAE1C,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,SAAS,uBAAuB,YAAY,EAAE;AAAA,EAC1D;AAEA,QAAM,cAAc;AAAA,IAClB,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAAG;AACD,UAAI;AAEF,YAAI,iBAAiB,cAAc,eAAgB;AAEnD,YAAI,eAAe,UAAW,OAAM,IAAI,SAAS,6BAA6B;AAE9E,YAAI,eAAe,cAAc,eAAe,UAAU;AACxD,oBAAU,KAAK;AAAA,YACb,MAAM,SAAS,OAAO,KAAK;AAAA,YAC3B,YAAY,WAAW,IAAI,cAAc;AAAA,YACzC,iBAAiB,mBAAmB;AAAA,YACpC,kBAAkB,qBAAqB,OAAO,CAAC,IAAI,iBAAiB,IAAI,cAAc;AAAA,UACxF,CAAC;AAED,qBAAW,EAAE,SAAS,KAAK,WAAW,OAAO,oBAAoB,CAAC,CAAC,GAAG;AACpE,kBAAM,UAAU,kBAAkB,QAAQ;AAC1C,4BAAgB,cAAc,OAAO,iBAAiB,KAAK,OAAO,CAAC;AAAA,UACrE;AAAA,QACF;AAAA,MACF,SAASC,QAAgB;AACvB,YAAIA,kBAAiB,UAAU;AAC7B,UAAAA,OAAM,UAAU,aAAa,IAAI,kBAAkB,YAAY,MAAMA,OAAM,OAAO;AAAA,QACpF;AACA,cAAMA;AAAA,MACR;AAAA,IACF;AAAA,IACA,sBAAsB,EAAE,MAAM,WAAW,GAAG;AAC1C,aAAO,KAAK;AAAA,QACV;AAAA,QACA,YAAY,WAAW,IAAI,cAAc;AAAA,MAC3C,CAAC;AAED,iBAAW,aAAa,YAAY;AAClC,cAAM,UAAU,kBAAkB,UAAU,QAAQ;AACpD,wBAAgB,cAAc,OAAO,iBAAiB,KAAK,OAAO,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,KAAiB,cAAsD;AACtG,MAAI,WAA2C;AAE/C,QAAM,KAAK;AAAA,IACT,mBAAmB,MAAM;AACvB,UAAI,KAAK,SAAS,cAAc;AAC9B,mBAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,eAAe,EAAE,MAAM,UAAU,gBAAgB,GAAgC;AACxF,MAAI,wBAAwB;AAE5B,QAAM,EAAE,MAAM,mBAAmB,gBAAgB,IAAI,gBAAgB,QAAQ;AAE7E,2BAAyB;AAEzB,MAAI,oBAAoB,MAAM;AAC5B,6BAAyB,IAAI,eAAe;AAAA,EAC9C;AAEA,MAAI,oBAAoB,MAAM;AAC5B,6BAAyB,IAAI,eAAe;AAAA,EAC9C;AAEA,MAAI,SAAS,MAAM;AACjB,6BAAyB,IAAI,IAAI;AAAA,EACnC;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,UAA6E;AACpG,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,iBAAiB;AAAA,IACnB;AAAA,EACF;AACA,MAAI,SAAS,SAAS,sBAAsB;AAC1C,WAAO;AAAA,MACL,MAAM,SAAS;AAAA,MACf,iBAAiB,SAAS;AAAA,IAC5B;AAAA,EACF,WAAW,SAAS,SAAS,uBAAuB;AAClD,WAAO;AAAA,MACL,MAAM,SAAS;AAAA,MACf,iBAAiB;AAAA,IACnB;AAAA,EACF,WAAW,SAAS,SAAS,iBAAiB;AAC5C,QAAI,SAAS;AACb,QAAI,SAAS,QAAQ,SAAS,iBAAiB;AAC7C,eAAS,SAAS,OAAO;AAAA,IAC3B,WAAW,SAAS,QAAQ,SAAS,cAAc;AACjD,eAAS,SAAS,OAAO;AAAA,IAC3B;AAEA,UAAM,EAAE,MAAM,gBAAgB,IAAI,gBAAgB,SAAS,YAAY;AACvE,WAAO;AAAA,MACL,MAAM,GAAG,IAAI,IAAI,MAAM;AAAA,MACvB;AAAA,IACF;AAAA,EACF,OAAO;AAEL,UAAM,IAAI,SAAS,yBAAyB,SAAS,IAAI,EAAE;AAAA,EAC7D;AACF;AAGA,SAAS,kBAAkB,UAAqC;AAC9D,MAAI,UAAU,SAAS,uBAAuB;AAE5C,UAAM,SAAS,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC;AAC7C,WAAO,CAAC,MAAM;AAAA,EAChB,WAAW,UAAU,SAAS,iBAAiB;AAC7C,UAAM,UAAU,kBAAkB,SAAS,YAAY;AAEvD,QAAI,SAAS,QAAQ,SAAS,cAAc;AAC1C,YAAM,gBAAgB,SAAS,OAAO;AACtC,cAAQ,KAAK,cAAc,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,IAC1C;AACA,WAAO;AAAA,EACT,OAAO;AACL,WAAO,CAAC;AAAA,EACV;AACF;AAOA,SAAS,iBAAiB,KAAiB,SAAmC;AAC5E,QAAM,UAA0B,CAAC;AAEjC,aAAW,UAAU,SAAS;AAC5B,QAAI;AAEJ,UAAM,KAAK;AAAA,MACT,gBAAgB,EAAE,MAAAC,OAAM,cAAc,GAAG;AACvC,YAAI,eAAe;AACjB,qBAAW,kBAAkB,eAAe;AAE1C,kBAAM,cAAc,eAAe,CAAC,KAAK,eAAe,CAAC;AACzD,gBAAI,WAAW,aAAa;AAC1B,6BAAe;AAAA;AAAA,gBAEb,QAAQ,eAAe,CAAC;AAAA,gBACxB,MAAAA;AAAA,cACF;AACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,cAAc;AAChB,cAAQ,KAAK,YAAY;AAAA,IAC3B,OAAO;AACL,YAAM,IAAI,SAAS,WAAW,MAAM,0BAA0B;AAAA,IAChE;AAAA,EACF;AAEA,SAAO;AACT;;;AC7OA,OAAO,cAAc;AACrB,OAAO,4BAA4B;AAQnC,eAAsB,eAAe,SAAiB,oBAA8C;AAClG,MAAI;AACJ,MAAI,oBAAoB;AACtB,aAAS,MAAM,SAAS,cAAc,kBAAkB;AAAA,EAC1D;AACA,MAAI;AACF,WAAO,SAAS,OAAO,SAAS;AAAA,MAC9B,SAAS,CAAC,sBAAsB;AAAA,MAChC,QAAQ;AAAA,MAER,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,gBAAgB;AAAA,MAEhB,GAAG;AAAA,IACL,CAAC;AAAA,EACH,SAASC,QAAO;AACd,QAAI;AACJ,QAAIA,kBAAiB,OAAO;AAC1B,gBAAUA,OAAM;AAAA,IAClB,OAAO;AACL,gBAAUA;AAAA,IACZ;AACA,YAAQ,IAAI,mCAAmC,OAAO,EAAE;AACxD,WAAO;AAAA,EACT;AACF;AAOA,eAAsB,iBAAiB,SAAkC;AACvE,SAAO,SAAS,OAAO,SAAS;AAAA,IAC9B,QAAQ;AAAA,EACV,CAAC;AACH;;;AChDA,OAAO,QAAQ;AACf,OAAOC,WAAU;;;ACCV,IAAMC,SAAQ,MAAY,OAAO,SAAS;AAC1C,IAAM,QAAQ,MAAY,OAAO,SAAS;AAGjDA,OAAM,MAAM,QAAQ,MAAM,KAAK,OAAO;AAGtC,MAAM,MAAM,QAAQ,MAAM,KAAK,OAAO;;;ADEtC,eAAsB,uBAAuB,QAAgB,gBAAwB,WAAkC;AACrH,QAAM,kBAAkB,MAAM,eAAe,MAAM;AAEnD,QAAM,GAAG,MAAMC,MAAK,QAAQ,cAAc,GAAG,EAAE,WAAW,KAAK,CAAC;AAEhE,QAAM,GAAG,UAAU,gBAAgB,eAAe;AAClD,EAAAC,OAAM,GAAG,SAAS,KAAK,cAAc,EAAE;AACzC;AAQA,eAAsB,yBACpB,QACA,gBACA,WACe;AACf,QAAM,kBAAkB,MAAM,iBAAiB,MAAM;AAErD,QAAM,GAAG,MAAMD,MAAK,QAAQ,cAAc,GAAG,EAAE,WAAW,KAAK,CAAC;AAEhE,QAAM,GAAG,UAAU,gBAAgB,eAAe;AAClD,EAAAC,OAAM,GAAG,SAAS,KAAK,cAAc,EAAE;AACzC;","names":["path","error","path","error","path","debug","path","debug"]}
|
|
1
|
+
{"version":3,"sources":["../src/codegen/render-solidity/abiToInterface.ts","../src/codegen/render-solidity/renderImportPath.ts","../src/codegen/render-solidity/common.ts","../src/codegen/render-solidity/renderEnums.ts","../src/codegen/render-solidity/renderTypeHelpers.ts","../src/codegen/render-typescript/schemaTypesToRecsTypeStrings.ts","../src/codegen/utils/contractToInterface.ts","../src/codegen/utils/findContractNode.ts","../src/codegen/utils/findSymbolImport.ts","../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/codegen/debug.ts","../src/codegen/utils/parseSystem.ts"],"sourcesContent":["import { AbiParameter, Hex } from \"viem\";\nimport { Abi, AbiError, AbiFunction, formatAbiItem, formatAbiParameter } from \"abitype\";\nimport { renderedSolidityHeader } from \"./common\";\nimport { hexToResource } from \"../../hexToResource\";\n\nfunction formatParam(param: AbiParameter): string {\n // return param.type === \"string\" || param.type === \"bytes\" || param.type === \"tuple\" || param.type.endsWith(\"]\")\n // ? `${formatAbiParameter(param)} memory`\n // : formatAbiParameter(param);\n return formatAbiParameter(param);\n}\n\nfunction formatFunction(item: AbiFunction): string {\n const params = item.inputs.map(formatParam).join(\", \");\n const returns = item.outputs.map(formatParam).join(\", \");\n return `function ${item.name}(${params}) external${returns.length ? ` returns (${returns})` : \"\"}`;\n}\n\nfunction formatSystemId(systemId: Hex): string {\n const resource = hexToResource(systemId);\n return `\n // equivalent to \\`WorldResourceIdLib.encode({ namespace: ${JSON.stringify(\n resource.namespace,\n )}, name: ${JSON.stringify(resource.name)}, typeId: RESOURCE_SYSTEM });\\`\n ResourceId constant systemId = ResourceId.wrap(${systemId});\n `;\n}\n\nexport type AbiToInterfaceOptions = {\n name: string;\n systemId?: Hex;\n abi: Abi;\n};\n\nexport function abiToInterface({ name, systemId, abi }: AbiToInterfaceOptions): string {\n const imports = systemId ? [`{ ResourceId } from \"@latticexyz/store/src/ResourceId.sol\"`] : [];\n const errors = abi.filter((item): item is AbiError => item.type === \"error\");\n const functions = abi.filter((item): item is AbiFunction => item.type === \"function\");\n\n return `\n ${renderedSolidityHeader}\n\n ${imports.map((item) => `import ${item};`).join(\"\\n\")}\n\n ${systemId ? formatSystemId(systemId) : \"\"}\n\n interface ${name} {\n ${errors.map((item) => `${formatAbiItem(item)};`).join(\"\\n\")}\n\n ${functions\n .map((item) => {\n if ([...item.inputs, ...item.outputs].some((param) => param.type.startsWith(\"tuple\"))) {\n return `// TODO: replace tuple with struct\\n// ${formatFunction(item)};`;\n }\n return `${formatFunction(item)};`;\n })\n .join(\"\\n\")}\n }\n `;\n}\n","import path from \"node:path\";\n\n// This will probably break for backslash-escaped POSIX paths,\n// but we'll worry about that later.\nfunction winToPosix(segment: string): string {\n return segment.replaceAll(path.win32.sep, path.posix.sep);\n}\n\nexport function renderImportPath(basePath: string, ...segments: readonly string[]): string {\n // Solidity compiler expects POSIX paths\n const fullPath = path.posix\n .join(winToPosix(basePath), ...segments.map(winToPosix))\n // remove trailing slash\n .replace(/\\/$/, \"\");\n\n // `path.join` strips the leading `./`\n // so if we started with a relative path, make it relative again\n if (basePath.startsWith(\".\")) {\n const relativePath = \"./\" + fullPath;\n return relativePath.replace(/^(\\.\\/)+\\./, \".\");\n }\n\n return fullPath;\n}\n","import { ImportDatum, StaticResourceData, RenderKeyTuple, RenderType } from \"./types\";\nimport { resourceToHex } from \"../../resourceToHex\";\nimport { hexToResource } from \"../../hexToResource\";\nimport { renderImportPath } from \"./renderImportPath\";\nimport { isDefined } from \"../../utils\";\n\n/**\n * Common header for all codegenerated solidity files\n */\nexport const renderedSolidityHeader = `// SPDX-License-Identifier: MIT\npragma solidity >=0.8.24;\n\n/* Autogenerated file. Do not edit manually. */`;\n\n/**\n * Renders a list of lines\n */\nexport function renderList<T>(list: T[], renderItem: (item: T, index: number) => string): string {\n return internalRenderList(\"\", list, renderItem);\n}\n\n/**\n * Renders a comma-separated list of arguments for solidity functions, ignoring empty and undefined ones\n */\nexport function renderArguments(args: (string | undefined)[]): string {\n return args\n .filter(isDefined)\n .filter((arg) => arg !== \"\")\n .join(\", \");\n}\n\ninterface RenderedCommonData {\n /** `_tableId` variable prefixed with its type (empty string if absent) */\n _typedTableId: string;\n /** Comma-separated table key names prefixed with their types (empty string if 0 keys) */\n _typedKeyArgs: string;\n /** Definition and initialization of the dynamic `_keyTuple` bytes32 array */\n _keyTupleDefinition: string;\n}\n\n/**\n * Renders some solidity statements commonly used within table libraries\n * @param param0.staticResourceData static data about the table library\n * @param param0.keyTuple key tuple of the table library\n * @returns Rendered statement strings\n */\nexport function renderCommonData({\n staticResourceData,\n keyTuple,\n}: {\n staticResourceData?: StaticResourceData;\n keyTuple: RenderKeyTuple[];\n}): RenderedCommonData {\n // static resource means static tableId as well, and no tableId arguments\n const _typedTableId = staticResourceData ? \"\" : \"ResourceId _tableId\";\n const _typedKeyArgs = renderArguments(keyTuple.map(({ name, typeWithLocation }) => `${typeWithLocation} ${name}`));\n\n const _keyTupleDefinition = `\n bytes32[] memory _keyTuple = new bytes32[](${keyTuple.length});\n ${renderList(keyTuple, (key, index) => `_keyTuple[${index}] = ${renderValueTypeToBytes32(key.name, key)};`)}\n `;\n\n return {\n _typedTableId,\n _typedKeyArgs,\n _keyTupleDefinition,\n };\n}\n\n/**\n * Aggregates, deduplicates and renders imports for symbols per path.\n * Identical symbols from different paths are NOT handled, they should be checked before rendering.\n */\nexport function renderImports(imports: ImportDatum[]): string {\n // Aggregate symbols by import path, also deduplicating them\n const aggregatedImports = new Map<string, Set<string>>();\n for (const { symbol, path } of imports) {\n if (!aggregatedImports.has(path)) {\n aggregatedImports.set(path, new Set());\n }\n aggregatedImports.get(path)?.add(symbol);\n }\n // Render imports\n const renderedImports = [];\n for (const [path, symbols] of aggregatedImports) {\n const renderedSymbols = [...symbols].join(\", \");\n renderedImports.push(`import { ${renderedSymbols} } from \"${renderImportPath(path)}\";`);\n }\n return renderedImports.join(\"\\n\");\n}\n\ninterface RenderWithStoreCallbackData {\n /** `_store` variable prefixed with its type (undefined if library name) */\n _typedStore: string | undefined;\n /** `_store` variable (undefined if library name) */\n _store: string;\n /** Empty string if storeArgument is false, otherwise `\" (using the specified store)\"` */\n _commentSuffix: string;\n /** Prefix to differentiate different kinds of store usage within methods */\n _methodNamePrefix: string;\n /** Whether FieldLayout variable should be passed to store methods */\n _useExplicitFieldLayout?: boolean;\n}\n\n/**\n * Renders several versions of the callback's result, which access Store in different ways\n * @param storeArgument whether to render a version with `IStore _store` as an argument\n * @param callback renderer for a method which uses store\n * @returns Concatenated results of all callback calls\n */\nexport function renderWithStore(\n storeArgument: boolean,\n callback: (data: RenderWithStoreCallbackData) => string,\n): string {\n let result = \"\";\n result += callback({ _typedStore: undefined, _store: \"StoreSwitch\", _commentSuffix: \"\", _methodNamePrefix: \"\" });\n result += callback({\n _typedStore: undefined,\n _store: \"StoreCore\",\n _commentSuffix: \"\",\n _methodNamePrefix: \"_\",\n _useExplicitFieldLayout: true,\n });\n\n if (storeArgument) {\n result +=\n \"\\n\" +\n callback({\n _typedStore: \"IStore _store\",\n _store: \"_store\",\n _commentSuffix: \" (using the specified store)\",\n _methodNamePrefix: \"\",\n });\n }\n\n return result;\n}\n\n/**\n * Renders several versions of the callback's result, which have different method name suffixes\n * @param withSuffixlessFieldMethods whether to render methods with an empty suffix\n * @param fieldName name of the field which the methods access, used for a suffix\n * @param callback renderer for a method to be suffixed\n * @returns Concatenated results of all callback calls\n */\nexport function renderWithFieldSuffix(\n withSuffixlessFieldMethods: boolean,\n fieldName: string,\n callback: (_methodNameSuffix: string) => string,\n): string {\n const methodNameSuffix = `${fieldName[0].toUpperCase()}${fieldName.slice(1)}`;\n let result = \"\";\n result += callback(methodNameSuffix);\n\n if (withSuffixlessFieldMethods) {\n result += \"\\n\" + callback(\"\");\n }\n\n return result;\n}\n\n/**\n * Renders `_tableId` definition of the given table.\n * @param param0 static resource data needed to construct the table ID\n */\nexport function renderTableId({\n namespace,\n name,\n offchainOnly,\n}: Pick<StaticResourceData, \"namespace\" | \"name\" | \"offchainOnly\">): string {\n const tableId = resourceToHex({\n type: offchainOnly ? \"offchainTable\" : \"table\",\n namespace,\n name,\n });\n // turn table ID back into arguments that would be valid in `WorldResourceIdLib.encode` (like truncated names)\n const resource = hexToResource(tableId);\n return `\n // Hex below is the result of \\`WorldResourceIdLib.encode({ namespace: ${JSON.stringify(\n resource.namespace,\n )}, name: ${JSON.stringify(resource.name)}, typeId: ${offchainOnly ? \"RESOURCE_OFFCHAIN_TABLE\" : \"RESOURCE_TABLE\"} });\\`\n ResourceId constant _tableId = ResourceId.wrap(${tableId});\n `;\n}\n\n/**\n * Renders solidity typecasts to get from the given type to `bytes32`\n * @param name variable name to be typecasted\n * @param param1 type data\n */\nexport function renderValueTypeToBytes32(\n name: string,\n { typeUnwrap, internalTypeId }: Pick<RenderType, \"typeUnwrap\" | \"internalTypeId\">,\n): string {\n const innerText = typeUnwrap.length ? `${typeUnwrap}(${name})` : name;\n\n if (internalTypeId === \"bytes32\") {\n return innerText;\n } else if (/^bytes\\d{1,2}$/.test(internalTypeId)) {\n return `bytes32(${innerText})`;\n } else if (/^uint\\d{1,3}$/.test(internalTypeId)) {\n return `bytes32(uint256(${innerText}))`;\n } else if (/^int\\d{1,3}$/.test(internalTypeId)) {\n return `bytes32(uint256(int256(${innerText})))`;\n } else if (internalTypeId === \"address\") {\n return `bytes32(uint256(uint160(${innerText})))`;\n } else if (internalTypeId === \"bool\") {\n return `_boolToBytes32(${innerText})`;\n } else {\n throw new Error(`Unknown value type id ${internalTypeId}`);\n }\n}\n\n/**\n * Whether the storage representation of the given solidity type is left aligned\n */\nexport function isLeftAligned(field: Pick<RenderType, \"internalTypeId\">): boolean {\n return /^bytes\\d{1,2}$/.test(field.internalTypeId);\n}\n\n/**\n * The number of padding bits in the storage representation of a right-aligned solidity type\n */\nexport function getLeftPaddingBits(field: Pick<RenderType, \"internalTypeId\" | \"staticByteLength\">): number {\n if (isLeftAligned(field)) {\n return 0;\n } else {\n return 256 - field.staticByteLength * 8;\n }\n}\n\n/**\n * Internal helper to render `lineTerminator`-separated list of items mapped by `renderItem`\n */\nfunction internalRenderList<T>(\n lineTerminator: string,\n list: T[],\n renderItem: (item: T, index: number) => string,\n): string {\n return list\n .map((item, index) => renderItem(item, index) + (index === list.length - 1 ? \"\" : lineTerminator))\n .join(\"\\n\");\n}\n","import { renderedSolidityHeader } from \"./common\";\n\n// importing this from config or store would be a cyclic dependency :(\ntype Enums = {\n readonly [name: string]: readonly [string, ...string[]];\n};\n\n/**\n * Render a list of enum data as solidity enum definitions\n */\nexport function renderEnums(enums: Enums): string {\n const enumDefinitions = Object.entries(enums).map(\n ([name, values]) => `\n enum ${name} {\n ${values.join(\", \")}\n }\n `,\n );\n\n return `\n ${renderedSolidityHeader}\n ${enumDefinitions.join(\"\")}\n `;\n}\n","import { RenderField, RenderKeyTuple, RenderType } from \"./types\";\n\n/**\n * Renders the necessary helper functions to typecast to/from the types of given fields and keys\n */\nexport function renderTypeHelpers(options: { fields: RenderField[]; keyTuple: RenderKeyTuple[] }): string {\n const { fields, keyTuple } = options;\n\n let result = \"\";\n\n for (const wrappingHelper of getWrappingHelpers([...fields, ...keyTuple])) {\n result += wrappingHelper;\n }\n\n // bool is special - it's the only primitive value type that can't be typecasted to/from\n if (fields.some(({ internalTypeId }) => internalTypeId.match(\"bool\"))) {\n result += `\n /**\n * @notice Cast a value to a bool.\n * @dev Boolean values are encoded as uint8 (1 = true, 0 = false), but Solidity doesn't allow casting between uint8 and bool.\n * @param value The uint8 value to convert.\n * @return result The boolean value.\n */\n function _toBool(uint8 value) pure returns (bool result) {\n assembly {\n result := value\n }\n }\n `;\n }\n if (keyTuple.some(({ internalTypeId }) => internalTypeId.match(\"bool\"))) {\n result += `\n /**\n * @notice Cast a bool to a bytes32.\n * @dev The boolean value is casted to a bytes32 value with 0 or 1 at the least significant bit.\n */\n function _boolToBytes32(bool value) pure returns (bytes32 result) {\n assembly {\n result := value\n }\n }\n `;\n }\n\n return result;\n}\n\nfunction getWrappingHelpers(array: RenderType[]): string[] {\n const wrappers = new Map<string, string>();\n const unwrappers = new Map<string, string>();\n for (const { typeWrappingData, typeWrap, typeUnwrap, internalTypeId } of array) {\n if (!typeWrappingData) continue;\n const { kind } = typeWrappingData;\n\n if (kind === \"staticArray\") {\n const { elementType, staticLength } = typeWrappingData;\n wrappers.set(typeWrap, renderWrapperStaticArray(typeWrap, elementType, staticLength, internalTypeId));\n unwrappers.set(typeUnwrap, renderUnwrapperStaticArray(typeUnwrap, elementType, staticLength, internalTypeId));\n }\n }\n\n return [...wrappers.values(), ...unwrappers.values()];\n}\n\n/**\n * Renders a function to cast a dynamic array to a static array.\n * @param functionName name of the function to be rendered\n * @param elementType type of the array's element\n * @param staticLength length of the static array\n * @param internalTypeId solidity type name of the dynamic array\n * @returns\n */\nfunction renderWrapperStaticArray(\n functionName: string,\n elementType: string,\n staticLength: number,\n internalTypeId: string,\n): string {\n // WARNING: ensure this still works if changing major solidity versions!\n // (the memory layout for static arrays may change)\n return `\n /**\n * @notice Cast a dynamic array to a static array.\n * @dev In memory static arrays are just dynamic arrays without the 32 length bytes,\n * so this function moves the pointer to the first element of the dynamic array.\n * If the length of the dynamic array is smaller than the static length,\n * the function returns an uninitialized array to avoid memory corruption.\n * @param _value The dynamic array to cast.\n * @return _result The static array.\n */\n function ${functionName}(\n ${internalTypeId} memory _value\n ) pure returns (\n ${elementType}[${staticLength}] memory _result\n ) {\n if (_value.length < ${staticLength}) {\n // return an uninitialized array if the length is smaller than the fixed length to avoid memory corruption\n return _result;\n } else {\n // in memory static arrays are just dynamic arrays without the 32 length bytes\n // (without the length check this could lead to memory corruption)\n assembly {\n _result := add(_value, 0x20)\n }\n }\n }\n `;\n}\n\n/**\n * Renders a function to cast a static array to a dynamic array.\n * @param functionName name of the function to be rendered\n * @param elementType type of the array's element\n * @param staticLength length of the static array\n * @param internalTypeId solidity type name of the dynamic array\n * @returns\n */\nfunction renderUnwrapperStaticArray(\n functionName: string,\n elementType: string,\n staticLength: number,\n internalTypeId: string,\n): string {\n // byte length for memory copying (more efficient than a loop)\n const byteLength = staticLength * 32;\n // TODO to optimize memory usage consider generalizing TightEncoder to a render-time utility\n return `\n /**\n * @notice Copy a static array to a dynamic array.\n * @dev Static arrays don't have a length prefix, so this function copies the memory from the static array to a new dynamic array.\n * @param _value The static array to copy.\n * @return _result The dynamic array.\n */ \n function ${functionName}(\n ${elementType}[${staticLength}] memory _value\n ) pure returns (\n ${internalTypeId} memory _result\n ) {\n _result = new ${internalTypeId}(${staticLength});\n uint256 fromPointer;\n uint256 toPointer;\n assembly {\n fromPointer := _value\n toPointer := add(_result, 0x20)\n }\n Memory.copy(fromPointer, toPointer, ${byteLength});\n }\n `;\n}\n","import { SchemaType } from \"@latticexyz/schema-type/deprecated\";\n\nexport const schemaTypesToRecsTypeStrings: Record<SchemaType, string> = {\n [SchemaType.UINT8]: \"RecsType.Number\",\n [SchemaType.UINT16]: \"RecsType.Number\",\n [SchemaType.UINT24]: \"RecsType.Number\",\n [SchemaType.UINT32]: \"RecsType.Number\",\n [SchemaType.UINT40]: \"RecsType.Number\",\n [SchemaType.UINT48]: \"RecsType.Number\",\n [SchemaType.UINT56]: \"RecsType.BigInt\",\n [SchemaType.UINT64]: \"RecsType.BigInt\",\n [SchemaType.UINT72]: \"RecsType.BigInt\",\n [SchemaType.UINT80]: \"RecsType.BigInt\",\n [SchemaType.UINT88]: \"RecsType.BigInt\",\n [SchemaType.UINT96]: \"RecsType.BigInt\",\n [SchemaType.UINT104]: \"RecsType.BigInt\",\n [SchemaType.UINT112]: \"RecsType.BigInt\",\n [SchemaType.UINT120]: \"RecsType.BigInt\",\n [SchemaType.UINT128]: \"RecsType.BigInt\",\n [SchemaType.UINT136]: \"RecsType.BigInt\",\n [SchemaType.UINT144]: \"RecsType.BigInt\",\n [SchemaType.UINT152]: \"RecsType.BigInt\",\n [SchemaType.UINT160]: \"RecsType.BigInt\",\n [SchemaType.UINT168]: \"RecsType.BigInt\",\n [SchemaType.UINT176]: \"RecsType.BigInt\",\n [SchemaType.UINT184]: \"RecsType.BigInt\",\n [SchemaType.UINT192]: \"RecsType.BigInt\",\n [SchemaType.UINT200]: \"RecsType.BigInt\",\n [SchemaType.UINT208]: \"RecsType.BigInt\",\n [SchemaType.UINT216]: \"RecsType.BigInt\",\n [SchemaType.UINT224]: \"RecsType.BigInt\",\n [SchemaType.UINT232]: \"RecsType.BigInt\",\n [SchemaType.UINT240]: \"RecsType.BigInt\",\n [SchemaType.UINT248]: \"RecsType.BigInt\",\n [SchemaType.UINT256]: \"RecsType.BigInt\",\n [SchemaType.INT8]: \"RecsType.Number\",\n [SchemaType.INT16]: \"RecsType.Number\",\n [SchemaType.INT24]: \"RecsType.Number\",\n [SchemaType.INT32]: \"RecsType.Number\",\n [SchemaType.INT40]: \"RecsType.Number\",\n [SchemaType.INT48]: \"RecsType.Number\",\n [SchemaType.INT56]: \"RecsType.BigInt\",\n [SchemaType.INT64]: \"RecsType.BigInt\",\n [SchemaType.INT72]: \"RecsType.BigInt\",\n [SchemaType.INT80]: \"RecsType.BigInt\",\n [SchemaType.INT88]: \"RecsType.BigInt\",\n [SchemaType.INT96]: \"RecsType.BigInt\",\n [SchemaType.INT104]: \"RecsType.BigInt\",\n [SchemaType.INT112]: \"RecsType.BigInt\",\n [SchemaType.INT120]: \"RecsType.BigInt\",\n [SchemaType.INT128]: \"RecsType.BigInt\",\n [SchemaType.INT136]: \"RecsType.BigInt\",\n [SchemaType.INT144]: \"RecsType.BigInt\",\n [SchemaType.INT152]: \"RecsType.BigInt\",\n [SchemaType.INT160]: \"RecsType.BigInt\",\n [SchemaType.INT168]: \"RecsType.BigInt\",\n [SchemaType.INT176]: \"RecsType.BigInt\",\n [SchemaType.INT184]: \"RecsType.BigInt\",\n [SchemaType.INT192]: \"RecsType.BigInt\",\n [SchemaType.INT200]: \"RecsType.BigInt\",\n [SchemaType.INT208]: \"RecsType.BigInt\",\n [SchemaType.INT216]: \"RecsType.BigInt\",\n [SchemaType.INT224]: \"RecsType.BigInt\",\n [SchemaType.INT232]: \"RecsType.BigInt\",\n [SchemaType.INT240]: \"RecsType.BigInt\",\n [SchemaType.INT248]: \"RecsType.BigInt\",\n [SchemaType.INT256]: \"RecsType.BigInt\",\n [SchemaType.BYTES1]: \"RecsType.String\",\n [SchemaType.BYTES2]: \"RecsType.String\",\n [SchemaType.BYTES3]: \"RecsType.String\",\n [SchemaType.BYTES4]: \"RecsType.String\",\n [SchemaType.BYTES5]: \"RecsType.String\",\n [SchemaType.BYTES6]: \"RecsType.String\",\n [SchemaType.BYTES7]: \"RecsType.String\",\n [SchemaType.BYTES8]: \"RecsType.String\",\n [SchemaType.BYTES9]: \"RecsType.String\",\n [SchemaType.BYTES10]: \"RecsType.String\",\n [SchemaType.BYTES11]: \"RecsType.String\",\n [SchemaType.BYTES12]: \"RecsType.String\",\n [SchemaType.BYTES13]: \"RecsType.String\",\n [SchemaType.BYTES14]: \"RecsType.String\",\n [SchemaType.BYTES15]: \"RecsType.String\",\n [SchemaType.BYTES16]: \"RecsType.String\",\n [SchemaType.BYTES17]: \"RecsType.String\",\n [SchemaType.BYTES18]: \"RecsType.String\",\n [SchemaType.BYTES19]: \"RecsType.String\",\n [SchemaType.BYTES20]: \"RecsType.String\",\n [SchemaType.BYTES21]: \"RecsType.String\",\n [SchemaType.BYTES22]: \"RecsType.String\",\n [SchemaType.BYTES23]: \"RecsType.String\",\n [SchemaType.BYTES24]: \"RecsType.String\",\n [SchemaType.BYTES25]: \"RecsType.String\",\n [SchemaType.BYTES26]: \"RecsType.String\",\n [SchemaType.BYTES27]: \"RecsType.String\",\n [SchemaType.BYTES28]: \"RecsType.String\",\n [SchemaType.BYTES29]: \"RecsType.String\",\n [SchemaType.BYTES30]: \"RecsType.String\",\n [SchemaType.BYTES31]: \"RecsType.String\",\n [SchemaType.BYTES32]: \"RecsType.String\",\n [SchemaType.BOOL]: \"RecsType.Boolean\",\n [SchemaType.ADDRESS]: \"RecsType.String\",\n [SchemaType.UINT8_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT16_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT24_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT32_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT40_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT48_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.UINT56_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT64_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT72_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT80_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT88_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT96_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT104_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT112_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT120_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT128_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT136_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT144_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT152_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT160_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT168_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT176_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT184_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT192_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT200_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT208_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT216_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT224_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT232_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT240_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT248_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.UINT256_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT8_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT16_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT24_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT32_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT40_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT48_ARRAY]: \"RecsType.NumberArray\",\n [SchemaType.INT56_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT64_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT72_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT80_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT88_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT96_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT104_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT112_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT120_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT128_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT136_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT144_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT152_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT160_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT168_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT176_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT184_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT192_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT200_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT208_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT216_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT224_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT232_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT240_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT248_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.INT256_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES1_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES2_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES3_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES4_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES5_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES6_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES7_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES8_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES9_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES10_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES11_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES12_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES13_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES14_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES15_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES16_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES17_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES18_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES19_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES20_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES21_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES22_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES23_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES24_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES25_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES26_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES27_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES28_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES29_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES30_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES31_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BYTES32_ARRAY]: \"RecsType.BigIntArray\",\n [SchemaType.BOOL_ARRAY]: \"RecsType.T\", // no boolean array\n [SchemaType.ADDRESS_ARRAY]: \"RecsType.StringArray\",\n [SchemaType.BYTES]: \"RecsType.String\",\n [SchemaType.STRING]: \"RecsType.String\",\n};\n","import { parse, visit } from \"@solidity-parser/parser\";\nimport type { SourceUnit, TypeName, VariableDeclaration } from \"@solidity-parser/parser/dist/src/ast-types\";\nimport { MUDError } from \"../../errors\";\nimport { findContractNode } from \"./findContractNode\";\nimport { SymbolImport, findSymbolImport } from \"./findSymbolImport\";\n\nexport interface ContractInterfaceFunction {\n name: string;\n parameters: string[];\n stateMutability: string;\n returnParameters: string[];\n}\n\nexport interface ContractInterfaceError {\n name: string;\n parameters: string[];\n}\n\n/**\n * Parse the contract data to get the functions necessary to generate an interface,\n * and symbols to import from the original contract.\n * @param source contents of a file with the solidity contract\n * @param contractName name of the contract\n * @returns interface data\n */\nexport function contractToInterface(\n source: string,\n contractName: string,\n): {\n functions: ContractInterfaceFunction[];\n errors: ContractInterfaceError[];\n symbolImports: SymbolImport[];\n} {\n const ast = parse(source);\n const contractNode = findContractNode(ast, contractName);\n let symbolImports: SymbolImport[] = [];\n const functions: ContractInterfaceFunction[] = [];\n const errors: ContractInterfaceError[] = [];\n\n if (!contractNode) {\n throw new MUDError(`Contract not found: ${contractName}`);\n }\n\n visit(contractNode, {\n FunctionDefinition({\n name,\n visibility,\n parameters,\n stateMutability,\n returnParameters,\n isConstructor,\n isFallback,\n isReceiveEther,\n }) {\n try {\n // skip constructor and fallbacks\n if (isConstructor || isFallback || isReceiveEther) return;\n // forbid default visibility (this check might be unnecessary, modern solidity already disallows this)\n if (visibility === \"default\") throw new MUDError(`Visibility is not specified`);\n\n if (visibility === \"external\" || visibility === \"public\") {\n functions.push({\n name: name === null ? \"\" : name,\n parameters: parameters.map(parseParameter),\n stateMutability: stateMutability || \"\",\n returnParameters: returnParameters === null ? [] : returnParameters.map(parseParameter),\n });\n\n for (const { typeName } of parameters.concat(returnParameters ?? [])) {\n const symbols = typeNameToSymbols(typeName);\n symbolImports = symbolImports.concat(symbolsToImports(ast, symbols));\n }\n }\n } catch (error: unknown) {\n if (error instanceof MUDError) {\n error.message = `Function \"${name}\" in contract \"${contractName}\": ${error.message}`;\n }\n throw error;\n }\n },\n CustomErrorDefinition({ name, parameters }) {\n errors.push({\n name,\n parameters: parameters.map(parseParameter),\n });\n\n for (const parameter of parameters) {\n const symbols = typeNameToSymbols(parameter.typeName);\n symbolImports = symbolImports.concat(symbolsToImports(ast, symbols));\n }\n },\n });\n\n return {\n functions,\n errors,\n symbolImports,\n };\n}\n\nfunction parseParameter({ name, typeName, storageLocation }: VariableDeclaration): string {\n let typedNameWithLocation = \"\";\n\n const { name: flattenedTypeName, stateMutability } = flattenTypeName(typeName);\n // type name (e.g. uint256)\n typedNameWithLocation += flattenedTypeName;\n // optional mutability (e.g. address payable)\n if (stateMutability !== null) {\n typedNameWithLocation += ` ${stateMutability}`;\n }\n // location, when relevant (e.g. string memory)\n if (storageLocation !== null) {\n typedNameWithLocation += ` ${storageLocation}`;\n }\n // optional variable name\n if (name !== null) {\n typedNameWithLocation += ` ${name}`;\n }\n\n return typedNameWithLocation;\n}\n\nfunction flattenTypeName(typeName: TypeName | null): { name: string; stateMutability: string | null } {\n if (typeName === null) {\n return {\n name: \"\",\n stateMutability: null,\n };\n }\n if (typeName.type === \"ElementaryTypeName\") {\n return {\n name: typeName.name,\n stateMutability: typeName.stateMutability,\n };\n } else if (typeName.type === \"UserDefinedTypeName\") {\n return {\n name: typeName.namePath,\n stateMutability: null,\n };\n } else if (typeName.type === \"ArrayTypeName\") {\n let length = \"\";\n if (typeName.length?.type === \"NumberLiteral\") {\n length = typeName.length.number;\n } else if (typeName.length?.type === \"Identifier\") {\n length = typeName.length.name;\n }\n\n const { name, stateMutability } = flattenTypeName(typeName.baseTypeName);\n return {\n name: `${name}[${length}]`,\n stateMutability,\n };\n } else {\n // TODO function types are unsupported but could be useful\n throw new MUDError(`Invalid typeName.type ${typeName.type}`);\n }\n}\n\n// Get symbols that need to be imported for given typeName\nfunction typeNameToSymbols(typeName: TypeName | null): string[] {\n if (typeName?.type === \"UserDefinedTypeName\") {\n // split is needed to get a library, if types are internal to it\n const symbol = typeName.namePath.split(\".\")[0];\n return [symbol];\n } else if (typeName?.type === \"ArrayTypeName\") {\n const symbols = typeNameToSymbols(typeName.baseTypeName);\n // array types can also use symbols (constants) for length\n if (typeName.length?.type === \"Identifier\") {\n const innerTypeName = typeName.length.name;\n symbols.push(innerTypeName.split(\".\")[0]);\n }\n return symbols;\n } else {\n return [];\n }\n}\n\nfunction symbolsToImports(ast: SourceUnit, symbols: string[]): SymbolImport[] {\n return symbols.map((symbol) => {\n const symbolImport = findSymbolImport(ast, symbol);\n if (!symbolImport) throw new MUDError(`Symbol \"${symbol}\" has no explicit import`);\n return symbolImport;\n });\n}\n","import { visit } from \"@solidity-parser/parser\";\nimport type { ContractDefinition, SourceUnit } from \"@solidity-parser/parser/dist/src/ast-types\";\n\nexport function findContractNode(ast: SourceUnit, contractName: string): ContractDefinition | undefined {\n let contract: ContractDefinition | undefined = undefined;\n\n visit(ast, {\n ContractDefinition(node) {\n if (node.name === contractName) {\n contract = node;\n }\n },\n });\n\n return contract;\n}\n","import { visit } from \"@solidity-parser/parser\";\nimport type { SourceUnit } from \"@solidity-parser/parser/dist/src/ast-types\";\n\nexport interface SymbolImport {\n symbol: string;\n path: string;\n}\n\n/**\n * Get import for given symbol.\n *\n * To avoid circular dependencies of interfaces on their implementations,\n * symbols used for args/returns must always be imported from an auxiliary file.\n * To avoid parsing the entire project to build dependencies,\n * symbols must be imported with an explicit `import { symbol } from ...`\n */\nexport function findSymbolImport(ast: SourceUnit, symbol: string): SymbolImport | undefined {\n let symbolImport: SymbolImport | undefined;\n\n visit(ast, {\n ImportDirective({ path, symbolAliases }) {\n if (symbolAliases) {\n for (const symbolAndAlias of symbolAliases) {\n // either check the alias, or the original symbol if there's no alias\n const symbolAlias = symbolAndAlias[1] ?? symbolAndAlias[0];\n if (symbol === symbolAlias) {\n symbolImport = {\n // always use the original symbol for interface imports\n symbol: symbolAndAlias[0],\n path,\n };\n return;\n }\n }\n }\n },\n });\n\n return symbolImport;\n}\n","import prettier from \"prettier\";\nimport prettierPluginSolidity from \"prettier-plugin-solidity\";\n\n/**\n * Formats solidity code using prettier\n * @param content solidity code\n * @param prettierConfigPath optional path to a prettier config\n * @returns formatted solidity code\n */\nexport async function formatSolidity(content: string, prettierConfigPath?: string): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [prettierPluginSolidity],\n parser: \"solidity-parse\",\n\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n\n ...config,\n });\n } catch (error) {\n let message;\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = error;\n }\n console.log(`Error during output formatting: ${message}`);\n return content;\n }\n}\n\n/**\n * Formats typescript code using prettier\n * @param content typescript code\n * @returns formatted typescript code\n */\nexport async function formatTypescript(content: string): Promise<string> {\n return prettier.format(content, {\n parser: \"typescript\",\n });\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { formatSolidity, formatTypescript } from \"./format\";\nimport { debug, error } from \"../debug\";\n\n/**\n * Formats solidity code using prettier and write it to a file\n * @param content solidity code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteSolidity(\n content: string,\n fullOutputPath: string,\n logPrefix: string,\n): Promise<void> {\n let output = content;\n try {\n output = await formatSolidity(output);\n } catch (e) {\n error(`Error while attempting to format ${fullOutputPath}`, e);\n }\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, output);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string,\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"codegen\");\nexport const error = parentDebug.extend(\"codegen\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { parse, visit } from \"@solidity-parser/parser\";\n\nimport { findContractNode } from \"./findContractNode\";\nimport { findSymbolImport } from \"./findSymbolImport\";\n\nconst baseSystemName = \"System\";\nconst baseSystemPath = \"@latticexyz/world/src/System.sol\";\n\nexport function parseSystem(\n source: string,\n contractName: string,\n): undefined | { contractType: \"contract\" | \"abstract\" } {\n const ast = parse(source);\n const contractNode = findContractNode(ast, contractName);\n if (!contractNode) return;\n\n const contractType = contractNode.kind;\n // skip libraries and interfaces\n // we allow abstract systems here so that we can create system libraries from them but without deploying them\n if (contractType !== \"contract\" && contractType !== \"abstract\") return;\n\n const isSystem = ((): boolean => {\n // if using the System suffix, assume its a system\n if (contractName.endsWith(\"System\") && contractName !== baseSystemName) return true;\n\n // otherwise check if we're inheriting from the base system\n let extendsBaseSystem = false;\n visit(contractNode, {\n InheritanceSpecifier(node) {\n if (node.baseName.namePath === baseSystemName) {\n extendsBaseSystem = true;\n }\n },\n });\n return extendsBaseSystem && findSymbolImport(ast, baseSystemName)?.path === baseSystemPath;\n })();\n\n if (isSystem) {\n return { contractType };\n }\n}\n"],"mappings":"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AM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,MAAM,GAAG;AAAA,EACrB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAAC,WAAW,OAAO,GAAG;AAAA,EACtB,CAA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","names":["path","visit","visit","path","visit","error","error","path","debug","path","debug","parse","visit","parse","visit"]}
|
package/dist/internal.js
CHANGED
|
@@ -59,6 +59,9 @@ async function ensureContract({
|
|
|
59
59
|
return [];
|
|
60
60
|
}
|
|
61
61
|
if (deployedBytecodeSize != null) {
|
|
62
|
+
if (deployedBytecodeSize === 0) {
|
|
63
|
+
throw new Error(`Empty bytecode for ${debugLabel}`);
|
|
64
|
+
}
|
|
62
65
|
if (deployedBytecodeSize > contractSizeLimit) {
|
|
63
66
|
console.warn(
|
|
64
67
|
`
|
package/dist/internal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/waitForTransactions.ts","../src/deploy/ensureContract.ts","../src/deploy/common.ts","../src/deploy/debug.ts","../src/deploy/ensureContractsDeployed.ts","../src/deploy/ensureDeployer.ts","../src/deploy/create2/deployment.json","../src/deploy/getDeployer.ts","../src/deploy/getContractAddress.ts"],"sourcesContent":["import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { debug } from \"./debug\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\n\nexport async function waitForTransactions({\n client,\n hashes,\n debugLabel = \"transactions\",\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly hashes: readonly Hex[];\n readonly debugLabel?: string;\n}): Promise<void> {\n if (!hashes.length) return;\n\n debug(`waiting for ${debugLabel} to confirm`);\n // wait for each tx separately/serially, because parallelizing results in RPC errors\n for (const hash of hashes) {\n const receipt = await waitForTransactionReceipt(client, { hash });\n // TODO: handle user op failures?\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted: ${hash}`);\n }\n }\n}\n","import { Client, Transport, Chain, Account, concatHex, getCreate2Address, Hex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport { contractSizeLimit, singletonSalt } from \"./common\";\nimport { debug } from \"./debug\";\nimport { sendTransaction } from \"../sendTransaction\";\n\nexport type Contract = {\n bytecode: Hex;\n deployedBytecodeSize?: number;\n debugLabel?: string;\n salt?: Hex;\n};\n\nexport async function ensureContract({\n client,\n deployerAddress,\n bytecode,\n deployedBytecodeSize,\n debugLabel = \"contract\",\n salt = singletonSalt,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n} & Contract): Promise<readonly Hex[]> {\n if (bytecode.includes(\"__$\")) {\n throw new Error(`Found unlinked public library in ${debugLabel} bytecode`);\n }\n\n const address = getCreate2Address({ from: deployerAddress, salt, bytecode });\n\n const contractCode = await getCode(client, { address, blockTag: \"pending\" });\n if (contractCode) {\n debug(\"found\", debugLabel, \"at\", address);\n return [];\n }\n\n if (deployedBytecodeSize != null) {\n if (deployedBytecodeSize > contractSizeLimit) {\n console.warn(\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n } else if (deployedBytecodeSize > contractSizeLimit * 0.95) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is almost over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n }\n }\n\n debug(\"deploying\", debugLabel, \"at\", address);\n return [\n await sendTransaction(client, {\n chain: client.chain ?? null,\n to: deployerAddress,\n data: concatHex([salt, bytecode]),\n }),\n ];\n}\n","import { stringToHex } from \"viem\";\n\n// salt for deterministic deploys of singleton contracts\nexport const singletonSalt = stringToHex(\"\", { size: 32 });\n\n// https://eips.ethereum.org/EIPS/eip-170\nexport const contractSizeLimit = parseInt(\"6000\", 16);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"deploy\");\nexport const error = parentDebug.extend(\"deploy\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { Contract, ensureContract } from \"./ensureContract\";\nimport { waitForTransactions } from \"../waitForTransactions\";\nimport { uniqueBy } from \"../utils/uniqueBy\";\n\nexport async function ensureContractsDeployed({\n client,\n deployerAddress,\n contracts,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n readonly contracts: readonly Contract[];\n}): Promise<readonly Hex[]> {\n // Deployments assume a deterministic deployer, so we only need to deploy the unique bytecode\n const uniqueContracts = uniqueBy(contracts, (contract) => contract.bytecode);\n\n const txs = (\n await Promise.all(uniqueContracts.map((contract) => ensureContract({ client, deployerAddress, ...contract })))\n ).flat();\n\n await waitForTransactions({\n client,\n hashes: txs,\n debugLabel: \"contract deploys\",\n });\n\n return txs;\n}\n","import { Account, Address, Chain, Client, Transport } from \"viem\";\nimport { getBalance, sendRawTransaction, sendTransaction, waitForTransactionReceipt } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\nimport { getDeployer } from \"./getDeployer\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function ensureDeployer(client: Client<Transport, Chain | undefined, Account>): Promise<Address> {\n const existingDeployer = await getDeployer(client);\n if (existingDeployer !== undefined) {\n return existingDeployer;\n }\n\n // There's not really a way to simulate a pre-EIP-155 (no chain ID) transaction,\n // so we have to attempt to create the deployer first and, if it fails, fall back\n // to a regular deploy.\n\n // Send gas to deployment signer\n const gasRequired = BigInt(deployment.gasLimit) * BigInt(deployment.gasPrice);\n const currentBalance = await getBalance(client, { address: `0x${deployment.signerAddress}` });\n const gasNeeded = gasRequired - currentBalance;\n if (gasNeeded > 0) {\n debug(\"sending gas for CREATE2 deployer to signer at\", deployment.signerAddress);\n const gasTx = await sendTransaction(client, {\n chain: client.chain ?? null,\n to: `0x${deployment.signerAddress}`,\n value: gasNeeded,\n });\n const gasReceipt = await waitForTransactionReceipt(client, { hash: gasTx });\n if (gasReceipt.status !== \"success\") {\n console.error(\"failed to send gas to deployer signer\", gasReceipt);\n throw new Error(\"failed to send gas to deployer signer\");\n }\n }\n\n // Deploy the deployer\n debug(\"deploying CREATE2 deployer at\", deployer);\n const deployTx = await sendRawTransaction(client, { serializedTransaction: `0x${deployment.transaction}` }).catch(\n (error) => {\n // Do a regular contract create if the presigned transaction doesn't work due to replay protection\n if (String(error).includes(\"only replay-protected (EIP-155) transactions allowed over RPC\")) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\n ⚠️ Your chain or RPC does not allow for non EIP-155 signed transactions, so your deploys will not be determinstic and contract addresses may change between deploys.\\n\\n We recommend running your chain's node with \\`--rpc.allow-unprotected-txs\\` to enable determinstic deployments.\\n`,\n );\n debug(\"deploying CREATE2 deployer\");\n return sendTransaction(client, {\n chain: client.chain ?? null,\n data: `0x${deployment.creationCode}`,\n });\n }\n throw error;\n },\n );\n\n const deployReceipt = await waitForTransactionReceipt(client, { hash: deployTx });\n if (!deployReceipt.contractAddress) {\n throw new Error(\"Deploy receipt did not have contract address, was the deployer not deployed?\");\n }\n\n if (deployReceipt.contractAddress !== deployer) {\n console.warn(\n `\\n ⚠️ CREATE2 deployer created at ${deployReceipt.contractAddress} does not match the CREATE2 determinstic deployer we expected (${deployer})`,\n );\n }\n\n return deployReceipt.contractAddress;\n}\n","{\n \"gasPrice\": 100000000000,\n \"gasLimit\": 100000,\n \"signerAddress\": \"3fab184622dc19b6109349b94811493bf2a45362\",\n \"transaction\": \"f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222\",\n \"address\": \"4e59b44847b379578588920ca78fbf26c0b4956c\",\n \"creationCode\": \"604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3\"\n}\n","import { Address, Chain, Client, Transport, sliceHex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function getDeployer(client: Client<Transport, Chain | undefined>): Promise<Address | undefined> {\n const bytecode = await getCode(client, { address: deployer });\n if (bytecode) {\n debug(\"found deployer bytecode at\", deployer);\n // check if deployed bytecode is the same as the expected bytecode (minus 14-bytes creation code prefix)\n if (bytecode !== sliceHex(`0x${deployment.creationCode}`, 14)) {\n console.warn(\n `\\n ⚠️ Bytecode for deployer at ${deployer} did not match the expected CREATE2 bytecode. You may have unexpected results.\\n`,\n );\n }\n return deployer;\n }\n}\n","import { Hex, getCreate2Address } from \"viem\";\nimport { singletonSalt } from \"./common\";\n\nexport function getContractAddress({\n deployerAddress,\n bytecode,\n salt = singletonSalt,\n}: {\n readonly deployerAddress: Hex;\n readonly bytecode: Hex;\n readonly salt?: Hex;\n}): Hex {\n return getCreate2Address({ from: deployerAddress, bytecode, salt });\n}\n"],"mappings":"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","names":["debug","debug","sendTransaction","waitForTransactionReceipt","getCode","getCode","debug","deployer","debug","sendTransaction","waitForTransactionReceipt","error","getCreate2Address","getCreate2Address"]}
|
|
1
|
+
{"version":3,"sources":["../src/waitForTransactions.ts","../src/deploy/ensureContract.ts","../src/deploy/common.ts","../src/deploy/debug.ts","../src/deploy/ensureContractsDeployed.ts","../src/deploy/ensureDeployer.ts","../src/deploy/create2/deployment.json","../src/deploy/getDeployer.ts","../src/deploy/getContractAddress.ts"],"sourcesContent":["import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { debug } from \"./debug\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\n\nexport async function waitForTransactions({\n client,\n hashes,\n debugLabel = \"transactions\",\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly hashes: readonly Hex[];\n readonly debugLabel?: string;\n}): Promise<void> {\n if (!hashes.length) return;\n\n debug(`waiting for ${debugLabel} to confirm`);\n // wait for each tx separately/serially, because parallelizing results in RPC errors\n for (const hash of hashes) {\n const receipt = await waitForTransactionReceipt(client, { hash });\n // TODO: handle user op failures?\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted: ${hash}`);\n }\n }\n}\n","import { Client, Transport, Chain, Account, concatHex, getCreate2Address, Hex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport { contractSizeLimit, singletonSalt } from \"./common\";\nimport { debug } from \"./debug\";\nimport { sendTransaction } from \"../sendTransaction\";\n\nexport type Contract = {\n bytecode: Hex;\n deployedBytecodeSize?: number;\n debugLabel?: string;\n salt?: Hex;\n};\n\nexport async function ensureContract({\n client,\n deployerAddress,\n bytecode,\n deployedBytecodeSize,\n debugLabel = \"contract\",\n salt = singletonSalt,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n} & Contract): Promise<readonly Hex[]> {\n if (bytecode.includes(\"__$\")) {\n throw new Error(`Found unlinked public library in ${debugLabel} bytecode`);\n }\n\n const address = getCreate2Address({ from: deployerAddress, salt, bytecode });\n\n const contractCode = await getCode(client, { address, blockTag: \"pending\" });\n if (contractCode) {\n debug(\"found\", debugLabel, \"at\", address);\n return [];\n }\n\n if (deployedBytecodeSize != null) {\n if (deployedBytecodeSize === 0) {\n throw new Error(`Empty bytecode for ${debugLabel}`);\n }\n\n if (deployedBytecodeSize > contractSizeLimit) {\n console.warn(\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n } else if (deployedBytecodeSize > contractSizeLimit * 0.95) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is almost over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n }\n }\n\n debug(\"deploying\", debugLabel, \"at\", address);\n return [\n await sendTransaction(client, {\n chain: client.chain ?? null,\n to: deployerAddress,\n data: concatHex([salt, bytecode]),\n }),\n ];\n}\n","import { stringToHex } from \"viem\";\n\n// salt for deterministic deploys of singleton contracts\nexport const singletonSalt = stringToHex(\"\", { size: 32 });\n\n// https://eips.ethereum.org/EIPS/eip-170\nexport const contractSizeLimit = parseInt(\"6000\", 16);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"deploy\");\nexport const error = parentDebug.extend(\"deploy\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { Contract, ensureContract } from \"./ensureContract\";\nimport { waitForTransactions } from \"../waitForTransactions\";\nimport { uniqueBy } from \"../utils/uniqueBy\";\n\nexport async function ensureContractsDeployed({\n client,\n deployerAddress,\n contracts,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n readonly contracts: readonly Contract[];\n}): Promise<readonly Hex[]> {\n // Deployments assume a deterministic deployer, so we only need to deploy the unique bytecode\n const uniqueContracts = uniqueBy(contracts, (contract) => contract.bytecode);\n\n const txs = (\n await Promise.all(uniqueContracts.map((contract) => ensureContract({ client, deployerAddress, ...contract })))\n ).flat();\n\n await waitForTransactions({\n client,\n hashes: txs,\n debugLabel: \"contract deploys\",\n });\n\n return txs;\n}\n","import { Account, Address, Chain, Client, Transport } from \"viem\";\nimport { getBalance, sendRawTransaction, sendTransaction, waitForTransactionReceipt } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\nimport { getDeployer } from \"./getDeployer\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function ensureDeployer(client: Client<Transport, Chain | undefined, Account>): Promise<Address> {\n const existingDeployer = await getDeployer(client);\n if (existingDeployer !== undefined) {\n return existingDeployer;\n }\n\n // There's not really a way to simulate a pre-EIP-155 (no chain ID) transaction,\n // so we have to attempt to create the deployer first and, if it fails, fall back\n // to a regular deploy.\n\n // Send gas to deployment signer\n const gasRequired = BigInt(deployment.gasLimit) * BigInt(deployment.gasPrice);\n const currentBalance = await getBalance(client, { address: `0x${deployment.signerAddress}` });\n const gasNeeded = gasRequired - currentBalance;\n if (gasNeeded > 0) {\n debug(\"sending gas for CREATE2 deployer to signer at\", deployment.signerAddress);\n const gasTx = await sendTransaction(client, {\n chain: client.chain ?? null,\n to: `0x${deployment.signerAddress}`,\n value: gasNeeded,\n });\n const gasReceipt = await waitForTransactionReceipt(client, { hash: gasTx });\n if (gasReceipt.status !== \"success\") {\n console.error(\"failed to send gas to deployer signer\", gasReceipt);\n throw new Error(\"failed to send gas to deployer signer\");\n }\n }\n\n // Deploy the deployer\n debug(\"deploying CREATE2 deployer at\", deployer);\n const deployTx = await sendRawTransaction(client, { serializedTransaction: `0x${deployment.transaction}` }).catch(\n (error) => {\n // Do a regular contract create if the presigned transaction doesn't work due to replay protection\n if (String(error).includes(\"only replay-protected (EIP-155) transactions allowed over RPC\")) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\n ⚠️ Your chain or RPC does not allow for non EIP-155 signed transactions, so your deploys will not be determinstic and contract addresses may change between deploys.\\n\\n We recommend running your chain's node with \\`--rpc.allow-unprotected-txs\\` to enable determinstic deployments.\\n`,\n );\n debug(\"deploying CREATE2 deployer\");\n return sendTransaction(client, {\n chain: client.chain ?? null,\n data: `0x${deployment.creationCode}`,\n });\n }\n throw error;\n },\n );\n\n const deployReceipt = await waitForTransactionReceipt(client, { hash: deployTx });\n if (!deployReceipt.contractAddress) {\n throw new Error(\"Deploy receipt did not have contract address, was the deployer not deployed?\");\n }\n\n if (deployReceipt.contractAddress !== deployer) {\n console.warn(\n `\\n ⚠️ CREATE2 deployer created at ${deployReceipt.contractAddress} does not match the CREATE2 determinstic deployer we expected (${deployer})`,\n );\n }\n\n return deployReceipt.contractAddress;\n}\n","{\n \"gasPrice\": 100000000000,\n \"gasLimit\": 100000,\n \"signerAddress\": \"3fab184622dc19b6109349b94811493bf2a45362\",\n \"transaction\": \"f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222\",\n \"address\": \"4e59b44847b379578588920ca78fbf26c0b4956c\",\n \"creationCode\": \"604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3\"\n}\n","import { Address, Chain, Client, Transport, sliceHex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function getDeployer(client: Client<Transport, Chain | undefined>): Promise<Address | undefined> {\n const bytecode = await getCode(client, { address: deployer });\n if (bytecode) {\n debug(\"found deployer bytecode at\", deployer);\n // check if deployed bytecode is the same as the expected bytecode (minus 14-bytes creation code prefix)\n if (bytecode !== sliceHex(`0x${deployment.creationCode}`, 14)) {\n console.warn(\n `\\n ⚠️ Bytecode for deployer at ${deployer} did not match the expected CREATE2 bytecode. You may have unexpected results.\\n`,\n );\n }\n return deployer;\n }\n}\n","import { Hex, getCreate2Address } from \"viem\";\nimport { singletonSalt } from \"./common\";\n\nexport function getContractAddress({\n deployerAddress,\n bytecode,\n salt = singletonSalt,\n}: {\n readonly deployerAddress: Hex;\n readonly bytecode: Hex;\n readonly salt?: Hex;\n}): Hex {\n return getCreate2Address({ from: deployerAddress, bytecode, salt });\n}\n"],"mappings":"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","names":["debug","debug","sendTransaction","waitForTransactionReceipt","getCode","getCode","debug","deployer","debug","sendTransaction","waitForTransactionReceipt","error","getCreate2Address","getCreate2Address"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@latticexyz/common",
|
|
3
|
-
"version": "2.2.22-
|
|
3
|
+
"version": "2.2.22-d2c77c206d94a00082a25939b786df04d8249fcb",
|
|
4
4
|
"description": "Common low level logic shared between packages",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"p-retry": "^5.1.2",
|
|
70
70
|
"prettier": "3.2.5",
|
|
71
71
|
"prettier-plugin-solidity": "1.3.1",
|
|
72
|
-
"@latticexyz/schema-type": "2.2.22-
|
|
72
|
+
"@latticexyz/schema-type": "2.2.22-d2c77c206d94a00082a25939b786df04d8249fcb"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
75
|
"@types/debug": "^4.1.7",
|